Um novo forum se abre: http://www.cadlisp.com/, do meu amigo marcelo de cascavel, meus votos de sucesso!!!
Servidores fora do ar
Aparentemente os servidores da UFPR estão offline....
Se você tentar baixar alguma coisa desta página e não conseguir, mande-me um mail:
neyton@yahoo.com
eu mando para você
se esta situação perdurar, terei de trocar de servidor. Até lá, mande-me um mail, ou baixe por este link no 4shared
Se você tentar baixar alguma coisa desta página e não conseguir, mande-me um mail:
neyton@yahoo.com
eu mando para você
se esta situação perdurar, terei de trocar de servidor. Até lá, mande-me um mail, ou baixe por este link no 4shared
Autocad.NET - um exemplo simples
Que tal a gente exercitar um pouco a programação em .NET para autocad?
Bom, vou começar propondo um problema:
Você tem um eixo qualquer, que é uma polilinha e vai no campo levantar pontos, os quais possuem uma estaca e um offset (distância perpendicular ao eixo em questão)
Agora, pense que você precisa gerar o caminhamento resultante da conexão desses pontos. Algo assim:
Onde a linha preta é o seu eixo, e a linha azul, a linha resultante de um levantamento como este: link
Onde temos um valor de estaca e um valor de offset, separados por espaços.
Vamos estudar um possível código para isso:
''importar todos os namespaces necessarios:
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.ApplicationServices.Application
Imports Autodesk.AutoCAD.DatabaseServices.OpenMode
Imports Autodesk.AutoCAD.EditorInput
Imports System.Reflection
Imports System.Windows.Forms
Imports Autodesk.AutoCAD.Runtime
Public Module teste
    ''CommandMethod, torna a sub FAZ visível para o usuário na linha de comando, como se fosse um comando do autocad
    
    Public Sub FAZ()
        ''pede a seleção de um arquivo qualquer:
        Dim PEGAARG As New OpenFileDialog
        PEGAARG.Filter = "Arquivo Txt|*.txt"
        ''se selecionou algo, continue, senão interrompa
        If PEGAARG.ShowDialog <> DialogResult.OK Then Exit Sub
        ''pede a selecão do eixo:
        Dim doc As Document = DocumentManager.MdiActiveDocument
        Dim ed As Editor = doc.Editor
        Dim PPO As New PromptEntityOptions("SELECIONE O EIXO")
        Dim PPR As PromptEntityResult = ed.GetEntity(PPO)
        ''se selecionou, continue, senão interrompa:
        If PPR.Status <> PromptStatus.OK Then Exit Sub
        ''neste ponto, temos todas as informações necessárias
        ''logo, podemos abrir o arquivo de texto e ler, linha por linha
        Dim F As New System.IO.FileStream(PEGAARG.FileName, IO.FileMode.Open)
        Dim R As New System.IO.StreamReader(F)
        ''inicia uma transação com o autocad
        ''essa transação deverá ser fechada corretamente no fim da execução, ou causará erro fatal
        With doc.TransactionManager.StartTransaction()
            ''e tente executar o programa
            Try
                ''pegue o eixo selecionado, abrindo ele para lermos algumas informações:
                Dim eixo As Polyline = PPR.ObjectId.GetObject(ForRead)
                ''crie uma polilinha na memória. Ela irá receber os vertices calculados durante o
                ''processamento do arquivo de texto
                Dim PL As New Polyline
                PL.SetDatabaseDefaults()
                ''processe o arquivo de texto até o fim:
                Do
                    Dim LINHA As String = R.ReadLine
                    If LINHA = Nothing Then Exit Do
                    ''interprete a linha linha no texto, separando as informações:
                    Dim OBJ As String() = LINHA.Split(" ")
                    Dim ESTACA As Double = OBJ(0)
                    Dim OFFSET As Double = OBJ(1)
                    ''calcula a coordenada do ponto sobre o eixo, cuja estaca seja a que foi lida
                    Dim PT As Point3d = eixo.GetPointAtDist(ESTACA)
                    ''pegue a primeira derivada do eixo naquele ponto:
                    ''ele nos fornece um vetor unitario com a direção da reta tangente ao eixo neste ponto
                    Dim VETOR As Vector3d = eixo.GetFirstDerivative(PT)
                    ''calcula o vetor ortogonal a este, que é unitário também
                    Dim VETORTOGONAL As Vector3d = VETOR.GetPerpendicularVector()
                    ''calcula o ponto sobre a reta deste vetor ortogonal, que dista do ponto sobre o eixo
                    ''o valor lido na variavel OFFSET
                    Dim PT2 As Point3d = PT.Add(VETORTOGONAL * OFFSET)
                    ''adicione um vértice à nossa nova polilinha:
                    PL.AddVertexAt(PL.NumberOfVertices, New Point2d(PT2.X, PT2.Y), 0, 0, 0)
                Loop
                ''adicione a nova polilinha que está em memoria, ao modelspace:
                ''para isso, você deve pegar o BlockTableRecord do model (variavel btr)
                Dim bt As BlockTable = doc.Database.BlockTableId.GetObject(ForRead)
                Dim btr As BlockTableRecord = bt(BlockTableRecord.ModelSpace).GetObject(ForWrite)
                btr.AppendEntity(PL)
                ''diz para a transação aberta que a polilinha deve fazer parte do nosso desenho
                ''e deve ser desenhada:
                .AddNewlyCreatedDBObject(PL, True)
            Catch
                ''se der pau, mostre na linha de comando o erro
                ed.WriteMessage(Err.Description)
            End Try
            ''ao terminar, feche o arquivo
            F.Close()
            ''encerra a transação, aceitando as modificações no desenho
            ''se pular essa linha, dá erro fatal
            .Commit()
        End With
    End Sub
