Sei sulla pagina 1di 3

Que tal a gente exercitar um pouco a programao em .NET para autocad?

Bom, vou comear 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 (distncia perpendicular ao eixo em questo)

Agora, pense que voc precisa gerar o caminhamento resultante da conexo 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 espaos.

Vamos estudar um possvel cdigo 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 visvel para o usurio na linha


de comando, como se fosse um comando do autocad

Public Sub FAZ()

''pede a seleo de um arquivo qualquer:


Dim PEGAARG As New OpenFileDialog
PEGAARG.Filter = "Arquivo Txt|*.txt"

''se selecionou algo, continue, seno interrompa


If PEGAARG.ShowDialog <> DialogResult.OK Then Exit Sub

''pede a seleco 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, seno interrompa:


If PPR.Status <> PromptStatus.OK Then Exit Sub

''neste ponto, temos todas as informaes necessrias


''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 transao com o autocad


''essa transao dever ser fechada corretamente no fim da
execuo, ou causar erro fatal
With doc.TransactionManager.StartTransaction()
''e tente executar o programa
Try
''pegue o eixo selecionado, abrindo ele para lermos
algumas informaes:
Dim eixo As Polyline = PPR.ObjectId.GetObject(ForRead)

''crie uma polilinha na memria. 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


informaes:
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 direo
da reta tangente ao eixo neste ponto
Dim VETOR As Vector3d =
eixo.GetFirstDerivative(PT)

''calcula o vetor ortogonal a este, que unitrio


tambm
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 vrtice 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 transao 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 transao, aceitando as modificaes no


desenho
''se pular essa linha, d erro fatal
.Commit()
End With

End Sub
End Module

A idia :
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 trs 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, seno o cad no consegue
carregar e usar a nossa dll)

As referencias a serem adicionadas so o acmgd.dll e acdbmgd.dll, que esto na pasta


do seu autocad.

Ao carregar a dll com o NETLOAD, digitamos o nosso novo comando: FAZ

e veja o resultado:

Potrebbero piacerti anche