Herbruikbare functies om te tekenen
VB.NET is een OOP-taal. Dat houdt in dat alles object-georiënteerd is. Alles in je programma is een object. Elke class is een object. Het handige van objecten is dat deze herbruikbaar zijn en je kunt ze eventueel uitbreiden met nieuwe eigenschappen en methoden.
Maar wat ook handig is, is om functionaliteit om te tekenen in AutoCAD om te zetten naar functies. Zo hoef je dan in je code geen 25x te programmeren hoe je een lijn tekent, door gebruik te maken van een functie kun je eenvoudig deze functie aanroepen met bijvoorbeeld een begin- en eindpunt. Een voorbeeld van zo'n functie in een class is:
Imports Autodesk.AutoCAD
Namespace hzCadTools
Public Class hzCadToolsDrawEntities
' Draw Line from Point to Point in ModelSpace
Shared Function hzDrawLinePPMS(ByVal StartPoint As Geometry.Point3d, ByVal EndPoint As Geometry.Point3d) As DatabaseServices.Line
Dim myTransMan As DatabaseServices.TransactionManager
Dim myTrans As DatabaseServices.Transaction
Dim myDWG As ApplicationServices.Document
Dim myBT As DatabaseServices.BlockTable
Dim myBTR As DatabaseServices.BlockTableRecord
' Get the active document and start the transaction
myDWG = ApplicationServices.Application.DocumentManager.MdiActiveDocument
myTransMan = myDWG.TransactionManager
myTrans = myTransMan.StartTransaction
' Open the blocktable for read
myBT = myDWG.Database.BlockTableId.GetObject(DatabaseServices.OpenMode.ForRead)
myBTR = myBT(DatabaseServices.BlockTableRecord.ModelSpace).GetObject(DatabaseServices.OpenMode.ForWrite)
' Draw the line
Dim myLine As New DatabaseServices.Line(StartPoint, EndPoint)
myBTR.AppendEntity(myLine)
myTrans.AddNewlyCreatedDBObject(myLine, True)
' Commit the transaction
myTrans.Commit()
myTrans.Dispose()
myTransMan.Dispose()
Return myLine
End Function
End Class
End Namespace
De function is shared zodat deze gebruikt kan worden in je programma. De code van bovenstaande functie wordt opgeslagen in een bestand zoals bijvoorbeeld clsCadTools.vb en deze kan in je project worden opgenomen. Het is ook mogelijk om er een zelfstandige DLL van te bouwen die je dan koppelt als reference.
Bovenstaande functie tekent een lijn van opgegeven punt tot opgegeven punt in ModelSpace. De functie retourneert een Line-object zodat je buiten de functie na het creëren de eigenschappen kunt bewerken, als je het geretourneerde resultaat toewijst aan een nieuw object van het type Line. In onderstaande code wordt dit gedaan door de gecreëerde lijn uit de functie toe te wijzen aan het nieuwe object "newLine". Van "newLine" zijn nu eigenschappen zoals kleur, laagnaam, lijntype, enz. te wijzigen. Dit kan eventueel ook in de functie worden opgenomen waarbij je dan de eigenschappen doorgeeft als parameter aan de functie. Zoals met alles moet je zelf afwegen wat het beste is. Persoonlijk geef ik de voorkeur om eigenschappen buiten deze functie te wijzigen.
De functie is overigens wel erg eenvoudig. Misschien is het een idee om binnen de functie te kijken of ModelSpace of een Layout actief is en die toe te wijzen als plek waar getekend wordt. En kan het een idee zijn om een nieuwe functie te maken die een punt, een richting en een lengte meekrijgt als parameter. Zo is een class uit te breiden tot een set bruikbare en herbruikbare functies om te tekenen.
De functie kun je dan bijvoorbeeld aanroepen in een class als dit:
Imports hzCadTools.hzCadTools.hzCadToolsDrawEntities
Imports Autodesk.AutoCAD
Imports Autodesk.AutoCAD.Runtime
Public Class test
_
Public Sub CommandSub()
Dim Firstpoint, Secondpoint As Geometry.Point3d
Dim newLine As DatabaseServices.Line
Firstpoint = New Geometry.Point3d(0, 0, 0)
Secondpoint = New Geometry.Point3d(10, 10, 0)
newLine = hzDrawLinePPMS(Firstpoint, Secondpoint)
End Sub
End Class
De bovenstaande code is een test-klasse. Uiteraard gebruik je dit niet in je programma, maar zo kun je testen of de functie het goed doet.