# Rotate, Scale, Project, and Mirror a Line Entity Example (VBA)

This example shows how to use a math transform to rotate, scale, project, and mirror a Line entity.

'-----------------------------------------------------------------------------
' Preconditions:
' 1. Create a VBA macro in a software product in which VBA is
' embedded.
' 2. Copy and paste this example into the Visual Basic IDE.
' 3. Add a reference to the DraftSight type library,
' install_dir\bin\dsAutomation.dll.
' 4. Add a reference to the Microsoft Scripting Runtime library.
' 5. Start DraftSight.
' 6. Run the macro.
'
' Postconditions:
' 1. A Line is drawn, rotated, scaled, projected, and mirrored.
' 2. The transformation parameters are printed before
' each transformation.
' 3. The Line parameters are printed before and after each
' transformation.
'----------------------------------------------------------------

Dim dsApp As DraftSight.Application

Sub Main()
'Connect to DraftSight
Set dsApp = GetObject(, "DraftSight.Application")
'Abort any command currently running in DraftSight
'to avoid nested commands
dsApp.AbortRunningCommand

'Get active document
Dim dsDoc As DraftSight.Document
Set dsDoc = dsApp.GetActiveDocument()
If dsDoc Is Nothing Then
MsgBox ("There are no open documents in DraftSight.")
Return
End If

'Get math utility
Dim dsMathUtility As DraftSight.MathUtility
Set dsMathUtility = dsApp.GetMathUtility()

'Draw a Line
Dim dsLine As Line
Set dsLine = DrawLine(dsDoc)

'Create different transformations
Dim transformations As New Scripting.Dictionary

'Create translation transformation
Dim dsTranslationVector As DraftSight.MathVector
Set dsTranslationVector = dsMathUtility.CreateVector(2, 3, 0)
Dim dsTranslationTransformation As DraftSight.MathTransform
Set dsTranslationTransformation = dsMathUtility.CreateTransformTranslation(dsTranslationVector)

transformations.Add "translation", dsTranslationTransformation
Call TransformLine(dsLine, "translation", transformations)

'Create scaling transformation
Dim dsCenterPoint As DraftSight.MathPoint
Set dsCenterPoint = dsMathUtility.CreatePoint(0, 0, 0)
Dim scaleFactor As Double
scaleFactor = 1.2
Dim dsScalingTransformation As DraftSight.MathTransform
Set dsScalingTransformation = dsMathUtility.CreateTransformScaling(dsCenterPoint, scaleFactor)

transformations.Add "scaling", dsScalingTransformation
Call TransformLine(dsLine, "scaling", transformations)

'Create rotation transformation
Dim dsRotationAxis As DraftSight.MathVector
Set dsRotationAxis = dsMathUtility.CreateVector(0, 0, 1)
Dim rotationAngle As Double
rotationAngle = 0.7875
'45 degrees in radians
Dim dsRotationTransformation As DraftSight.MathTransform
Set dsRotationTransformation = dsMathUtility.CreateTransformRotation(dsCenterPoint, dsRotationAxis, rotationAngle)

transformations.Add "rotation", dsRotationTransformation
Call TransformLine(dsLine, "rotation", transformations)

'Create mirror transformation about point
Dim dsMirrorPoint As DraftSight.MathPoint
Set dsMirrorPoint = dsMathUtility.CreatePoint(0, 0, 0)
Dim dsMirrorAboutPointTransformation As DraftSight.MathTransform
Set dsMirrorAboutPointTransformation = dsMathUtility.CreateTransformMirroringAboutPoint(dsMirrorPoint)

transformations.Add "mirror about point", dsMirrorAboutPointTransformation
Call TransformLine(dsLine, "mirror about point", transformations)

'Create mirror transformation about Line
Dim dsMirrorLine As DraftSight.MathLine
Set dsMirrorLine = dsMathUtility.CreateLine(0, 0, 0, 0, 20, 0, dsMathLineType_e.dsMathLineType_Bounded)
Dim dsMirrorAboutLineTransformation As DraftSight.MathTransform
Set dsMirrorAboutLineTransformation = dsMathUtility.CreateTransformMirroringAboutLine(dsMirrorLine)

transformations.Add "mirror about Line", dsMirrorAboutLineTransformation
Call TransformLine(dsLine, "mirror about Line", transformations)

'Create mirror transformation about plane
Dim dsMirrorPlane As DraftSight.MathPlane
Set dsMirrorPlane = dsMathUtility.CreateZXPlane()
Dim dsMirrorAboutPlaneTransformation As DraftSight.MathTransform
Set dsMirrorAboutPlaneTransformation = dsMathUtility.CreateTransformMirroringAboutPlane(dsMirrorPlane)

