==== Intro ==== There are several ways of opening a VBA script file in AutoCAD. Some scripts are embedded in a drawing and are opened automatically when the drawing is opened. For separate scripts AutoCAD comes with a ::VBA Manager:: which can open and close scripts. Drag-and-dropping a file into a drawing opens it and using the :::VBALOAD::: command. :::VBAUNLOAD::: can be used to unload a script. AutoCAD uses arcane programming terminology. A ::macro:: is a subroutine of a function. A ::VBA script file:: is called a ::project:: (Supposedly because a script file potentially consists of multiple "macros"). Each script files consists of at least one function. Once a script has been opened :::VBARUN::: executes a function. Alternatively, AutoCAD comes with a ::VBA IDE:: which allows you to edit and run loaded functions. ==== VBA Commands ==== ''VBAIDE'' Brings up the VBA IDE. The VBA IDE allows you to edit, run, and debug programs interactively. Although the VBA IDE is invoked only when AutoCAD is running, it can be minimized, opened, and closed independent of the AutoCAD Application window. ''VBALOAD'' Loads a VBA project into the current AutoCAD session. VBARUN Runs a VBA macro from the Macros dialog box or from the AutoCAD command line. ''VBAUNLOAD'' Unloads a VBA project from the current AutoCAD session. If the VBA project is modified but not saved, the user is asked to save it with the Save Project dialog box (or command line equivalent). ''VBAMAN'' Displays the VBA Manager allowing you to view, create, load, close, embed, and extract projects. ''VBASTMT'' Executes a VBA statement from the AutoCAD command line. ==== Commands ==== * ZOOM a * PAN * LINE * PLINE * REC * CIRCLE * ARC * ERASE * EXTEND * TRIM * COPY * MIRROR * OFFSET * MOVE * ROTATE * FILLET * DIST * VBALOAD * VBAUNLOAD * VBARUN * VBAIDE ==== AutoCad-specific VBA things ==== * :::ThisDrawing::: refers to the currently open dwg file. ==== Some Example Code ==== Public Sub Drawline() Dim lineobj As AcadLine Dim StartPoint(0 To 2) As Double Dim EndPoint(0 To 2) As Double 'Define startpoint the line point StartPoint(0) = 0: StartPoint(1) = 0: StartPoint(2) = 0 'Define endpoint the line point EndPoint(0) = 10: EndPoint(1) = 10: EndPoint(2) = 0 'Create a line in model space Set lineobj = ThisDrawing.ModelSpace.AddLine(StartPoint, EndPoint) ThisDrawing.SaveAs Drawline.dwg End Sub ==== Text Output ==== MsgBox "Rotation completed.", , "Rotate Example" ==== Select All ==== Dim sset As AcadSelectionSet Set sset = ThisDrawing.SelectionSets.Add("SSET") sset.Select acSelectionSetAll Sub abc() Dim SSet As AcadSelectionSet ' or - Dim SSet As Object ' for late binding Dim FilterType(0) As Integer Dim FilterData(0) As Variant Dim Groupcode As Variant Dim DataValue As Variant FilterType(0) = 67 FilterData(0) = 0 ' ModelSpace Groupcode = FilterType DataValue = FilterData On Error Resume Next ActiveDocument.SelectionSets.Item("TEST_SSET").Delete Set SSet = ActiveDocument.SelectionSets.Add("TEST_SSET") On Error GoTo 0 SSet.Select acSelectionSetAll, , , Groupcode, DataValue End Sub ==== Move ==== Sub Example_Move() ' This example creates a circle and then performs ' a move on that circle. ' Create the circle Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 2#: center(1) = 2#: center(2) = 0# radius = 0.5 Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius) ZoomAll ' Define the points that make up the move vector Dim point1(0 To 2) As Double Dim point2(0 To 2) As Double point1(0) = 0: point1(1) = 0: point1(2) = 0 point2(0) = 2: point2(1) = 0: point2(2) = 0 MsgBox "Move the circle 2 units in the X direction.", , "Move Example" ' Move the circle circleObj.Move point1, point2 ZoomAll MsgBox "Move completed.", , "Move Example" End Sub Public Sub moveAll() Dim sset As AcadSelectionSet Set sset = ThisDrawing.SelectionSets.Add("SSET2") sset.Select acSelectionSetAll Dim point1(0 To 2) As Double Dim point2(0 To 2) As Double point1(0) = 0: point1(1) = 0: point1(2) = 0 point2(0) = 20000: point2(1) = 0: point2(2) = 0 ' Move the circle ' sset.Move point1, point2 For Each ent In sset ent.Move point1, point2 Next ZoomAll MsgBox "Move completed.", , "Move Exampl" End Sub ==== Rotate ==== Sub Example_Rotate() ' This example creates a lightweight polyline ' and then rotates that polyline. ' Create the polyline Dim plineObj As AcadLWPolyline Dim points(0 To 11) As Double points(0) = 1: points(1) = 2 points(2) = 1: points(3) = 3 points(4) = 2: points(5) = 3 points(6) = 3: points(7) = 3 points(8) = 4: points(9) = 4 points(10) = 4: points(11) = 2 Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points) plineObj.Closed = True ZoomAll MsgBox "Rotate the polyline by 45 degrees.", , "Rotate Example" ' Define the rotation Dim basePoint(0 To 2) As Double Dim rotationAngle As Double basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0 rotationAngle = 0.7853981 ' 45 degrees ' Rotate the polyline plineObj.Rotate basePoint, rotationAngle ZoomAll MsgBox "Rotation completed.", , "Rotate Example" End Sub ==== LOAD/SAVE ==== Sub Ch3_NewDrawing() Dim docObj As AcadDocument Set docObj = ThisDrawing.Application.Documents.Add End Sub Sub Example_Open() ' The following example opens "C:\AutoCAD\Sample\city map.dwg" file. ' This drawing may not exist on your system. Change the drawing ' path and name to reflect a valid AutoCAD drawing on your system. ThisDrawing.Application.Documents.Open ("C:\AutoCAD\Sample\city map.dwg") End Sub Sub Ch3_OpenDrawing() Dim dwgName As String dwgName = "c:\campus.dwg" If Dir(dwgName) <> "" Then ThisDrawing.Application.Documents.Open dwgName Else MsgBox "File " & dwgName & " does not exist." End If End Sub Sub Example_Save() ' The following example saves current drawing ThisDrawing.Save End Sub Sub Example_SaveAs() ' The following example saves current drawing as "test.dwg" ThisDrawing.SaveAs ("test.dwg") End Sub Sub closeCurrentDrawing() ThisDrawing.Close End Sub Function getDrawingList(Folder As String) As Collection Dim fs, f, f1, fc Dim mycoll As New Collection Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFolder(Folder) Set fc = f.Files For Each f1 In fc If UCase(Right(f1.Name, 4)) = UCase(".dwg") Then mycoll.Add f1.PATH End If Next Set getDrawingList = mycoll End Function Sub transformAllInDir() Dim drawings As Collection Set drawings = getDrawingList("C:\test") For Each drawing In drawings MsgBox drawing Next drawing End Sub ==== Send Command ==== Sub Example_SendCommand() ' This example sends a command for evaluation to the AutoCAD command line ' of a particular drawing ' Create a Circle in the active drawing and ' zoom to display the entire circle ThisDrawing.SendCommand "_Circle" & vbCr & "2,2,0" & vbCr & "4" & vbCr ThisDrawing.SendCommand "_zoom" & vbCr & "a" & vbCr ' Refresh view ThisDrawing.Regen acAllViewports MsgBox "A circle command has been sent to the command line of the current drawing." End Sub ==== UCS ==== Function getActiveUcs() As AcadUCS ' get the active UCS ' if the UCS is not saved, save it Dim Origin Dim xaxis Dim yaxis Dim Zero(0 To 2) As Double Zero(0) = 0: Zero(1) = 0: Zero(2) = 0 Dim currentUCS As String currentUCSName = ThisDrawing.GetVariable("UCSNAME") If currentUCSName = "" Then ' Current UCS is not saved so get the data and save it ' A ucs is saved when a user makes and saves one or ' a user clicks on an isoview button If ThisDrawing.GetVariable("WORLDUCS") = 1 Then ' active UCS is identical to WCS xaxis = Zero: yaxis = Zero xaxis(0) = 1: yaxis(1) = 1 Set getActiveUcs = ThisDrawing.UserCoordinateSystems.Add(Zero, xaxis, yaxis, "World") Else Origin = ThisDrawing.GetVariable("UCSORG") xaxis = ThisDrawing.GetVariable("UCSXDIR") yaxis = ThisDrawing.GetVariable("UCSYDIR") Set getActiveUcs = ThisDrawing.UserCoordinateSystems.Add(Zero, xaxis, yaxis, "Active") 'Changing the origin later stops the error message '-2145320930 UCS X axis and Y axis are not perpendicular getActiveUcs.Origin = Origin ThisDrawing.ActiveUCS = getActiveUcs End If Else Set getActiveUcs = ThisDrawing.UserCoordinateSystems.Item(currentUCSName) End If End Function Dim ucsObj As AcadUCS Dim origin(0 To 2) As Double Dim xAxisPoint(0 To 2) As Double Dim yAxisPoint(0 To 2) As Double origin(0) = -326482.9747: origin(1) = 80747.2734: origin(2) = 0 xAxisPoint(0) = 0.9828: xAxisPoint(1) = 0.1849: xAxisPoint(2) = 0 yAxisPoint(0) = -0.1849: yAxisPoint(1) = 0.9828: yAxisPoint(2) = 0 ' Set ucsObj = ThisDrawing.UserCoordinateSystems.Add(origin, xAxisPoint, yAxisPoint, "UCSMe") Set ucsObj = ThisDrawing.UserCoordinateSystems.Improve(origin, xAxisPoint, yAxisPoint, "UCSMe") ThisDrawing.ActiveUCS = ucsObj ThisDrawing.ActiveUCS = ThisDrawing.UserCoordinateSystems("TempWorld") Sub angleFromXAxis() Dim angRad As Double Dim angDeg As Double Dim p1(0 To 2) As Double Dim p2(0 To 2) As Double p1(0) = 0: p1(1) = 0: p1(2) = 0 p2(0) = 0.9828: p2(1) = 0.1849: p2(2) = 0 angRad = ThisDrawing.Utility.angleFromXAxis(p1, p2) angDeg = (180 * angRad) / 3.14159265358979 'andRad = (3.14159265358979 * andDeg)/180 MsgBox angDeg End Sub Sub drawToUCS Dim XYZ(0 To 2) As Double Dim TestBlock As AcadBlockReference Dim ucsObj As AcadUCS Dim TransMatrix As Variant Set ucsObj = ThisDrawing.UserCoordinateSystems.Item("MYUCS") XYZ(0) = 0 XYZ(1) = 0 XYZ(2) = 0 Set TestBlock = ThisDrawing.ModelSpace.InsertBlock(XYZ, "MYBLOCK", 1, 1, 1, 0) TransMatrix = ucsObj.GetUCSMatrix() TestBlock.TransformBy (TransMatrix) TestBlock.Update End Sub