Creating a Drawing with Visual Basic
Before we complete our discussion of COM, let us see how VB and COM can be used to pass data from one application to another. Example 1-2 is a short but interesting VB procedure that reads some text data from an Excel
Example 1-2. Visual Basic Automation
Sub Main() Dim xAP As Excel.Application Dim xWB As Excel.Workbook Dim xWS As Excel.Worksheet Set xAP = Excel.Application Set xWB = xAP.Workbooks.Open("C:\A2K2_VBA\IUnknown.xls") Set xWS = xWB.Worksheets("Sheet1") MsgBox "Excel says: """ & Cells(1, 1) & """" Dim A2K As AcadApplication Dim A2Kdwg As AcadDocument Set A2K = CreateObject("AutoCAD.Application") Set A2Kdwg = A2K.Application.Documents.Add MsgBox A2K.Name & " version " & A2K.Version & _ " is running." Dim Height As Double Dim P(0 To 2) As Double Dim TxtObj As AcadText Dim TxtStr As String Height = 1 P(0) = 1: P(1) = 1: P(2) = 0 TxtStr = Cells(1, 1) Set TxtObj = A2Kdwg.ModelSpace.AddText(TxtStr, _ P, Height) A2Kdwg.SaveAs "C:\A2K2_VBA\IUnknown.dwg" A2K.Documents.Close A2K.Quit Set A2K = Nothing xAP.Workbooks.Close xAP.Quit Set xAP = Nothing End Sub
spreadsheet, creates an AutoCAD drawing, places the text into the drawing, and then saves the drawing. What is interesting is that except for the two message boxes that are included to let you know when Excel and AutoCAD are running, neither application is ever visible. Before you can run this program, you will need to create an Excel worksheet with some text in the first cell (A1), then save the workbook to a desired location and exit from Excel. (Any text is OK, but "Hello, World!" is the traditional choice.)
Setting Available References
In Visual Basic 6.0, which we are using for Example 1-2, you set references to the available type libraries using a dialog box accessed through the Project'References menu. The VB References dialog is illustrated in Figure 1-4. [In AutoCAD VBA you use an identical dialog box, but it is accessed using the Tools'References menu in the Visual Basic Editor. AutoCAD's Interactive Development Environment (IDE) is discussed in Chapter 2.] For our example procedure, we need references to the AutoCAD 2000 and Microsoft Excel type libraries, which have been checked as shown in Figure 1-4.
Figure 1-4 References Dialog
Writing the Procedure
The procedure, which is called Main, is in five paragraphs. (Normally, a VB project has a startup form. We do not use any forms in this example, so VB requires that the Sub procedure be called Main.) The first paragraph sets up Excel. You need to declare (Dim statements) three object variables for the Excel components you are going to call: Application, Workbook, and Worksheet. Then the Set statement is used to assign an object reference to each variable. Setting xAP invokes Excel. Setting xWB calls the Excel Workbooks property with the Open method to open a file containing the desired spreadsheet. Here we've used the name C:\IUnknown.xls. You should change this to the path and file name of the Excel Workbook you created earlier. Setting xWS to the name of the specific worksheet (using the default name Sheet1) completes this sequence. The standard VB/VBA message box (MsgBox will become very familiar throughout the course of this book) presents a dialog box that displays the text being processed.
The second paragraph does the same thing for AutoCAD. A2K is the object variable for the AutoCAD application object (AcadApplication) and A2Kdwg names the instance of AcadDocument. (We discuss Application, which is the root object of AutoCAD's object model, together with the Documents collection and Document object in Chapter 4.) Using the Set statement once again, we instantiate the AutoCAD.Application and create a new drawing using the Add method on the Documents collection. A second MsgBox tells us that AutoCAD is now running.
The actual work is done in the third and central paragraph of our VB program, where we declare the variables required for creating a Text object in AutoCAD. (The Text object, along with AutoCAD's other two dozen graphic objects, or entities, is covered in Chapter 9.) Briefly, we need numeric variables to specify the height of the text and the point at which it is to be inserted (an array for its X, Y, and Z coordinates). Also, we need an object variable for the Text object and a string to contain the text itself. We specify the height and the insertion point by assigning values to Height and the P( ) array. Then we assign the string value of Cells(1, 1) to TextStr using Excel's Cells method, and finally, we set the Text object (TxtObj) using AutoCad's AddText method. We leave ModelSpace as a little mystery for the time being.
One major difference between VB and VBA that we might mention at this point is use of the A2Kdwg object variable to represent the active drawing. In VBA the active drawing can always be referred to as ThisDrawing. This is not the case in VB, where you must define explicit variables for the AutoCAD application and the current document.
In the fourth paragraph we name and save our new drawing in the desired location using AutoCAD's SaveAs method. Here we've used the name C:\IUnknown.dwg. We then Close this single new member of the Documents collection and Quit the application. In the final paragraph we use the corresponding Excel methods to do the same thing to our spreadsheet. In both cases, setting the application object variables to Nothing releases the memory allocated to those processes.