transformations.Add "mirror about plane", dsMirrorAboutPlaneTransformation
Call TransformLine(dsLine, "mirror about plane", transformations)

'Create projection transformation
Dim dsProjectionPlane As DraftSight.MathPlane
Set dsProjectionPlane = dsMathUtility.CreateYZPlane()
Dim dsProjectionDirection As DraftSight.MathVector
Set dsProjectionDirection = dsMathUtility.CreateVector(1, 0, 0)
Dim dsProjectionTransformation As DraftSight.MathTransform
Set dsProjectionTransformation = dsMathUtility.CreateTransformProjection(dsProjectionPlane, dsProjectionDirection)

transformations.Add "projection", dsProjectionTransformation
Call TransformLine(dsLine, "projection", transformations)
End Sub

Sub TransformLine(dsLine As DraftSight.Line, keyString As String, transformations As Scripting.Dictionary)

'Get the transformation by key out of the dictionary
Dim transform As DraftSight.MathTransform
Set transform = transformations(keyString)

'Get MathLine property of Line entity
Dim dsMathLine As DraftSight.MathLine
Set dsMathLine = dsLine.MathLine

'Print mathematical line parameters
Call PrintMathLineParameters(dsMathLine)

'Print transformation parameters
Call PrintMathTransformation(keyString, transform)
'Transform mathematical line
dsMathLine.TransformBy transform

'Update Line
dsLine.MathLine = dsMathLine

MsgBox ("The transformation " & keyString & " has been applied to the Line.")

'Zoom by window
Dim lowerLeftCorner(0 To 2) As Double
lowerLeftCorner(0) = -10
lowerLeftCorner(1) = -10
lowerLeftCorner(2) = 0
Dim upperRightCorner(0 To 2) As Double
upperRightCorner(0) = 10
upperRightCorner(1) = 10
upperRightCorner(2) = 0
dsApp.Zoom dsZoomRange_e.dsZoomRange_Window, lowerLeftCorner, upperRightCorner

'Print result mathematical line parameters
Call PrintMathLineParameters(dsMathLine)

End Sub

Function DrawLine(dsDoc As DraftSight.Document) As DraftSight.Line
'Get model space
Dim dsModel As DraftSight.Model
Set dsModel = dsDoc.GetModel()

'Get sketch manager
Dim dsSketchMgr As DraftSight.SketchManager
Set dsSketchMgr = dsModel.GetSketchManager()

'Draw a Line
Dim startPoint(0 To 2) As Double
startPoint(0) = 1
startPoint(1) = 1
startPoint(2) = 0
Dim endPoint(0 To 2) As Double
endPoint(0) = 5
endPoint(1) = 1
endPoint(2) = 0

Set DrawLine = dsSketchMgr.InsertLine(startPoint(0), startPoint(1), startPoint(2), endPoint(0), endPoint(1), endPoint(2))
End Function

Sub PrintMathTransformation(transformationName As String, dsMathTransformation As DraftSight.MathTransform)
Debug.Print ("The " & transformationName & " transformation:")

Dim countOfRows As Long
countOfRows = 4
Dim countOfColumns As Long
countOfColumns = 4

Dim i As Long
Dim j As Long

For i = 0 To countOfRows - 1
Dim rowInformation As String
rowInformation = "("

For j = 0 To countOfColumns - 1
rowInformation = rowInformation & dsMathTransformation.GetElementAt(i, j)

If j <> countOfColumns - 1 Then
rowInformation = rowInformation & " , "
End If
Next

rowInformation = rowInformation & ");"

Debug.Print (rowInformation)
Next
End Sub

Sub PrintMathLineParameters(dsMathLine As DraftSight.MathLine)
Debug.Print ("Mathematical line parameters: ")

Debug.Print ("Type = " & dsMathLine.GetType)

'Get start point
Dim dsPoint As DraftSight.MathPoint
Set dsPoint = dsMathLine.startPoint

Dim x As Double, y As Double, z As Double
dsPoint.GetPosition x, y, z

Debug.Print ("StartPoint: " & x & ", " & y & ", " & z)

'Get end point
Set dsPoint = dsMathLine.endPoint

dsPoint.GetPosition x, y, z

Debug.Print ("EndPoint: " & x & ", " & y & ", " & z)

'Get direction
Dim dsVector As DraftSight.MathVector
dsMathLine.GetDirection dsVector

dsVector.GetCoordinates x, y, z

Debug.Print ("Direction: " & x & ", " & y & ", " & z)

Debug.Print ("Length = " & dsMathLine.GetLength())
End Sub