VBA is in the process of being phased out, and the replacement is .NET. This may disappoint some of you that have VBA applications/skills, but you will be pleased to hear that you can still use code that you have, and all you know about VBA programming with AutoCAD® can still be put to good use using VB.NET. The following tutorial sets the foundation for creating your first VB.NET project, and should serve as a good starting point for migrating your code across to VB.NET.
What you need
There is no native IDE (integrated development environment) within AutoCAD® for developing .NET projects like you could with VBA (via the command VBAIDE). Instead, you need an external software development package for writing and compiling your code. Fear not however, you can download express editions of several programming suites for free directly from Microsoft’s website. Click here to visit the page for downloading Visual Basic Express 2010.
Next, you need to download the ObjectARX programming interface from AutoDesk’s website. Click here to visit the page for downloading ObjectARX. Ensure you acquire the correct version of the ObjectARX libraries for your version of AutoCAD®.
Create your first VB.NET AutoCAD® project
Open Microsoft Visual Basic Express, and select “New Project”, and then select the “Class Library” option. This creates a project that compiles to a dynamic link library (.dll file). In VBA you automatically have access to the AutoCAD® object, including objects such as ThisDrawing, but in this environment we have to create references to AutoCAD® explicitly ourselves. We do this by naming a reference to ObjectARX, which contains the AutoCAD® type libraries that we want to use.
- Under the Solution Explorer window, right click on your project (ClassLibrary1 if you haven’t renamed it), and select Properties.
- Click on the References Tab.
- Click on the Add dropdown, and select Reference.
- Click on the Browse Tab, and navigate to where the ObjectARX libraries are installed. Typically this will be C:\ObjectARX 2011\
- Depending on your preference, open the folder inc-win32 or inc-x64.
- Select the dll files Autodesk.AutoCAD®.Interop.dll and Autodesk.AutoCAD®.Interop.Common.dll, and click OK. This imports the AutoCAD® type libraries.
- Add another reference, and this time select the inc folder. Select AcMgd.dll and AcDbMgd.dll, and click OK. I’m not completely sure why these are required, but apparently they are!
- Finally, you’ll notice on the References Tab that the Copy Local property of the AcMgd.dll and AcDbMgd.dll references is set to True. This needs to be False so select them, and under the properties window change the Copy Local property to False.
Writing some initial code
Our project is now set up with all the references required to link to AutoCAD®. Now we can begin writing code.
Switch back to code view (If you haven’t renamed anything, double click on Class1.vb under Solution Explorer). We need to specify in this class which libraries from our references we intend to use, so right at the top of the class (before Public Class Class1) put the following code:
'Contains the AutoCAD® Type Library Imports Autodesk.AutoCAD®.Interop 'Contains the AutoCAD®/ObjectDBX Type Library Imports Autodesk.AutoCAD®.Interop.Common
Now in VBA, we had access to the ThisDrawing object. This is quite useful, so it would be useful to have the same functionality here. Now that we have access to the AutoCAD® object model, we can add a simple Get procedure to retrieve the object we want. Put the following code inside the Class (between Public Class Class1 and End Class):
Public ReadOnly Property ThisDrawing As AcadDocument Get Return Autodesk.AutoCAD®.ApplicationServices.Application.DocumentManager.MdiActiveDocument.AcadDocument End Get End Property
Now we can use ThisDrawing anywhere within the class as we could in VBA.
Writing our first AutoCAD® Function
Everything is in place now to start producing our own AutoCAD® commands. If you have any VBA code you want to transfer across, you should now be able to paste them into this class. Here’s one that I wrote recently as an example. The code adds a border to MTEXT, and the only difference between this code and VBA code is that I’ve made use of the .NET Try/Catch statement, which is better for error trapping than previous methods in VBA:
Public Sub CreateMTextBorder() Dim ent As AcadEntity Dim pnt As Object Try ThisDrawing.Utility.GetEntity(ent, pnt, "Pick MTEXT to add a border to") Dim mt As AcadMText mt = ent Dim Min As Object, Max As Object Dim Coords(7) As Double mt.GetBoundingBox(Min, Max) Coords(0) = Min(0) - 1 Coords(1) = Min(1) - 1 Coords(2) = Max(0) + 1 Coords(3) = Min(1) - 1 Coords(4) = Max(0) + 1 Coords(5) = Max(1) + 1 Coords(6) = Min(0) - 1 Coords(7) = Max(1) + 1 If ThisDrawing.ActiveSpace = AcActiveSpace.acModelSpace Then ThisDrawing.ModelSpace.AddLightWeightPolyline(Coords).Closed = True Else ThisDrawing.PaperSpace.AddLightWeightPolyline(Coords).Closed = True End If Catch ThisDrawing.Utility.Prompt("Invalid Selection") End Try End Sub
Make sure that your subroutine is declared Public as opposed to Private, so that it will be visible by AutoCAD®. Also, there is one final piece of code we need to add to make this visible by AutoCAD®. We need to add some META data before the subroutine, which tells AutoCAD® that the subroutine is callable directly from AutoCAD®. This is where we assign our subroutine a Command Name for our AutoCAD® Command Line. Add the following code on the line before Public Sub CreateMTextBorder():
Whatever we put in the brackets will be the command that we type into the AutoCAD® command line.
Our class is now complete, and is ready to be compiled into a DLL file for use with AutoCAD®.
Under the debug menu, we can select Build to create our .dll, but if we do it now the NETLOAD command in AutoCAD® will fail to load the .dll file. This is because the .dll file must be built on the same version of the .NET framework as the version of AutoCAD® you are using. AutoCAD® 2011 is built on version 3.5 of the .NET framework, so we need to tell VB to compile our class using this version.
- Go to project properties as we did before for adding references.
- Click on the Compile Tab.
- At the bottom, click on Advanced Compile Options.
- At the bottom of the Advance Compiler Settings dialog box, select the Target Framework .NET Framework 3.5.
- Click OK. This usually requires closing and reopening the project afterwards.
Now we can build our .dll file based on the same .NET Framework as AutoCAD®, which should make it compatable. It is useful to have the Output Window open, so that we can grab the location of the compiled .dll file once the build is complete. You can open this window by going Debug > Windows > Output. Go Debug > Build, and this will compile the .dll file. Copy the path of the .dll file from the Output window, and open AutoCAD®.
Type NETLOAD into the command line. This is the command for loading .NET projects. You will be prompted to supply a path, so paste in the path to the .dll file we just created. If it worked, it should silently finish the command, i.e., you shouldn’t get any error messages. Now that the .dll is loaded you should be able to type in the command specified in the META data to call the subroutine inside the .dll, in the case if this example, MTEXTB.
I would like to take this opporunity to suggest that you subscribe to my blog – if you work with AutoCAD® I have many tips and tricks on the tip of my tongue. I guaranteee that you will find it a valuable resource.