End Module
 A idéia é:
1) Pergunte pelo arquivo de texto
2) Pergunte pelo eixo
3) Abra o arquivo de texto e processe linha a linha deste, calcuando coordenadas
a serem adicionadas a uma polilinha nova
O passo três engloba um looping, para lermos as linhas
Tambem Calcula a coordenada do ponto que queremos, para isso seus conhecimentos de vetores, algebra linear e derivadas devem estar "frescos" ainda. No mais, depois de compilado o programa com o VISUAL STUDIO da Microsoft (sugiro o 10, express edition, é de gratis, ah, comfigure para usar o framework 3.5, senão o cad não consegue carregar e usar a nossa dll)
As referencias a serem adicionadas são o acmgd.dll e acdbmgd.dll, que estão na pasta do seu autocad.
Ao carregar a dll com o NETLOAD, digitamos o nosso novo comando: FAZ
e veja o resultado:
legal, não? e simples!!!
Tbn2 - Novos Comandos
O comando CopyLabel foi criado para suprir uma falta do Civil 3D: Colocar labels nos alinhamentos que representem cotas de perfil em diversas estacas.
Deveria funcionar com o recurso de "Reference Text" nas labels de estacas, mas aparentemente não rola....
A solução que encontrei foi criar uma label do tipo "Station/Offset" de alinhamento, aquelas que você cria uma a uma sobre o alinhamento. Nela dá para colocar um "Reference Text" para profiles.
Faça asim, crie um novo estilo:
Agora, crie um componente do tipo "Reference Text":
Escolha na listinha que se abre, Profile, depois edite o "Contents" para mostrar a cota do perfil:
Você pode configurar suas labels como quiser, tamanho de texto, cor, etc, mas o importante mesmo é ter esse "Reference Text"
Com o estilo criado, configure o civil 3d para que este estilo seja usado por padrão, para isso, clique:
Em seguida altere o item indicado:
Pronto, agora, crie UMA label do tipo station/offset,(menu Alignments, Add Alignment Labels, Station/Offset, ou digite ADDALIGNOFFLBL
Será solicitado a estaca, informe a estaca incial do alinhamento.
Em seguida será solicitado o Offset, informe ZERO.
Agora, como estamos usando uma label que precisa de um perfil, também será solicitado que você informe qual é o perfil. Escolha o GREIDE PROJETADO (ou o perfil de superficie) do alinhamento em que estamos colocando labels.
Bom, se quiser, agora, pode incluir neste mesmo comando, labels em diversas estacas, OU terminar o comando e usar o comando CopyLabel
Ao chamar o comando CopyLabel, será pedido a seleção de uma label, que você já deve ter inserido
Será pedido então qual o intervalo a ser usado entre uma label e outra. Informe e clique ENTER, veja o resultado:
Gostou da idéia?
Então baixe o programa e teste você mesmo!!!
download
Deveria funcionar com o recurso de "Reference Text" nas labels de estacas, mas aparentemente não rola....
A solução que encontrei foi criar uma label do tipo "Station/Offset" de alinhamento, aquelas que você cria uma a uma sobre o alinhamento. Nela dá para colocar um "Reference Text" para profiles.
Faça asim, crie um novo estilo:
Agora, crie um componente do tipo "Reference Text":
Escolha na listinha que se abre, Profile, depois edite o "Contents" para mostrar a cota do perfil:
Você pode configurar suas labels como quiser, tamanho de texto, cor, etc, mas o importante mesmo é ter esse "Reference Text"
Com o estilo criado, configure o civil 3d para que este estilo seja usado por padrão, para isso, clique:
Em seguida altere o item indicado:
Pronto, agora, crie UMA label do tipo station/offset,(menu Alignments, Add Alignment Labels, Station/Offset, ou digite ADDALIGNOFFLBL
Será solicitado a estaca, informe a estaca incial do alinhamento.
Em seguida será solicitado o Offset, informe ZERO.
Agora, como estamos usando uma label que precisa de um perfil, também será solicitado que você informe qual é o perfil. Escolha o GREIDE PROJETADO (ou o perfil de superficie) do alinhamento em que estamos colocando labels.
Bom, se quiser, agora, pode incluir neste mesmo comando, labels em diversas estacas, OU terminar o comando e usar o comando CopyLabel
Ao chamar o comando CopyLabel, será pedido a seleção de uma label, que você já deve ter inserido
Será pedido então qual o intervalo a ser usado entre uma label e outra. Informe e clique ENTER, veja o resultado:
Gostou da idéia?
Então baixe o programa e teste você mesmo!!!
download
Assinar:
Comentários (Atom)
 
 






