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!!!