ActiveX-VBA Developers Guide
ActiveX-VBA Developers Guide
February 2006
Autodesk Trademarks
The following are registered trademarks of Autodesk, Inc., in the USA and other countries: 3D Studio, 3D Studio MAX, 3D Studio VIZ, 3ds Max, ActiveShapes, Actrix, ADI, AEC-X, ATC, AUGI, AutoCAD, AutoCAD LT, Autodesk, Autodesk Envision, Autodesk Inventor, Autodesk Map, Autodesk MapGuide, Autodesk Streamline, Autodesk WalkThrough, Autodesk World, AutoLISP, AutoSketch, Backdraft, Bringing information down to earth, Buzzsaw, CAD Overlay, Character Studio, Cinepak, Cinepak (logo), Civil 3D, Cleaner, Combustion, Design Your World, Design Your World (logo), EditDV, Education by Design, Gmax, Heidi, HOOPS, i-drop, IntroDV, Lustre, Mechanical Desktop, ObjectARX, Powered with Autodesk Technology (logo), ProjectPoint, RadioRay, Reactor, Revit, Visual, Visual Construction, Visual Drainage, Visual Hydro, Visual Landscape, Visual Roads, Visual Survey, Visual Toolbox, Visual Tugboat, Visual LISP, Volo, WHIP!, and WHIP! (logo). The following are trademarks of Autodesk, Inc., in the USA and other countries: AutoCAD Learning Assistance, AutoCAD Simulator, AutoCAD SQL Extension, AutoCAD SQL Interface, AutoSnap, AutoTrack, Built with ObjectARX (logo), Burn, CAiCE, Cinestream, Cleaner Central, ClearScale, Colour Warper, Content Explorer, Dancing Baby (image), DesignCenter, Design Doctor, Designer's Toolkit, DesignKids, DesignProf, DesignServer, Design Web Format, DWF, DWFit, DWG Linking, DWG TrueConvert, DWG TrueView, DXF, Extending the Design Team, GDX Driver, Gmax (logo), Gmax ready (logo), Heads-up Design, Incinerator, jobnet, LocationLogic, ObjectDBX, Plasma, PolarSnap, Productstream, RealDWG, Real-time Roto, Render Queue, Topobase, Toxik, Visual Bridge, Visual Syllabus, and Wiretap.
Third-Party Trademarks
All other brand names, product names, or trademarks belong to their respective holders.
1 2 3 4 5 6 7 8 9 10
RAL DESIGN RAL, Sankt Augustin, 2002 RAL CLASSIC RAL, Sankt Augustin, 2002 Representation of the RAL Colors is done with the approval of RAL Deutsches Institut fr Gtesicherung und Kennzeichnung e.V. (RAL German Institute for Quality Assurance and Certification, re. Assoc.), D-53757 Sankt Augustin." Typefaces from the Bitstream typeface library copyright 1992. Typefaces from Payne Loving Trust 1996. All rights reserved. Printed and Help produced with Idiom WorldServer.
GOVERNMENT USE
Use, duplication, or disclosure by the U.S. Government is subject to restrictions as set forth in FAR 12.212 (Commercial Computer Software-Restricted Rights) and DFAR 227.7202 (Rights in Technical Data and Computer Software), as applicable.
Contents
Chapter 1
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Overview of AutoCAD ActiveX Technology . . . . . . . . Overview of AutoCAD Visual Basic for Applications (VBA) Interface . . . . . . . . . . . . . . . . . . . . . . . . . . How VBA Is Implemented in AutoCAD . . . . . . . AutoCAD ActiveX and VBA Together . . . . . . . . . . . How This Guide Is Organized . . . . . . . . . . . . . . . For More Information . . . . . . . . . . . . . . . . . . . Sample Code . . . . . . . . . . . . . . . . . . . . . . . . Migrate Automation Projects . . . . . . . . . . . . . . . . New Objects . . . . . . . . . . . . . . . . . . . . . Changed Items . . . . . . . . . . . . . . . . . . . . How to Migrate Projects . . . . . . . . . . . . . . . . . . . . . . .1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 .2 .4 .4 .5 .5 .6 .6 .6 .7
Chapter 2
Use the Macros Dialog Box . . . . . . Run a Macro . . . . . . . . . . . . . . Edit a Macro . . . . . . . . . . . . . . Step into a Macro . . . . . . . . . . . Set the Project Options . . . . . . . . Edit Your Projects with the VBA IDE . . . . View Project Information . . . . . . . Define the Components in a Project . Import Existing Components . . . . . Edit Components . . . . . . . . . . . Name Your Project . . . . . . . . . . Save Your Project . . . . . . . . . . . Reference Other VBA Projects . . . . . Set the VBA IDE Options . . . . . . . Perform an Introductory Exercise . . . . . More Information . . . . . . . . . . . . . AutoCAD VBA Project Terms . . . . . . . . AutoCAD VBA Commands . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. 13 . 14 . 15 . 15 . 15 . 16 . 17 . 17 . 19 . 19 . 21 . 22 . 22 . 23 . 25 . 26 . 27 . 28
Chapter 3
Chapter 4
vi | Contents
Open, Save, and Close Drawings . . . . . . . . . . . . . Set AutoCAD Preferences . . . . . . . . . . . . . . . . . Database Preferences . . . . . . . . . . . . . . . . Control the Application Window . . . . . . . . . . . . . Control the Drawing Windows . . . . . . . . . . . . . . Position and Size the Document Window . . . . . Use Zoom . . . . . . . . . . . . . . . . . . . . . . Use Named Views . . . . . . . . . . . . . . . . . . Use Tiled Viewports . . . . . . . . . . . . . . . . . Update the Geometry in the Document Window . Reset Active Objects . . . . . . . . . . . . . . . . . . . . Set and Return System Variables . . . . . . . . . . . . . Draw with Precision . . . . . . . . . . . . . . . . . . . . Adjust Snap and Grid Alignment . . . . . . . . . . Use Ortho Mode . . . . . . . . . . . . . . . . . . Draw Construction Lines . . . . . . . . . . . . . . Calculate Points and Values . . . . . . . . . . . . . Calculate Areas . . . . . . . . . . . . . . . . . . . Prompt for User Input . . . . . . . . . . . . . . . . . . . GetString Method . . . . . . . . . . . . . . . . . . GetPoint Method . . . . . . . . . . . . . . . . . . GetKeyword Method . . . . . . . . . . . . . . . . Control User Input . . . . . . . . . . . . . . . . . Access the AutoCAD Command Line . . . . . . . . . . . Work with No Documents Open . . . . . . . . . . . . . Import Other File Formats . . . . . . . . . . . . . . . . Export to Other File Formats . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. 47 . 48 . 50 . 50 . 51 . 51 . 52 . 55 . 56 . 58 . 59 . 59 . 60 . 60 . 61 . 62 . 64 . 65 . 66 . 67 . 67 . 68 . 68 . 69 . 70 . 71 . 71
Chapter 5
vii | Contents
Mirror Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Array Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Move Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Rotate Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Delete Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Scale Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Transform Objects . . . . . . . . . . . . . . . . . . . . . . . . . 106 Extend and Trim Objects . . . . . . . . . . . . . . . . . . . . . 109 Explode Objects . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Edit Polylines . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Edit Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Edit Hatches . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Use Layers, Colors, and Linetypes . . . . . . . . . . . . . . . . . . . . 117 Work with Layers . . . . . . . . . . . . . . . . . . . . . . . . . 118 Work with Colors . . . . . . . . . . . . . . . . . . . . . . . . . 122 Work with Linetypes . . . . . . . . . . . . . . . . . . . . . . . . 123 Assign Layers, Colors, and Linetypes to Objects . . . . . . . . . 126 Save and Restore Layer Settings . . . . . . . . . . . . . . . . . . . . . 128 Understand How AutoCAD Saves Layer Settings . . . . . . . . . 129 Use the LayerStateManager to Manage Layer Settings . . . . . . 130 Add Text to Drawings . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Work with Text Styles . . . . . . . . . . . . . . . . . . . . . . . 135 Use Line Text (Text) . . . . . . . . . . . . . . . . . . . . . . . . 140 Use Multiline Text (Mtext) . . . . . . . . . . . . . . . . . . . . 143 Use Unicode Characters, Control Codes, and Special Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Substitute Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Check Spelling . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Chapter 6
viii | Contents
Create Leaders and Annotation . . . . . . . Create Leader Lines . . . . . . . . . . Add the Annotation to a Leader Line . Leader Associativity . . . . . . . . . . Edit Leader Associativity . . . . . . . . Edit Leaders . . . . . . . . . . . . . . Use Geometric Tolerances . . . . . . . . . . Create Geometric Tolerances . . . . . Edit Tolerances . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Chapter 7
Chapter 8
ix | Contents
Handle Application Level Events . . . . . . . . . . . . . . . . . . Enable Application Level Events . . . . . . . . . . . . . . . Handle Document Level Events . . . . . . . . . . . . . . . . . . . Enable Document Level Events in Environments Other Than VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Code Document Level Events in Environments Other Than VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Code Document Level Events in VBA . . . . . . . . . . . . . Handle Object Level Events . . . . . . . . . . . . . . . . . . . . . Enable the Object Level Event . . . . . . . . . . . . . . . . .
Chapter 9
Chapter 10
x | Contents
Chapter 11
Chapter 12
Chapter 13
xi | Contents
Reference the ActiveX Object Library of Other Applications . . . . . . . . . . . . . . . . . . . Create an Instance of the Other Application . . . Program with Objects from Other Applications . Access Windows APIs from VBA . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
Chapter 14
Chapter 15
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
xii | Contents
Introduction
This introduction describes the concept of exposing AutoCAD objects through an ActiveX Automation interface and programming those objects using the Visual Basic for Applications programming environment.
2 | Chapter 1 Introduction
AutoCAD programmatically, you already have a good understanding of the AutoCAD facilities. However, you will find the VBA object-based approach to be quite different from that of AutoLISP. The second element is the AutoCAD ActiveX Automation interface, which establishes messages (communication) with AutoCAD objects.Programming in VBA requires a fundamental understanding of ActiveX Automation. A description of the AutoCAD ActiveX Automation interface can be found in the ActiveX and VBA Reference. Even the experienced VB programmer will find the AutoCAD ActiveX Automation interface invaluable for understanding and developing AutoCAD VBA applications. The third element is the VBA programming environment, which has its own set of objects, keywords, constants, and so forth that provides program flow, control, debugging, and execution. Microsoft's own extensive Help for VBA is included with the AutoCAD VBA Help and is accessible from the VBA IDE by any of the following methods: Pressing F1 on the keyboard Choosing Help from the VBA IDE menu bar Clicking the Question Mark icon on the VBA IDE toolbar
You can load a .NET application using the NETLOAD command in AutoCAD.
Additional information about using a .NET application with AutoCAD is available from the Developer Center section of the Autodesk website
4 | Chapter 1 Introduction
Sample Code
This manual and the ActiveX and VBA Reference together contain over 800 example VBA subroutines that demonstrate the usage of ActiveX methods, properties, and events. There are also many sample applications provided in the AutoCAD Sample directory. These sample applications show a wide range of fuctionality, from extracting AutoCAD drawing data into Microsoft Excel spreadsheets to drawing and performing stress analysis on an electrical transmission tower. These samples also show how to combine the versatility of the Visual Basic for Applications programming environment with the power of the AutoCAD ActiveX interface to create customized applications. Additionally, example code in the ActiveX and VBA Developer's Guide and ActiveX and VBA Reference can be copied from the Help files, pasted directly into the AutoCAD VBA environment, and then executed with one requirement: the current active drawing in AutoCAD must be a blank drawing open to model space. To run the examples from the Help files 1 Copy the example from the Help file into an empty VBA code module. 2 Verify that AutoCAD has a blank drawing open to model space. 3 Open the Macros dialog box by entering the command VBARUN. 4 Choose the macro and press Run. More information on running macros and the Macros dialog box is available in the topic Run a Macro.
New Objects
The following objects are new in AutoCAD 2007. For more information about these objects, see the ActiveX and VBA Reference and the Object Browser in the VBA IDE. SortentsTable. Contains and manipulates draw order information. Table. Adds and modifies tables in a drawing. TableStyle. Adds and modifies formatting for tables, such as grid visibility, lineweight, and color. In addition, AutoCAD 2007 contains objects for the automation of the Sheet Set Manager. For information about these objects, see the Sheet Set Objects Reference.
Changed Items
This section describes existing items that have changed. Changed Items
AutoCAD 2004 item BeginClose event Layer object Layers collection AutoCAD 2007 item BeginDocClose event Layer object Layers collection Description of change You can use the BeginDocClose event to prevent a drawing from being closed Addition of the Description property and Used property Addition of the GenerateUsageData method
6 | Chapter 1 Introduction
Changed Items
ModelSpace collection PaperSpace collection Block object ModelSpace collection PaperSpace collection Block object Addition of the AddTable method to all the collections and to the object; addition of the Path property to the Block object
MText object, MText object, Text object Addition of the BackgroundFill property to the Text object MText object; addition of FieldCode method to the MText object and Text object Plot object Plot object The BatchPlotProgress property and StartBatchMode property are obsolete. It is recommended that Microsoft .NET applications be used for batch plotting. The DisplayPlotPreview method no longer supports partial preview Addition of the PlotLogFilePath property, PageSetupOverridesTemplateFile property, and QNewTemplateFile property
PreferencesOutput PreferencesOutput object Addition of the AutomaticPlotLog property, object DefaultPlotToFilePath property, and ContinuousPlotLog property Viewport object View object Viewport object Addition of the ModelView property, SheetView property, LabelBlockId property, HasSheetView property, and SyncModelView method Addition of the CategoryName property, LayoutId property, LayerState property, and HasVpAssociation property
View object
automation project uses version-independent ProgIDs, change the project to use version-dependent ProgIDs.
8 | Chapter 1 Introduction
This chapter introduces you to AutoCAD Visual Basic for Applications (VBA) projects and the VBA interactive development environment (IDE). Although most VBA environments are similar in behavior, the AutoCAD VBA IDE has some unique features. There are also several AutoCAD commands that can be used to load projects, run projects, or open the VBA IDE. This chapter defines the use of VBA projects, VBA commands, and the VBA IDE in general.
At any given time, users can have both embedded and global projects loaded into their AutoCAD session. AutoCAD VBA projects are not binary compatible with standalone Visual Basic 6 projects. However, the forms, modules, and classes can be exchanged between projects using the IMPORT and EXPORT VBA commands in the VBA IDE. For more information about the VBA IDE, see Edit Your Projects with the VBA IDE on page 16. The use of Visual Studio .NET to drive and customize AutoCAD through COM Automation is supported.
You can also load a project file using one of the following methods: Enter the VBALOAD command, which opens the Open VBA Project dialog box. Drag a DVB file from Windows Explorer and drop it into an open drawing in the AutoCAD window.
Virus Alert
Each time you load a project you are given the option of enabling or disabling the code within that project as a protection against viruses. If you enable the code, viruses in the code can begin executing. If you disable the code, the project will still be loaded, but all code within that project is prevented from running. The virus alert is not displayed when you load a project by dragging a DVB file from Windows Explorer and dropping it into an open drawing in the AutoCAD window. More information about the virus alert is available in Set the Project Options on page 15.
Unload a Project
Unloading a project frees up memory and keeps the list of loaded projects at a length that is easy to manage. You cannot unload embedded projects or projects that are referenced by other loaded projects. To unload a VBA project You can unload a VBA project by selecting the project you want to unload and choosing Unload, or by using the VBAUNLOAD command, which prompts you for the project to be unloaded.
To embed a project in an AutoCAD drawing 1 Open the VBA Manager and select the project you want to embed. 2 Choose Embed.
To create a new macro 1 Open the Macros dialog box and enter the name for the new macro. 2 In the Macros In drop-down list, select a project to create the new macro in. 3 Choose Create. If a macro with the specified name already exists, you will be asked if you want to replace the existing macro. If you select Yes at the prompt, the code in the existing macro will be deleted and a new, empty macro will be created with the specified name. If you select No at the prompt, you will be returned to the Macros dialog box to enter a new name for the macro. If you select Cancel at the prompt, the Macros dialog box will be dismissed and no new macro will be created. To delete a macro 1 Open the Macros dialog box and select the macro to delete. 2 Choose Delete. You will be prompted to confirm the delete. 3 At the prompt, choose Yes to delete the macro, or No to cancel the delete.
Run a Macro
Running a macro executes the macro code within the context of the current AutoCAD session. The current active drawing is considered to be the open drawing that has the focus when macro execution begins. All VBA references to the ThisDrawing object will refer to the current active drawing for macros in global projects. For macros in embedded projects, the ThisDrawing object always refers to the drawing in which the macro is embedded. To run a macro from the Macros dialog box 1 Open the Macros dialog box and select the macro to run. 2 Choose Run. To run a macro from the VBA IDE From the Run menu, use the Run Macro menu option. If no macro or form is current, a dialog box is displayed, allowing you to choose the macro to run.
If a given macro is current (the cursor is in a procedure), that macro will be executed.
Edit a Macro
Editing a macro will open the VBA IDE with the chosen macro open in the Code window. For more information on editing macros in the VBA IDE see Edit Your Projects with the VBA IDE on page 16. To edit a macro 1 Open the Macros dialog box and select the macro to edit. 2 Choose Edit.
Allow Break on Errors This option allows VBA to enter Break mode when an error is encountered. Break mode is a temporary suspension of program execution in the interactive development environment. In Break mode, you can examine, debug, reset, step through, or continue program execution. When this option is enabled, unhandled errors found during the execution of a VBA macro will suspend the execution of the macro and display the VBA IDE at the point of the error in the macro. When this option is disabled, untrapped errors found during the execution of a VBA macro will display a message box alerting you to the error, and then end execution of the macro. Enable Macro Virus Protection The virus protection mechanism displays a built-in warning message whenever you open a drawing that may contain macro viruses. To set the AutoCAD VBA project options 1 From the Tools menu choose Macro Macros to open the VBA Macros dialog box. 2 From the VBA Macros dialog box, choose Options to open the Options dialog box. 3 From the Options dialog box, select the options you want to enable. 4 Choose OK.
The Project window is visible by default. If it is not visible, select Project window from the View menu, or press CTRL+R.
Objects
The object component represents the type of object, or document, that the VBA code will access. For AutoCAD VBA projects, this object represents the current AutoCAD drawing.
Forms
The form component contains the custom dialog boxes you constructed for use with your project.
Standard Modules
The code module component contains your generic procedures and functions. A standard module is also referred to as a code module, or as simply a module.
Class Modules
The class module component contains all your own objects, which are defined as classes.
References
The reference component contains all your references to other projects or libraries.
Edit Components
You can edit standard modules, class modules, and forms in the VBA IDE. Standard and class modules are edited in a Code window. Forms are edited in the UserForm window using a special toolbox. You can open as many Code windows as you have modules, so you can easily view the code in different forms or modules, and copy and paste between them. To edit a component in your project 1 In the Project window of the VBA IDE, select the component you want to edit. 2 Select the View Code button in the Project window to open a Code window.
3 Select the View Object button in the Project window to open a UserForm window and associated toolbox. To access the code associated with a form To access the code associated with a control, double-click on any control in the Form window. The code associated with that control will open in a Code window.
To add a control simply drag the desired control from the toolbox and place it on the form. You can set your controls to align with the grid of your form from the General tab of the Options dialog box. You can view the form grid and determine the size of the gridlines from the General tab of the Options dialog box. (See Set the VBA IDE Options on page 23 for more information on the Options dialog box.) Each form you design will automatically have a Maximize, Minimize, and Close button. These buttons have already been implemented for you. To add code to the control, simply double-click on the control once it has been placed on the form. This will open a Code window for the control.
To change the file name for a project 1 In the VBA IDE, select the Save option from the File menu. 2 In the Save As dialog box, enter the new name and location for the project file.
then reference the library when needed. This keeps the shared code centrally located and supported, while allowing a large number of developers to utilize the code. Once another project has been successfully referenced, you will notice a new folder in the Projects window of the VBA IDE. This new folder is titled References and contains the name of the project referenced. Once you have referenced a project, you can use any public code or form component in that project. When a project that references another project is loaded into AutoCAD, the referenced project is automatically loaded into AutoCAD as well. The referenced project cannot be closed until all projects that reference it are closed first. You cannot make circular references. That is, you cannot reference a project that contains a reference back to the first project. If you accidentally create a circular reference, you will be notified by VBA. Project referencing is a standard feature of Microsoft VBA. There is no additional work in AutoCAD to extend this functionality. You can find more information on referencing projects in the Microsoft VBA Help. You can open the Microsoft VBA Help from the Help menu in the VBA IDE. NOTE You cannot reference embedded projects or VBA projects from other applications. To reference another VBA project 1 In the Project window of the VBA IDE, select the project to which you will be adding the reference. 2 From the Tools menu, select the References option to open the References dialog box. 3 From the References dialog box, press the Browse button to open the Add Reference dialog box. 4 From the Add Reference dialog box, select the project file you want to reference and then press the Open button. 5 From the Add Reference dialog box, select the OK button to complete the reference addition.
The Options dialog box contains four tabs: Editor, Editor Format, General, and Docking.
Editor
The Editor tab specifies the Code window and Project window settings. Code settings include Auto Syntax Check Require Variable Declaration Auto List Member Auto Quick Info Auto Data Tips Auto Indent Tab Width Window settings include Drag and Drop Text Editing Default to Full Module View Procedure Separator Display
Editor Format
The Editor Format tab specifies the appearance of your code. You can Change color of the code Change text list items Change foreground Change background Change margin indicators Change text font and size Display or hide the margin indicator
General
The General tab specifies the settings, error handling, and compile settings for your current VBA project. You can Change the grid settings for the form grid Display or hide tooltips Set the automatic collapse of windows Choose to receive state loss notifications Determine how errors are handled Set the project to compile on demand or perform background compilations
Docking
The Docking tab allows you to choose which windows you want to be dockable.
4 When prompted for the procedure information, enter a name such as HelloWorld. Make sure the Type selected is Sub, and the Scope selected is Public. 5 Choose OK. 6 Enter the following code (that opens a new drawing) between the lines Public Sub HelloWorld() and End Sub.
ThisDrawing.Application.Documents.Add
Enter the following code (that creates the text string and defines its insertion location) immediately following the code entered in step 6.
Dim insPoint(0 To 2) As Double 'Declare insertion point Dim textHeight As Double 'Declare text height Dim textStr As String 'Declare text string Dim textObj As AcadText 'Declare text object insPoint(0) = 2 'Set insertion point x coordinate insPoint(1) = 4 'Set insertion point y coordinate insPoint(2) = 0 'Set insertion point z coordinate textHeight = 1 'Set text height to 1.0 textStr = "Hello World!" 'Set the text string 'Create the Text object Set textObj = ThisDrawing.ModelSpace.AddText _ (textStr, insPoint, textHeight)
Enter the code (that saves the drawing) immediately following the code entered in step 7.
ThisDrawing.SaveAs("Hello.dwg")
Run your program by selecting the Run Sub/UserForm option from the Run menu in the VBA IDE. When the program finishes running, bring the AutoCAD application to the front. You should see your text Hello World! visible in your drawing. The drawing name should be Hello.dwg.
More Information
More information on the VBA IDE and the VBA programming language is available in the Help files provided by Microsoft. To access the Microsoft Help files, choose Microsoft Visual Basic Help from the Help menu in the VBA IDE.
To use AutoCAD ActiveX Automation effectively you should be familiar with the AutoCAD entities, objects, and features relating to the type of application you are developing. The greater your knowledge of an object's graphical and nongraphical properties, the easier it is for you to manipulate them through AutoCAD ActiveX Automation. Remember that the AutoCAD ActiveX Automation Help file is availablejust press F1. If you are having trouble with a particular object, method, or property, highlight the object, method, or property in the VBA IDE and press F1.
The Application object is also the Global object for the ActiveX interface. This means that all the methods and properties for the Application object are available in the global name space.
Linetypes, and TextStyles. The Document object also provides access to the Plot and Utility objects. To access drawing properties, use the SummaryInfo property of the Document object.
Each collection has a method for adding an object to the collection. Most collections use the Add method for this purpose. However, entity objects are usually added using a method titled Add<Entityname>. For example, to add a line you would use the AddLine method. Collections also have some other methods and properties in common. The Count property can be used to obtain a zero-based count of the objects in a collection. The Item method can be used to obtain any object within a collection.
The Plot object provides access to settings in the Plot dialog box and gives an application the ability to plot the drawing using various methods. For more information on plotting, see Plot Your Drawing on page 243. The Utility object provides user input and conversion functions. The user input functions are methods that prompt the user on the AutoCAD command line for input of various types of data, such as strings, integers, reals, points, and so forth. The conversion functions are methods that operate on AutoCAD-specific data types such as points and angles, in addition to string and number handling. For more information on the user input functions, see Prompt for User Input on page 66.
To reference the objects through a user-defined variable, define the variable as the desired type, then set the variable to the appropriate object. For example, the following code defines a variable (moSpace) of typeAcadModelSpace and sets the variable equal to the current model space:
Dim moSpace As AcadModelSpace Set moSpace = ThisDrawing.ModelSpace
The following statement then adds a line to the model space using the user-defined variable:
Dim startPoint(0 To 2) As Double, endPoint(0 To 2) As Double Dim LineObj as AcadLine startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0 endPoint(0) = 30: endPoint(1) = 20: endPoint(2) = 0 Set LineObj = moSpace.AddLine(startPoint,endPoint)
Retrieving the first entity in model space The following example returns the first entity object in model space. Similar code can do the same for paper space entities. Note that all drawing objects can be defined as AcadEntity objects:
Sub Ch2_FindFirstEntity() ' This example returns the first entity in model space On Error Resume Next Dim entity As AcadEntity If ThisDrawing.ModelSpace.count <> 0 Then Set entity = ThisDrawing.ModelSpace.Item(0) MsgBox entity.ObjectName + _ " is the first entity in model space." Else MsgBox "There are no objects in model space." End If End Sub
Collection Objects
A Collection object is a predefined object that contains (is a parent object for) all instances of a similar object.The following is a list of collection objects: Collection Contains all documents open in the current AutoCAD session. ModelSpace Collection Contains all graphical objects (entities) in model space. PaperSpace Collection Contains all graphical objects (entities) in the active paper space layout.
Collection Objects | 35
Block Object Contains all entities within a specific block definition. Blocks Collection Contains all blocks in the drawing. Dictionaries Collection Contains all dictionaries in the drawing. DimStyles Collection Contains all dimension styles in the drawing. FileDependencies Collection Contains all items in the File Dependency List. Groups Collection Contains all groups in the drawing. Hyperlinks Collection Contains all hyperlinks for a given entity. Layers Collection Contains all layers in the drawing. Layouts Collection Contains all layouts in the drawing. Linetypes Collection Contains all linetypes in the drawing. MenuBar Collection Contains all menus currently displayed in AutoCAD. MenuGroups Collection Contains all menus and toolbars currently loaded in AutoCAD. PlotConfigurations Collection Contains named plot settings in the drawing.
RegisteredApplications Collection Contains all registered applications in the drawing. SelectionSets Collection Contains all selection sets in the drawing. TextStyles Collection Contains all text styles in the drawing. UCSs Collection Contains all user coordinate systems (UCS's) in the drawing. Views Collection Contains all views in the drawing. Viewports Collection Contains all viewports in the drawing.
Access a Collection
Most collection objects are accessed through the Document object. The Document object contains a property for each of the Collection objects. For example, the following code defines a variable and sets it to the Layers collection of the current drawing:
Dim layerCollection as AcadLayers Set layerCollection = ThisDrawing.Layers
The Documents collection, MenuBar collection, and MenuGroups collection are accessed through the Application object. The Application object contains a property for each of these collections. For example, the following code defines a variable and sets it to the MenuGroups collection for the application:
Dim MenuGroupsCollection as AcadMenuGroups Set MenuGroupsCollection = ThisDrawing.Application.MenuGroups
Collection Objects | 37
NOTE Do not use the entity edit methods (Copy, Array, Mirror, and so forth) on any object while simultaneously iterating through a collection using the For Each mechanism. Either finish your iteration before you attempt to edit an object in the collection or create a temporary array and set it equal to the collection. Then you can iterate through the copied array and perform your edits. Iteratethrough the Layers collection The following example iterates through a collection and displays the names of all layers in the collection:
Sub Ch2_IterateLayer() ' Iterate through the collection On Error Resume Next Dim I As Integer Dim msg As String msg = "" For I = 0 To ThisDrawing.Layers.count - 1 msg = msg + ThisDrawing.Layers.Item(I).Name + vbCrLf Next MsgBox msg End Sub
Find the layer named MyLayer The following example refers to layer named MyLayer, and issues a message if the layer does not exist:
Sub Ch2_FindLayer() ' Use the Item method to find a layer named MyLayer On Error Resume Next Dim ABCLayer As AcadLayer Set ABCLayer = ThisDrawing.Layers("MyLayer") If Err <> 0 Then MsgBox "The layer 'MyLayer' does not exist." End If
End Sub
Once an object has been deleted, you must never attempt to access the object again later in the program.
Type libraries do not store objects; they store information. By accessing a type library, applications and browsers can determine the characteristics of an object, such as the interfaces supported by the object and the names and addresses of the members of each interface. Before you can use the Automation object exposed by an application, you must reference its type library. The reference is automatically set in the VBA IDE. For other interactive development environments you must create a reference to the AutoCAD type library file, acax17enu.tlb, which is located at c:\program files\common files\autodesk shared. To access Sheet Set Manager objects in the VBA IDE or in other environments, you must create a reference to the AcSmComponents17 1.0 type library file, AcSmComponents17.tlb, which is located at c:\program files\common files\autodesk shared. You can use an application's objects without referencing the application's type library. However, it is preferable to add the type library reference for the following reasons: Globally accessible functions may be accessed directly without qualification. Invocation of functions, properties, and methods can be checked at compile time for correctness, and therefore will execute more quickly at runtime. It is possible to declare variables of the types defined in the library, which increases runtime reliability and readability.
What Is a Variant?
A variant is a special data type that can contain any kind of data except fixed-length string data and user-defined types. A variant can also contain the special values Empty, Error, Nothing, and NULL. You can determine how the data in a variant is treated using the VarType or TypeName VBA function. You can use the Variant data type in place of most any data type to work with data in a more flexible way.
(fitPoints, startTan, endTan) ' Zoom in on the newly created spline ZoomAll End Sub
NOTE The registry key for COM application access for AutoCAD 2007 is AutoCAD.Application.17.
Connect to AutoCAD from Visual Basic 6 The following code example uses the Clear and Description properties of Err. If your coding environment does not support these properties, you will need to modify the example appropriately:
Sub Ch2_ConnectToAcad() Dim acadApp As AcadApplication On Error Resume Next Set acadApp = GetObject(, "AutoCAD.Application.17") If Err Then Err.Clear Set acadApp = CreateObject("AutoCAD.Application.17") If Err Then MsgBox Err.Description Exit Sub End If End If MsgBox "Now running " + acadApp.Name + _ " version " + acadApp.Version End Sub
Next, set the document variable to the Document object in the AutoCAD application. The Document object is returned by the ActiveDocument property of the Application object.
Dim acadDoc as AcadDocument Set acadDoc = acadApp.ActiveDocument
From this point on, use the acadDoc variable to reference the current AutoCAD drawing. VBA versus VB Comparison Code Example The following code example demonstrates creating a line in both VBA and VB. Creating a line using VBA:
Sub Ch2_AddLineVBA() ' This example adds a line ' in model space Dim lineObj As AcadLine Dim startPoint(0 To 2) As Double Dim endPoint(0 To 2) As Double ' Define the start and end ' points for the line startPoint(0) = 1 startPoint(1) = 1 startPoint(2) = 0 endPoint(0) = 5 endPoint(1) = 5 endPoint(2) = 0
' Create the line in model space Set lineObj = ThisDrawing. _ ModelSpace.AddLine _ (startPoint, endPoint) ' Zoom in on the newly created line ZoomAll End Sub
46
This chapter describes the fundamentals for developing an application in AutoCAD. It explains how to control and work effectively in the AutoCAD environment.
End Sub
Create a new drawing This example uses the Add method to create a new drawing based on the default template.
Sub Dim Set End Ch3_NewDrawing() docObj As AcadDocument docObj = ThisDrawing.Application.Documents.Add Sub
Save the active drawing This example saves the active drawing under its current name and again under a new name.
Sub Ch3_SaveActiveDrawing() ' Save the active drawing under the current name ThisDrawing.Save ' Save the active drawing under a new name ThisDrawing.SaveAs "MyDrawing.dwg" End Sub
Test if a drawing has unsaved changes This example checks to see if there are unsaved changes and verifies with the user that it is OK to save the drawing (if it is not OK, skip to the end). If OK, use the Save method to save the current drawing, as shown here:
Sub Ch3_TestIfSaved() If Not (ThisDrawing.Saved) Then If MsgBox("Do you wish to save this drawing?", _ vbYesNo) = vbYes Then ThisDrawing.Save End If End If End Sub
PreferencesFiles PreferencesOpenSave PreferencesOutput PreferencesProfiles PreferencesSelection PreferencesSystem PreferencesUser These objects are accessible via the Preferences object. To gain access to the Preferences object, use the Preferences property of the Application object:
Dim acadPref as AcadPreferences Set acadPref = ThisDrawing.Application.Preferences
You can then access any of the specific Preferences objects using the Display, Drafting, Files, OpenSave, Output, Profile, Selection, System, and User properties. Set the crosshairs to full screen
Sub Ch2_PrefsSetCursor() ' This example sets the crosshairs of the AutoCAD drawing cursor ' to full screen. ' Access the Preferences object Dim acadPref As AcadPreferences Set acadPref = ThisDrawing.Application.Preferences ' Use the CursorSize property to set the size of the crosshairs acadPref.Display.CursorSize = 100 End Sub
Database Preferences
In addition to the nine Preferences objects, the DatabasePreferences object contains all the options stored in the drawing. This separate object was provided to make the drawing-stored options available to applications accessing AutoCAD drawings without first starting the AutoCAD application (ObjectDBX applications). The DatabasePreferences object is found under the Document object.
Find the current state of the Application window This example queries the state of the Application window and displays the state in a message box to the user.
Sub Ch3_CurrentWindowState() Dim CurrWindowState As Integer Dim msg As String CurrWindowState = ThisDrawing.Application.WindowState msg = Choose(CurrWindowState, "normal", _ "minimized", "maximized") MsgBox "The application window is " + msg End Sub
Make the Application window invisible The following code uses the Visible property to make the AutoCAD application invisible to the end user.
Sub Ch3_HideWindowState() ThisDrawing.Application.Visible = False End Sub
Position a Document window This example uses the Width and Height properties to set the active Document window to 400 pixels wide by 400 pixels high.
Sub Ch3_SizeDocumentWindow() ThisDrawing.Width = 400 ThisDrawing.Height = 400 End Sub
Use Zoom
A view is a specific magnification, position, and orientation of a drawing. The most common way to change a view is to use one of the many AutoCAD Zoom options, which increases or decreases the size of the image displayed in the graphics area. For more information on zooming in AutoCAD, see Magnify a View (Zoom) in the User's Guide.
Scale a View
If you need to increase or decrease the magnification of the image by a precise scale, you can specify a zoom scale in three ways: Relative to the drawing limits Relative to the current view Relative to paper space units To scale a view, use the ZoomScaled method. This method takes two parameters as input: the scale and the type of scale. The scale is simply a number. How that number gets interpreted by AutoCAD depends on the type of scale you choose. The type of scale determines if the scale value is created relative to the drawing limits, the current view, or the paper space units. To scale relative to the drawing limits, use the constant acZoomScaledAbsolute. To scale the view relative to the current view, use the constant acZoomScaledRelative. To scale relative to paper space units, use the constant acZoomScaledRelativePSpace. Zoom in on the active drawing using a specified scale
Sub Ch3_ZoomScaled() MsgBox "Perform a ZoomScaled using:" & vbCrLf & _ "Scale Type: acZoomScaledRelative" & vbCrLf & _ "Scale Factor: 2", , "ZoomScaled" Dim scalefactor As Double Dim scaletype As Integer scalefactor = 2 scaletype = acZoomScaledRelative ThisDrawing.Application.ZoomScaled scalefactor, scaletype End Sub
Center Objects
Zoom in on the active drawing to a specified center You can move a specific point in your drawing to the center of the graphics area. The ZoomCenter method is useful for resizing an object and bringing it to the center of the viewport. With ZoomCenter, you can specify a scale size by entering a magnification relative to the current view. Zoom in on the active drawing to a specified center The following example shows the effects of using ZoomCenter to display a view at the same size and at twice the size:
Sub Ch3_ZoomCenter() MsgBox "Perform a ZoomCenter using:" & vbCrLf & _ "Center 3, 3, 0" & vbCrLf & _ "Magnification: 10", , "ZoomCenter" Dim Center(0 To 2) As Double Dim magnification As Double Center(0) = 3: Center(1) = 3: Center(2) = 0 magnification = 10 ThisDrawing.Application.ZoomCenter Center, magnification End Sub
See Magnify a View (Zoom) in the User's Guide for illustrations of how zooming works. Zoom in on the active drawing to all contents and to the drawing extents
Sub Ch3_ZoomAll() ' ZoomAll MsgBox "Perform a ZoomAll", , "ZoomAll" ThisDrawing.Application.ZoomAll ' ZoomExtents MsgBox "Perform a ZoomExtents", , "ZoomExtents" ThisDrawing.Application.ZoomExtents End Sub
Delete a View object The following example deletes a View object (viewObj).
Sub Ch3_DeleteView() Dim viewObj As AcadView Set viewObj = ThisDrawing.Views("View1") ' Delete the view viewObj.Delete End Sub
Delete a named view from the Views collection This example deletes a named view from the Views collection.
Sub Ch3_DeleteViewFromCollection() ThisDrawing.Views("View1").Delete End Sub
' Create a new viewport Dim vportObj As AcadViewport Set vportObj = ThisDrawing.Viewports.Add("TEST_VIEWPORT") ' Split vportObj into 2 horizontal windows vportObj.Split acViewport2Horizontal ' Now set vportObj to be the active viewport ThisDrawing.ActiveViewport = vportObj End Sub
In this example: Viewport 1-LowerLeftCorner = (0, .5), UpperRightCorner = (.5, 1) Viewport 2-LowerLeftCorner = (.5, .5), UpperRightCorner = (1, 1) Viewport 3-LowerLeftCorner = (0, 0), UpperRightCorner = (.5, .5) Viewport 4-LowerLeftCorner = (.5, 0), UpperRightCorner = (1, .5)
Split a viewport, then iterate through the windows This example splits a viewport into four windows. It then iterates through all the viewports in the drawing and displays the viewport name and the lower-left and upper-right corner for each viewport.
Sub Ch3_IteratingViewportWindows() ' Create a new viewport and make it active Dim vportObj As AcadViewport Set vportObj = ThisDrawing.Viewports.Add("TEST_VIEWPORT") ThisDrawing.ActiveViewport = vportObj ' Split vport into 4 windows vportObj.Split acViewport4 ' Iterate through the viewports, ' highlighting each viewport and displaying ' the upper right and lower left corners ' for each. Dim vport As AcadViewport Dim LLCorner As Variant Dim URCorner As Variant For Each vport In ThisDrawing.Viewports ThisDrawing.ActiveViewport = vport LLCorner = vport.LowerLeftCorner URCorner = vport.UpperRightCorner MsgBox "Viewport: " & vport.Name & " is now active." & _ vbCrLf & "Lower left corner: " & _ LLCorner(0) & ", " & LLCorner(1) & vbCrLf & _ "Upper right corner: " & _ URCorner(0) & ", " & URCorner(1) Next vport End Sub
Update the display of a single object This example creates a circle. It then updates the circle using the Update method so the circle is visible in AutoCAD.
Sub Ch3_UpdateDisplay() Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 1: center(1) = 1: center(2) = 0 radius = 1 ' Create the circle Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius) ' Update the circle circleObj.Update End Sub
newBasePoint(0) = 1: newBasePoint(1) = 1 ThisDrawing.ActiveViewport.SnapBasePoint = newBasePoint ' Change the snap rotation angle to 30 degrees (0.575 radians) Dim rotationAngle As Double rotationAngle = 0.575 ThisDrawing.ActiveViewport.SnapRotationAngle = rotationAngle ' reset the viewport ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport End Sub
As you move the cursor, a rubber-band line that defines the displacement follows the horizontal or vertical axis, depending on which axis is nearest to the cursor. AutoCAD ignores Ortho mode in perspective views, or when you enter coordinates on the command line or specify an object snap. To turn Ortho mode on or off, use the OrthoOn property. This property requires a Boolean for input. Set to TRUE to turn Ortho mode on, and to FALSE to turn Ortho mode off. For example, the following statement turns Ortho mode on for the active viewport:
ThisDrawing.ActiveViewport.OrthoOn = True
Dim BPoint As Variant Dim Vector As Variant BPoint = xlineObj.basePoint Vector = xlineObj.DirectionVector
Create Rays
A ray is a line in 3D space that starts at a point you specify and extends to infinity. Unlike xline construction lines, which extend in two directions, rays extend in only one direction. As a result, rays help reduce the visual clutter caused by numerous construction lines. Like construction lines, rays are ignored by commands that display the drawing extents.
Query Rays
Once created, you can query the first point of a ray using the BasePoint property. The second point used to create the ray is not stored with the object. Instead, use the DirectionVector property to obtain the directional vector for the ray. Add, query, and edit a Ray object The following example code creates a Ray object using the two points (5, 0, 0) and (1, 1, 0). It then queries the current base point and direction vector and displays the results in a message box. The direction vector is then changed and the base point and new direction vector are queried and displayed.
Sub Ch3_EditRay() Dim rayObj As AcadRay Dim basePoint(0 To 2) As Double Dim secondPoint(0 To 2) As Double ' Define the ray basePoint(0) = 3#: basePoint(1) = 3#: basePoint(2) = 0# secondPoint(0) = 4#: secondPoint(1) = 4#: secondPoint(2) = 0# ' Creates a Ray object in model space Set rayObj = ThisDrawing.ModelSpace.AddRay _ (basePoint, secondPoint) ThisDrawing.Application.ZoomAll ' Find the current status of the Ray MsgBox "The base point of the ray is: " & _ rayObj.basePoint(0) & ", " & _ rayObj.basePoint(1) & ", " & _ rayObj.basePoint(2) & vbCrLf & _ "The directional vector for the ray is: " & _ rayObj.DirectionVector(0) & ", " & _ rayObj.DirectionVector(1) & ", " & _ rayObj.DirectionVector(2), , "Edit Ray" ' Change the directional vector for the ray
Dim newVector(0 To 2) As Double newVector(0) = -1 newVector(1) = 1 newVector(2) = 0 rayObj.DirectionVector = newVector ThisDrawing.Regen False MsgBox "The base point of the ray is: " & _ rayObj.basePoint(0) & ", " & _ rayObj.basePoint(1) & ", " & _ rayObj.basePoint(2) & vbCrLf & _ "The directional vector for the ray is: " & _ rayObj.DirectionVector(0) & ", " & _ rayObj.DirectionVector(1) & ", " & _ rayObj.DirectionVector(2), , "Edit Ray" End Sub
Dim returnDist As Double ' Return the value entered by user. A prompt is provided. returnDist = ThisDrawing.Utility.GetDistance _ (, "Pick two points.") MsgBox "The distance between the two points is: " & returnDist End Sub
Calculate Areas
Calculate the area defined by points entered from the user You can find the area of an arc, circle, ellipse, lightweight polyline, polyline, region, or planar-closed spline by using the Area property. If you need to calculate the combined area of more than one object, you can keep a running total as you add or use the Boolean method on a series of regions to obtain a single region representing the desired area. From this single region you can use the Area property to obtain its area. The calculated area differs according to the type of object you query. For an explanation of how area is calculated for each object type, see Obtain Area Information in the User's Guide.
Dim p3 As Variant Dim p4 As Variant Dim p5 As Variant ' Get the points from the user p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "First point: ") p2 = ThisDrawing.Utility.GetPoint(p1, vbCrLf & "Second point: ") p3 = ThisDrawing.Utility.GetPoint(p2, vbCrLf & "Third point: ") p4 = ThisDrawing.Utility.GetPoint(p3, vbCrLf & "Fourth point: ") p5 = ThisDrawing.Utility.GetPoint(p4, vbCrLf & "Fifth point: ") ' Create the 2D polyline from the points Dim polyObj As AcadLWPolyline Dim vertices(0 To 9) As Double vertices(0) = p1(0): vertices(1) = p1(1) vertices(2) = p2(0): vertices(3) = p2(1) vertices(4) = p3(0): vertices(5) = p3(1) vertices(6) = p4(0): vertices(7) = p4(1) vertices(8) = p5(0): vertices(9) = p5(1) Set polyObj = ThisDrawing.ModelSpace.AddLightWeightPolyline _ (vertices) polyObj.Closed = True ThisDrawing.Application.ZoomAll ' Display the area for the polyline MsgBox "The area defined by the points is " & _ polyObj.Area, , "Calculate Defined Area" End Sub
GetString Method
The GetString method prompts the user for input of a string at the AutoCAD Command prompt. This method accepts two parameters. The first parameter controls the input of spaces in the input string. If it is set to 0, spaces are not allowed (SPACEBAR terminates the input); if set to 1, the string can contain spaces (ENTER must be used to terminate the input). The second parameter is the prompt string. Get a string value from the user at the AutoCAD command line The following example displays the Enter Your Name prompt, and requires that the input from the user be terminated by pressing ENTER (spaces are allowed in the input string). The string value is stored in the retVal variable and is displayed using a message box.
Sub Ch3_GetStringFromUser() Dim retVal As String retVal = ThisDrawing.Utility.GetString _ (1, vbCrLf & "Enter your name: ") MsgBox "The name entered was: " & retVal End Sub
The GetString method does not honor a prior call to the InitializeUserInput method.
GetPoint Method
The GetPoint method prompts the user for the specification of a point at the AutoCAD Command prompt. This method accepts two parameters, an optional from point and the prompt string. If the from point is provided, AutoCAD draws a rubber-band line from that point. To control the user input, this method can be preceded by a call to the InitializeUserInput method. Get a point selected by the user The following example prompts the user for two points, then draws a line using those points as the start point and endpoint.
Sub Ch3_GetPointsFromUser() Dim startPnt As Variant Dim endPnt As Variant Dim prompt1 As String Dim prompt2 As String prompt1 = vbCrLf & "Enter the start point of the line: " prompt2 = vbCrLf & "Enter the end point of the line: " ' Get the first point without entering a base point startPnt = ThisDrawing.Utility.GetPoint(, prompt1) ' Use the point entered above as the base point
endPnt = ThisDrawing.Utility.GetPoint(startPnt, prompt2) ' Create a line using the two points entered ThisDrawing.ModelSpace.AddLine startPnt, endPnt ThisDrawing.Application.ZoomAll End Sub
GetKeyword Method
The GetKeyword method prompts the user for input of a keyword at the AutoCAD Command prompt. This method accepts only one parameter, which is the prompt string. The keywords and input parameters are defined with a call to the InitializeUserInput method. Get a keyword from the user at the AutoCAD command line The following example forces the user to enter a keyword by setting the first parameter of InitializeUserInput to 1, which disallows NULL input (pressing ENTER). The second parameter establishes the list of valid keywords.
Sub Ch3_KeyWord() Dim keyWord As String ThisDrawing.Utility.InitializeUserInput 1, "Line Circle Arc" keyWord = ThisDrawing.Utility.GetKeyword _ (vbCrLf & "Enter an option (Line/Circle/Arc): ") MsgBox keyWord, , "GetKeyword Example" End Sub
A more user-friendly keyword prompt is one that provides a default value if the user presses ENTER (NULL input). Notice the minor modifications to the following example:
Sub Ch3_KeyWord2() Dim keyWord As String ThisDrawing.Utility.InitializeUserInput 0, "Line Circle Arc" keyWord = ThisDrawing.Utility.GetKeyword _ (vbCrLf & "Enter an option (Line/Circle/<Arc>): ") If keyWord = "" Then keyWord = "Arc" MsgBox keyWord, , "GetKeyword Example" End Sub
retrieve the string value (keyword or arbitrary input) when the user input method does not return a string value. The InitializeUserInput method accepts two parameters. The first parameter is a bit-coded integer value that determines the input options for the user input method. The second parameter is a string that defines the valid keywords. Get an integer value or a keyword from the user at the AutoCAD command line The following example prompts the user for a positive, non-negative integer value or a keyword:
Sub Ch3_UserInput() ' The first parameter of InitializeUserInput (6) ' restricts input to positive and non-negative ' values. The second parameter is the list of ' valid keywords. ThisDrawing.Utility.InitializeUserInput 6, "Big Small Regular" ' Set the prompt string variable Dim promptStr As String promptStr = vbCrLf & "Enter the size or (Big/Small/<Regular>):" ' At the GetInteger prompt, entering a keyword or pressing ' ENTER without entering a value results in an error. To allow ' your application to continue and check for the error ' description, you must set the error handler to resume on error. On Error Resume Next ' Get the value entered by the user Dim returnInteger As Integer returnInteger = ThisDrawing.Utility.GetInteger(promptStr) ' Check for an error. If the error number matches the ' one shown below, then use GetInput to get the returned ' string; otherwise, use the value of returnInteger. If Err.Number = -2145320928 Then Dim returnString As String Debug.Print Err.Description returnString = ThisDrawing.Utility.GetInput() If returnString = "" Then 'ENTER returns null string returnString = "Regular" 'Set to default End If Err.Clear Else 'Otherwise, returnString = returnInteger 'Use the value entered End If ' Display the result MsgBox returnString, , "InitializeUserInput Example" End Sub
to the command line. The string must contain the arguments to the command listed in the order expected by the prompt sequence of the executed command. A blank space or the ASCII equivalent of a carriage return in the string is equivalent to pressing ENTER on the keyboard. Unlike the AutoLISP environment, invoking the SendCommand method with no argument is invalid. Send a command to the AutoCAD command line The following example creates a circle with a center of (2, 2, 0) and a radius of 4. The drawing is then zoomed to all the geometry in the drawing. Notice that there is a space at the end of the string which represents the final ENTER to begin execution of the command.
Sub Ch3_SendACommandToAutoCAD() ThisDrawing.SendCommand "_Circle 2,2,0 4 " ThisDrawing.SendCommand "_zoom a " End Sub
Use the Count property on the Documents collection to determine if AutoCAD is in a zero document state. If Documents.Count = 0, then AutoCAD is in a zero document state. If Documents.Count > 0, then there is at least one drawing open. It is also important to note that in VBA the ThisDrawing object is not defined when AutoCAD is in a zero document state. This makes sense since ThisDrawing normally refers to the active drawing and in the zero document state there are no drawings open. Attempting to execute a macro that uses ThisDrawing will result in a runtime error. To avoid the error, use the VBA GetObject function, and specify the AutoCAD version, to obtain a connection to AutoCAD when there are no documents open.
The Export method ignores selection set information when exporting a DXF file, but a syntax error results if the argument is omitted.
Sub Ch3_ImportingAndExporting() ' Create the circle for visual representation Dim circleObj As AcadCircle Dim centerPt(0 To 2) As Double Dim radius As Double centerPt(0) = 2: centerPt(1) = 2: centerPt(2) = 0 radius = 1 Set circleObj = ThisDrawing.ModelSpace.AddCircle _ (centerPt, radius) ThisDrawing.Application.ZoomAll ' Create an empty selection set Dim sset As AcadSelectionSet Set sset = ThisDrawing.SelectionSets.Add("NEWSSET") 'Export the current drawing to a DXF file in the ' AutoCAD temporary file directory Dim tempPath As String Dim exportFile As String Const dxfname As String = "DXFExprt" tempPath = _ ThisDrawing.Application.preferences.Files.TempFilePath exportFile = tempPath & dxfname ThisDrawing.Export exportFile, "DXF", sset ' Delete the empty selection set ThisDrawing.SelectionSets.Item("NEWSSET").Delete ' Open a new drawing ThisDrawing.Application.Documents.Add "acad.dwt" ' Define the import Dim importFile As String Dim insertPoint(0 To 2) As Double Dim scalefactor As Double importFile = tempPath & dxfname & ".dxf" insertPoint(0) = 0: insertPoint(1) = 0: insertPoint(2) = 0 scalefactor = 2# ' Import the file ThisDrawing.Import importFile, insertPoint, scalefactor ThisDrawing.Application.ZoomAll End Sub
You can create a range of objects, from simple lines and circles to spline curves, ellipses, and associative hatch areas. In general, you add objects to model space using one of the Add methods. You can also create objects in paper space, or in a block. Once an object is created, you can change the layer, color, and linetype of the object. You can also add text to annotate your drawing.
Create Objects
While there are often several different ways to create the same graphical object in AutoCAD, ActiveX Automation offers only one creation method per object. For example, in AutoCAD there are four different ways you can create a circle: (1) by specifying the center and radius, (2) by two points defining the diameter, (3) by three points defining the circumference, or (4) by two tangents and a radius. However, in ActiveX Automation there is only one creation method provided to create a circle, and that method uses the center and radius. NOTE The VB and VBA methods of creating objects using either CreateObject or Dim with the New keyword can only be used to create the AutoCAD Application object. All other AutoCAD objects must be created using the Add or Add<objectname> method provided in the AutoCAD interface.
Create Objects | 73
To reference the objects through a user-defined variable, define the variable as type AcadModelSpace or AcadPaperSpace, and then set the variable to the appropriate property of the active document. The following example defines two variables and sets them equal to the current model space and paper space, respectively:
Dim Dim Set Set moSpace paSpace moSpace paSpace As AcadModelSpace As AcadPaperSpace = ThisDrawing.ModelSpace = ThisDrawing.PaperSpace
The following statement adds a line to the model space using the user-defined variable:
Set lineObj = moSpace.AddLine(startPoint,endPoint)
Create Lines
The line is the most basic object in AutoCAD. You can create a variety of linessingle lines, and multiple line segments with and without arcs. In general, you draw lines by specifying coordinate points. The default linetype is CONTINUOUS, an unbroken line, but various linetypes are available that use dots and dashes. To create a line, use one of the following methods: AddLine Creates a line passing through two points. AddLightweightPolyline Creates a 2D lightweight polyline from a list of vertices. AddMLine Creates a multiline. AddPolyline Creates a 2D or 3D polyline. Standard lines and multilines are created on the XY plane of the world coordinate system. Polylines and Lightweight Polylines are created in the object coordinate system (OCS). For information about converting OCS coordinates, see Convert Coordinates on page 218.
Create a Polyline object This example uses the AddLightweightPolyline method to create a simple two-segment polyline using the 2D coordinates (2,4), (4,2), and (6,4).
Sub Ch4_AddLightWeightPolyline() Dim plineObj As AcadLWPolyline Dim points(0 To 5) As Double ' Define the 2D polyline points points(0) = 2: points(1) = 4 points(2) = 4: points(3) = 2 points(4) = 6: points(5) = 4 ' Create a light weight Polyline object in model space Set plineObj = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points) ThisDrawing.Application.ZoomAll End Sub
Create Objects | 75
Dim startTan(0 To 2) As Double Dim endTan(0 To 2) As Double Dim fitPoints(0 To 8) As Double ' Define the variables startTan(0) = 0.5: startTan(1) = 0.5: startTan(2) = 0 endTan(0) = 0.5: endTan(1) = 0.5: endTan(2) = 0 fitPoints(0) = 1: fitPoints(1) = 1: fitPoints(2) = 0 fitPoints(3) = 5: fitPoints(4) = 5: fitPoints(5) = 0 fitPoints(6) = 10: fitPoints(7) = 0: fitPoints(8) = 0 ' Create the spline Set splineObj = ThisDrawing.ModelSpace.AddSpline _ (fitPoints, startTan, endTan) ZoomAll End Sub
For more information about splines, see the Spline object and AddSpline method documentation in the AutoCAD ActiveX and VBA Reference.
Adding 32, 64, or 96 to the previous value selects a shape to draw around the point in addition to the figure drawn through it:
PDSIZE controls the size of the point figures, except for PDMODE values 0 and 1. A 0 setting generates the point at 5 percent of the graphics area height.
A positive PDSIZE value specifies an absolute size for the point figures. A negative value is interpreted as a percentage of the viewport size. The size of all points is recalculated when the drawing is regenerated. After you change PDMODE and PDSIZE, the appearance of existing points changes the next time the drawing is regenerated. To set PDMODE and PDSIZE, use the SetVariable method. Create a Point object and change its appearance The following code example creates a Point object in model space at the coordinate (5, 5, 0). The PDMODE and PDSIZE system variables are then updated.
Sub Ch4_CreatePoint() Dim pointObj As AcadPoint Dim location(0 To 2) As Double ' Define the location of the point location(0) = 5#: location(1) = 5#: location(2) = 0# ' Create the point Set pointObj = ThisDrawing.ModelSpace.AddPoint(location) ThisDrawing.SetVariable "PDMODE", 34 ThisDrawing.SetVariable "PDSIZE", 1 ZoomAll End Sub
The first two points define one edge of the polygon. The third point is defined diagonally opposite from the second. If the fourth point is set equal to the third point, then a filled triangle is created. To create a solid-filled area, use the AddSolid method.
Create Objects | 77
For more information about filling solids, see Create Solid-Filled Areas in the User's Guide. Create a solid-filled object The following code example creates a quadrilateral solid in model space using the coordinates (0, 0, 0), (5, 0, 0), (5, 8, 0), and (0, 8, 0).
Sub Ch4_CreateSolid() Dim solidObj As AcadSolid Dim point1(0 To 2) As Double Dim point2(0 To 2) As Double Dim point3(0 To 2) As Double Dim point4(0 To 2) As Double ' Define the solid point1(0) = 0#: point1(1) = 0#: point1(2) = 0# point2(0) = 5#: point2(1) = 0#: point2(2) = 0# point3(0) = 5#: point3(1) = 8#: point3(2) = 0# point4(0) = 0#: point4(1) = 8#: point4(2) = 0# ' Create the solid object in model space Set solidObj = ThisDrawing.ModelSpace.AddSolid _ (point1, point2, point3, point4) ZoomAll End Sub
Create Regions
To create a region, use the AddRegion method. This method will create a region out of every closed loop formed by the input array of curves. AutoCAD converts closed 2D and planar 3D polylines to separate regions, then converts polylines, lines, and curves that form closed planar loops. If more than two curves share an endpoint, the resulting region might be arbitrary. Because of this, several regions may actually be created when using the AddRegion method. Use a variant to hold the newly created array of regions.
To calculate the total number of Region objects created, use the UBound and LBound VBA functions, as in the following example:
UBound(objRegions) - LBound(objRegions) + 1
where objRegions is a variant containing the return value from AddRegion. This statement will calculate the total number of regions created. Create a simple region The following code example creates a region from a single circle.
Sub Ch4_CreateRegion() ' Define an array to hold the ' boundaries of the region. Dim curves(0 To 0) As AcadCircle ' Create a circle to become a ' boundary for the region. Dim center(0 To 2) As Double Dim radius As Double center(0) = 2 center(1) = 2 center(2) = 0 radius = 5# Set curves(0) = ThisDrawing.ModelSpace.AddCircle _ (center, radius) ' Create the region Dim regionObj As Variant regionObj = ThisDrawing.ModelSpace.AddRegion(curves) ZoomAll End Sub
Create Objects | 79
Dim RoomObjects(0 To 1) As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 4 center(1) = 4 center(2) = 0 radius = 2# Set RoomObjects(0) = ThisDrawing.ModelSpace. _ AddCircle(center, radius) radius = 1# Set RoomObjects(1) = ThisDrawing.ModelSpace. _ AddCircle(center, radius) ' Create a region from the two circles Dim regions As Variant regions = ThisDrawing.ModelSpace.AddRegion(RoomObjects) ' Copy the regions into the region variables for ease of use Dim RoundRoomObj As AcadRegion Dim PillarObj As AcadRegion If regions(0).Area > regions(1).Area Then ' The first region is the room Set RoundRoomObj = regions(0) Set PillarObj = regions(1) Else ' The first region is the pillar Set PillarObj = regions(0) Set RoundRoomObj = regions(1) End If ' Subtract the pillar space from the floor space to ' get a region that represents the total carpet area. RoundRoomObj.Boolean acSubtraction, PillarObj ' Use the Area property to determine the total carpet area MsgBox "The carpet area is: " & RoundRoomObj.Area End Sub
Find the area of the resulting region with the Area property.
Unite Regions
To unite regions, call the Boolean method and enter the constant acUnion for the operation instead of acSubtraction. You can combine regions in any order to unite them.
Create Hatches
Hatching fills a specified area in a drawing with a pattern.
When creating a hatch, you do not initially specify the area to be filled. First you must create the Hatch object. Once this is done, you can specify the outer loop, which is the outermost boundary for the hatch. You can then continue to specify any inner loops that may exist in the hatch. For more information about working with hatches, see Overview of Hatch Patterns and Fills in the User's Guide.
Associate a Hatch
You can create associative or nonassociative hatches. Associative hatches are linked to their boundaries and updated when the boundaries are modified. Nonassociative hatches are independent of their boundaries. Associativity can only be set when a hatch is created. Once a hatch has been created, you can unassociate it, but you cannot associate it again. To make a hatch associative, set the Associativity parameter of the AddHatch method to TRUE. To make a hatch nonassociative, set the Associativity parameter of the AddHatch method to FALSE.
Create Objects | 81
acHatchPatternTypeUserDefined Defines a pattern of lines using the current linetype. acHatchPatternTypeCustomDefined Selects the pattern name from a PAT other than the acad.pat file. When entering the pattern name, use a name that is valid for the file specified by the pattern type.
Description
Specifies standard style, or normal. This option hatches inward from the outermost area boundary. If AutoCAD encounters an internal boundary, it turns off hatching until it encounters another boundary. This is the default setting for the HatchStyle property. Fills the outermost areas only. This style also hatches inward from the area boundary, but it turns off hatching if it encounters an internal boundary and does not turn it back on again.
Outer
Description
Ignores internal structure. This option hatches through all internal objects.
When you have finished defining the hatch it must be evaluated before it can be displayed. Use the Evaluate method to do this. Create a Hatch object This example creates an associate hatch in model space. Once the hatch has been created, you can change the size of the circle that the hatch is associated with. The hatch will change to match the current circle size.
Sub Ch4_CreateHatch() Dim hatchObj As AcadHatch Dim patternName As String Dim PatternType As Long Dim bAssociativity As Boolean ' Define the hatch patternName = "ANSI31" PatternType = 0 bAssociativity = True ' Create the associative Hatch object Set hatchObj = ThisDrawing.ModelSpace.AddHatch _ (PatternType, patternName, bAssociativity) ' Create the outer boundary for the hatch. (a circle) Dim outerLoop(0 To 0) As AcadEntity Dim center(0 To 2) As Double Dim radius As Double center(0) = 3: center(1) = 3: center(2) = 0 radius = 1 Set outerLoop(0) = ThisDrawing.ModelSpace. _ AddCircle(center, radius) ' Append the outerboundary to the hatch ' object, and display the hatch hatchObj.AppendOuterLoop (outerLoop) hatchObj.Evaluate ThisDrawing.Regen True End Sub
Create Objects | 83
Create an empty selection set This example creates a new selection set.
Sub Ch4_CreateSelectionSet() Dim selectionSet1 As AcadSelectionSet Set selectionSet1 = ThisDrawing.SelectionSets. _ Add("NewSelectionSet") End Sub
SelectAtPoint Selects objects passing through a given point and places them into the active selection set. SelectByPolygon Selects objects within a fence and adds them to the active selection set. SelectOnScreen Prompts the user to pick objects from the screen and adds them into the active selection set. Add selected objects to a selection set This example prompts the user to select objects, then adds those objects to the selection set.
Sub Ch4_AddToASelectionSet() ' Create a new selection set Dim sset As AcadSelectionSet Set sset = ThisDrawing.SelectionSets.Add("SS1") ' Prompt the user to select objects ' and add them to the selection set. ' To finish selecting, press ENTER. sset.SelectOnScreen End Sub
Filter type
Object Type (String) Such as Line, Circle, Arc, and so forth. Object Name (String) The table (given) name of a named object. Layer Name (String) Such as Layer 0. Object Visibility (Integer) Use 0 = visible, 1 = invisible. Color Number (Integer) Numeric index values ranging from 0 to 256. Zero indicates BYBLOCK. 256 indicates BYLAYER. A negative value indicates that the layer is turned off. Model/paper space indicator (Integer) Use 0 or omitted = model space, 1 = paper space.
67
For a complete list of DXF group codes, see Group Code Value Types in the DXF Reference. The filter arguments are declared as arrays. The filter type is declared as an integer and the filter value as a variant. Each filter type must be paired with a filter value. For example:
FilterType(0) = 0 'Indicates filter refers to an object type FilterData(0) = "Circle" 'Indicates the object type is "Circle"
Specify a single selection criterion for a selection set The following code prompts users to select objects to be included in a selection set, but only adds the selected object if it is a circle:
Sub Ch4_FilterMtext() Dim sstext As AcadSelectionSet Dim FilterType(0) As Integer Dim FilterData(0) As Variant Set sstext = ThisDrawing.SelectionSets.Add("SS2") FilterType(0) = 0 FilterData(0) = "Circle" sstext.SelectOnScreen FilterType, FilterData End Sub
Description
Anything goes (always true) Equals Not equal to Not equal to Not equal to
Description
Less than Less than or equal to Greater than Greater than or equal to Bitwise AND (integer groups only) Bitwise masked equals (integer groups only)
Logical operators in filter lists are also indicated by a -4 group code, and the operator is a string, but the operators must be paired. The opening operator is preceded by a less-than symbol (<), and the closing operator is followed by a greater-than symbol (>). The following table lists the logical operators allowed in selection set filtering. Logical grouping operators for selection set filter lists Starting operator
"<AND" "<OR" "<XOR" "<NOT"
Encloses
One or more operands One or more operands Two operands One operand
Ending operator
"AND>" "OR>" "XOR>" "NOT>"
Select a circle whose radius is greater than or equal to 5.0 The following code specifies that the selected object must be a circle whose radius is greater than or equal to 5.0:
Sub Ch4_FilterRelational() Dim sstext As AcadSelectionSet Dim FilterType(2) As Integer Dim FilterData(2) As Variant Set sstext = ThisDrawing.SelectionSets.Add("SS5") FilterType(0) = 0 FilterData(0) = "Circle" FilterType(1) = -4 FilterData(1) = ">=" FilterType(2) = 40 FilterData(2) = 5# sstext.SelectOnScreen FilterType, FilterData End Sub
Select either Text or Mtext The following example specifies that either Text or Mtext objects can be selected:
Sub Ch4_FilterOrTest() Dim sstext As AcadSelectionSet Dim FilterType(3) As Integer Dim FilterData(3) As Variant Set sstext = ThisDrawing.SelectionSets.Add("SS6") FilterType(0) = -4 FilterData(0) = "<or" FilterType(1) = 0 FilterData(1) = "TEXT" FilterType(2) = 0 FilterData(2) = "MTEXT" FilterType(3) = -4 FilterData(3) = "or>" sstext.SelectOnScreen FilterType, FilterData End Sub
Definition
Matches any single numeric digit Matches any single alphabetic character Matches any single nonalphanumeric character Matches any character sequence, including an empty one, and it can be used anywhere in the search pattern: at the beginning, middle, or end Matches any single character If it is the first character in the pattern, it matches anything except the pattern Matches any one of the characters enclosed Matches any single character not enclosed
[...] [~...]
Definition
Used inside brackets to specify a range for a single character Separates two patterns Escapes special characters (reads next character literally)
Use a single quote (`) to indicate that a character is not a wildcard, but is to be taken literally. For example, to specify that only an anonymous block named *U2 be included in the selection set, use the following filter arguments:
FilterType(0) = 2 FilterData(0) = "`*U2"
Select Mtext where a specific word appears in the text The following code defines the selection criteria as any Mtext in which The appears in the text string. This example also demonstrates use of the SelectByPolygon selection method:
Sub Ch4_FilterPolygonWildcard() Dim sstext As AcadSelectionSet Dim FilterType(1) As Integer Dim FilterData(1) As Variant Dim pointsArray(0 To 11) As Double Dim mode As Integer mode = acSelectionSetWindowPolygon pointsArray(0) = -12#: pointsArray(1) = -7#: pointsArray(2) = 0 pointsArray(3) = -12#: pointsArray(4) = 10#: pointsArray(5) = 0 pointsArray(6) = 10#: pointsArray(7) = 10#: pointsArray(8) = 0 pointsArray(9) = 10#: pointsArray(10) = -7#: pointsArray(11) = 0 Set sstext = ThisDrawing.SelectionSets.Add("SS10") FilterType(0) = 0 FilterData(0) = "MTEXT" FilterType(1) = 1 FilterData(1) = "*The*" sstext.SelectByPolygon mode, pointsArray, FilterType, FilterData End Sub
See Filter for Extended Data on page 90 for more information about extended data. Select circles that contain xdata The following example filters for circles containing xdata added by the MY_APP application:
Sub Ch4_FilterXdata() Dim sstext As AcadSelectionSet Dim mode As Integer Dim pointsArray(0 To 11) As Double mode = acSelectionSetWindowPolygon pointsArray(0) = -12#: pointsArray(1) = -7#: pointsArray(2) = 0 pointsArray(3) = -12#: pointsArray(4) = 10#: pointsArray(5) = 0 pointsArray(6) = 10#: pointsArray(7) = 10#: pointsArray(8) = 0 pointsArray(9) = 10#: pointsArray(10) = -7#: pointsArray(11) = 0 Dim FilterType(1) As Integer Dim FilterData(1) As Variant Set sstext = ThisDrawing.SelectionSets.Add("SS9") FilterType(0) = 0 FilterData(0) = "Circle" FilterType(1) = 1001 FilterData(1) = "MY_APP" sstext.SelectByPolygon mode, pointsArray, FilterType, FilterData End Sub
Each selection set in a drawing is a member of the SelectionSets collection. You can use the For Each statement to iterate through a drawing's SelectionSets collection and collect information about each selection set. Display the name of each selection set in a drawing The following code displays the name of each selection set in a drawing, and lists the types of objects included in each selection set:
Sub ListSelectionSets() Dim selsetCollection As AcadSelectionSets Dim selset As AcadSelectionSet
Dim ent As Object Dim i, j As Integer Set selsetCollection = ThisDrawing.SelectionSets ' Find each selection set in the drawing i = 0 For Each selset In selsetCollection MsgBox "Selection set " & CStr(i) & " is: " & selset.Name ' Now find each object in the selection set, and say what it is j = 0 For Each ent In selset MsgBox "Item " & CStr(j + 1) & " in " & selset.Name _ & "is: " & ent.EntityName j = j + 1 Next i = i + 1 Next End Sub
Edit Objects
To modify an existing object, use the methods and properties associated with that object. If you modify a visible property of a graphic object, use the Update method to redraw the object on screen. This section describes how to edit 2D objects.
Rename Objects
As your drawings become more complex, you can rename objects to keep the names meaningful or to avoid conflicts with names in other drawings you have inserted in the main drawings. You can rename any named object except those that AutoCAD names by default, for example, layer 0 or the CONTINUOUS linetype. Names can be up to 255 characters long. In addition to letters and numbers, names can contain spaces (although AutoCAD removes spaces that appear directly before and after a name) and any special character not used by Microsoft Windows or AutoCAD for other purposes. Special characters that you cannot use include less-than and greater-than symbols (< >), forward slashes and backslashes (/ \), quotation marks ("), colons (:), semicolons (;),
Edit Objects | 93
question marks (?), commas (,), asterisks (*), vertical bars (|), equal signs (=), and single quotes ('). You also cannot use special characters created with Unicode fonts. To rename an object, use the Name property for that object. Rename a layer This example creates a layer called NewLayer and then renames the layer to MyLayer.
Sub Ch4_RenamingLayer() ' Create a layer Dim layerObj As AcadLayer Set layerObj = ThisDrawing.Layers.Add("NewLayer") ' Change the name of the layer layerObj.Name = "MyLayer" End Sub
Copy Objects
You can copy single or multiple objects within the current drawing. Offsetting creates new objects at a specified distance from selected objects, or through a specified point. Mirroring creates a mirror image of objects in a specified mirror line. Arraying creates sets of copied objects in a rectangular or circular pattern. For more information about copying objects, see Copy, Offset, or Mirror Objects in the User's Guide. NOTE You cannot perform any of the copy methods while simultaneously iterating through a collection. An iteration will open the workspace for a read-only operation while these methods attempt to perform a read-write operation. Complete any iteration of a collection before you call these methods.
through the array, copying each object individually, and collect the newly created objects in a second array. To copy multiple objects to a different drawing, use the CopyObjects method and set the Owner parameter to the drawing's model space. Copy two Circle objects This example creates two Circle objects and uses the CopyObjects method to make a copy of the circles.
Sub Ch4_CopyCircleObjects() Dim DOC1 As AcadDocument Dim circleObj1 As AcadCircle Dim circleObj2 As AcadCircle Dim circleObj1Copy As AcadCircle Dim circleObj2Copy As AcadCircle Dim centerPoint(0 To 2) As Double Dim radius1 As Double Dim radius2 As Double Dim radius1Copy As Double Dim radius2Copy As Double Dim objCollection(0 To 1) As Object Dim retObjects As Variant ' Define the Circle object centerPoint(0) = 0: centerPoint(1) = 0: centerPoint(2) = 0 radius1 = 5#: radius2 = 7# radius1Copy = 1#: radius2Copy = 2# ' Create a new drawing Set DOC1 = ThisDrawing.Application.Documents.Add ' Add two circles to the drawing Set circleObj1 = DOC1.ModelSpace.AddCircle _ (centerPoint, radius1) Set circleObj2 = DOC1.ModelSpace.AddCircle _ (centerPoint, radius2) ZoomAll ' Put the objects to be copied into a form ' compatible with CopyObjects Set objCollection(0) = circleObj1 Set objCollection(1) = circleObj2 ' Copy object and get back a collection of ' the new objects (copies) retObjects = DOC1.CopyObjects(objCollection) ' Get newly created object and apply ' new properties to the copies Set circleObj1Copy = retObjects(0) Set circleObj2Copy = retObjects(1) circleObj1Copy.radius = radius1Copy circleObj1Copy.Color = acRed circleObj2Copy.radius = radius2Copy circleObj2Copy.Color = acRed ZoomAll End Sub
Edit Objects | 95
Copy objects to another drawing This example creates Circle objects, then uses the CopyObjects method to copy the circles into a new drawing.
Sub Ch4_Copy_to_New_Drawing() Dim DOC0 As AcadDocument Dim circleObj1 As AcadCircle, circleObj2 As AcadCircle Dim centerPoint(0 To 2) As Double Dim radius1 As Double, radius2 As Double Dim radius1Copy As Double, radius2Copy As Double Dim objCollection(0 To 1) As Object Dim retObjects As Variant ' Define the Circle object centerPoint(0) = 0: centerPoint(1) = 0: centerPoint(2) = 0 radius1 = 5#: radius2 = 7# radius1Copy = 1#: radius2Copy = 2# ' Add two circles to the current drawing Set circleObj1 = ThisDrawing.ModelSpace.AddCircle _ (centerPoint, radius1) Set circleObj2 = ThisDrawing.ModelSpace.AddCircle _ (centerPoint, radius2) ThisDrawing.Application.ZoomAll ' Save pointer to the current drawing Set DOC0 = ThisDrawing.Application.ActiveDocument ' Copy objects ' ' First put the objects to be copied into a form compatible ' with CopyObjects Set objCollection(0) = circleObj1 Set objCollection(1) = circleObj2 ' Create a new drawing and point to its model space Dim Doc1MSpace As AcadModelSpace Dim DOC1 As AcadDocument Set DOC1 = Documents.Add Set Doc1MSpace = DOC1.ModelSpace ' Copy the objects into the model space of the new drawing. A ' collection of the new (copied) objects is returned. retObjects = DOC0.CopyObjects(objCollection, Doc1MSpace) Dim circleObj1Copy As AcadCircle, circleObj2Copy As AcadCircle ' Get the newly created object collection and apply new ' properties to the copies. Set circleObj1Copy = retObjects(0) Set circleObj2Copy = retObjects(1) circleObj1Copy.radius = radius1Copy circleObj1Copy.Color = acRed circleObj2Copy.radius = radius2Copy circleObj2Copy.Color = acRed ThisDrawing.Application.ZoomAll MsgBox "Circles copied." End Sub
Offset Objects
Offsetting an object creates a new object at a specified offset distance from the original object. You can offset arcs, circles, ellipses, lines, lightweight polylines, polylines, splines, and xlines. To offset an object, use the Offset method provided for that object. The only input to this method is the distance to offset the object. If this distance is negative, it is interpreted by AutoCAD as being an offset to make a smaller curve (that is, for an arc it would offset to a radius that is the given distance less than the starting curve's radius). If smaller has no meaning, then AutoCAD would offset in the direction of smaller X,Y,Z WCS coordinates. If the offset distance is invalid, then an error is returned.
For many objects, the result of this operation will be a single new curve (which may not be of the same type as the original curve). For example, offsetting an ellipse will result in a spline because the result does fit the equation of an ellipse. In some cases it may be necessary for the offset result to be several curves. Because of this, the method returns the new object, or array of objects, as a variant. For more information about offsetting objects, see Copy, Offset, or Mirror Objects in the User's Guide. Offset a polyline This example creates a lightweight polyline and then offsets the polyline.
Sub Ch4_OffsetPolyline() ' Create the polyline Dim plineObj As AcadLWPolyline Dim points(0 To 11) As Double points(0) = 1: points(1) = 1 points(2) = 1: points(3) = 2 points(4) = 2: points(5) = 2 points(6) = 3: points(7) = 2 points(8) = 4: points(9) = 4
Edit Objects | 97
points(10) = 4: points(11) = 1 Set plineObj = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points) plineObj.Closed = True ZoomAll ' Offset the polyline Dim offsetObj As Variant offsetObj = plineObj.Offset(0.25) ZoomAll End Sub
Mirror Objects
Mirroring creates a mirror image copy of an object around an axis or mirror line. You can mirror all drawing objects. To mirror an object, use the Mirror method provided for that object. This method requires two coordinates as input. The two coordinates specified become the endpoints of the mirror line around which the base object is reflected. In 3D, this line orients a mirroring plane perpendicular to the XY plane of the UCS containing the mirror line. Unlike the mirror command in AutoCAD, this method places the reflected image into the drawing and retains the original object. (To remove the original object, use the Erase method.)
To manage the reflection properties of Text objects, use the MIRRTEXT system variable. The default setting of MIRRTEXT is On (1), which causes Text objects to be mirrored just as any other object. When MIRRTEXT is Off (0), text is not mirrored. Use the GetVariable and SetVariable methods to query and set the MIRRTEXT setting.
You can mirror a Viewport object in paper space, although doing so has no effect on its model space view or on model space objects. For more information about mirroring objects, see Copy, Offset, or Mirror Objects in the User's Guide.
Mirror a polyline about an axis This example creates a lightweight polyline and mirrors that polyline about an axis. The newly created polyline is colored blue.
Sub Ch4_MirrorPolyline() ' Create the polyline Dim plineObj As AcadLWPolyline Dim points(0 To 11) As Double points(0) = 1: points(1) = 1 points(2) = 1: points(3) = 2 points(4) = 2: points(5) = 2 points(6) = 3: points(7) = 2 points(8) = 4: points(9) = 4 points(10) = 4: points(11) = 1 Set plineObj = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points) plineObj.Closed = True ZoomAll ' Define the mirror axis Dim point1(0 To 2) As Double Dim point2(0 To 2) As Double point1(0) = 0: point1(1) = 4.25: point1(2) = 0 point2(0) = 4: point2(1) = 4.25: point2(2) = 0 ' Mirror the polyline Dim mirrorObj As AcadLWPolyline Set mirrorObj = plineObj.Mirror(point1, point2) Dim col As New AcadAcCmColor Call col.SetRGB(125, 175, 235) mirrorObj.TrueColor = col ZoomAll End Sub
Array Objects
You can copy an object in polar or rectangular arrays. For polar arrays, you control the number of copies of the object and the angle to fill the array to. For rectangular arrays, you control the number of rows and columns and the distance between them. For more information about arrays, see Create an Array of Objects in the User's Guide.
Edit Objects | 99
rotation. A negative value specifies clockwise rotation. An error is returned for an angle that equals 0. The center point is a variant array containing three doubles. These doubles represent the 3D WCS coordinate specifying the center point for the polar array.
AutoCAD determines the distance from the array's center point to a reference point on the original object. The reference point used depends on the type of object. AutoCAD uses the center point of a circle or arc, the insertion point of a block or shape, the start point of text, and one endpoint of a line or trace. This method does not support the Rotate While Copying option of the AutoCAD ARRAY command. Create a polar array This example creates a circle, and then performs a polar array of the circle. This creates four circles filling 180 degrees around a base point of (4, 4, 0).
Sub Ch4_ArrayingACircle() ' 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 = 1 Set circleObj = ThisDrawing.ModelSpace. _ AddCircle(center, radius) ZoomAll ' Define the polar array Dim noOfObjects As Integer Dim angleToFill As Double Dim basePnt(0 To 2) As Double noOfObjects = 4 angleToFill = 3.14 ' 180 degrees basePnt(0) = 4#: basePnt(1) = 4#: basePnt(2) = 0# ' The following example will create 4 copies
' of an object by rotating and copying it about ' the point (3,3,0). Dim retObj As Variant retObj = circleObj.ArrayPolar _ (noOfObjects, angleToFill, basePnt) ZoomAll End Sub
AutoCAD builds the rectangular array along a baseline defined by the current snap rotation angle. This angle is 0 by default, so the rows and columns of a rectangular array are orthogonal with respect to the X and Y drawing axes. You can change this angle and create a rotated array by setting the snap rotation angle to a nonzero value. To do this, use the SnapRotationAngle property. Create a rectangular array This example creates a circle and then performs a rectangular array of the circle, creating five rows and five columns of circles.
Sub Ch4_ArrayRectangularExample()
' 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 rectangular array Dim numberOfRows As Long Dim numberOfColumns As Long Dim numberOfLevels As Long Dim distanceBwtnRows As Double Dim distanceBwtnColumns As Double Dim distanceBwtnLevels As Double numberOfRows = 5 numberOfColumns = 5 numberOfLevels = 2 distanceBwtnRows = 1 distanceBwtnColumns = 1 distanceBwtnLevels = 1 ' Create the array of objects Dim retObj As Variant retObj = circleObj.ArrayRectangular _ (numberOfRows, numberOfColumns, numberOfLevels, _ distanceBwtnRows, distanceBwtnColumns, distanceBwtnLevels) ZoomAll End Sub
Move Objects
You can move objects along a vector without changing their orientation or size. You can also rotate objects around a base point. For more information about moving objects, see Move Objects in the User's Guide.
Move a circle along a vector This example creates a circle and then moves that circle two units along the X axis.
Sub Ch4_MoveCircle() ' 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. ' The move vector will move the circle 2 units ' along the x axis. 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 ' Move the circle circleObj.Move point1, point2 circleObj.Update End Sub
Rotate Objects
You can rotate all drawing objects and attribute reference objects. To rotate an object, use the Rotate method provided for that object. This method requires as input a base point and a rotation angle. The base point is a variant array with three doubles. These doubles represent a 3D WCS coordinate specifying the point through which the axis of rotation is defined. The angle of rotation is specified in radians. This angle determines how far an object rotates around the base point relative to its current location.
For more information about rotating objects, see Rotate Objects in the User's Guide. Rotate a polyline about a base point This example creates a closed lightweight polyline, and then rotates the polyline 45 degrees about the base point (4, 4.25, 0).
Sub Ch4_RotatePolyline() ' 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 ' Define the rotation of 45 degrees about a ' base point of (4, 4.25, 0) 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 plineObj.Update End Sub
Delete Objects
You can delete individual objects by using the Delete method. NOTE The Collection objects in ActiveX Automation have a Delete method due to the manner in which these objects have been defined in the type library. However, the Collection objects, such as ModelSpace collection, Layers collection,
and Dictionaries collection, should never be deleted. An error will result if you attempt to delete a collection. Create and delete a polyline This example creates a lightweight polyline, then deletes it.
Sub Ch4_DeletePolyline() ' Create the polyline Dim lwpolyObj As AcadLWPolyline Dim vertices(0 To 5) As Double vertices(0) = 2: vertices(1) = 4 vertices(2) = 4: vertices(3) = 2 vertices(4) = 6: vertices(5) = 4 Set lwpolyObj = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(vertices) ZoomAll ' Erase the polyline lwpolyObj.Delete ThisDrawing.Regen acActiveViewport End Sub
Scale Objects
You scale an object by specifying a base point and a length, which is used as a scale factor based on the current drawing units. You can scale all the drawing objects, as well as attribute reference objects. To scale an object, use the ScaleEntity method provided for that object. This method scales the object equally in the X, Y, and Z directions. It takes as input the base point for the scale and a scale factor. The base point is a variant array with three doubles. These doubles represent a 3D WCS coordinate specifying the point from which the scale begins. The scale factor is the factor by which to scale the object. The dimensions of the object are multiplied by the scale factor. A scale factor greater than 1 enlarges the object. A scale factor between 0 and 1 reduces the object.
For more information about scaling, see Resize or Reshape Objects in the User's Guide.
Scale a polyline This example creates a closed lightweight polyline and then scales the polyline by 0.5.
Sub Ch4_ScalePolyline() ' 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 ' Define the scale Dim basePoint(0 To 2) As Double Dim scalefactor As Double basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0 scalefactor = 0.5 ' Scale the polyline plineObj.ScaleEntity basePoint, scalefactor plineObj.Update End Sub
Transform Objects
You move, scale, or rotate an object given a 4 by 4 transformation matrix using the TransformBy method. The following table demonstrates the transformation matrix configuration, where R = Rotation and T = Translation: Transformation matrix configuration
R00 R10 R20 0 R01 R11 R21 0 R02 R12 R22 0 T0 T1 T2 1
To transform an object, first initialize the transformation matrix. The following example shows a transformation matrix, assigned to the variable tMatrix, which will rotate an entity by 90 degrees about the point (0, 0, 0):
tMatrix(0,0) = 0.0
tMatrix(0,1) tMatrix(0,2) tMatrix(0,3) tMatrix(1,0) tMatrix(1,1) tMatrix(1,2) tMatrix(1,3) tMatrix(2,0) tMatrix(2,1) tMatrix(2,2) tMatrix(2,3) tMatrix(3,0) tMatrix(3,1) tMatrix(3,2) tMatrix(3,3)
= = = = = = = = = = = = = = =
-1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
After the transformation matrix is complete, apply the matrix to the object using the TransformBy method. The following line of code demonstrates applying a matrix (tMatrix) to an object (anObj):
anObj.TransformBy tMatrix
Rotate a line with a transformation matrix This example creates a line and rotates it 90 degrees using a transformation matrix.
Sub Ch4_TransformBy() ' Create a line Dim lineObj As AcadLine Dim startPt(0 To 2) As Double Dim endPt(0 To 2) As Double startPt(0) = 2 startPt(1) = 1 startPt(2) = 0 endPt(0) = 5 endPt(1) = 1 endPt(2) = 0 Set lineObj = ThisDrawing.ModelSpace. _ AddLine(startPt, endPt) ZoomAll ' Initialize the transMat variable with a ' transformation matrix that will rotate ' an object by 90 degrees about the point(0,0,0) Dim transMat(0 To 3, 0 To 3) As Double transMat(0, 0) = 0#: transMat(0, 1) = -1# transMat(0, 2) = 0#: transMat(0, 3) = 0# transMat(1, 0) = 1#: transMat(1, 1) = 0# transMat(1, 2) = 0#: transMat(1, 3) = 0# transMat(2, 0) = 0#: transMat(2, 1) = 0# transMat(2, 2) = 1#: transMat(2, 3) = 0# transMat(3, 0) = 0#: transMat(3, 1) = 0# transMat(3, 2) = 0#: transMat(3, 3) = 1# ' Transform the line using the defined transformation matrix
The following are more examples of transformation matrices: Rotation Matrix: 90 degrees about point (0, 0, 0)
0.0 1.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
Explode Objects
Exploding objects converts the objects from single objects to their constituent parts but has no visible effect. For example, exploding forms simple lines and arcs from 3D polygons, polylines, polygon meshes, and regions. It replaces a block reference with copies of the simple objects that compose the block. For more information about exploding objects, see Disassociate Compound Objects (Explode) in the User's Guide. Explode a polyline This example creates a lightweight polyline object. It then explodes the polyline into separate objects. The example then loops through the resulting objects and displays a message box containing the name of each object and its index in the list of exploded objects.
Sub Ch4_ExplodePolyline() Dim plineObj As AcadLWPolyline Dim points(0 To 11) As Double ' Define the 2D polyline points points(0) = 1: points(1) = 1 points(2) = 1: points(3) = 2 points(4) = 2: points(5) = 2 points(6) = 3: points(7) = 2 points(8) = 4: points(9) = 4 points(10) = 4: points(11) = 1 ' Create a light weight Polyline object Set plineObj = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points) ' Set the bulge on one segment to vary the ' type of objects in the polyline plineObj.SetBulge 3, -0.5 plineObj.Update ' Explode the polyline Dim explodedObjects As Variant explodedObjects = plineObj.Explode ' Loop through the exploded objects ' and display a message box with ' the type of each object Dim I As Integer For I = 0 To UBound(explodedObjects) explodedObjects(I).Update MsgBox "Exploded Object " & I & ": " & _ explodedObjects(I).ObjectName explodedObjects(I).Update Next End Sub
Edit Polylines
2D and 3D polylines, rectangles, polygons, and 3D polygon meshes are all polyline variants and are edited in the same way. AutoCAD recognizes both fit polylines and spline-fit polylines. A spline-fit polyline uses a curve fit, similar to a B-spline. There are two kinds of spline-fit polylines: quadratic and cubic. Both polylines are controlled by the SPLINETYPE system variable. A fit polyline uses standard curves for curve fit and utilizes any tangent directions set on any given vertex. To edit a polyline, use the properties and methods of the LightweightPolyline or Polyline object. Use the following properties and methods to open or close a polyline, change the coordinates of a polyline vertex, or add a vertex: Closed property Opens or closes the polyline. Coordinates property Specifies the coordinates for each vertex in the polyline. AddVertex method Adds a vertex to a lightweight polyline. Use the following methods to update the bulge or width of a polyline: SetBulge Sets the bulge of a polyline, given the segment index. SetWidth Sets the start and end width of a polyline, given the segment index. For more information about editing polylines, see Modify or Join Polyline in the User's Guide. Edit a polyline This example creates a lightweight polyline. It then adds a bulge to the third segment of the polyline, appends a vertex to the polyline, changes the width of the last segment, and finally closes the polyline.
Sub Ch4_EditPolyline() Dim plineObj As AcadLWPolyline Dim points(0 To 9) As Double ' Define the 2D polyline points points(0) = 1: points(1) = 1 points(2) = 1: points(3) = 2
points(4) = 2: points(5) = 2 points(6) = 3: points(7) = 2 points(8) = 4: points(9) = 4 ' Create a light weight Polyline object Set plineObj = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points) ' Add a bulge to segment 3 plineObj.SetBulge 3, -0.5 ' Define the new vertex Dim newVertex(0 To 1) As Double newVertex(0) = 4: newVertex(1) = 1 ' Add the vertex to the polyline plineObj.AddVertex 5, newVertex ' Set the width of the new segment plineObj.SetWidth 4, 0.1, 0.5 ' Close the polyline plineObj.Closed = True plineObj.Update End Sub
Edit Splines
Use the following editable properties to change splines: ControlPoints Specifies the control points of a spline. EndTangent Specifies the end tangent of the spline as a directional vector. FitPoints Specifies all the fit points of a spline. FitTolerance Refits the spline to the existing points with new tolerance values. Knots Specifies the knots vector for the spline. StartTangent Specifies the start tangent for the spline. In addition, you can use the following methods to edit splines:
AddFitPoint Adds a single fit point to the spline at a given index. DeleteFitPoint Deletes the fit point of a spline at a given index. ElevateOrder Elevates the order of the spline to the given order. GetFitPoint Gets the fit point of the spline at a given index. (Gets one fit point only. To query all the fit points of the spline, use the FitPoints property.) Reverse Reverses the direction of a spline. SetControlPoint Sets the control point of the spline at a given index. SetFitPoint Sets the fit point of the spline at a given index. (Sets one fit point only. To change all the fit points of the spline, use the FitPoints property.) SetWeight Sets the weight of the control point at a given index. Use the following read-only properties to query splines: Area Gets the enclosed area of a spline. Closed Indicates whether the spline is open or closed. Degree Gets the degree of the spline's polynomial representation. IsPeriodic Specifies if the given spline is periodic.
IsPlanar Specifies if the given spline is planar. IsRational Specifies if the given spline is rational. NumberOfControlPoints Gets the number of control points of the spline. NumberOfFitPoints Gets the number of fit points of the spline. For more information about editing splines, see Modify Splines in the User's Guide. Change a control point on a spline This example creates a spline and then changes the first control point for the spline.
Sub Ch4_ChangeSplineControlPoint() ' Create the spline Dim splineObj As AcadSpline Dim startTan(0 To 2) As Double Dim endTan(0 To 2) As Double Dim fitPoints(0 To 8) As Double startTan(0) = 0.5: startTan(1) = 0.5: startTan(2) = 0 endTan(0) = 0.5: endTan(1) = 0.5: endTan(2) = 0 fitPoints(0) = 1: fitPoints(1) = 1: fitPoints(2) = 0 fitPoints(3) = 5: fitPoints(4) = 5: fitPoints(5) = 0 fitPoints(6) = 10: fitPoints(7) = 0: fitPoints(8) = 0 Set splineObj = ThisDrawing.ModelSpace. _ AddSpline(fitPoints, startTan, endTan) splineObj.Update ' Change the coordinate of the first fit point Dim controlPoint(0 To 2) As Double controlPoint(0) = 0 controlPoint(1) = 3 controlPoint(2) = 0 splineObj.SetControlPoint 0, controlPoint splineObj.Update End Sub
Edit Hatches
You can edit both hatch boundaries and hatch patterns. If you edit the boundary of an associative hatch, the pattern is updated as long as the editing results in a valid boundary. Associative hatches are updated even if they're on
layers that are turned off. You can modify hatch patterns or choose a new pattern for an existing hatch, but associativity can only be set when a hatch is created. You can check to see if a Hatch object is associative by using the AssociativeHatch property. (See the AddHatch method for more information on creating a hatch.) You must re-evaluate a hatch using the Evaluate method to see any edits to the hatch. For more information about editing hatches, see Modify Hatches and Solid-Filled Areas in the User's Guide.
Dim startAngle As Double Dim endAngle As Double center(0) = 5: center(1) = 3: center(2) = 0 radius = 3 startAngle = 0 endAngle = 3.141592 Set outerLoop(0) = ThisDrawing.ModelSpace. _ AddArc(center, radius, startAngle, endAngle) Set outerLoop(1) = ThisDrawing.ModelSpace. _ AddLine(outerLoop(0).startPoint, outerLoop(0).endPoint) ' Append the outer loop to the hatch object hatchObj.AppendOuterLoop (outerLoop) ' Create a circle as the inner loop for the hatch. Dim innerLoop(0) As AcadEntity center(0) = 5: center(1) = 4.5: center(2) = 0 radius = 1 Set innerLoop(0) = ThisDrawing.ModelSpace. _ AddCircle(center, radius) ' Append the circle as an inner loop to the hatch hatchObj.AppendInnerLoop (innerLoop) ' Evaluate and display the hatch hatchObj.Evaluate ThisDrawing.Regen True End Sub
PatternSpace Specifies the user-defined hatch pattern spacing. SetPattern Sets the pattern name and pattern type for the hatch. Change the pattern spacing of a hatch This example creates a hatch. It then adds two to the current pattern spacing for the hatch.
Sub Ch4_ChangeHatchPatternSpace() Dim hatchObj As AcadHatch Dim patternName As String Dim PatternType As Long Dim bAssociativity As Boolean ' Define the hatch patternName = "ANSI31" PatternType = 0 bAssociativity = True ' Create the associative Hatch object Set hatchObj = ThisDrawing.ModelSpace. _ AddHatch(PatternType, patternName, bAssociativity) ' Create the outer loop for the hatch. Dim outerLoop(0 To 0) As AcadEntity Dim center(0 To 2) As Double Dim radius As Double center(0) = 5 center(1) = 3 center(2) = 0 radius = 3 Set outerLoop(0) = ThisDrawing.ModelSpace. _ AddCircle(center, radius) hatchObj.AppendOuterLoop (outerLoop) hatchObj.Evaluate ' Change the spacing of the hatch pattern by ' adding 2 to the current spacing hatchObj.patternSpace = hatchObj.patternSpace + 2 hatchObj.Evaluate ThisDrawing.Regen True End Sub
For more information about this topic, see Control the Properties of Objects in the User's Guide.
up to thirty-one characters and contain letters, digits, and the special characters dollar sign ($), hyphen (-), and underscore (_) but cannot include blank spaces. For more information about creating layers, see Create and Name Layers in the User's Guide. Create a new layer, assign it the color red, and add an object to the layer The following code creates a circle and a new layer. The new layer is assigned the color red. The circle is assigned to the layer, and the color of the circle changes accordingly.
Sub Ch4_NewLayer() ' Create a 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 = 1 Set circleObj = ThisDrawing.ModelSpace. _ AddCircle(center, radius) ' Create a color object Dim col As New AcadAcCmColor col.ColorMethod = AutoCAD.acColorMethodForeground ' Set the layer to the color Dim layColor As AcadAcCmColor Set layColor = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17") Call layColor.SetRGB(122, 199, 25) ThisDrawing.ActiveLayer.TrueColor = layColor col.ColorMethod = AutoCAD.acColorMethodByLayer ' Assign the circle the color "ByLayer" so ' that the circle will automatically pick ' up the color of the layer on which it resides circleObj.Color = acByLayer circleObj.Update End Sub
Freeze a layer This example creates a new layer called ABC and then freezes the layer.
Sub Ch4_LayerFreeze() ' Create a new layer called "ABC" Dim layerObj As AcadLayer Set layerObj = ThisDrawing.Layers.Add("ABC") ' Freeze layer "ABC" layerObj.Freeze = True End Sub
If you use acByLayer, new objects assume the color of the layer upon which they are drawn.
Delete Layers
To delete a layer, use the Delete method. You can delete a layer at any time during a drawing session. You cannot delete the current layer, layer 0, an xref-dependent layer, or a layer that contains objects. NOTE Layers referenced by block definitions, along with the special layer named DEFPOINTS, cannot be deleted even if they do not contain visible objects.
Color name
Red Yellow Green Cyan Blue Magenta Black/White
Colors 8 through 255 must be assigned by a number or by selecting the color in a dialog box. The default color (7) is either white or black, depending on your background color. For more information about working with colors, see Work with Colors in the User's Guide.
linetypeName = "CENTER" ' Load "CENTER" line type from acad.lin file ThisDrawing.Linetypes.Load linetypeName, "acad.lin" Exit Sub ERRORHANDLER: MsgBox Err.Description End Sub
For more information about activating a linetype, see Set the Current Linetype in the User's Guide.
Rename Linetypes
To rename a linetype, use the Name property. When you rename a linetype, you are renaming only the linetype definition in your drawing. The name in the LIN library file is not being updated to reflect the new name.
Delete Linetypes
To delete a linetype, use the Delete method. You can delete a linetype at any time during a drawing session; however, linetypes that cannot be deleted include BYLAYER, BYBLOCK, CONTINUOUS, the current linetype, and xref-dependent linetypes. Also, linetypes referenced by block definitions cannot be deleted, even if they are not used by any objects. For more information about deleting linetypes, see Set the Current Linetype in the User's Guide.
A linetype description can have up to 47 characters. The description can be a comment or a series of underscores, dots, dashes, and spaces to show a simple representation of the linetype pattern. For example:
ThisDrawing.ActiveLinetype.Description = "Exterior Wall"
' Set the linetype scale of a circle to 3 circleObj.LinetypeScale = 3# circleObj.Update MsgBox ("Here is the circle with the new linetype") ' Restore original active linetype ThisDrawing.ActiveLinetype = currLineType End Sub
radius = 1 Set circleObj = ThisDrawing.ModelSpace. _ AddCircle(center, radius) ' Create a new layer called "ABC" Dim layerObj As AcadLayer Set layerObj = ThisDrawing.Layers.Add("ABC") ' Assign the circle to the "ABC" layer circleObj.Layer = "ABC" circleObj.Update End Sub
NOTE Before you can assign a linetype to an object, the linetype must be loaded into the current drawing. To load a linetype into the drawing, use the Load method. For more information about linetypes, see Overview of Linetypes in the User's Guide. Change the linetype of a circle This example creates a circle. It then attempts to load the linetype CENTER from the acad.lin file. If the linetype already exists, or the file does not exist, then a message is displayed. Finally, it sets the linetype for the circle to be CENTER.
Sub Ch4_ChangeCircleLinetype() On Error Resume Next ' Create a 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 = 1 Set circleObj = ThisDrawing.ModelSpace. _ AddCircle(center, radius) Dim linetypeName As String linetypeName = "CENTER" ' Load "CENTER" line type from acad.lin file ThisDrawing.Linetypes.Load linetypeName, "acad.lin" If Err.Description <> "" Then MsgBox Err.Description ' Assign the circle the linetype "CENTER" circleObj.Linetype = "CENTER" circleObj.Update End Sub
You do not need (and should not try) to interpret XRecords when working with layer settings using ActiveX. Use the functions of the LayerStateManager object to access saved layer settings. List the saved layer settings in a drawing If layer settings have been saved in the current drawing, the following code lists the names of all saved layer settings:
Sub Ch4_ListStates() On Error Resume Next Dim oLSMDict As AcadDictionary Dim XRec As Object Dim layerstateNames As String layerstateNames = "" ' Get the ACAD_LAYERSTATES dictionary, which is in the ' extension dictionary in the Layers object. Set oLSMDict = ThisDrawing.Layers. _ GetExtensionDictionary.Item("ACAD_LAYERSTATES") ' List the name of each saved layer setting. Settings are ' stored as XRecords in the dictionary. For Each XRec In oLSMDict layerstateNames = layerstateNames + XRec.Name + vbCrLf Next XRec MsgBox "The saved layer settings in this drawing are: " + _ vbCrLf + layerstateNames End Sub
SetDataBase Associates an AutoCAD database with the LayerStateManager. To access the LayerStateManager object, use the GetInterfaceObject method.
Dim oLSM As AcadLayerStateManager Set oLSM = ThisDrawing.Application. _ GetInterfaceObject("AutoCAD.AcadLayerStateManager.17")
After you retrieve the LayerStateManager object, you must associate a database with it before you can access the object's methods. Use the SetDatabase method to associate a database with the LayerStateManager.
oLSM.SetDatabase ThisDrawing.Database
Layer property
All layer settings Color Frozen or thawed Linetype Lineweight Locked or unlocked New viewport layers frozen or thawed None On or off Plotting on or off Plot style
If you try to save layer settings under a name that already exists, an error is returned. You must rename or delete the existing saved layer settings before you can reuse the name. Save a layer's color and linetype settings The following code saves the color and linetype settings of the current layer under the name ColorLinetype.
Sub Ch4_SaveLayerColorAndLinetype() Dim oLSM As AcadLayerStateManager ' Access the LayerStateManager object Set oLSM = ThisDrawing.Application. _ GetInterfaceObject("AutoCAD.AcadLayerStateManager.17") ' Associate the current drawing database with LayerStateManager oLSM.SetDatabase ThisDrawing.Database oLSM.Save "ColorLinetype", acLsColor + acLsLineType End Sub
Rename a saved layer setting The following code renames the ColorLinetype layer settings to OldColorLinetype.
Sub Ch4_RenameLayerSettings() Dim oLSM As AcadLayerStateManager Set oLSM = ThisDrawing.Application. _ GetInterfaceObject("AutoCAD.AcadLayerStateManager.17") oLSM.SetDatabase ThisDrawing.Database oLSM.Rename "ColorLinetype", "OldColorLinetype" End Sub
Delete a saved layer setting The following code deletes layer settings that were saved under the name
ColorLinetype. Sub Ch4_DeleteColorAndLinetype() Dim oLSM As AcadLayerStateManager Set oLSM = ThisDrawing.Application. _ GetInterfaceObject("AutoCAD.AcadLayerStateManager.17") oLSM.SetDatabase ThisDrawing.Database oLSM.Delete "ColorLinetype" End Sub
linetypes they had when ColorLinetype was saved. If you add new layers to the drawing after saving ColorLinetype, those new layers are not affected when you restore ColorLinetype. Restore the color and linetype settings of a drawing's layers Assuming that the color and linetype settings of the layers in the current drawing were previously saved under the name ColorLinetype, the following code resets the color and linetype settings of each layer in the drawing to the value they had when ColorLinetype was saved.
Sub Ch4_RestoreLayerSettings() Dim oLSM As AcadLayerStateManager Set oLSM = ThisDrawing.Application. _ GetInterfaceObject("AutoCAD.AcadLayerStateManager.17") oLSM.SetDatabase ThisDrawing.Database oLSM.Restore "ColorLinetype" End Sub
If the imported file defines settings for layers that do not exist in the current drawing, those layers are created in the current drawing. When you use the Restore method, the properties specified when the settings were saved are assigned to the new layers; all other properties of the new layers are assigned default settings. Export saved layer settings The following code exports saved layer settings to a file named Colortype.las.
Sub Ch4_ExportLayerSettings() Dim oLSM As AcadLayerStateManager Set oLSM = ThisDrawing.Application. _ GetInterfaceObject("AutoCAD.AcadLayerStateManager.17") oLSM.SetDatabase ThisDrawing.Database oLSM.Export "ColorLinetype", "c:\my documents\ColorLType.las" End Sub
Import saved layer settings The following code imports layer settings from a file named Colortype.las.
Sub Ch4_ImportLayerSettings() Dim oLSM As AcadLayerStateManager Set oLSM = ThisDrawing.Application. _ GetInterfaceObject("AutoCAD.AcadLayerStateManager.17") oLSM.SetDatabase ThisDrawing.Database ' If the drawing you're importing to does not contain ' all the linetypes referenced in the saved settings, ' an error is returned. The import is completed, though, ' and the default linetype is used. On Error Resume Next oLSM.Import "c:\my documents\ColorLType.las" If Err.Number = -2145386359 Then ' Error indicates a linetype is not defined MsgBox ("One or more linetypes specified in the imported " + _ "settings is not defined in your drawing") End If On Error GoTo 0 End Sub
For more information about working with text, see Create Text in the User's Guide.
TextGenerationFlag Specifies backward text, upside-down text, or both. If you change an existing style's font or orientation, all text using that style is changed to use the new font or orientation. Changing text height, width factor, and oblique angle does not change existing text but does change subsequently created text objects. NOTE You must call the Regen or Update method to see any changes to the above properties.
Assign Fonts
Fonts define the shapes of the text characters that make up each character set. A single font can be used by more than one style. To assign a font to a text style, use the FontFile property of the TextStyle object. By entering the font file containing an AutoCAD-compiled SHX font, you assign that font to the text style. Set text fonts This example gets the current font values for the active text style and then changes the typeface for the font to PlayBill. The new font is then set using the SetFont method. To see the effects of changing the typeface, add some Mtext or Text to your current drawing before running the example. Note that, if you don't have the PlayBill font on your system, you need to substitute a font you do have in order for this example to work.
Sub Ch4_UpdateTextFont() MsgBox ("Look at the text now...") Dim typeFace As String Dim SavetypeFace As String Dim Bold As Boolean Dim Italic As Boolean Dim charSet As Long Dim PitchandFamily As Long ' Get the current settings to fill in the ' default values for the SetFont method ThisDrawing.ActiveTextStyle.GetFont typeFace, _ Bold, Italic, charSet, PitchandFamily ' Change the typeface for the font SavetypeFace = typeFace typeFace = "PlayBill" ThisDrawing.ActiveTextStyle.SetFont typeFace, _ Bold, Italic, charSet, PitchandFamily ThisDrawing.Regen acActiveViewport MsgBox ("Now see how it looks after changing the font...") 'Restore the original typeface ThisDrawing.ActiveTextStyle.SetFont SavetypeFace, _ Bold, Italic, charSet, PitchandFamily
For TrueType fonts, the value specified for text height might not represent the height of uppercase letters. The height specified represents the height of a capital letter plus an accent area reserved for accent marks and other marks used in non-English languages. The relative portion of areas assigned to capital letters and accent characters is determined by the font designer at the time the font is designed, and, consequently, will vary from font to font. In addition to the height of a capital letter and the ascent area that make up the height specified by the user, TrueType fonts have a descent area for portions of characters that extend below the text insertion line. Examples of such characters are y, j, p, g, and q. You specify the text height using the Height property. This property accepts positive numbers only. Change the height of a Text object This example creates a line of text and then changes the height of the text.
Sub Ch4_ChangeTextHeight() Dim textObj As AcadText Dim textString As String Dim insertionPoint(0 To 2) As Double Dim height As Double ' Define the text object textString = "Hello, World." insertionPoint(0) = 3 insertionPoint(1) = 3 insertionPoint(2) = 0 height = 0.5 ' Create the text object in model space Set textObj = ThisDrawing.ModelSpace. _ AddText(textString, insertionPoint, height) ' Change the value of the Height to 1 textObj.height = 1 textObj.Update End Sub
Dim textObj As AcadText Dim textString As String Dim insertionPoint(0 To 2) As Double Dim height As Double ' Define the text object textString = "Hello, World." insertionPoint(0) = 3 insertionPoint(1) = 3 insertionPoint(2) = 0 height = 0.5 ' Create the text object in model space Set textObj = ThisDrawing.ModelSpace. _ AddText(textString, insertionPoint, height) ' Change the value of the ObliqueAngle ' to 45 degrees (.707 radians) textObj.ObliqueAngle = 0.707 textObj.Update End Sub
To change a text style associated with an individual Text object, set the StyleName property to a new text style. Once you have changed the text style, use the Update method for the Text object to see the changes in your drawing. In addition to the standard editable properties for entities (color, layer, linetype, and so forth), other properties that you can change on a Text object include the following: Alignment Specifies the horizontal and vertical alignment for the text. InsertionPoint Specifies the insertion point for the text. ObliqueAngle Specifies the oblique angle of the individual text object. Rotation Specifies the rotation angle in radians for the text. ScaleFactor Specifies the scale factor for the text. TextAlignmentPoint Specifies the alignment point for the text. TextGenerationFlag Specifies whether the text is displayed backward, upside-down, or both simultaneously. TextString Specifies the actual text string displayed. Once you have changed a property, use the Update method to see the changes in your drawing. NOTE For a complete list of methods and properties, see the Text object documentation in the AutoCADActiveX and VBA Reference.
ThisDrawing.Regen acActiveViewport MsgBox "The Text object is now aligned right" End Sub
Orientation options such as style, justification, width, and rotation affect all text within the mtext text boundary, not specific words or characters. Use the AttachmentPoint property to change the justification of mtext, and the Rotation property to control the angle of rotation of the text boundary. The StyleName property sets the default fonts and formatting characteristics for new text. As you create text, you can select which style you want to use from a list of existing styles. When you change the style of an MText object that has character formatting applied to any portion of the text, the style is applied to the entire object, and some formatting of characters might not be retained. For instance, changing from a TrueType style to a style using an SHX font or to another TrueType font causes the text to use the new font for the entire object, and any character formatting is lost. Formatting options such as underlining, stacked text, or fonts can be applied to individual words or characters within a paragraph. You also can change color, font, and text height. You can change the spaces between text characters or increase the width of the characters. Use curly braces ({ }) to apply a format change only to the text within the braces. You can nest braces up to eight levels deep. You also can enter the ASCII equivalent for control codes within lines or paragraphs to indicate formatting or special characters, such as tolerance or dimensioning symbols. The following control characters can be used to create the text in the illustration. (For the ASCII equivalent of this string see the example following the illustration.) {{\H1.5x; Big text} \A2; over text\A1;/\A0; under text}
For more information about formatting multiline text, see Format Characters Within Multiline Text in the User's Guide. Use control characters to format text This example creates and formats an MText object.
Sub Ch4_FormatMText() Dim mtextObj As AcadMText Dim insertPoint(0 To 2) As Double Dim width As Double Dim textString As String insertPoint(0) = 2 insertPoint(1) = 2 insertPoint(2) = 0 width = 4
' Define the ASCII characters for the control characters Dim OB As Long ' Open Bracket { Dim CB As Long ' Close Bracket } Dim BS As Long ' Back Slash \ Dim FS As Long ' Forward Slash / Dim SC As Long ' Semicolon ; OB = Asc("{") CB = Asc("}") BS = Asc("\") FS = Asc("/") SC = Asc(";") ' Assign the text string the following line of control ' characters and text characters: ' {{\H1.5x; Big text}\A2; over text\A1;/\A0; under text} textString = Chr(OB) + Chr(OB) + Chr(BS) + "H1.5x" _ + Chr(SC) + "Big text" + Chr(CB) + Chr(BS) + "A2" _ + Chr(SC) + "over text" + Chr(BS) + "A1" + Chr(SC) _ + Chr(FS) + Chr(BS) + "A0" + Chr(SC) + "under text" _ + Chr(CB) ' Create a text Object in model space Set mtextObj = ThisDrawing.ModelSpace. _ AddMText(insertPoint, width, textString) ZoomAll End Sub
Description
Degree symbol Plus/minus tolerance symbol Diameter dimensioning symbol
In addition to using Unicode characters for special characters, you can specify a special character by including control information in the text string. Use a pair of percent signs (%%) to introduce each control sequence. For example, the following control code works with standard AutoCAD text and PostScript fonts to draw character number nnn:
%%nnn
These control codes work with standard AutoCAD text fonts only: Control code descriptions Control code
%%o %%u %%d %%p %%c %%%
Description
Toggles overscore mode on and off Toggles underscore mode on and off Draws degree symbol Draws plus and minus tolerance symbol Draws diameter dimensioning symbol Draws single percent sign
Substitute Fonts
You can designate fonts to be substituted for other fonts or as defaults when AutoCAD cannot find a font specified in a drawing. The fonts used for the text in your drawing are determined by the text style and, for mtext, by individual font formats applied to sections of text. You can use font mapping tables to ensure that your drawing uses only certain fonts, or to convert the fonts you used to other fonts. You can use these font mapping tables to enforce corporate font standards, or to facilitate offline printing. AutoCAD comes with a default font mapping table. You can edit this file using any ASCII text editor. You also can specify a different font mapping table file by using the FontFileMap property on the Preferences object. For more information about font mapping tables and substituting fonts, see Substitute Fonts in the User's Guide.
AutoCAD uses the simplex.shx file. However, you can specify a different font if necessary. Use the AltFontFile property on the Preferences object to set the alternative font file name. If you use a text style that uses a Big Font, you can map it to another font using the AltFontFile property. This system variable uses a default font file pair of txt.shx, bigfont.shx. If AutoCAD cannot find a font file when a drawing is opened, it applies a default set of font substitution rules.
Check Spelling
During a spelling check, AutoCAD matches the words in the drawing to the words in the current main dictionary. Any words you add are stored in the custom dictionary that is current at the time of the spelling check. For example, you can add proper names so that AutoCAD no longer identifies them as misspelled words. To check spelling in another language, you can change to a different main dictionary. There is no method for checking spelling provided in AutoCAD ActiveX Automation. However, you can specify a different main dictionary using the MainDictionary property, or a different custom dictionary using the CustomDictionary property on the Preferences object. For more information about spellings checks, see Check Spelling in the User's Guide.
Dimensions add measurements to a drawing. Tolerances specify by how much a dimension can vary. With ActiveX Automation, dimensions can be managed with dimension styles and overrides.
Dimensioning Concepts
Dimensions show the geometric measurements of objects, the distances or angles between objects, or the X and Y coordinates of a feature. AutoCAD provides three basic types of dimensioning: linear, radial, and angular. Linear dimensions include aligned, rotated, and ordinate dimensions.
You can create dimensions for lines, multilines, arcs, circles, and polyline segments, or you can create dimensions that stand alone. AutoCAD draws dimensions on the current layer. Every dimension has a dimension style associated with it, whether it's the default or one you define. The style controls characteristics such as color, text style, and linetype scale. Thickness information is not supported. Style families allow for subtle modifications to a base style for different types of dimensions. Overrides allow for style modifications to a specific dimension.
For more information about dimensions, see Change Existing Objects in the User's Guide.
Parts of a Dimension
This section briefly defines the parts of a dimension.
A dimension line is a line that indicates the direction and extent of a dimension. For an angular dimension, the dimension line is an arc. Extension lines, also called projection lines or witness lines, extend from the feature being dimensioned to the dimension line. Arrowheads, also called symbols of termination or just termination, are added to each end of the dimension line. Dimension text is a text string that usually indicates the actual measurement. The text may also include prefixes, suffixes, and tolerances. A leader is a solid line leading from some annotation to the referenced feature. A center mark is a small cross that marks the center of a circle or arc. Centerlines are broken lines that mark the center of a circle or arc.
See Parts of a Dimensionin the User's Guide for more information about the parts of a dimension.
variables by using the SetVariable method. For example, the following line of code sets the DIMAUNIT system variable (the units format for angular dimensions) to radians (3):
ThisDrawing.SetVariable "DIMAUNIT", 3
See Use Dimension Styles in the User's Guide for more information about the dimensioning system variables.
Single-line dimension text uses the active text style as specified by the ActiveTextStyle property. Paragraphs of text use the active text style with any modifications you make in your text string. For more information about dimension text, see Control Dimension Text in the User's Guide.
Leader objects are associated with the annotation, so when the annotation is edited, the leader is updated accordingly. You can copy annotation used elsewhere in a drawing and append it to a leader, or you can create a new annotation. You can also create a leader with no annotation appended. For more information about leaders, see Overview of Creating Text and Leaders in the User's Guide.
Create Dimensions
You can create linear, radial, angular, and ordinate dimensions. When creating dimensions, the active dimension style is used. Once created, you can modify the extension line origins, the dimension text location, and the dimension text content and its angle relative to the dimension line. You can also change the dimension style used by the dimension. For more information about creating dimensions, see Change Existing Objects in the User's Guide.
To create a linear dimension, use the AddDimAligned or AddDimRotated method. After you create linear dimensions, you can modify the text, the angle of the text, or the angle of the dimension line. In the following illustrations, the extension line origins are designated explicitly. The resulting dimension line location is also shown:
To create an aligned dimension, use the AddDimAligned method. This method requires three coordinates as input: the origin of both extension lines and the text position. To create a rotated dimension, use the AddDimRotated method. This method requires three coordinates and the angle of the dimension line as input. The three coordinates are the origin of both extension lines and the text position. The angle must be provided in radians and represents the angle of rotation for the dimension line. For additional information about creating linear dimensions, see Create Linear Dimensions in the User's Guide.
system variables. (System variables can be queried or set using the GetVariable and SetVariable methods.) For horizontal dimension text, if the angle of the dimension line is more than 15 degrees from horizontal, and is outside the circle or arc, AutoCAD draws a hook line, also called a landing or dogleg. The hook line is one arrowhead long, and is placed next to the dimension text, as shown in the following illustrations:
To create radial dimensions, use the AddDimRadial or AddDimDiametric method. These methods require three values as input: the coordinate of the circle or arc's center, the coordinate for the leader attachment, and the length of the leader. These methods use the LeaderLength parameter as the distance from the ChordPoint to the point where the dimension will do a horizontal hook line to the annotation text (or stop if no hook line is necessary). For additional information about creating radial dimensions, see Create Radial Dimensions in the User's Guide. Create a radial dimension This example creates a radial dimension in model space.
Sub Ch5_CreateRadialDimension() Dim dimObj As AcadDimRadial Dim center(0 To 2) As Double Dim chordPoint(0 To 2) As Double Dim leaderLen As Integer ' Define the dimension center(0) = 0 center(1) = 0 center(2) = 0 chordPoint(0) = 5
chordPoint(1) = 5 chordPoint(2) = 0 leaderLen = 5 ' Create the radial dimension in model space Set dimObj = ThisDrawing.ModelSpace. _ AddDimRadial(center, chordPoint, leaderLen) ZoomAll End Sub
NOTE The LeaderLength setting is only used during the creation of the dimension (and even then only if the dimension is set to use the default text position value). After the dimension is closed for the first time, changing the LeaderLength value will not affect how the dimension is displayed, but the new setting will be stored and will show up in DXF, LISP, and ADSRX applications.
FirstPoint(2) = 0 SecondPoint(0) = 1 SecondPoint(1) = 3 SecondPoint(2) = 0 TextPoint(0) = 3 TextPoint(1) = 5 TextPoint(2) = 0 ' Create the angular dimension in model space Set dimObj = ThisDrawing.ModelSpace. _ AddDimAngular(angVert, FirstPoint, SecondPoint, TextPoint) ZoomAll End Sub
Ordinate dimensions consist of an X or Y ordinate with a leader line. X-datum ordinate dimensions measure the distance of a feature from the datum along the X axis. Y-datum ordinate dimensions measure the same distance along the Y axis. AutoCAD uses the origin of the current user coordinate system (UCS) to determine the measured coordinates. The absolute value of the coordinate is used. The text is aligned with the ordinate leader line regardless of the text orientation defined by the current dimension style. You can accept the default text or supply your own. To create an ordinate dimension, use the AddDimOrdinate method. This method requires three values as input: a coordinate specifying the point to be dimensioned (A), a coordinate specifying the end of the leader (B), and a Boolean flag specifying whether the dimension is an X-datum ordinate dimension or a Y-datum ordinate dimension. If you enter TRUE for the Boolean flag, the method will create an X-datum ordinate dimension. If you enter FALSE, it will create a Y-datum ordinate dimension.
For additional information about creating ordinate dimensions, see Create Ordinate Dimensions in the User's Guide. Create an ordinate dimension This example creates an ordinate dimension in model space.
Sub Ch5_CreatingOrdinateDimension() Dim dimObj As AcadDimOrdinate Dim definingPoint(0 To 2) As Double Dim leaderEndPoint(0 To 2) As Double Dim useXAxis As Long ' Define the dimension definingPoint(0) = 5 definingPoint(1) = 5 definingPoint(2) = 0 leaderEndPoint(0) = 10 leaderEndPoint(1) = 5 leaderEndPoint(2) = 0 useXAxis = 5 ' Create an ordinate dimension in model space Set dimObj = ThisDrawing.ModelSpace. _ AddDimOrdinate(definingPoint, _ leaderEndPoint, useXAxis) ZoomAll End Sub
Edit Dimensions
As with other graphical objects in AutoCAD, you can edit dimensions using the standard methods and properties provided for the object. The following properties are available for most dimension objects: Rotation Specifies the rotation angle in radians for the dimension line. StyleName Specifies the name of the dimension style. TextOverride Specifies the text string for the dimension. TextPosition Specifies the dimension text position.
TextRotation Specifies the rotation angle of the dimension text. Measurement Specifies the actual measurement for the dimension. In addition, certain dimension objects provide properties for editing the extension line origins and leader length. The following methods are included for dimension object editing: ArrayPolar Creates a polar array. ArrayRectangular Creates a rectangular array. Copy Copies the dimension object. Erase Erases the dimension object. Mirror Mirrors the dimension object. Move Moves the dimension object. Rotate Rotates the dimension object. ScaleEntity Scales the dimension object. For more information about editing dimensions, see Modify Existing Dimensions in the User's Guide.
("Style 3 copied from the running drawing values") Call newStyle2.CopyFrom(ThisDrawing) End Sub
Open the DIMSTYLE dialog box. You should now have three dimension styles listed. Style 1 should have a yellow dimension line. Style 2 should be the same as Style 1. Style 3 should have a blue dimension line.
DimensionLineColor Specifies the color of the dimension line for a dimension, leader, or tolerance object. DimensionLineWeight Specifies the lineweight for the dimension lines. DimLine1Suppress, DimLine2Suppress Specifies the suppression of the dimension lines. DimLineInside Specifies the display of dimension lines inside the extension lines only. ExtensionLineColor Specifies the color for dimension extension lines. ExtensionLineExtend Specifies the distance the extension line extends beyond the dimension line. ExtensionLineOffset Specifies the distance the extension lines are offset from the origin points. ExtensionLineWeight Specifies the lineweight for the extension lines. ExtLine1EndPoint, ExtLine2EndPoint Specifies the endpoint of extension lines. ExtLine1StartPoint, ExtLine2StartPoint Specifies the start point of extension lines. ExtLine1Suppress, ExtLine2Suppress Specifies the suppression of extension lines. Fit Specifies the placement of text and arrowheads inside or outside extension lines.
ForceLineInside Specifies if a dimension line is drawn between the extension lines even when the text is placed outside the extension lines. FractionFormat Specifies the format of fractional values in dimensions and tolerances. HorizontalTextPosition Specifies the horizontal justification for dimension text. LinearScaleFactor Specifies a global scale factor for linear dimensioning measurements. PrimaryUnitsPrecision Specifies the number of decimal places displayed for the primary units of a dimension or tolerance. SuppressLeadingZeros, SuppressTrailingZeros Specifies the suppression of leading and trailing zeros in dimension values. SuppressZeroFeet, SuppressZeroInches Specifies the suppression of a zero foot and zero inch measurement in dimension values. TextColor Specifies the color of the text for dimension and tolerance objects. TextGap Specifies the distance between the dimension text and the dimension line when you break the dimension line to accommodate dimension text. TextHeight Specifies the height for the dimension or tolerance text. TextInside Specifies if the dimension text is to be drawn inside the extension lines. TextInsideAlign Specifies the position of dimension text inside the extension lines for all dimension types except ordinate.
TextMovement Specifies how dimension text is drawn when text is moved. TextOutsideAlign Specifies the position of dimension text outside the extension lines for all dimension types except ordinate. TextPosition Specifies the dimension text position. TextPrecision Specifies the precision of angular dimension text. TextPrefix Specifies the dimension value prefix. TextRotation Specifies the rotation angle of the dimension text. TextSuffix Specifies the dimension value suffix. ToleranceDisplay Specifies if tolerances are displayed with the dimension text. ToleranceHeightScale Specifies a scale factor for the text height of tolerance values relative to the dimension text height. ToleranceJustification Specifies the vertical justification of tolerance values relative to the nominal dimension text. ToleranceLowerLimit Specifies the minimum tolerance limit for dimension text. TolerancePrecision Specifies the precision of tolerance values in primary dimensions.
ToleranceSuppressLeadingZeros Specifies the suppression of leading zeros in tolerance values. ToleranceSuppressTrailingZeros Specifies the suppression of trailing zeros in dimension values. ToleranceUpperLimit Specifies the maximum tolerance limit for dimension text. UnitsFormat Specifies the unit format for all dimensions except angular. VerticalTextPosition Specifies the vertical position of text in relation to the dimension line. Enter a user-defined suffix for an aligned dimension This example creates an aligned dimension in model space and uses the TextSuffix property to allow the user to change the text suffix for the dimension.
Sub Ch5_AddTextSuffix() Dim dimObj As AcadDimAligned Dim point1(0 To 2) As Double Dim point2(0 To 2) As Double Dim location(0 To 2) As Double Dim suffix As String ' Define the dimension point1(0) = 0: point1(1) = 5: point1(2) = 0 point2(0) = 5: point2(1) = 5: point2(2) = 0 location(0) = 5: location(1) = 7: location(2) = 0 ' Create an aligned dimension object in model space Set dimObj = ThisDrawing.ModelSpace. _ AddDimAligned(point1, point2, location) ThisDrawing.Application.ZoomAll ' Allow the user to change the text suffix for the dimension suffix = InputBox("Enter a new text suffix for the dimension" _ , "Set Dimension Suffix", ":SUFFIX") ' Apply the change to the dimension dimObj.TextSuffix = suffix ThisDrawing.Regen acAllViewports End Sub
dimensions in model space, because AutoCAD places the definition points in the space where the geometry is drawn. If you draw a dimension in paper space that describes geometry in your model, the paper space dimension does not change when you use editing commands or change the magnification of the display in the model space viewport. The location of the paper space dimensions also stays the same when you change a view from paper space to model space. If you're dimensioning in paper space and the global scale factor for linear dimensioning (the DIMLFAC system variable) is set at less than 0, the distance measured is multiplied by the absolute value of DIMLFAC. If you're dimensioning in model space, the value of 1.0 is used even if DIMLFAC is less than 0. AutoCAD computes a value for DIMLFAC if you change the variable at the Dim prompt and select the Viewport option. AutoCAD calculates the scaling of model space to paper space and assigns the negative of this value to DIMLFAC.
To create a leader line, use the AddLeader method. This method requires three values as input: the array of coordinates specifying where to create the leader, the annotation object (or NULL if the leader is to have no annotation), and the type of leader to create. The type of leader specifies whether the leader is to be a straight line or a smooth spline curve. It also determines whether or not the leader is to have arrows. Use one of the following constants to specify the type of leader: acLineNoArrow, acLineWithArrow, acSplineNoArrow, or acSplineWithArrow. These constants are mutually exclusive. Create a leader line This example creates a leader line in model space. There is no annotation associated with the leader line.
Sub Ch5_CreateLeader() Dim leaderObj As AcadLeader Dim points(0 To 8) As Double Dim leaderType As Integer Dim annotationObject As AcadObject points(0) = 0: points(1) = 0: points(2) = 0 points(3) = 4: points(4) = 4: points(5) = 0 points(6) = 4: points(7) = 5: points(8) = 0 leaderType = acLineWithArrow Set annotationObject = Nothing ' Create the leader object in model space Set leaderObj = ThisDrawing.ModelSpace. _ AddLeader(points, annotationObject, leaderType) ZoomAll End Sub
Leader Associativity
Leaders are associated with their annotation so that when the annotation moves, the endpoint of the leader moves with it. As you move text and feature
control frame annotation, the final leader line segment alternates between attaching to the left side and to the right side of the annotation according to the relation of the annotation to the penultimate (second to last) point of the leader. If the midpoint of the annotation is to the right of the penultimate leader point, then the leader attaches to the right; otherwise, it attaches to the left. Removing either object from the drawing using either the Erase, Add (to add a block), or WBlock method will break associativity. If the leader and its annotation are copied together in a single operation, the new copy is associative. If they are copied separately, they will not be associative. If associativity is broken for any reason, for example, by copying only the Leader object or by erasing the annotation, the hook line will be removed from the leader. Associate a leader to the annotation This example creates an MText object. A leader line is then created using the MText object as its annotation.
Sub Ch5_AddAnnotation() Dim leaderObj As AcadLeader Dim mtextObj As AcadMText Dim points(0 To 8) As Double Dim insertionPoint(0 To 2) As Double Dim width As Double Dim leaderType As Integer Dim annotationObject As Object Dim textString As String, msg As String ' Create the MText object in model space textString = "Hello, World." insertionPoint(0) = 5 insertionPoint(1) = 5 insertionPoint(2) = 0 width = 2 Set mtextObj = ThisDrawing.ModelSpace. _ AddMText(insertionPoint, width, textString) ' Data for Leader points(0) = 0: points(1) = 0: points(2) = 0 points(3) = 4: points(4) = 4: points(5) = 0 points(6) = 4: points(7) = 5: points(8) = 0 leaderType = acLineWithArrow ' Create the Leader object in model space and associate ' the MText object with the leader Set annotationObject = mtextObj Set leaderObj = ThisDrawing.ModelSpace. _ AddLeader(points, annotationObject, leaderType) ZoomAll End Sub
Edit Leaders
Any modifications to leader annotation that change its position affect the position of the endpoint of the associated leader. Also, rotating the annotation causes the leader hook line (if any) to rotate. To resize a leader, you can scale it. Scaling updates only the scale of the selected object. For example, if you scale the leader, the annotation stays in the same position relative to the leader endpoint but isn't scaled. In addition to scaling, you can also move, mirror, and rotate a leader. Use the ScaleEntity, Move, Mirror, and Rotate methods to edit the leader. You can also change the text style associated with the annotation by using the StyleName property.
specifying the direction of the tolerance. You can also copy, move, erase, scale, and rotate tolerances. Create a geometric tolerance This example creates a simple geometric tolerance in model space.
Sub Ch5_CreateTolerance() Dim toleranceObj As AcadTolerance Dim textString As String Dim insertionPoint(0 To 2) As Double Dim direction(0 To 2) As Double ' Define the tolerance object textString = "Here is the Feature Control Frame" insertionPoint(0) = 5 insertionPoint(1) = 5 insertionPoint(2) = 0 direction(0) = 1 direction(1) = 1 direction(2) = 0 ' Create the tolerance object in model space Set toleranceObj = ThisDrawing.ModelSpace. _ AddTolerance(textString, insertionPoint, direction) ZoomAll End Sub
Edit Tolerances
Tolerances are influenced by several system variables: DIMCLRD controls the color of the feature control frame; DIMCLRT controls the color of the tolerance text; DIMGAP controls the gap between the feature control frame and the text; DIMTXT controls the size of the tolerance text; and DIMTXTSTY controls the style of the tolerance text. Use the SetVariable method to set the values of system variables.
AutoCAD ActiveX Automation gives you extensive control over the customization of menus and toolbars in the current AutoCAD session. Using AutoCAD ActiveX/VBA, you can edit or augment the existing menu structure, or you can completely replace the current menu structure. You can also manipulate toolbars and right-click menus. Menu customization can improve productivity by exposing application-specific tasks or by condensing tasks with multiple steps into a single menu selection. For information about customizing menus and toolbars in addition to the information in this section, see the Customization Guide.
The MenuGroups collection contains the menu groups that are loaded in the current AutoCAD session. These menu groups contain all the menus that are available to the AutoCAD session, some or all of which may be displayed on the AutoCAD menu bar. In addition to the menus, the menu groups also contain all the toolbars that are available to the current AutoCAD session. Menu groups may also represent tile menus, screen menus, or tablet menus. Each menu group contains a PopupMenus collection and a Toolbars collection. The PopupMenus collection contains all the menus within the menu group. Likewise, the Toolbars collection contains all the toolbars within the menu group. Each PopupMenu is actually a collection that contains an individual object for each menu item that appears on that menu. Likewise, each Toolbar is also a collection that contains an individual object for each toolbar item that appears on that toolbar.
ThisDrawing.Application.MenuGroups.Load "acad.cui"
When using the Load method, set the BaseMenu parameter to TRUE to load a new menu group to the menu bar. This will load the menu group as a base menu in the same manner as the MENU command in AutoCAD. To load a new menu group as a partial menu, omit the BaseMenu parameter. This will load the menu group in the same manner as the MENULOAD command in AutoCAD. Once loaded into the MenuGroups collection, partial menus can be inserted into the menu bar by using the InsertMenuInMenuBar method or the InsertInMenuBar method. Once a menu group has been loaded, all the menus and toolbars defined by that menu group are available for use. You can Add new menus to the menu bar Remove menus from the menu bar Rearrange menus on the menu bar Add new items to an existing menu or toolbar Remove items from an existing menu or toolbar Create new menus and toolbars Float or dock toolbars Enable or disable menu and toolbar items Check or uncheck a menu item Change the tag, label, or help string of a menu or toolbar item Reassign the macros associated to a menu or toolbar item NOTE You can only edit popup menus and toolbars using ActiveX Automation. However, you can use ActiveX Automation to load and unload other menu types such as image tile menu items, screen menus, or tablet menus.
The RemoveFromMenuBar method is called directly from the PopupMenu object to be removed. This method does not require any input. The name of the menu is not needed because you are calling the method directly from the object to be removed. You should use whichever method is more convenient for your application. NOTE Menus that have been removed from the menu bar are still available in their designated menu group. They are simply no longer visible to the user.
Sub Ch6_CreateMenu() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Create the new menu Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") End Sub
The first index position is zero (0) and the separators are listed as individual menu items with their own index position. The Count property for the menu pictured would be six (6). To add a menu item between Tile Horizontally and Tile Vertically, set the Index parameter to two (2), which is the index of the Tile Vertically menu item. This inserts your new menu item into index two (2) and bumps all the remaining menu items down one index position. Once a menu item has been created, you cannot change the index of the menu item through the Index property. To change the index of an existing menu item you must delete and re-add the menu item to a different position, or add or delete surrounding menu items until a proper placement is achieved.
' Add a menu item to the new menu Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' Assign the macro the VBA equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newMenuItem = newMenu.AddMenuItem _ (newMenu.count + 1, "Open", openMacro) ' Display the menu on the menu bar newMenu.InsertInMenuBar _ (ThisDrawing.Application.menuBar.count + 1) End Sub
("Te" + Chr(Asc("&")) + "stMenu") ' Add a menu item to the new menu Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' Assign the macro the VBA equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newMenuItem = newMenu.AddMenuItem _ (newMenu.count + 1, Chr(Asc("&")) _ + "Open", openMacro) ' Display the menu on the menu bar newMenu.InsertInMenuBar _ (ThisDrawing.Application.menuBar.count + 1) End Sub
Create and populate a submenu This example creates a new menu called TestMenu and adds it to a submenu called OpenFile. The submenu is then populated with a menu item called Open, which opens a drawing when executed. Finally, the menu is displayed on the menu bar.
Sub Ch6_AddASubMenu() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Create the new menu Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") ' Add the submenu Dim FileSubMenu As AcadPopupMenu Set FileSubMenu = newMenu.AddSubMenu("", "OpenFile") ' Add a menu item to the sub menu Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' Assign the macro the VB equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newMenuItem = FileSubMenu.AddMenuItem _ (newMenu.count + 1, "Open", openMacro) ' Display the menu on the menu bar newMenu.InsertInMenuBar _ (ThisDrawing.Application.menuBar.count + 1) End Sub
' Add a menu item Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' Assign the macro the VB equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newMenuItem = LastMenu.AddMenuItem _ (LastMenu.count + 1, "Open", openMacro) ' Remove the menu item from the menu newMenuItem.Delete End Sub
HelpString A help string is the text string that appears in the AutoCAD status line when a user highlights a menu item for selection. You can read or write the value of a help string by using the HelpString property. Enable Using the Enable property, you can enable or disable a menu item. You can also read the Enable property to determine if a menu item is currently enabled or disabled. Using this property to enable or disable a menu item overrides any setting for enabling in the DIESEL expression of the menu item. See Explore the Properties of Menu Items on page 182 for an example of disabling menu items. Check Using the Check property you can check or uncheck a menu item. You can also read the Check property to determine if a menu item is currently checked or unchecked. Using this property to check or uncheck a menu item overrides any setting for checking in the DIESEL expression of the menu item. Index The index of a menu item specifies the position of that menu item on the menu on which it belongs. The index position of a menu always begins with position 0. For example, if the item is the first item on a menu, it returns an index position of 0. If it is the second item on a menu, it returns an index position of 1 and so on. Type You can determine the type of a menu item by using the Type property. A menu item can be one of the following types: a regular menu, a separator, or the heading for a submenu. If the item is a regular menu item, this property returns acMenuItem. If the item is a separator, this property returns acMenuSeparator. If the item is a heading for a submenu, this property returns acSubMenu. SubMenu You can find the submenu by using the SubMenu property. If the menu item is of the type acSubMenu, this property returns the menu that is attached as the submenu, or embedded menu. The embedded menu is returned as a PopupMenu object.
If the menu item is not of the type acSubMenu, this property returns an error. Parent You can find the menu to which a menu item belongs by using the Parent property. This property returns the menu on which the menu item resides. The parent menu is returned as a PopupMenu object. Enable and disable menu items This example creates a new menu called TestMenu and inserts two menu items. The second menu item is then disabled using the Enable property and the menu is displayed on the menu bar.
Sub Ch6_DisableMenuItem() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Create the new menu Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") ' Add two menu items and a menu separator to the new menu Dim MenuEnable As AcadPopupMenuItem Dim MenuDisable As AcadPopupMenuItem Dim MenuSeparator As AcadPopupMenuItem Dim openMacro As String ' Assign the macro the VB equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set MenuEnable = newMenu.AddMenuItem _ (newMenu.count + 1, "OpenEnabled", openMacro) Set MenuSeparator = newMenu.AddSeparator("") Set MenuDisable = newMenu.AddMenuItem _ (newMenu.count + 1, "OpenDisabled", openMacro) ' Disable the second menu item MenuDisable.Enable = False ' Display the menu on the menu bar newMenu.InsertInMenuBar _ (ThisDrawing.Application.menuBar.count + 1) End Sub
The Add method requires as input the name of the toolbar to add. The name is a string of alphanumeric characters with no punctuation other than a dash (-) or an underscore (_). The name is the easiest way of identifying the toolbar within the collection. You can change the name of a toolbar once it has been created. To change the name of an existing toolbar, use the Name property for that toolbar. Create a new toolbar This example creates a new toolbar called TestToolbar in the first menu group in the MenuGroups collection.
Sub Ch6_CreateToolbar() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Create the new toolbar Dim newToolbar As AcadToolbar Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar") End Sub
(-) or an underscore (_). This string is displayed as the tooltip when the cursor is placed over the toolbar button. Once a toolbar button has been created, you can change the name using the Name parameter. HelpString A help string is the text string that appears in the AutoCAD status line when a user highlights a menu item for selection. Once a toolbar button has been created, you can change the help string for the button using the HelpString parameter. Macro A macro is a series of commands that executes specific actions when a toolbar button is selected. Toolbar macros can be simply recordings of keystrokes that accomplish a task, or they can be a complex combination of commands, AutoLISP, DIESEL, or ActiveX programming code. Once a Toolbar button has been created, you can change the macro for the button using the Macro parameter. FlyoutButton The FlyoutButton parameter is an optional flag stating whether or not the new button is to be a flyout button. If the new button is to be a flyout button, this parameter must be set to TRUE. If the new button is not to be a flyout button, this parameter can be set to FALSE or it can be ignored. Add buttons to a new toolbar This example creates a new toolbar and adds a button to the toolbar. The button is assigned a macro that will execute the OPEN command when the button is selected.
Sub Ch6_AddButton() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Create the new toolbar Dim newToolbar As AcadToolbar Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar") ' Add a button to the new toolbar Dim newButton As AcadToolbarItem Dim openMacro As String ' Assign the macro the VB equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newButton = newToolbar.AddToolbarButton _ ("", "NewButton", "Open a file.", openMacro) End Sub
Set MenuGroup0 = ThisDrawing.Application. _ MenuGroups.Item(0) Set Toolbar0 = MenuGroup0.Toolbars.Item(0) ' Clear the string variables SmallButtonName = "" LargeButtonName = "" ' Create a header for the message box and ' display the toolbar to be queried msg = "Toolbar: " + Toolbar0.Name + vbCrLf Toolbar0.Visible = True ' Iterate through the toolbar and collect data ' for each button in the toolbar. If the toolbar is ' a normal button or a flyout, collect the small ' and large button names for the button. For Each Button In Toolbar0 ButtonType = Choose(Button.Type + 1, "Button", _ "Separator", "Control", "Flyout") msg = msg & ButtonType & ": " If Button.Type = acToolbarButton Or _ Button.Type = acToolbarFlyout Then Button.GetBitmaps SmallButtonName, _ LargeButtonName msg = msg + SmallButtonName + ", " _ + LargeButtonName End If msg = msg + vbCrLf Next Button ' Display the results MsgBox msg End Sub
Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application. _ MenuGroups.Item(0) ' Create the first toolbar Dim FirstToolbar As AcadToolbar Set FirstToolbar = currMenuGroup.Toolbars. _ Add("FirstToolbar") ' Add a flyout button to the first menu on the menu bar Dim FlyoutButton As AcadToolbarItem Set FlyoutButton = FirstToolbar.AddToolbarButton _ ("", "Flyout", "Demonstrates a flyout button", _ "OPEN", True) ' Create the second toolbar. This will be attached to ' the first toolbar via the flyout button. Dim SecondToolbar As AcadToolbar Set SecondToolbar = currMenuGroup.Toolbars. _ Add("SecondToolbar") ' Add a button to the next toolbar Dim newButton As AcadToolbarItem Dim openMacro As String ' Assign the macro the VB equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newButton = SecondToolbar.AddToolbarButton _ ("", "NewButton", "Open a file.", openMacro) ' Attach the second toolbar to the flyout ' button on the first toolbar FlyoutButton.AttachToolbarToFlyout currMenuGroup.Name, _ SecondToolbar.Name ' Display the first toolbar, hide the second toolbar FirstToolbar.Visible = True SecondToolbar.Visible = False End Sub
The Row and Column parameters specify a number on the existing rows and columns of docked toolbars at which to dock the toolbar. You can query a toolbar to see if it is docked by using the DockStatus property. The DockStatus property will return TRUE if the toolbar is docked and FALSE if the toolbar is floating. Dock a toolbar This example creates a new toolbar with three buttons on it. The toolbar is then displayed and docked on the left side of the screen.
Sub Ch6_DockToolbar() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application. _ MenuGroups.Item(0) ' Create the new toolbar Dim newToolbar As AcadToolbar Set newToolbar = currMenuGroup.Toolbars. _ Add("TestToolbar") ' Add three buttons to the new toolbar. ' All three buttons will have the same macro attached. Dim newButton1 As AcadToolbarItem Dim newButton2 As AcadToolbarItem Dim newButton3 As AcadToolbarItem Dim openMacro As String ' Assign the macro the VB equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newButton1 = newToolbar.AddToolbarButton _ ("", "NewButton1", "Open a file.", openMacro) Set newButton2 = newToolbar.AddToolbarButton _ ("", "NewButton2", "Open a file.", openMacro) Set newButton3 = newToolbar.AddToolbarButton _ ("", "NewButton3", "Open a file.", openMacro) ' Display the toolbar newToolbar.Visible = True ' Dock the toolbar to the left of the screen. newToolbar.Dock acToolbarDockLeft End Sub
Tagstring A tag, or name tag, is a string consisting of alphanumeric and underscore (_) characters. This string uniquely identifies the toolbar item within a given toolbar. A new tag is assigned automatically when a toolbar item is created. You can read or write the value of a tag by using the Tagstring property. Name A name is a string identifying the toolbar item. It is also the string used for the tooltip text, which is the text string that pops up in AutoCAD when a user holds the mouse or another pointing device over the toolbar item. You can read or write the value of a name by using the Name property. Macro A macro is a series of commands that executes specific actions when a toolbar item is selected. Macros can simply be recordings of keystrokes that accomplish a task, or they can be a complex combination of commands, AutoLISP, DIESEL, or ActiveX programming code. You can read or write the value of a macro by using the Macro property. HelpString A help string is the text string that appears in the AutoCAD status line for a toolbar button. You can read or write the value of a help string by using the HelpString property. Index The index of a toolbar item specifies the position of that toolbar item on the toolbar to which it belongs. The index position of a toolbar always begins with position 0. For example, if the item is the first item on a toolbar, it will have an index position of 0. If it is the second item on a toolbar, it will have an index position of 1, and so on. You can read the index position of a toolbar item by using the Index property. Type A toolbar item can be one of the following types: a regular toolbar button, a separator, a flyout toolbar button, or a special control element. If the item is a regular toolbar button, this property returns acButton. If the item is a separator, this property returns acToolButtonSeparator. If the item is a
flyout button, this property returns acFlyout. If the item is a special control element, this property returns acControl. You can determine the type of a toolbar item by using the Type property. Flyout If the toolbar item is of the type acFlyout, this property returns the toolbar that is attached as the flyout toolbar. The flyout toolbar is returned as a Toolbar object. If the menu item is not of the type acFlyout, this property returns NULL. You can find the flyout toolbar of a toolbar item by using the Flyout property. Parent This property returns the toolbar on which the toolbar item resides. The Parent toolbar is returned as a Toolbar object. You can find the toolbar to which a toolbar item belongs by using the Parent property. Toolbar Properties There are other properties that apply to all toolbar items on the toolbar. Such properties include whether the toolbar is docked or floating, visible or hidden, and whether the toolbar uses large buttons or small buttons.
Create Macros
A macro is a series of commands that executes specific actions when a toolbar item is selected. Macros can simply be recordings of keystrokes that accomplish a task, or they can be a complex combination of commands, AutoLISP, DIESEL, or ActiveX programming code. If you intend to include command parameters in a menu macro, you must know the sequence in which that command expects its parameters. Every character in a menu macro is significant, even the blank spaces. As AutoCAD is revised and enhanced, the sequence of prompts for various commands (and sometimes even the command names) might change. Therefore, your custom menus might require minor changes when you upgrade to a new release of AutoCAD. When command input comes from a menu item, the settings of the PICKADD and PICKAUTO system variables are assumed to be 1 and 0, respectively. This preserves compatibility with previous releases of AutoCAD and makes customization easier because you are not required to check the settings of these variables.
ASCII equivalent
chr(59) chr(13) chr(94) + chr(124) chr(32)
Description
Issues ENTER Issues ENTER Issues TAB Enters a space; blank space between command sequences in a menu item is equivalent to pressing the SPACEBAR Pauses for user input Translates AutoCAD commands and key words that follow Continues menu macro to the next line (if last character) Displays the current top-level image, pull-down, or shortcut menu Prefix for a repeating item Loads a menu section or introduces a conditional DIESEL macro expression Toggles Snap on or off (CTRL+B) Cancels command (CTRL+C) Cancels command (ESC) Toggles Coords on or off (CTRL+D) Sets the next isometric plane (CTRL+E) Toggles Grid on or off (CTRL+G) Issues backspace
\ _ + =* *^C^C $ ^B ^C ESC ^D ^E ^G ^H
chr(92) chr(95) chr(43) chr(61) + chr(42) chr(42) + chr(3) + chr(3) chr(36) chr(2) chr(3) chr(3) chr(4) chr(5) chr(7) chr(8)
ASCII equivalent
chr(15) chr(16) chr(17) chr(20) chr(22) chr(26)
Description
Toggles Ortho on or off (CTRL+O) Toggles MENUECHO on or off Echoes all prompts, status listings, and input to the printer (CTRL+Q) Toggles Tablet on or off (CTRL+T) Changes current viewport (CTRL+V) Null character that suppresses the automatic addition of SPACEBAR at the end of a menu item
Macro Termination
When a macro is executed, AutoCAD places a space at the end of the macro before processing the command sequence. AutoCAD processes the following menu macro as though you had entered line SPACEBAR.
line
Sometimes this is undesirable; for example, the TEXT or DIM command must be terminated by ENTER, not by a space. Also, it sometimes takes more than one space (or ENTER) to complete a command, but some text editors don't let you create a line with trailing blanks. Two special conventions get around these problems. When a semicolon (;) appears in a macro, AutoCAD substitutes an ENTER. If a line ends with a control character, a backslash (\), a plus sign (+), or a semicolon (;), AutoCAD does not add a blank after it. Look at the following macro:
erase \;
If this item simply ended with the backslash (which indicates user input), it would fail to complete the ERASE operation, because AutoCAD doesn't add a blank after the backslash. Therefore, this macro uses a semicolon (;) to force an ENTER after the user input. Here are more examples:
ucs ucs ;
Selecting the first macro enters ucs and SPACEBAR on the command line, and the following prompt appears: Enter an option [New/Move/orthoGraphic/Prev/Restore/Save/Del/Apply/?/World] <World>: Selecting the second macro enters ucs, SPACEBAR, and semicolon (;) at the command line, which accepts the default value, World. No difference between the first and second item would be evident on the screen; naturally, you wouldn't put both on the same menu. Selecting the third macro displays a prompt for a starting point and then draws the address on three lines. In the triple-semicolon (;;;), the first semicolon ends the text string, the second causes repetition of the TEXT command, and the third calls for the default placement below the previous line. NOTE All special characters must be input using their ASCII equivalents. For a list of ASCII equivalents, see Macro Characters Mapped to ASCII Equivalents on page 193.
The first macro pauses to ask the user for the center point and then reads a radius of 1 from the macro. Note that there is no space after the backslash character (\). The next macro pauses to ask the user to enter one layer name, then turns that layer off and exits the LAYER command. The LAYER command normally prompts for another operation and exits only if you press SPACEBAR (blank) or ENTER (;). Normally, the macro resumes after one item is entered. Therefore, it isn't possible to construct a macro that accepts a variable number of inputs (as in object selection) and then continues. However, an exception is made for the SELECT command; a backslash suspends the macro until object selection has completed. For example, consider the following macro:
select \change previous ;properties color red ;
This macro uses the SELECT command to create a selection set of one or more objects. It then issues the CHANGE command, references this selection set using the Previous option, and changes the color of all selected objects to red. Because the backslash character (\) causes a macro to pause for user input, you cannot use a backslash for any other purpose in a macro. When specifying file directory paths, use a forward slash (/) as the path delimiter: for example, /direct/file. The following circumstances delay resumption of a macro: If input of a point is expected, Object Snap modes may precede entry of the actual point. If X/Y/Z point filters are used, the macro remains suspended until the entire point has been accumulated. For the SELECT command only, the macro doesn't resume until object selection has been completed. If the user responds with a transparent command, the suspended macro remains suspended until the transparent command is completed and the originally requested input is received. If the user responds by choosing another macro (to supply options or to execute a transparent command), the original macro is suspended, and the newly selected item is processed to completion before the suspended macro is resumed.
Cancel a Command
To make sure you have no previous incomplete commands, use ^C^C in a macro. This is the same as pressing ESC twice from the keyboard. Although a single ^C cancels most commands, ^C^C is required to return to the Command prompt from a DIM command. Therefore, ^C^C ensures that AutoCAD returns to the Command prompt in most cases.
Macro Repetition
Once you have selected a command, you are likely to use it several times before moving on to another command. That is how most people use tools; you pick up a tool, do several things with it, then pick up another tool, and so on. To avoid picking up the tool before each use, AutoCAD provides a command repetition capability, triggered by a null response. However, you cannot use this feature to specify command options.
This feature makes it possible for you to repeat frequently used commands until you choose another command. If a macro begins with *^C^C immediately following the item label, the macro is saved in memory. Subsequent Command prompts are answered by that macro until it is terminated by ESC or by the selection of another macro. Do not use ^C (Cancel) within a macro that begins with the string *^C^C; this cancels the macro repetition. The following is an example of the repetitive, or modal, approach to command handling.
*^C^CMOVE Single *^C^CCOPY Single *^C^CERASE Single *^C^CSTRETCH Single Crossing *^C^CROTATE Single *^C^CSCALE Single
Macro repetition does not work for items in image tile menus.
This macro terminates the current command and activates the ERASE command with the single selection option. After you select this item, you either point to the single object to be erased or point to a blank area and specify a window. The object(s) selected in this way are erased, and the macro is repeated (due to the leading asterisk) so that you can erase something else. Single selection mode leads to more dynamic interaction with AutoCAD.
Create Status-Line Help for Menu Items and Toolbar Items | 197
The HelpString property is empty when the menu or toolbar item is first created. Add status-line help to a menu item This example creates a new menu called TestMenu and then creates a menu item called Open. The menu item is then assigned status-line help via the HelpString property.
Sub Ch6_AddHelp() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Create the new menu Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add _ ("Te" + Chr(Asc("&")) + "stMenu") ' Add a menu item to the new menu Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' Assign the macro the VBA equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " ' Create the menu item Set newMenuItem = newMenu.AddMenuItem _ (newMenu.count + 1, Chr(Asc("&")) _ + "Open", openMacro) ' Add the status line help to the menu item newMenuItem.HelpString = "Opens an AutoCAD drawing file." ' Display the menu on the menu bar newMenu.InsertInMenuBar _ (ThisDrawing.Application.menuBar.count + 1) End Sub
Sub Ch6_AddMenuItemToshortcutMenu() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Find the shortcut menu and assign it to the ' shortcutMenu variable Dim scMenu As AcadPopupMenu Dim entry As AcadPopupMenu For Each entry In currMenuGroup.Menus If entry.shortcutMenu = True Then Set scMenu = entry End If Next entry ' Add a menu item to the shortcut menu Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' Assign the macro the VBA equivalent of "ESC ESC _open " openMacro = Chr(3) + Chr(3) + "_open " Set newMenuItem = scMenu.AddMenuItem _ ("", Chr(Asc("&")) _ + "OpenDWG", openMacro) End Sub
200
Use Events
Events are notifications, or messages, that are sent out by AutoCAD to inform you about the current state of the session, or alert you that something has happened. For example, when a drawing is opened the BeginOpen event is triggered. This event contains the name of the AutoCAD drawing that was opened. There is another event triggered when a drawing is closed. Given this information you could write a subroutine, or event handler, that uses these events to track the amount of time a user spends working on a particular drawing.
same object. However, you can safely read information from the object triggering an event. For example, suppose you have a floor that is filled with tiles and you create an event handler attached to the border of the floor. If you change the size of the floor, the event handler will automatically add or subtract tiles to fill the new area. The event handler will be able to read the new area of the border, but it cannot attempt any changes on the border itself. Do not perform any action from an event handler that will trigger the same event. If you perform the same action in an event handler that triggers that same event, you will create an infinite loop. For example, you should never attempt to open a drawing from within the BeginOpen event, or AutoCAD will simply continue to open more drawings until the maximum number of open drawings is reached. Remember that no events will be fired while AutoCAD is displaying a modal dialog box.
BeginFileDrop Triggered when a file is dropped on the main Application window. BeginLISP Triggered immediately after AutoCAD receives a request to evaluate a LISP expression. BeginModal Triggered just before a modal dialog box is displayed. BeginOpen Triggered immediately after AutoCAD receives a request to open an existing drawing. BeginPlot Triggered immediately after AutoCAD receives a request to print a drawing. BeginQuit Triggered just before an AutoCAD session ends. BeginSave Triggered immediately after AutoCAD receives a request to save the drawing. EndCommand Triggered immediately after a command completes. EndLISP Triggered upon completion of evaluating a LISP expression. EndModal Triggered just after a modal dialog box is dismissed. EndOpen Triggered immediately after AutoCAD finishes opening an existing drawing. EndPlot Triggered after a document has been sent to the printer. EndSave Triggered when AutoCAD has finished saving the drawing.
LISPCancelled Triggered when the evaluation of a LISP expression is canceled. NewDrawing Triggered just before a new drawing is created. SysVarChanged Triggered when the value of a system variable is changed. WindowChanged Triggered when there is a change to the Application window. WindowMovedOrResized Triggered just after the Application window has been moved or resized.
After the new object has been declared with events, it appears in the Object drop-down list box in the class module, and you can write event procedures for the new object in the class module. (When you select the new object in
the Object box, the valid events for that object are listed in the Procedure drop-down list box.) Before the procedures will run, however, you must connect the declared object in the class module with the Application object. You can do this with the following code from any module. To connect the declared object to the Application object 1 In the Code window for your main module, add the following line to the declarations section:
Dim X As New EventClassModule
3 In the code for your main module, add a call to the InitializeEvents subroutine:
Call InitializeEvents
Once the InitializeEvents procedure has been run, the App object in the class module points to the Application object specified, and any event procedures in the class module will run when the events occur. Prompt to continue when a drawing is dropped into AutoCAD This example intercepts the load process when a file has been dragged and dropped into AutoCAD. A message box containing the name of the file that was dropped and Yes/No/Continue buttons that allow the user to decide if the file should continue to be loaded or displayed. If the user chooses to cancel out of the operation, that decision is returned through the Cancel parameter of the BeginFileDrop event and the file is not loaded.
Public WithEvents ACADApp As AcadApplication Sub Example_AcadApplication_Events() ' This example intializes the public variable (ACADApp) ' which will be used to intercept AcadApplication Events ' ' Run this procedure FIRST! ' We could get the application from the ThisDocument ' object, but that would require having a drawing open, ' so we grab it from the system. Set ACADApp = GetObject(, "AutoCAD.Application.17") End Sub
Private Sub ACADApp_BeginFileDrop _ (ByVal FileName As String, Cancel As Boolean) ' This example intercepts an Application BeginFileDrop event. ' ' This event is triggered when a drawing file is dragged ' into AutoCAD. ' ' To trigger this example event: ' 1) Make sure to run the example that initializes ' the public variable (named ACADApp) linked to this event. ' ' 2) Drag an AutoCAD drawing file into the AutoCAD ' application from either the Windows Desktop ' or Windows Explorer ' Use the "Cancel" variable to stop the loading of the ' dragged file, and the "FileName" variable to notify ' the user which file is about to be dragged in. If MsgBox("AutoCAD is about to load " & FileName & vbCrLf _ & "Do you want to continue loading this file?", _ vbYesNoCancel + vbQuestion) <> vbYes Then Cancel = True End If End Sub
BeginLISP Triggered immediately after AutoCAD receives a request to evaluate a LISP expression. BeginPlot Triggered immediately after AutoCAD receives a request to print a drawing. BeginRightClick Triggered after the user right-clicks on the Drawing window. BeginSave Triggered immediately after AutoCAD receives a request to save the drawing. BeginShortcutMenuCommand Triggered after the user right-clicks on the Drawing window, and before the shortcut menu appears in Command mode. BeginShortcutMenuDefault Triggered after the user right-clicks on the Drawing window, and before the shortcut menu appears in Default mode. BeginShortcutMenuEdit Triggered after the user right-clicks on the Drawing window, and before the shortcut menu appears in Edit mode. BeginShortcutMenuGrip Triggered after the user right-clicks on the Drawing window, and before the shortcut menu appears in Grip mode. BeginShortcutMenuOsnap Triggered after the user right-clicks on the Drawing window, and before the shortcut menu appears in Osnap mode. Deactivate Triggered when the Drawing window is deactivated. EndCommand Triggered immediately after a command completes.
EndLISP Triggered upon completion of evaluating a LISP expression. EndPlot Triggered after a document has been sent to the printer. EndSave Triggered when AutoCAD has finished saving the drawing. EndShortcutMenu Triggered after the shortcut menu appears. LayoutSwitched Triggered after the user switches to a different layout. LISPCancelled Triggered when the evaluation of a LISP expression is canceled. ObjectAdded Triggered when an object has been added to the drawing. ObjectErased Triggered when an object has been erased from the drawing. ObjectModified Triggered when an object in the drawing has been modified. SelectionChanged Triggered when the current pickfirst selection set changes. WindowChanged Triggered when there is a change to the Document window. WindowMovedOrResized Triggered just after the Drawing window has been moved or resized.
After the new object has been declared with events, it appears in the Object drop-down list box in the class module, and you can write event procedures for the new object in the class module. (When you select the new object in the Object box, the valid events for that object are listed in the Procedure drop-down list box.) Before the procedures will run, however, you must connect the declared object in the class module with the Document object. You can do this with the following code from any module. To connect the declared object to the Document object 1 In the Code window for your main module, add the following line to the declarations section:
Dim X As New EventClassModule
End Sub
3 In the code for your main module, add a call to the InitializeApp subroutine:
Call InitializeEvents
Once the InitializeEvents procedure has been run, the Doc object in the class module points to the Document object created, and any event procedures in the class module will run when the events occur.
openMacro = Chr(vbKeyEscape) + Chr(vbKeyEscape) + "_open " Set newMenuItem = ShortcutMenu.AddMenuItem _ (0, Chr(Asc("&")) _ + "OpenDWG", openMacro) End Sub Private Sub AcadDocument_EndShortcutMenu _ (ShortcutMenu As AutoCAD.IAcadPopupMenu) On Error Resume Next ShortcutMenu.Item("OpenDWG").Delete End Sub
After the new object has been declared with events, it appears in the Object drop-down list box in the class module, and you can write event procedures
for the new object in the class module. (When you select the new object in the Object box, the valid events for that object are listed in the Procedure drop-down list box.) Before the procedures will run, however, you must connect the declared object in the class module with the Circle object. You can do this with the following code from any module. To connect the declared object to the Automation object 1 In the Code window for your main module, add the following line to the declarations section:
Dim X As New EventClassModule
2 In the same window, create a circle called MyCircle and initialize it as containing events:
Sub InitializeEvents() Dim MyCircle As AcadCircle Dim centerPoint(0 To 2) As Double Dim radius As Double centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0# radius = 5# Set MyCircle = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius) Set X.Object = MyCircle End Sub
3 In the code for your main module, add a call to the InitializeApp subroutine:
Call InitializeEvents
Once the InitializeEvents procedure has been run, the Circle object in the class module points to the Circle object created, and any event procedures in the class module will run when the events occur. NOTE When coding in VBA, you must provide an event handler for all objects enabled for the Modified event. If you do not provide a handler, VBA may terminate unexpectedly. Display the area of a closed polyline whenever the polyline is updated This example creates a lightweight polyline with events. The event handler for the polyline then displays the new area whenever the polyline is changed. To trigger the event, simply change the size of the polyline
in AutoCAD. Remember that you must run the CreatePLineWithEvents subroutine before the event handler is activated.
Public WithEvents PLine As AcadLWPolyline Sub CreatePLineWithEvents() ' This example creates a light weight polyline Dim points(0 To 9) As Double points(0) = 1: points(1) = 1 points(2) = 1: points(3) = 2 points(4) = 2: points(5) = 2 points(6) = 3: points(7) = 3 points(8) = 3: points(9) = 2 Set PLine = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points) PLine.Closed = True ThisDrawing.Application.ZoomAll End Sub Private Sub PLine_Modified _ (ByVal pObject As AutoCAD.IAcadObject) ' This event is triggered when the polyline is resized. ' If the polyline is deleted the modified event is still ' triggered, so we use the error handler to avoid ' reading data from a deleted object. On Error GoTo ERRORHANDLER MsgBox "The area of " & pObject.ObjectName & " is: " _ & pObject.Area Exit Sub ERRORHANDLER: MsgBox Err.Description End Sub
Most drawings consist of two-dimensional (2D) views of objects that are three dimensional (3D). Though this method of drafting is widely used in the architectural and engineering communities, it is limited: the drawings are 2D representations of 3D objects and must be visually interpreted. Moreover, because the views are created independently, there are more possibilities for error and ambiguity. As a result, you may want to create true 3D models instead of 2D representations. You can use the AutoCAD drawing tools to create detailed, realistic 3D objects and manipulate them in various ways.
Specify 3D Coordinates
Entering 3D world coordinate system (WCS) coordinates is similar to entering 2D WCS coordinates. In addition to specifying X and Y values, you specify a Z value. As with the 2D coordinates, a variant is used to pass the coordinates to ActiveX methods and properties, and to query the coordinates. For more information about specifying 3D coordinates, see Enter 3D Coordinates in the User's Guide. Define and query the coordinates for 2D and 3D polylines This example creates two polylines, each with three coordinates. The first polyline is a 2D polyline, the second polyline is 3D. Notice that the length of the array containing the vertices is expanded to include the Z coordinates in the creation of the 3D polyline. The example concludes by querying the coordinates of the polylines and displaying the coordinates in a message box.
Sub Ch8_Polyline_2D_3D() Dim pline2DObj As AcadLWPolyline Dim pline3DObj As AcadPolyline Dim points2D(0 To 5) As Double Dim points3D(0 To 8) As Double ' Define three 2D polyline points points2D(0) = 1: points2D(1) = 1 points2D(2) = 1: points2D(3) = 2 points2D(4) = 2: points2D(5) = 2 ' Define three 3D polyline points points3D(0) = 1: points3D(1) = 1: points3D(2) = 0 points3D(3) = 2: points3D(4) = 1: points3D(5) = 0
points3D(6) = 2: points3D(7) = 2: points3D(8) = 0 ' Create the 2D light weight Polyline Set pline2DObj = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points2D) pline2DObj.Color = acRed pline2DObj.Update ' Create the 3D polyline Set pline3DObj = ThisDrawing.ModelSpace. _ AddPolyline(points3D) pline3DObj.Color = acBlue pline3DObj.Update ' Query the coordinates of the polylines Dim get2Dpts As Variant Dim get3Dpts As Variant get2Dpts = pline2DObj.Coordinates get3Dpts = pline3DObj.Coordinates ' Display the coordinates MsgBox ("2D polyline (red): " & vbCrLf & _ get2Dpts(0) & ", " & get2Dpts(1) & vbCrLf & _ get2Dpts(2) & ", " & get2Dpts(3) & vbCrLf & _ get2Dpts(4) & ", " & get2Dpts(5)) MsgBox ("3D polyline (blue): " & vbCrLf & _ get3Dpts(0) & ", " & get3Dpts(1) & ", " & _ get3Dpts(2) & vbCrLf & _ get3Dpts(3) & ", " & get3Dpts(4) & ", " & _ get3Dpts(5) & vbCrLf & _ get3Dpts(6) & ", " & get3Dpts(7) & ", " & _ get3Dpts(8)) End Sub
matrix of a given UCS. Use this transformation matrix to find the equivalent WCS coordinates. To make a UCS active, use the ActiveUCS property on the Document object. If changes are made to the active UCS, the new UCS object must be reset as the active UCS for the changes to appear. To reset the active UCS, simply call the ActiveUCS property again with the updated UCS object. For more information about defining a UCS, see Control the User Coordinate System in 3D in the User's Guide. Create a new UCS, make it active, and translate the coordinates of a point into the UCS coordinates The following subroutine creates a new UCS and sets it as the active UCS for the drawing. It then asks the user to pick a point in the drawing, and returns both WCS and UCS coordinates for the point.
Sub Ch8_NewUCS() ' Define the variables we will need Dim ucsObj As AcadUCS Dim origin(0 To 2) As Double Dim xAxisPnt(0 To 2) As Double Dim yAxisPnt(0 To 2) As Double ' Define the UCS points origin(0) = 4: origin(1) = 5: origin(2) = 3 xAxisPnt(0) = 5: xAxisPnt(1) = 5: xAxisPnt(2) = 3 yAxisPnt(0) = 4: yAxisPnt(1) = 6: yAxisPnt(2) = 3 ' Add the UCS to the ' UserCoordinatesSystems collection Set ucsObj = ThisDrawing.UserCoordinateSystems. _ Add(origin, xAxisPnt, yAxisPnt, "New_UCS") ' Display the UCS icon ThisDrawing.ActiveViewport.UCSIconAtOrigin = True ThisDrawing.ActiveViewport.UCSIconOn = True ' Make the new UCS the active UCS ThisDrawing.ActiveUCS = ucsObj MsgBox "The current UCS is : " & ThisDrawing.ActiveUCS.Name _ & vbCrLf & " Pick a point in the drawing." ' Find the WCS and UCS coordinate of a point Dim WCSPnt As Variant Dim UCSPnt As Variant WCSPnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ") UCSPnt = ThisDrawing.Utility.TranslateCoordinates _ (WCSPnt, acWorld, acUCS, False) MsgBox "The WCS coordinates are: " & WCSPnt(0) & ", " _ & WCSPnt(1) & ", " & WCSPnt(2) & vbCrLf & _ "The UCS coordinates are: " & UCSPnt(0) & ", " _ & UCSPnt(1) & ", " & UCSPnt(2) End Sub
Convert Coordinates
The TranslateCoordinates method translates a point or a displacement from one coordinate system to another. A point argument, called OriginalPoint, can be interpreted as either a 3D point or a 3D displacement vector. This argument is distinguished by the Boolean argument, Disp. If the Disp argument is set to TRUE, the OriginalPoint argument is treated as a displacement vector; otherwise, it is treated as a point. Two more arguments determine which coordinate system the OriginalPoint is from, and to which coordinate system the OriginalPoint is to be converted. The following AutoCAD coordinate systems can be specified in the From and To arguments: WCS World coordinate system: The reference coordinate system. All other coordinate systems are defined relative to the WCS, which never changes. Values measured relative to the WCS are stable across changes to other coordinate systems. All points passed in and out of ActiveX methods and properties are expressed in the WCS unless otherwise specified. UCS User coordinate system (UCS): The working coordinate system. The user specifies a UCS to make drawing tasks easier. All points passed to AutoCAD commands, including those returned from AutoLISP routines and external functions, are points in the current UCS (unless the user precedes them with an * at the Command prompt). If you want your application to send coordinates in the WCS, OCS, or DCS to AutoCAD commands, you must first convert them to the UCS by calling the TranslateCoordinates method. OCS Object coordinate system: Point values specified by certain methods and properties for the Polyline and LightweightPolyline objects are expressed in this coordinate system, relative to the object. These points are usually converted into the WCS, current UCS, or current DCS, according to the intended use of the object. Conversely, points in WCS, UCS, or DCS must be translated into an OCS before they are written to the database by means of the same properties. See the AutoCAD ActiveX and VBA Reference for the methods and properties that use this coordinate system. When converting coordinates to or from the OCS you must enter the normal for the OCS in the final argument of the TranslateCoordinates function. DCS Display coordinate system: The coordinate system where objects are transformed before they are displayed. The origin of the DCS is the point
stored in the AutoCAD system variable TARGET, and its Z axis is the viewing direction. In other words, a viewport is always a plan view of its DCS. These coordinates can be used to determine where something will be displayed to the AutoCAD user. PSDCS Paper space DCS: This coordinate system can be transformed only to or from the DCS of the currently active model space viewport. This is essentially a 2D transformation, where the X and Y coordinates are always scaled and offset if the Disp argument is FALSE. The Z coordinate is scaled but never translated. Therefore, it can be used to find the scale factor between the two coordinate systems. The PSDCS can be transformed only into the current model space viewport. If the from argument equals PSDCS, then the to argument must equal DCS, and vice versa. Translate OCS coordinates to WCS coordinates This example creates a polyline in model space. The first vertex for the polyline is then displayed in both the OCS and WCS coordinates. The conversion from OCS to WCS requires the normal for the OCS be placed in the last argument of the TranslateCoordinates method.
Sub Ch8_TranslateCoordinates() ' Create a polyline in model space. Dim plineObj As AcadPolyline Dim points(0 To 14) As Double ' Define the 2D polyline points points(0) = 1: points(1) = 1: points(2) = 0 points(3) = 1: points(4) = 2: points(5) = 0 points(6) = 2: points(7) = 2: points(8) = 0 points(9) = 3: points(10) = 2: points(11) = 0 points(12) = 4: points(13) = 4: points(14) = 0 ' Create a light weight Polyline object in model space Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points) ' Find the X and Y coordinates of the ' first vertex of the polyline Dim firstVertex As Variant firstVertex = plineObj.Coordinate(0) ' Find the Z coordinate for the polyline ' using the elevation property firstVertex(2) = plineObj.Elevation ' Change the normal for the pline so that the ' difference between the coordinate systems ' is obvious. Dim plineNormal(0 To 2) As Double plineNormal(0) = 0# plineNormal(1) = 1# plineNormal(2) = 2# plineObj.Normal = plineNormal ' Translate the OCS coordinate into WCS Dim coordinateWCS As Variant coordinateWCS = ThisDrawing.Utility.TranslateCoordinates _
(firstVertex, acOCS, acWorld, False, plineNormal) ' Display the coordinates of the point MsgBox "The first vertex has the following coordinates:" _ & vbCrLf & "OCS: " & firstVertex(0) & ", " & _ firstVertex(1) & ", " & firstVertex(2) & vbCrLf & _ "WCS: " & coordinateWCS(0) & ", " & _ coordinateWCS(1) & ", " & coordinateWCS(2) End Sub
Create 3D Objects
Create a polyface mesh Create a wedge solid AutoCAD supports three types of 3D modeling: wireframe, surface, and solid. Each type has its own creation and editing techniques. For more information about creating 3D objects, see Create 3D Objects in the User's Guide.
Create Wireframes
With AutoCAD you can create wireframe models by positioning any 2D planar object anywhere in 3D space. You can position 2D objects in 3D space using several methods: Create the object by entering 3D points. You enter a coordinate that defines the X, Y, and Z location of the point. Set the default construction plane (XY plane) on which you will draw the object by defining a UCS. Move the object to its proper orientation in 3D space after you create it. Also, you can create some wireframe objects, such as polylines, that can exist in all three dimensions. Use the Add3DPoly method to create 3D polylines. For more information on creating wireframes, see Create Wireframe Models in the User's Guide.
Create Meshes
A rectangular mesh ( PolygonMesh object) represents an object's surface using planar facets. The mesh density, or number of facets, is defined in terms of a matrix of M and N vertices, similar to a grid consisting of columns and rows. M and N specify the column and row position, respectively, of any given vertex. You can create meshes in both 2D and 3D, but they are used primarily for 3D.
Use the Add3DMesh method for creating rectangular meshes. This method takes three values as input: the number of vertices in the M direction, the numer of vertices in the N direction, and a variant array containing coordinates for all the vertices in the mesh. Once the PolygonMesh is created, use the MClose and NClose properties to close the mesh. For more information on creating meshes, see Create Surfaces in the User's Guide. Create a polygon mesh This example creates a 44 polygon mesh. The direction of the active viewport is then adjusted so that the three-dimensional nature of the mesh is more easily viewed.
Sub Ch8_Create3DMesh() Dim meshObj As AcadPolygonMesh Dim mSize, nSize, Count As Integer Dim points(0 To 47) As Double ' create the matrix of points points(0) = 0: points(1) = 0: points(2) = 0 points(3) = 2: points(4) = 0: points(5) = 1 points(6) = 4: points(7) = 0: points(8) = 0 points(9) = 6: points(10) = 0: points(11) = 1 points(12) = 0: points(13) = 2: points(14) = 0 points(15) = 2: points(16) = 2: points(17) = 1 points(18) = 4: points(19) = 2: points(20) = 0 points(21) = 6: points(22) = 2: points(23) = 1 points(24) = 0: points(25) = 4: points(26) = 0 points(27) = 2: points(28) = 4: points(29) = 1 points(30) = 4: points(31) = 4: points(32) = 0 points(33) = 6: points(34) = 4: points(35) = 0 points(36) = 0: points(37) = 6: points(38) = 0 points(39) = 2: points(40) = 6: points(41) = 1 points(42) = 4: points(43) = 6: points(44) = 0 points(45) = 6: points(46) = 6: points(47) = 0 mSize = 4: nSize = 4 ' creates a 3Dmesh in model space Set meshObj = ThisDrawing.ModelSpace. _ Add3DMesh(mSize, nSize, points) ' Change the viewing direction of the viewport ' to better see the cylinder Dim NewDirection(0 To 2) As Double NewDirection(0) = -1 NewDirection(1) = -1 NewDirection(2) = 1 ThisDrawing.ActiveViewport.direction = NewDirection ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport ZoomAll End Sub
Create Solids
A solid object ( 3DSolid object) represents the entire volume of an object. Solids are the most informationally complete and least ambiguous of the 3D modeling types. Complex solid shapes are also easier to construct and edit than wireframes and meshes. You create solids from one of the basic solid shapes of box, cone, cylinder, sphere, torus, and wedge or by extruding a 2D object along a path or revolving a 2D object about an axis. Use one of the following methods to create solids: AddBox, AddCone, AddCylinder, AddEllipticalCone, AddEllipticalCylinder, AddExtrudedSolid, AddExtrudedSolidAlongPath, AddRevolvedSolid, AddSolid, AddSphere, AddTorus, or AddWedge. Like meshes, solids are displayed as wireframes until you hide, shade, or render them. Additionally, you can analyze solids for their mass properties (volume, moments of inertia, center of gravity, and so forth). Use the following properties to analyze solids: MomentOfInertia, PrincipalDirections, PrincipalMoments, ProductOfInertia, RadiiOfGyration, and Volume. The ContourlinesPerSurface property controls the number of tessellation lines used to visualize curved portions of the wireframe. The RenderSmoothness property adjusts the smoothness of shaded and hidden-line objects. For more information on creating solids, see Create 3D Objects in the User's Guide. Create a wedge solid The following example creates a wedge-shaped solid in model space. The viewing direction of the active viewport is updated to display the three-dimensional nature of the wedge more easily.
Sub Ch8_CreateWedge() Dim wedgeObj As Acad3DSolid Dim center(0 To 2) As Double Dim length As Double Dim width As Double Dim height As Double ' Define the wedge center(0) = 5#: center(1) = 5#: center(2) = 0 length = 10#: width = 15#: height = 20# ' Create the wedge in model space Set wedgeObj = ThisDrawing.ModelSpace. _ AddWedge(center, length, width, height) ' Change the viewing direction of the viewport Dim NewDirection(0 To 2) As Double
NewDirection(0) = -1 NewDirection(1) = -1 NewDirection(2) = 1 ThisDrawing.ActiveViewport.direction = NewDirection ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport ZoomAll End Sub
Edit in 3D
This section describes how to edit 3D objects by, for example, rotating, arraying, and mirroring.
Rotate in 3D
With the Rotate method, you can rotate objects in 2D about a specified point. The direction of rotation is determined by the WCS. The Rotate3D method rotates objects in 3D about a specified axis. The Rotate3D method takes three values as input: the WCS coordinates of the two points defining the rotation axis and the rotation angle in radians.
To rotate 3D objects, use either the Rotate or Rotate3D method. For more information on rotating in 3D, see Rotate Objects in the User's Guide. Create a 3D box and rotate it about an axis This example creates a 3D box. It then defines the axis for rotation and finally rotates the box 30 degrees about the axis.
Sub Dim Dim Dim Ch8_Rotate_3DBox() boxObj As Acad3DSolid length As Double width As Double
Dim height As Double Dim center(0 To 2) As Double ' Define the box center(0) = 5: center(1) = 5: center(2) = 0 length = 5 width = 7 height = 10 ' Create the box object in model space Set boxObj = ThisDrawing.ModelSpace. _ AddBox(center, length, width, height) ' Define the rotation axis with two points Dim rotatePt1(0 To 2) As Double Dim rotatePt2(0 To 2) As Double Dim rotateAngle As Double rotatePt1(0) = -3: rotatePt1(1) = 4: rotatePt1(2) = 0 rotatePt2(0) = -3: rotatePt2(1) = -4: rotatePt2(2) = 0 rotateAngle = 30 rotateAngle = rotateAngle * 3.141592 / 180# ' Rotate the box boxObj.Rotate3D rotatePt1, rotatePt2, rotateAngle ZoomAll End Sub
Array in 3D
With the ArrayRectangular method, you can create a rectangular array in 3D. In addition to specifying the number of columns (X direction) and rows (Y direction), you also specify the number of levels (Z direction). For more information on using arrays of objects in 3D, see Create an Array of Objects in the User's Guide. Create a 3D rectangular array This example creates a circle and then uses that circle to create a rectangular array of four rows, four columns, and three levels of circles.
Sub Ch8_CreateRectangularArray() ' 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) ' Define the rectangular array Dim numberOfRows As Long Dim numberOfColumns As Long Dim numberOfLevels As Long Dim distanceBwtnRows As Double Dim distanceBwtnColumns As Double Dim distanceBwtnLevels As Double
Edit in 3D | 225
numberOfRows = 4 numberOfColumns = 4 numberOfLevels = 3 distanceBwtnRows = 1 distanceBwtnColumns = 1 distanceBwtnLevels = 4 ' Create the array of objects Dim retObj As Variant retObj = circleObj.ArrayRectangular _ (numberOfRows, numberOfColumns, _ numberOfLevels, distanceBwtnRows, _ distanceBwtnColumns, distanceBwtnLevels) ZoomAll End Sub
For more information on mirroring objects in 3D, see Mirror Objects in the User's Guide. Mirror in 3D This example creates a box in model space. It then mirrors the box about a plane and colors the mirrored box red.
Sub Ch8_MirrorABox3D() ' Create the box object Dim boxObj As Acad3DSolid Dim length As Double Dim width As Double Dim height As Double Dim center(0 To 2) As Double center(0) = 5#: center(1) = 5#: center(2) = 0 length = 5#: width = 7: height = 10# ' Create the box (3DSolid) object in model space Set boxObj = ThisDrawing.ModelSpace. _
AddBox(center, length, width, height) ' Define the mirroring plane with three points Dim mirrorPt1(0 To 2) As Double Dim mirrorPt2(0 To 2) As Double Dim mirrorPt3(0 To 2) As Double mirrorPt1(0) = 1.25: mirrorPt1(1) = 0: mirrorPt1(2) = 0 mirrorPt2(0) = 1.25: mirrorPt2(1) = 2: mirrorPt2(2) = 0 mirrorPt3(0) = 1.25: mirrorPt3(1) = 2: mirrorPt3(2) = 2 ' Mirror the box Dim mirrorBoxObj As Acad3DSolid Set mirrorBoxObj = boxObj.Mirror3D _ (mirrorPt1, mirrorPt2, mirrorPt3) mirrorBoxObj.Color = acRed ZoomAll End Sub
Edit 3D Solids
Once you have created a solid, you can create more complex shapes by combining solids. You can join solids, subtract solids from each other, or find the common volume (overlapping portion) of solids. Use the Boolean or CheckInterference method to perform these combinations.
Solids are further modified by obtaining the 2D cross section of a solid or slicing a solid into two pieces. Use the SectionSolid method to find cross sections of solids, and the SliceSolid method for slicing a solid into two pieces. Find the interference between two solids This example creates a box and a cylinder in model space. It then finds the interference between the two solids and creates a new solid from that interference. For ease of viewing, the box is colored white, the cylinder is colored cyan, and the interference solid is colored red.
Sub Ch8_FindInterferenceBetweenSolids() ' Define the box Dim boxObj As Acad3DSolid Dim length As Double Dim width As Double
Dim height As Double Dim center(0 To 2) As Double center(0) = 5: center(1) = 5: center(2) = 0 length = 5 width = 7 height = 10 ' Create the box object in model space ' and color it white Set boxObj = ThisDrawing.ModelSpace. _ AddBox(center, length, width, height) boxObj.Color = acWhite ' Define the cylinder Dim cylinderObj As Acad3DSolid Dim cylinderRadius As Double Dim cylinderHeight As Double center(0) = 0: center(1) = 0: center(2) = 0 cylinderRadius = 5 cylinderHeight = 20 ' Create the Cylinder and ' color it cyan Set cylinderObj = ThisDrawing.ModelSpace.AddCylinder _ (center, cylinderRadius, cylinderHeight) cylinderObj.Color = acCyan ' Find the interference between the two solids ' and create a new solid from it. Color the ' new solid red. Dim solidObj As Acad3DSolid Set solidObj = boxObj.CheckInterference(cylinderObj, True) solidObj.Color = acRed ZoomAll End Sub
Slice a solid into two solids This example creates a box in model space. It then slices the box based on a plane defined by three points. The slice is returned as a 3DSolid.
Sub Ch8_SliceABox() ' Create the box object Dim boxObj As Acad3DSolid Dim length As Double Dim width As Double Dim height As Double Dim center(0 To 2) As Double center(0) = 5#: center(1) = 5#: center(2) = 0 length = 5#: width = 7: height = 10# ' Create the box (3DSolid) object in model space Set boxObj = ThisDrawing.ModelSpace. _ AddBox(center, length, width, height) boxObj.Color = acWhite ' Define the section plane with three points Dim slicePt1(0 To 2) As Double Dim slicePt2(0 To 2) As Double Dim slicePt3(0 To 2) As Double slicePt1(0) = 1.5: slicePt1(1) = 7.5: slicePt1(2) = 0
slicePt2(0) = 1.5: slicePt2(1) = 7.5: slicePt2(2) = 10 slicePt3(0) = 8.5: slicePt3(1) = 2.5: slicePt3(2) = 10 ' slice the box and color the new solid red Dim sliceObj As Acad3DSolid Set sliceObj = boxObj.SliceSolid _ (slicePt1, slicePt2, slicePt3, True) sliceObj.Color = acRed ZoomAll End Sub
230
After you've created your drawing with AutoCAD, you usually plot it on paper. A plotted drawing can contain a single view of your drawing or a more complex arrangement of views. In paper space, you can create windows called floating viewports, which display various views of the drawing. Depending on your needs, you can plot one or more viewports, or set options that determine what is plotted and how the image fits on the paper.
Layouts
All the geometry of your drawing is contained in layouts. Model space geometry is contained on a single layout named Model. You cannot rename the model space layout, nor can you create another model space layout. There can be only one model space layout per drawing. Paper space geometry is also contained on layouts. You can have many different paper space layouts in your drawing, each representing a different configuration to print. You can change the name of the paper space layouts. In ActiveX Automation the ModelSpace collection contains all the geometry in the model space layout. Because there can be more than one paper space layout in a drawing, the PaperSpace collection points to the last active paper space layout.
For more information about working with paper space layouts, see Hatches, Fills, and Wipeouts in the User's Guide.
Plot Configurations
A PlotConfiguration object is similar to a Layout object, as both contain identical plot information. The difference is that a Layout object is associated with a Block object containing the geometry to plot. A PlotConfiguration object is not associated with a particular Block object. It is simply a named collection of plot settings available for use with any geometry.
Layout Settings
Layout settings control the final plotted output. These settings affect the paper size, plot scale, plot area, plot origin, and the plot device name. Understanding how to use layout settings ensures that the layout is plotted as expected. All the settings for a layout can be changed from the Layout object properties and methods.
Layouts | 233
To enter a standard scale, first set the UseStandardScale property to TRUE. You can then enter the desired scale using the StandardScale property. To enter a custom scale, first set the UseStandardScale property to FALSE. You can then enter the custom scale using the SetCustomScale method. When you are reviewing an early draft view, a precise scale is not always important. You can use the acScaleToFit value of the StandardScale property to plot the layout at the largest possible size that fits the paper.
Viewports
When working in model space you draw geometry in tile viewports (referred to as Viewport objects in ActiveX Automation). You can display one or several different viewports at a time. If several tiled viewports are displayed, editing in one viewport affects all other viewports. However, you can set magnification, viewpoint, grid, and snap settings individually for each viewport. In paper space, you work in floating paper space viewports (referred to as PViewport objects in ActiveX Automation) to contain different views of your model. Floating viewports are treated as objects you can move, resize, and shape to create a suitable layout. You also can draw objects, such as title blocks or annotations, directly in the paper space view without affecting the model itself.
For more information about viewports, see Set Model Space Viewports and Display Multiple Views in Model Space in the User's Guide.
Floating Viewports
You cannot edit the model in paper space. To access the model in a PViewport object, toggle from paper space to model space using the ActiveSpace property. As a result, you can work with the model while keeping the overall layout visible. In PViewport objects, the editing and view-changing capabilities are almost the same as in Viewport objects. However, you have more control over the individual views. For example, you can freeze or turn off layers in some viewports without affecting others. You can turn an entire viewport display on or off. You can also align views between viewports and scale the views relative to the overall layout. The following illustration shows how different views of a model are displayed in paper space. Each paper space image represents a PViewport object with a different view. In one view, the dimensioning layer is frozen. Notice that the title block, border, and annotation, which are drawn in paper space, do not appear in the Model Space view. Also, the layer containing the viewport borders has been turned off.
Viewports | 235
When you work in a Viewport object, the ActiveSpace property must always be set to acModelSpace. When you are working in a PViewport object, you can set the ActiveSpace property to either acModelSpace or acPaperSpace, thus allowing you to switch between paper space and model space as needed. PViewport object, Viewport object, and ActiveSpace property settings Type of viewport
PViewport
Status
ActiveSpace = acPaperspace ActiveSpace = acModelspace ActiveSpace = acModelspace
Usage
Arrange the layout by creating floating viewports and adding title block, borders, and annotation. Editing does not affect the model. Work within floating viewports to edit the model or change views. You can turn off or freeze layers in individual viewports. Split the screen into tiled viewports to edit different views of the model.
PViewport
Viewport
In AutoCAD ActiveX Automation, the ActiveSpace property is used to control the TILEMODE system variable. Setting ThisDrawing.ActiveSpace =acModelSpace is equivalent to setting TILEMODE = on, and setting ThisDrawing.ActiveSpace = acPaperSpace is equivalent to setting TILEMODE = off. Similarly, the MSpace property is the equivalent of both the MSPACE and PSPACE commands in AutoCAD. Setting ThisDrawing.MSpace = TRUE is the same as using the MSPACE command: it switches to model space. Setting ThisDrawing.MSpace = FALSE is the same as using the PSPACE command: it switches to paper space. In addition, you are required to use the Display method before setting the MSpace property to TRUE. The Display method initializes certain graphic settings that must be set before switching to model space. In AutoCAD this is done behind the scenes. However, in the ActiveX Automation interface, the programmer must take care of this initialization. NOTE Remember, you must turn on the display using the Display method for at least one PViewport object before you can set the MSpace property to TRUE. Failure to turn on the display will result in an error being returned when you try to set the MSpace property.
To switch to the last active paper space layout 1 Set the ActiveSpace property to acPaperSpace:
ThisDrawing.ActiveSpace = acPaperSpace
When you are in paper space, AutoCAD displays the paper space user coordinate system (UCS) icon in the lower-left corner of the graphics area. The crosshairs indicate that the paper space layout area (not the views in the viewports) can be edited.
This will place you in model space, floating viewports. NOTE You must create floating viewports before you attempt to switch to model space. To switch to tiled viewports To switch to tiled viewports, perform this additional step: Set the ActiveSpace property to acModelSpace:
ThisDrawing.ActiveSpace = acModelSpace
Viewports | 237
The order of steps in the preceding code is important. In general, things must be done in the same order they would be done at the AutoCAD command line. The only unexpected actions involve defining the view and enabling the viewport. NOTE To set or modify aspects of the view (view direction, lens length, and so forth), the Viewport object's Display method must be set to off (FALSE), and before you can set a viewport current the Display method must be set to on (TRUE). Create four floating viewports This example takes the example from "Create and enable a floating viewport" and continues it by creating four floating viewports and setting the view of each to top, front, right, and isometric views, respectively. Each view is scaled to half the scale of paper space. To ensure there is something to see in these viewports, you may want to create a 3D solid sphere before trying this example.
Sub Ch9_FourPViewports() Dim topVport, frontVport As AcadPViewport Dim rightVport, isoVport As AcadPViewport Dim pt(0 To 2) As Double Dim viewDir(0 To 2) As Double ThisDrawing.ActiveSpace = acPaperSpace ThisDrawing.MSpace = True ' Take the existing PViewport and make it the topVport pt(0) = 2.5: pt(1) = 5.5: pt(2) = 0 Set topVport = ThisDrawing.ActivePViewport 'No need to set Direction for top view topVport.center = pt topVport.width = 2.5 topVport.height = 2.5 topVport.Display True ThisDrawing.MSpace = True ThisDrawing.ActivePViewport = topVport ZoomExtents ZoomScaled 0.5, acZoomScaledRelativePSpace 'Create and setup frontVport pt(0) = 2.5: pt(1) = 2.5: pt(2) = 0 Set frontVport = ThisDrawing.PaperSpace. _ AddPViewport(pt, 2.5, 2.5) viewDir(0) = 0: viewDir(1) = 1: viewDir(2) = 0 frontVport.direction = viewDir frontVport.Display acOn ThisDrawing.MSpace = True ThisDrawing.ActivePViewport = frontVport ZoomExtents ZoomScaled 0.5, acZoomScaledRelativePSpace 'Create and setup rightVport pt(0) = 5.5: pt(1) = 5.5: pt(2) = 0 Set rightVport = ThisDrawing.PaperSpace. _ AddPViewport(pt, 2.5, 2.5) viewDir(0) = 1: viewDir(1) = 0: viewDir(2) = 0
Viewports | 239
rightVport.direction = viewDir rightVport.Display acOn ThisDrawing.MSpace = True ThisDrawing.ActivePViewport = rightVport ZoomExtents ZoomScaled 0.5, acZoomScaledRelativePSpace 'Create and set up isoVport pt(0) = 5.5: pt(1) = 2.5: pt(2) = 0 Set isoVport = ThisDrawing.PaperSpace. _ AddPViewport(pt, 2.5, 2.5) viewDir(0) = 1: viewDir(1) = 1: viewDir(2) = 1 isoVport.direction = viewDir isoVport.Display acOn ThisDrawing.MSpace = True ThisDrawing.ActivePViewport = isoVport ZoomExtents ZoomScaled 0.5, acZoomScaledRelativePSpace 'Finish: Perform a regen in all viewports ThisDrawing.Regen True End Sub
2 Edit the drawing. You can also create objects such as annotations, dimensions, and title blocks in paper space. You must, however, set the ActiveSpace property to FALSE, and turn paper space on using the MSpace property. Objects created in paper space are visible only in paper space.
relative to paper space, not relative to the previous view or to the full-scale model.
When you work in paper space, the scale factor represents a ratio between the size of the plotted drawing and the actual size of the model displayed in the viewports. To derive this scale, divide paper space units by model space units. For a quarter-scale drawing, for example, you specify a scale factor of one paper space unit to four model space units (1:4). Use the ZoomScaled method to scale viewports relative to paper space units. This method takes three values as input: the viewport to scale, the scale factor, and how you want that scale factor applied. The third value is optional and determines how the scale is applied: Relative to the drawing limits Relative to the current view Relative to paper space units To specify the scale relative to paper space units, enter the acZoomScaled-RelativePSpace constant for this value. As shown in the illustrations, if you enter a scale of 2 relative to the paper space units, the scale in the viewport increases to twice the size of the paper space units. A scale of .5 relative to the paper space units sets the scale to half the size of the paper space units. The model is plotted at half its actual size.
Viewports | 241
Use the SetVariable method to set the value of the PSLTSCALE system variable.
The device name can be specified using the ConfigName property. This device can be overridden in the PlotToDevice method by specifying a PC3 file.
246
As you gain experience, you can take advantage of the many advanced features of AutoCAD to further enhance your applications. You can include in your drawing raster images such as aerial, satellite, and digital photographs, as well as computer-rendered images. For information about raster images in addition to the information in this section, see the User's Guide. In addition to enhancing your drawing's visual image, AutoCAD provides several features to help you organize data, allowing you to further expand the intelligence of the objects in your drawing.
You can set the raster image scale factor when you create the Raster object so that the image's geometry scale matches the scale of the geometry created in the AutoCAD drawing. When you select an image to attach, the image is inserted at a scale factor of 1 image unit of measurement to 1 AutoCAD unit of measurement. To set the image scale factor, you need to know the scale of the geometry on the image, and you need to know what unit of measurement (inches, feet, and so forth) you want to use to define 1 AutoCAD unit. The image file must contain resolution information defining the DPI, or dots per inch, and number of pixels in the image. If an image has resolution information, AutoCAD combines it with the scale factor and the AutoCAD unit of measurement you supply to scale the image in your drawing. For example, if your raster image is a scanned blueprint on which the scale is 1 inch equals 50 feet, or 1:600, and your AutoCAD drawing is set up so that 1 unit represents 1 inch, then to set the scale factor of the image, you enter 600 for the ScaleFactor parameter of the AddRaster method. AutoCAD then inserts the image at a scale that brings the geometry in the image into alignment with the vector geometry in the drawing. NOTE If no resolution information is defined with the attached image file, AutoCAD calculates the image's original width as one unit. After insertion, the image width in AutoCAD units is equal to the scale factor. Attach a raster image This example adds a raster image in model space. This example uses the watch.jpg file found in the sample directory. If you do not have this image, or if it is located in a different directory, insert a valid path and file name for the imageName variable.
Sub Ch10_AttachingARaster() Dim insertionPoint(0 To 2) As Double Dim scalefactor As Double Dim rotationAngle As Double Dim imageName As String Dim rasterObj As AcadRasterImage imageName = "C:/Program Files/AutoCAD Directory/sample/watch.jpg' insertionPoint(0) = 5 insertionPoint(1) = 5 insertionPoint(2) = 0 scalefactor = 2 rotationAngle = 0 On Error GoTo ERRORHANDLER ' Attach the raster image in model space Set rasterObj = ThisDrawing.ModelSpace.AddRaster _ (imageName, insertionPoint, _ scalefactor, rotationAngle) ZoomAll Exit Sub ERRORHANDLER: MsgBox Err.Description
End Sub
Name Images
Image names are not necessarily the same as image file names. When you attach an image to a drawing, AutoCAD uses the file name without the file extension as the image name. You can change the image name without affecting the name of the file. The image file is represented by the ImageFile property on the Raster object. Changing the ImageFile property will change the image in the drawing. The image name is represented by the Name property, and changing the Name property will change the name of the image only, not the file associated with it.
layer, linetype, and linetype scale. If the image is a bitonal image, the image color and boundary color are the same. As with other AutoCAD objects, you can modify images and their boundary properties. For example, you can: Display or hide the image boundary Modify the image layer, boundary color, and linetype Change the image location Scale, rotate, and change the width and height of the image Toggle the image visibility Change the image transparency Change the image brightness, contrast, and fade Change the quality and speed of image display
Color Specifies the color of the image boundary Linetype Specifies the linetype of the image
boundary is displayed. To hide images, set the ImageVisibility property to FALSE. To redisplay the images, set the ImageVisibility property to TRUE.
Clip Images
You can define a region of an image for display and plotting by clipping the image. The clipping boundary must be a 2D polygon or rectangle with vertices constrained to lie within the boundaries of the image. Multiple instances of the same image can have different boundaries To clip an image 1 Turn on the image boundaries using the ClippingEnabled property
2 Specify the clipping boundary and perform the clip using the ClipBoundary method. This method takes one value as input: a variant array of 2D world coordinate system coordinates specifying the clipping boundary of a raster image.
clipPoints(6) = 5: clipPoints(7) = 6 clipPoints(8) = 6: clipPoints(9) = 6.75 ' Clip the image rasterObj.ClipBoundary clipPoints ' Enable the display of the clip rasterObj.ClippingEnabled = True ThisDrawing.Regen acActiveViewport Exit Sub ERRORHANDLER: MsgBox Err.Description End Sub
Define Blocks
To create a new block, use the Add method. This method requires two values as input: the location in the drawing where the block is added and the name of the block to create.
Once created, you can add any geometrical object, or another block, to the newly created block. You can then insert an instance of the block into the drawing. An inserted block is an object called a block reference. You can also create a block by using the WBlock method to group objects in a separate drawing file. The drawing file can then be used as a block definition for other drawings. AutoCAD considers any drawing you insert into another drawing to be a block. For more information on defining blocks, see Create Blocks in the User's Guide.
Insert Blocks
You can insert blocks or entire drawings into the current drawing with the InsertBlock method. The InsertBlock method takes six values as input: the insertion point, the name of the block or drawing to insert, the X-scale factor, the Y-scale factor, the Z-scale factor, and the rotation angle. When you insert an entire drawing into another drawing, AutoCAD treats the inserted drawing like any other block reference. Subsequent insertions reference the block definition (which contains the geometric description of the block) with different position, scale, and rotation settings. If you change the original drawing after inserting it, the changes have no effect on the inserted block. If you want the inserted block to reflect the changes you made to the original drawing, you can redefine the block by reinserting the original drawing. This can be done with the InsertBlock method. If you insert a drawing as a block, the file name is automatically used as the name of the block. You can change the name of the block by using the Name property once the block has been created. By default, AutoCAD uses the coordinate (0, 0, 0) as the base point for inserted drawings. You can change the base point of a drawing by opening the original drawing and using the SetVariable method to specify a different insertion base point for the INSBASE system variable. AutoCAD uses the new base point the next time you insert the drawing. If the drawing you insert contains PaperSpace objects, those objects are not included in the current drawing's block definition. To use the PaperSpace objects in another drawing, open the original drawing and use the Add method to define the PaperSpace objects as a block. You can insert the drawing into another drawing in either paper space or model space. A block reference cannot be iterated to find the original objects that compose it. However, you can iterate the original block definition, or you can explode the block reference into its original components.
You can also insert an array of blocks using the AddMInsertBlock method. This method does not insert a single block into your drawing, as the InsertBlock does, but instead inserts an array of the specified block. This method returns an MInsertBlock object. For more information on inserting blocks, see Insert Blocks in the User's Guide. Define a block and insert the block into a drawing This example defines a block and adds a circle to the block definition. It then inserts the block into the drawing as a block reference.
Sub Ch10_InsertingABlock() ' Define the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add _ (insertionPnt, "CircleBlock") ' Add a circle to the block Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 0 center(1) = 0 center(2) = 0 radius = 1 Set circleObj = blockObj.AddCircle(center, radius) ' Insert the block Dim blockRefObj As AcadBlockReference insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _ (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0) ZoomAll MsgBox "The circle belongs to " & blockRefObj.ObjectName End Sub
NOTE After insertion, the external file's WCS is aligned parallel to the XY plane of the current user coordinate system (UCS) in the current drawing. Thus, a block from an external file is inserted at any orientation in space by setting the UCS before inserting it.
End Sub
Redefine a Block
Use any of the Block object methods and properties to redefine a block. When you redefine a block, all the references to that block in the drawing are immediately updated to reflect the new definition. Redefinition affects previous and future insertions of a block. Constant attributes are lost and replaced by any new constant attributes. Variable attributes remain unchanged, even if the new block has no attributes. Redefine the objects in a block definition This example creates a block and adds a circle to the definition of the block. The block is then inserted into the drawing as a block reference. The circle in the block definition is updated, and the block reference is updated automatically.
Sub Ch10_RedefiningABlock() ' Define the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add _ (insertionPnt, "CircleBlock") ' Add a circle to the block Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 0 center(1) = 0 center(2) = 0 radius = 1 Set circleObj = blockObj.AddCircle(center, radius) ' Insert the block Dim blockRefObj As AcadBlockReference insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _ (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0) ZoomAll ' Redefine the circle in the block, ' and update the block reference circleObj.radius = 3 blockRefObj.Update End Sub
acAttributeModeVerify Prompts you to verify that the attribute value is correct when you insert the block. acAttributeModePreset Sets the attribute to its default value when you insert a block containing a present attribute. The value cannot be edited in this mode. You can enter none, any combination, or all of the options. To specify a combination of options, add the constants together. For example, you can enter acAttributeModeInvisible + acAttributeModeConstant. The prompt string appears when a block containing the attribute is inserted. The default for this string is the Tag string. Input acAttributeModeConstant for the mode to disable the prompt. The tag string identifies each occurrence of the attribute. You can use any characters except spaces or exclamation points. AutoCAD changes lowercase letters to uppercase. Once the attribute definition is defined in a block, whenever you insert the block using the InsertBlock method you can specify a different value for the attribute reference. An attribute definition is associated to the block upon which it is created. Attribute definitions created on model space or paper space are not considered attached to any given block. Define an attribute definition This example creates a block and then adds an attribute to the block. The block is then inserted into the drawing.
Sub Ch10_CreatingAnAttribute() ' Define the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add _ (insertionPnt, "BlockWithAttribute") ' Add an attribute to the block Dim attributeObj As AcadAttribute Dim height As Double Dim mode As Long Dim prompt As String Dim insertionPoint(0 To 2) As Double Dim tag As String Dim value As String height = 1
mode = acAttributeModeVerify prompt = "New Prompt" insertionPoint(0) = 5 insertionPoint(1) = 5 insertionPoint(2) = 0 tag = "New Tag" value = "New Value" Set attributeObj = blockObj.AddAttribute(height, mode, _ prompt, insertionPoint, tag, value) ' Insert the block, creating a block reference ' and an attribute reference Dim blockRefObj As AcadBlockReference insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _ (insertionPnt, "BlockWithAttribute", 1#, 1#, 1#, 0) End Sub
Rotation Specifies the rotation of the attribute ScaleFactor Specifies the scale factor of the attribute TagString Specifies the tag string of the attribute Some of the methods you can use to edit the attribute include the following: ArrayPolar Creates a polar array ArrayRectangular Creates a rectangular array Copy Copies the attribute Erase Erases the attribute Mirror Mirrors the attribute Move Moves the attribute Rotate Rotates the attribute ScaleEntity Scales the attribute Redefine an attribute definition This example creates a block and then adds an attribute to the block. The block is then inserted into the drawing. The attribute text is then updated to be displayed backward.
Sub Ch10_RedefiningAnAttribute()
' Define the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add _ (insertionPnt, "BlockWithAttribute") ' Add an attribute to the block Dim attributeObj As AcadAttribute Dim height As Double Dim mode As Long Dim prompt As String Dim insertionPoint(0 To 2) As Double Dim tag As String Dim value As String height = 1 mode = acAttributeModeVerify prompt = "New Prompt" insertionPoint(0) = 5 insertionPoint(1) = 5 insertionPoint(2) = 0 tag = "New Tag" value = "New Value" Set attributeObj = blockObj.AddAttribute(height, mode, _ prompt, insertionPoint, tag, value) ' Insert the block, creating a block reference ' and an attribute reference Dim blockRefObj As AcadBlockReference insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _ (insertionPnt, "BlockWithAttribute", 1#, 1#, 1#, 0) ' Redefine the attribute text to display backwards. attributeObj.Backward = True attributeObj.Update End Sub
The TagString property represents the individual tag for the attribute reference. The TextString property contains the value for the attribute reference. For more information on extracting attribute information, see Extract Data from Block Attributes in the User's Guide. Get attribute reference information This example creates a block and then adds an attribute to the block. The block is then inserted into the drawing. The attribute data is then returned and displayed using a message box. The attribute data is then updated for the block reference, and once again the attribute data is returned and displayed.
Sub Ch10_GettingAttributes() ' Create the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add _ (insertionPnt, "TESTBLOCK") ' Define the attribute definition Dim attributeObj As AcadAttribute Dim height As Double Dim mode As Long Dim prompt As String Dim insertionPoint(0 To 2) As Double Dim tag As String Dim value As String height = 1# mode = acAttributeModeVerify prompt = "Attribute Prompt" insertionPoint(0) = 5 insertionPoint(1) = 5 insertionPoint(2) = 0 tag = "Attribute Tag" value = "Attribute Value" ' Create the attribute definition object on the block Set attributeObj = blockObj.AddAttribute _ (height, mode, prompt, _ insertionPoint, tag, value) ' Insert the block Dim blockRefObj As AcadBlockReference insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _ (insertionPnt, "TESTBLOCK", 1, 1, 1, 0) ZoomAll ' Get the attributes for the block reference Dim varAttributes As Variant varAttributes = blockRefObj.GetAttributes ' Move the attribute tags and values into a
' string to be displayed in a Msgbox Dim strAttributes As String strAttributes = "" Dim I As Integer For I = LBound(varAttributes) To UBound(varAttributes) strAttributes = strAttributes + " Tag: " + _ varAttributes(I).TagString + vbCrLf + _ " Value: " + varAttributes(I).textString Next MsgBox "The attributes for blockReference " + _ blockRefObj.Name & " are: " & vbCrLf _ & strAttributes ' Change the value of the attribute ' Note: There is no SetAttributes. Once you have the ' variant array, you have the objects. ' Changing them changes the objects in the drawing. varAttributes(0).textString = "NEW VALUE!" ' Get the attributes again Dim newvarAttributes As Variant newvarAttributes = blockRefObj.GetAttributes ' Again, display the tags and values strAttributes = "" For I = LBound(varAttributes) To UBound(varAttributes) strAttributes = strAttributes + " Tag: " + _ newvarAttributes(I).TagString + vbCrLf + _ " Value: " + newvarAttributes(I).textString Next MsgBox "The attributes for blockReference " & _ blockRefObj.Name & " are: " & vbCrLf _ & strAttributes End Sub
Update Xrefs
When you open or plot your drawing, AutoCAD reloads each xref to reflect the latest state of the referenced drawing. After you make changes to an externally referenced drawing and save the file, other users can access your changes immediately by reloading the xref.
Attach Xrefs
Attaching an xref links one drawing (the reference file, or xref) to the current drawing. When a drawing references an xref, AutoCAD attaches only the xref definition to the drawing, unlike regular blocks, where the block definition and the contents of the block are stored with the current drawing. AutoCAD reads the reference drawing to determine what to display in the current drawing. If the reference file is missing or corrupt, its data is not displayed in the current drawing. Each time you open a drawing, AutoCAD loads all graphical and nongraphical (such as layers, linetypes, and text styles) objects from referenced files. If VISRETAIN is on, AutoCAD stores any updated xref-dependent layer information in the current drawing. You can attach as many copies of an xref as you want, and each can have a different position, scale, and rotation. You can also control the dependent layers and linetype properties that are defined in the xref. To attach an xref, use the AttachExternalReference method. This method requires you to input the path and file name of the drawing to be referenced, the name the xref is to use in the current drawing, the insertion point, the scale, and rotation information for the xref. The AttachExternalReference method returns the newly created ExternalReference object. For more information on attaching xrefs, see Attach External References in the User's Guide. Attach an external reference to a drawing This example displays all the blocks in the current drawing before and after adding an external reference. This example uses the 3D House.dwg file found in the sample directory. If you do not have this image, or if it is located in a different directory, insert a valid path and file name for the PathName variable.
Sub Ch10_AttachingExternalReference() On Error GoTo ERRORHANDLER Dim InsertPoint(0 To 2) As Double Dim insertedBlock As AcadExternalReference Dim tempBlock As AcadBlock Dim msg As String, PathName As String ' Define external reference to be inserted InsertPoint(0) = 1
InsertPoint(1) = 1 InsertPoint(2) = 0 PathName = "C:/Program Files/AutoCAD 2007/sample/3D House.dwg" ' Display current Block information for this drawing GoSub ListBlocks ' Add the external reference to the drawing Set insertedBlock = ThisDrawing.ModelSpace. _ AttachExternalReference(PathName, "XREF_IMAGE", _ InsertPoint, 1, 1, 1, 0, False) ZoomAll ' Display new Block information for this drawing GoSub ListBlocks Exit Sub ListBlocks: msg = vbCrLf ' Reset message For Each tempBlock In ThisDrawing.Blocks msg = msg & tempBlock.Name & vbCrLf Next MsgBox "The current blocks in this drawing are: " & msg Return ERRORHANDLER: MsgBox Err.Description End Sub
Overlay Xrefs
Overlaying is similar to attaching, except when a drawing is attached or overlaid. Any other overlays nested in it are ignored and, therefore, not displayed. In other words, nested overlays are not read in. To overlay an xref, set the Overlay parameter of the AttachExternalReference method to TRUE.
Detach Xrefs
You can detach an xref definition to remove the xrefs completely from your drawing. You can also erase the individual xref instances. Detaching the xref definition removes all dependent symbols associated with that xref. If all the instances of an xref are erased from the drawing, AutoCAD removes the xref definition the next time the drawing is opened. To detach an xref, use the Detach method. You cannot detach a nested xref. Detach an xref definition This example attaches an external reference and then detaches the external reference. This example uses the 3D House.dwg file found in the sample directory. If you do not have this image, or if it is located in a different directory, insert a valid path and file name for the PathName variable.
Sub Ch10_DetachingExternalReference() On Error GoTo ERRORHANDLER ' Define external reference to be inserted Dim xrefHome As AcadBlock Dim xrefInserted As AcadExternalReference Dim insertionPnt(0 To 2) As Double Dim PathName As String insertionPnt(0) = 1 insertionPnt(1) = 1 insertionPnt(2) = 0 PathName = "c:/AutoCAD 2007/sample/3D House.dwg" ' Add the external reference Set xrefInserted = ThisDrawing.ModelSpace. _ AttachExternalReference(PathName, "XREF_IMAGE", _ insertionPnt, 1, 1, 1, 0, False) ZoomAll MsgBox "The external reference is attached." ' Detach the external reference definition Dim name As String name = xrefInserted.name ThisDrawing.Blocks.Item(name).Detach MsgBox "The external reference is detached." Exit Sub ERRORHANDLER: MsgBox Err.Description End Sub
Reload Xrefs
If someone modifies an externally referenced drawing while you are working on the host drawing to which that xref is attached, you can update that xref drawing using the Reload method. When you reload, the selected xref drawing is updated in your host drawing. Also, if you have unloaded an xref, you can choose to reload that externally referenced drawing at any time. Reload an xref definition This example attaches an external reference and then reloads the external reference. This example uses the 3D House.dwg file found in the sample directory. If you do not have this image, or if it is located in a different directory, insert a valid path and file name for the PathName variable.
Sub Ch10_ReloadingExternalReference() On Error GoTo ERRORHANDLER ' Define external reference to be inserted Dim xrefHome As AcadBlock Dim xrefInserted As AcadExternalReference Dim insertionPnt(0 To 2) As Double Dim PathName As String insertionPnt(0) = 1 insertionPnt(1) = 1 insertionPnt(2) = 0
PathName = "c:/AutoCAD 2007/sample/3D House.dwg" ' Add the external reference to the block Set xrefInserted = ThisDrawing.ModelSpace. _ AttachExternalReference(PathName, "XREF_IMAGE", _ insertionPnt, 1, 1, 1, 0, False) ZoomAll MsgBox "The external reference is attached." ' Reload the external reference definition ThisDrawing.Blocks.Item(xrefInserted.name).Reload MsgBox "The external reference is reloaded." Exit Sub ERRORHANDLER: MsgBox Err.Description End Sub
Unload Xrefs
To unload an xref, use the Unload method. When you unload a referenced file that is not being used in the current drawing, the AutoCAD performance is enhanced by not having to read and display unnecessary drawing geometry or symbol table information. The xref geometry and that of any nested xref is not displayed in the current drawing until the xref is reloaded. Unload an xref definition This example attaches an external reference and then unloads the external reference. This example uses the 3D House.dwg file found in the sample directory. If you do not have this image, or if it is located in a different directory, insert a valid path and file name for the PathName variable.
Sub Ch10_UnloadingExternalReference() On Error GoTo ERRORHANDLER ' Define external reference to be inserted Dim xrefHome As AcadBlock Dim xrefInserted As AcadExternalReference Dim insertionPnt(0 To 2) As Double Dim PathName As String insertionPnt(0) = 1 insertionPnt(1) = 1 insertionPnt(2) = 0 PathName = "c:/AutoCAD 2007/sample/3D House.dwg" ' Add the external reference Set xrefInserted = ThisDrawing.ModelSpace. _ AttachExternalReference(PathName, "XREF_IMAGE", _ insertionPnt, 1, 1, 1, 0, False) ZoomAll MsgBox "The external reference is attached." ' Unload the external reference definition ThisDrawing.Blocks.Item(xrefInserted.name).Unload MsgBox "The external reference is unloaded." Exit Sub ERRORHANDLER:
Bind Xrefs
Binding an xref to a drawing using the Bind method makes the xref a permanent part of the drawing and no longer an externally referenced file. The externally referenced information becomes a block. When the externally referenced drawing is updated, the bound xref is not updated. This process binds the entire drawing's database, including all of its dependent symbols. Dependent symbols are named objects such as blocks, dimension styles, layers, linetypes, and text styles. Binding the xref allows named objects from the xref to be used in the current drawing. The Bind method requires only one parameter: bPrefixName. If bPrefixName is set to TRUE, the symbol names of the xref drawing are prefixed in the current drawing with <blockname>$x$, where x is an integer that is automatically incremented to avoid overriding existing block definitions. If the bPrefixName parameter is set to FALSE, the symbol names of the xref drawing are merged into the current drawing without the prefix. If duplicate names exist, AutoCAD uses the symbols already defined in the local drawing. If you are unsure whether your drawing contains duplicate symbol names, it is recommended that you set bPrefixName to TRUE. For more information on binding xrefs, see Archive Drawings That Contain External References (Bind) in the User's Guide. Bind an xref definition This example attaches an external reference and then binds the external -reference to the drawing. This example uses the 3D House.dwg file found in the sample directory. If you do not have this image, or if it is located in a different directory, insert a valid path and file name for the PathName variable.
Sub Ch10_BindingExternalReference() On Error GoTo ERRORHANDLER ' Define external reference to be inserted Dim xrefHome As AcadBlock Dim xrefInserted As AcadExternalReference Dim insertionPnt(0 To 2) As Double Dim PathName As String insertionPnt(0) = 1 insertionPnt(1) = 1 insertionPnt(2) = 0 PathName = "c:/AutoCAD 2007/sample/3D House.dwg" ' Add the external reference Set xrefInserted = ThisDrawing.ModelSpace. _ AttachExternalReference(PathName, "XREF_IMAGE", _ insertionPnt, 1, 1, 1, 0, False)
ZoomAll MsgBox "The external reference is attached." ' Bind the external reference definition ThisDrawing.Blocks.Item(xrefInserted.name).Bind False MsgBox "The external reference is bound." Exit Sub ERRORHANDLER: MsgBox Err.Description End Sub
To turn on layer and spatial indexes, set the INDEXCTL system variable using the SetVariable method. The following settings apply to the INDEXCTL s-ystem variable: 0 = no indexes created 1 = layer index created 2 = spatial index created 3 = both spatial and layer indexes created By default, INDEXCTL is set to 0 when you create a new AutoCAD drawing. For more information on demand loading and xrefs, see Increase Performance with Large Xrefs in the User's Guide.
View the xdata of all objects in a selection set This example displays the xdata attached with the previous example. If you attach xdata other than strings (type 1000), you will need to revise this code
Sub Ch10_ViewXData() ' Find the selection created in previous example Dim sset As Object Set sset = ThisDrawing.SelectionSets.Item("SS1") ' Define the xdata variables to hold xdata information Dim xdataType As Variant Dim xdata As Variant Dim xd As Variant 'Define index counter Dim xdi As Integer xdi = 0 ' Loop through the objects in the selection set ' and retrieve the xdata for the object Dim msgstr As String Dim appName As String Dim ent As AcadEntity appName = "MY_APP" For Each ent In sset msgstr = "" xdi = 0 ' Retrieve the appName xdata type and value ent.GetXData appName, xdataType, xdata ' If the xdataType variable is not initialized, there ' was no appName xdata to retrieve for that entity If VarType(xdataType) <> vbEmpty Then For Each xd In xdata msgstr = msgstr & vbCrLf & xdataType(xdi) _ & ": " & xd xdi = xdi + 1 Next xd End If ' If the msgstr variable is NULL, there was no xdata If msgstr = "" Then msgstr = vbCrLf & "NONE" MsgBox appName & " xdata on " & ent.ObjectName & _ ":" & vbCrLf & msgstr Next ent End Sub
274
Many programming tasks involve more than simply working with the AutoCAD ActiveX object model. This chapter provides a brief overview of creating dialog boxes, handling errors, controlling window focus, and distributing your application to others. Remember, the Microsoft documentation for VBA contains more information on these topics.
Forms in VBA
Forms are the basic building blocks through which you create your own custom dialog boxes for your application. Through custom forms you can provide information to users, get information from users, or have your users control activity in the application. Forms are like an artist's canvasthey start out blank. To fill your canvas, you need a palette. In this case, your palette is the control toolbox. You, as the artist, place selected controls from the toolbox onto the form. You can add as many controls as you like. At any time you can adjust size and properties of the controls and even the form itself. Finally, you add the functionality (code) to the controls that brings your form to life.
Although Visual Basic 6 supports different types of forms, VBA supports only the UserForm. This means some forms have been created and exported in Visual Basic 6 that cannot be imported into VBA. UserFormsor forms, as they are called in this guidecan be modal or modeless. The ShowModal property of a form determines whether it is modal or modeless. Modal forms displayed in your running application must be closed before users can perform any other action in the application. For more information about working with modal forms, see Modal Forms on page 281. To create a new form in your project 1 Open the Project window of the VBA IDE and select the project you want to add the form to. 2 From the Insert menu, choose UserForm. A blank form is created and added to your project.
To create a modeless form in your project 1 Open the Project window of the VBA IDE and select the project you want to add the form to. 2 From the Insert menu, choose UserForm, and change the ShowModal property to False. 3 Add the AcFocusCtrl (AcFocusCtrl.dll) to the Toolbox, and drag the control onto the form. The AcFocusCtrl keeps the focus on the form during user interaction.
1 In the control toolbox, double-click on the control you want to place. 2 On the form, click at the location you want a copy of the control placed. Move to another location on the form and click again. Another copy of the control will appear. You can add as many copies of the control as you need. 3 When you are finished with the control, return to the control toolbox and click the control one more time to deselect it.
Display a form This example will display the form named UserForm1:
Public Sub MyApplication() UserForm1.Show End Sub
The subroutine (and consequently the display of your form) is now callable as a macro from the VBARUN command or from an AutoCAD menu. Hide a form This example hides the form named UserForm1:
Public Sub MyAppHide() UserForm1.Hide End Sub
Use
Displays a form. If the form has not been loaded, it is loaded automatically. Hides a form. The form is not unloaded from memory. Loads a form into memory but does not display it. Unloads a form from memory. This can be done explicitly from the Unload method, or automatically at the termination of the application.
Modal Forms
When you define a dialog box as modal in AutoCAD VBA, the user must respond to the dialog box before any other part of the application is allowed to continue. No subsequent code is executed until the modal dialog box is closed through either the Hide or Unload method. This requires that you, as the developer of the application, think carefully about how and when you implement dialog boxes. For example, you may have a dialog box that requires the user to select an object in the AutoCAD drawing. For the user to be able to pick the object from the AutoCAD Application window, you must hide the form by calling the Hide method. Once the object has been selected you use the Show method to redisplay the form, with all of its data still current, and continue with the application. NOTE Although other forms in the application are disabled when a modal dialog box is displayed, other applications are not.
Handle Errors
Most development environments provide default error handling. For VB and VBA, the default reaction to an error is to display an error message and terminate the application. While this behavior is adequate during the development phase of your application, it is not productive for your end user. There may be errors that you want to ignore, or that you want to provide special responses to. There may be errors that you will want to suppress the error message display for, or simply control the message that gets displayed to the user. In addition, automatically terminating the application is hardly ever acceptable to the end user.
In general, error handling is necessary whenever user input is required and whenever working with file I/O. Remember, even if you are sure a needed file is there and available for processing, there may be conditions you haven't thought of that could cause errors. NOTE Most of the code examples provided in the AutoCAD documentation do not use error trapping. This keeps the examples simple and to the point. However, as with all programming languages, proper error trapping and handling is essential for a robust application.
statement automatically detours processing to your specially written error handler. The default error handling for the system is bypassed. The On Error statement has three forms: On Error Resume Next On Error GoTo Label On Error GoTo 0 The On Error Resume Next statement is used when you want to ignore errors. This statement traps the error and instead of displaying an error message and terminating the program, it simply moves on to the next line of code and continues processing. For example, if you wanted to create a subroutine to iterate through model space and change the color of each entity, you know that AutoCAD will throw an error if you try to color an entity on a locked layer. Instead of terminating the program, simply skip the entity on the locked layer and continue processing the remaining entities. The On Error Resume Next statement lets you do just that. The On Error GoTo Label statement is used when you want to write an explicit error handler. This statement traps the error and instead of displaying an error message and terminating the program, it jumps to a specific location in your code. Your code can then respond to the error in whatever manner is appropriate for your application. For example, you can expand the example above to display a message containing the handle for each entity on the locked layer. Handle errors with the On Error Resume Next statement The following subroutine iterates model space and changes the color of each entity to red. Try running this subroutine on a drawing with several entities, some of which are on a locked layer. Next, comment out the On Error Resume Next statement and run the subroutine again. You will notice the subroutine terminates at the first entity on the locked layer.
Sub Ch11_ColorEntities() Dim entry As Object On Error Resume Next For Each entry In ThisDrawing.ModelSpace entry.Color = acRed Next entry End Sub
Handle errors with the On Error GoTo statement The following subroutine iterates model space and changes the color of each entity to red. For each entity on the locked layer, the error handler displays a custom error message and the handle of the entity. Try running this
subroutine on a drawing with several entities, some of which are on a locked layer. Next, comment out the On Error GoTo MyErrorHandling statement and run the subroutine again. You will notice the subroutine terminates at the first entity on the locked layer.
Sub Ch11_ColorEntities2() Dim entry As Object On Error GoTo MyErrorHandler For Each entry In ThisDrawing.ModelSpace entry.Color = acRed Next entry ' Important! Exit the subroutine before the error handler Exit Sub MyErrorHandler: Msgbox entry.EntityName + " is on a locked layer." + _ " The handle is: " + entry.Handle Resume Next End Sub
The On Error GoTo 0 statement cancels the current error handler. The On Error Resume Next and On Error GoTo Label statements remain in effect until the subroutine ends, another error handler is declared, or the error handler is canceled with the On Error GoTo 0 statement.
Using the InitializeUserInput method with the user input functions provides additional control of the user input but can also introduce additional conditions that must be verified through error trapping. For an example of error trapping that is required with certain types of user-input, see Prompt for User Input on page 66.
where filename is the name of the project file, modulename is the name of the module containing the macro to be run, and macroname is the name of the macro. The file name is only required when the file is not loaded in the current session of AutoCAD. If the file name is provided, the file will be loaded. For more information on editing menus and toolbars, see Customize Toolbars and Menus on page 171.
You can cause a macro to run automatically when VBA loads by naming the macro AcadStartup. Any macro in your acad.dvb file called AcadStartup will automatically get executed when VBA loads.
below the Document object in the AutoCAD object model. Working with nondocument-dependent object, such as the Application or MenuBar objects, is allowed. AutoCAD does not have a command line in a zero document state. Any attempt to access the AutoCAD command line while AutoCAD is in a zero document state will result in an error.
288
ActiveX technology allows you to exchange information easily with other AutoCAD applications and other ActiveX-enabled applications such as Microsoft Excel or Microsoft Word. This chapter examines some of the basic procedures for interacting with other applications.
NOTE This chapter provides only a brief introduction to the capabilities of cross-application programming. This material is not AutoCAD-specific, and as such it is discussed in both Microsoft documentation and independent programming guides. To exchange information across ActiveX Object Models 1 Reference the other applications' ActiveX Object Model. This will make your code aware of the names and relationships of the objects in the other Object Model. 2 Create an instance of the other application. This will create (instantiate) valid objects for the basic objects in the other Object Model. 3 Write your code utilizing both the AutoCAD Object Model and the other applications' Object Model. This is where the exchange of data takes place.
To make a reference to another application's object library 1 In the VBA IDE, open the Tools menu and select the References menu option. 2 Find and select the entry in the list of Available References for the application you want to access. 3 Select OK to close the dialog box with your changes.
After you declare the variable, use the Set statement with the New keyword to set the variable equal to a running instance of the application. For example, the following Set statement sets the variable declared above equal to the Excel application. The New keyword starts a new session of Excel.
Set ExcelAppObj = New Excel.Application
NOTE Some applications allow only one running instance of the application at a time. Using the New keyword on such an application will establish a reference to the existing instance and will not launch a new session of the application.
You should familiarize yourself with the Object Model of the application you are writing code for. You can use the VBA Object Browser or the application's help file to learn about any Object Model you are referencing.
NOTE Destroying or going beyond the scope of the object variable does not necessarily cause the application to terminate. You should always quit the application using the appropriate method to assure proper memory cleanup. List AutoCAD attributes on an Excel spreadsheet This subroutine finds all the block references in the current drawing. It then finds the attributes attached to those block references and lists them in an Excel spreadsheet. To run this example, do the following: 1 Open a drawing containing block references with attributes. (The sample drawing sample/activeX/attrib.dwg contains such block references.) 2 Open the VBA IDE using the AutoCAD VBAIDE command. 3 Using the Tools References menu option in the VBA IDE, select Microsoft Excel 8.0 Object Model. 4 Copy this subroutine into a VBA Code window and run it.
Sub Ch12_Extract() Dim Excel As Excel.Application Dim ExcelSheet As Object Dim ExcelWorkbook As Object Dim RowNum As Integer Dim Header As Boolean Dim elem As AcadEntity Dim Array1 As Variant Dim Count As Integer ' Launch Excel. Set Excel = New Excel.Application ' Create a new workbook and find the active sheet.
Set ExcelWorkbook = Excel.Workbooks.Add Set ExcelSheet = Excel.ActiveSheet ExcelWorkbook.SaveAs "Attribute.xls" RowNum = 1 Header = False ' Iterate through model space finding ' all block references. For Each elem In ThisDrawing.ModelSpace With elem ' When a block reference has been found, ' check it for attributes If StrComp(.EntityName, "AcDbBlockReference", 1) _ = 0 Then If .HasAttributes Then ' Get the attributes Array1 = .GetAttributes ' Copy the Tagstrings for the ' Attributes into Excel For Count = LBound(Array1) To UBound(Array1) If Header = False Then If StrComp(Array1(Count).EntityName, _ "AcDbAttribute", 1) = 0 Then ExcelSheet.Cells(RowNum, _ Count + 1).value = _ Array1(Count).TagString End If End If Next Count RowNum = RowNum + 1 For Count = LBound(Array1) To UBound(Array1) ExcelSheet.Cells(RowNum, Count + 1).value _ = Array1(Count).textString Next Count Header = True End If End If End With Next elem Excel.Application.Quit End Sub
To use a Windows API, you must first declare the API in your application. This is done with the Declare statement. The Declare statement requires several pieces of information: The name of the dynamic link library (DLL) containing the procedure you want to use The name of the procedure as it appears in the DLL The name of the procedure as you want to use it in your application The parameters the procedure expects to receive The return value data type (if the procedure you are calling is a function) You can place the Declare statement in any of your VBA modules. If you place it in a standard module, the procedure will be available to any module in your application, unless you limit its scope by using the keyword Private. If you place the Declare statement in a class or form module, the procedure will only be available in that module. Once a procedure has been declared, you can call that procedure as you would any other procedure in your application. Getting a Declare statement just right is a difficult skill to learn. Getting a Declare statement wrong is easy, but it often comes with dire consequences. Be sure to save any information in active applications before you try out a new Declare statement. To help you with your Declare statements, Microsoft provides a file listing of many of the declarations most commonly used. The file is called Win32api.txt and comes with Visual Basic 6 and Office. You can search this file for the procedure you need and copy the Declare statement provided into your code. The Microsoft VBA documentation contains more information on the Declare statement and an example of its use. The Microsoft Windows API Reference is available as part of the Microsoft Developer Network CD subscription and provides a reference to all the available procedures in the Windows APIs. Dan Appleman's book Visual Basic Programmer's Guide to the Win32 API is also an excellent resource directed at the Visual Basic 6 programmer.
This tutorial demonstrates how to use ActiveX and Visual Basic for Applications (VBA) and how to add a macro to AutoCAD. The tutorial is oriented toward landscape architecture, but the concepts in the tutorial are relevant to any application area. This tutorial is designed for the proficient AutoCAD user who is a novice VBA programmer.
Half width of path: The user will specify a number Radius of tiles: The user will specify a number Spacing between tiles: The user will specify a number Your macro will first prompt the user to enter the start point and endpoint to specify the centerline of a path. Next, it will prompt the user to enter the half width of the path and the radius of the circular tiles. Finally, the user will enter the spacing between the tiles. You are using the half width of the path rather than the full width because it is easier to visualize the half width from the centerline of the path.
Notice that as soon as you press ENTER after entering the line Function dtr(a As Double) As Double, End Function is added automatically. This ensures that all subroutines and functions have an associated End statement. Now look at the code. First, the constant pi is defined as the value 3.14159. This allows you to use the word pi instead of typing 3.14159 each time you need to use the value. Next, you are defining a function called dtr (short for degrees to radians). The function dtr takes one argument, a, which is the angle in degrees. The result is obtained by dividing the angle in degrees by 180, and then multiplying this value by pi. The line that begins with a single quote is a comment; VBA ignores all text on a line after a single quote.
This function can now be used in other subroutines throughout your project. 4 Save your work. Click File Save Global1. Name the project gardenpath.dvb. Next, add a function to calculate the distance between points. To calculate the distance between two points 1 Enter the following code after the dtr function:
' Calculate distance between two points Function distance(sp As Variant, ep As Variant) _ As Double Dim x As Double Dim y As Double Dim z As Double x = sp(0) - ep(0) y = sp(1) - ep(1) z = sp(2) - ep(2) distance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2)) End Function
Get Input
The Gardenpath macro asks the user where to draw the path, how wide to make the path, how large the concrete tiles are, and how closely to space those tiles. You define a subroutine that asks the user for all of these items and then computes various numbers to use in the rest of the macro. In this subroutine, you use the user input methods found in the Utility object.
Declare Variables
The next subroutine uses several variables. All variables must be declared before the subroutine can access them. In the VBA IDE, enter the following code in the Code window, immediately after the line Const pi = 3.14159:
Private sp(0 To 2) As Double Private ep(0 To 2) As Double
hwidth As Double trad As Double tspac As Double pangle As Double plength As Double totalwidth As Double angp90 As Double angm90 As Double
Now look at the two drop-down lists at the top of the Code window. These lists are called the Object Box and the Procedure/Event Box and currently display the terms (General) and (Declarations), respectively. These lists display the current section of the code you are working in, and enable you to move quickly to a different section by simply selecting one from the list. The (Declarations) section is the appropriate place to declare variables that you will use in more than one subroutine.
In the gpuser subroutine, the line Dim varRet As Variant declares the variable varRet. Because this variable is used only in this subroutine, it can be declared here locally, instead of in the (Declarations) section. The next line, varRet = ThisDrawing.Utility.GetPoint( , "Start point of path: "), calls the GetPoint method. The underscore in the line is intended to make a long line easier to read, and tells VBA to read the next line as if it were on the same line. You can remove the underscore by placing the code all on one line. To access the GetPoint method, you must first go through the ThisDrawing object that represents the current drawing. After entering ThisDrawing you enter a period (.), which means that you are going to access something within that object. After you type the period, you enter Utility and another period. Once again, you are going to access something within the Utility object. Finally, enter GetPoint, which is the name of the method you are calling. The GetPoint method takes two parameters. The first parameter is optional and won't be used. Leave the parameter blank and simply type a comma to mark its spot. The second parameter is the prompt, which is also optional. For this parameter, you entered a string prompting the user to enter the start point. The point the user enters is put into the varRet variable. The next three lines of the subroutine copy the point returned by the user into the sp array. The endpoint is returned in the same manner. The GetDistance method is used to obtain the half width of the path (hwidth), the tile radius (trad), and the spacing between the tiles (tspac). The GetDistance method takes two parameters. The first parameter is a base point. For this value, you supply the start point. The second parameter is the prompt, for which you provide a string prompting the user for the appropriate input. The interesting thing about the GetDistance method is that it can return either a value entered on the command line or the distance between a point selected in AutoCAD and the start point. The subroutine goes on to calculate several variables used later in the macro. The pangle variable is set to the angle from the start point to the endpoint and is found by using the AngleFromXAxis method. The width of the path is found by multiplying the half width by two. The plength variable is set to the length of the path and is found using the distance function you entered earlier. Finally, calculate and save the angle of the path plus and minus 90 degrees in angp90 and angm90, respectively. The following illustration shows how the variables obtained by gpuser specify the dimensions of the path.
This subroutine draws the outline of the path using the AddLightweightPolyline method. This method takes one parameter: an array of points that make up the polyline. You must find all the points that make up the polyline object and place them into an array in the order they are to be drawn. For this polyline, the points needed are the corners of the path. To find the corners of the path, use the PolarPoint method. This method finds a point that is a given angle and distance from a base point. Begin with the start point (sp) and find the first corner of the path, working in a counterclockwise direction. This corner will be at a distance of half the width of the path (hwidth) and at -90 degrees from the path angle. Because you want to draw a closed rectangle for the path, this point becomes the first and last point in the array. Hence, the X and Y coordinates returned from the PolarPoint method are moved into the first and last positions in the points array. The remaining corners of the path are found in the same manner using the length and width of the path (plength and width), and the angle of the path. Every time the PolarPoint method is called, the coordinates returned (varRet) are copied into the points array. Once all the corners have been identified in the points array, the AddLightweightPolyline method is called. Notice that this method is called from the ModelSpace object. If you were to run this macro, you would also notice that the polyline is not yet visible in AutoCAD. The polyline will not become visible until you update the display, which you will do later.
pfirst(1) = varRet(1) pfirst(2) = varRet(2) varRet = ThisDrawing.Utility.PolarPoint( _ pfirst, angp90, offset) pctile(0) = varRet(0) pctile(1) = varRet(1) pctile(2) = varRet(2) pltile(0) = pctile(0) pltile(1) = pctile(1) pltile(2) = pctile(2) Do While distance(pfirst, pltile) < (hwidth - trad) Set cir = ThisDrawing.ModelSpace.AddCircle( _ pltile, trad) varRet = ThisDrawing.Utility.PolarPoint( _ pltile, angp90, (tspac + trad + trad)) pltile(0) = varRet(0) pltile(1) = varRet(1) pltile(2) = varRet(2) Loop varRet = ThisDrawing.Utility.PolarPoint( _ pctile, angm90, tspac + trad + trad) pltile(0) = varRet(0) pltile(1) = varRet(1) pltile(2) = varRet(2) Do While distance(pfirst, pltile) < (hwidth - trad) Set cir = ThisDrawing.ModelSpace.AddCircle( _ pltile, trad) varRet = ThisDrawing.Utility.PolarPoint( _ pltile, angm90, (tspac + trad + trad)) pltile(0) = varRet(0) pltile(1) = varRet(1) pltile(2) = varRet(2) Loop End Sub ' Draw the rows of tiles Private Sub drawtiles() Dim pdist As Double Dim offset As Double pdist = trad + tspac offset = 0 Do While pdist <= (plength - trad) drow pdist, offset pdist = pdist + ((tspac + trad + trad) * Sin(dtr(60))) If offset = 0 Then offset = (tspac + trad + trad) * Cos(dtr(60)) Else offset = 0 End If Loop End Sub
To understand how these subroutines work, refer to the following illustration. The subroutine drow draws a row of tiles at a given distance along the path specified by its first argument, and offsets the row perpendicular to the path
by a distance specified by its second argument. You want to offset the tiles on alternate rows to cover more space and make a more pleasing arrangement.
The drow subroutine finds the location for the first row by using the PolarPoint method to move along the path by the distance specified by the first argument. The subroutine then uses the PolarPoint method again to move perpendicularly to the path for the offset. The subroutine uses the While statement to continue to draw circles until the edge of the path is encountered. The PolarPoint method in the first While statement moves on to the next tile location by spacing a distance of two tile radii (trad) and one intertile space (tspac). A second while loop then draws the tiles in the row in the other direction until the other edge is encountered. The drawtiles subroutine calls drow repeatedly to draw all the tile rows. The subroutine While loop steps along the path, calling drow for each row. Tiles in adjacent rows form equilateral triangles, as shown in the previous illustration. The edges of these triangles are equal to twice the tile radius plus the spacing between the tiles. Therefore, by trigonometry, the distance along the path between rows is the sine of 60 degrees multiplied by this quantity, and the offset for odd rows is the cosine of 60 degrees multiplied by this quantity. The If statement is used in drawtiles to offset every other row. If the offset is equal to 0, set it to the spacing between the centers of tiles multiplied by the cosine of 60 degrees, as explained earlier. If the offset is not equal to 0, set it to 0. This alternates the offset on the rows as you want. Save your work.
gpuser sblip = ThisDrawing.GetVariable("blipmode") scmde = ThisDrawing.GetVariable("cmdecho") ThisDrawing.SetVariable "blipmode", 0 ThisDrawing.SetVariable "cmdecho", 0 drawout drawtiles ThisDrawing.SetVariable "blipmode", sblip ThisDrawing.SetVariable "cmdecho", scmde End Sub
The path subroutine calls gpuser to gather the necessary input. The GetVariable method is then used to obtain the current values of the BLIPMODE and CMDECHO system variables, and saves these values as sblip and scmde. The subroutine then uses the SetVariable method to set both of these system variables to 0, thereby disabling blips and command echoing. Next, the path is drawn using the drawout and drawtiles subroutines. Finally, the SetVariable method is used to reset the system variables to their original values. You may notice that this is the only subroutine you have entered that did not begin with a Private keyword, which ensures the subroutine can only be called from within the current module. Because the gardenpath subroutine must be available to the user, you should omit the Private keyword. Save your work.
AutoCAD window. You see the prompt you specified in the GetPoint call on the command line. Enter a point. Control now returns to the macro. The line following the call to the GetPoint method is highlighted. Continue stepping through the code by pressing F8. Remember to switch back to the AutoCAD window when you are entering information.
You can experiment with the Gardenpath macro by specifying the various inputs.
3 Close the toolbox. To set the properties for the radio button controls 1 On the user form, select the OptionButton1 control. On the View menu, click Properties Window, and change the following properties for OptionButton1: (Name) = gp_poly Caption = Polygon ControlTipText = Polygon Tile Shape Accelerator = P 2 On the user form, select the OptionButton2 control. In the Properties window, change the following properties for OptionButton2: (Name) = gp_circ Caption = Circle ControlTipText = Circle Tile Shape Accelerator = I To set the properties for the label controls 1 On the user form, select the Label1 control. In the Properties window, change the following properties for Label1: (Name) = label_trad Caption = Radius of tiles TabStop = True 2 On the user form, select the Label2 control. In the Properties window, change the following properties for Label2:
(Name) = label_tspac Caption = Space between tiles TabStop = True 3 On the user form, select the Label3 control. In the Properties window, change the following properties for Label3: (Name) = label_tsides Caption = Number of sides TabStop = True To set the properties for the text box controls 1 On the user form, select the TextBox1 control. In the Properties window, change the following property for TextBox1: (Name) = gp_trad 2 On the user form, select the TextBox2 control. In the Properties window, change the following property for TextBox2: (Name) = gp_tspac 3 On the user form, select the TextBox3 control. In the Properties window, change the following property for TextBox3: (Name) = gp_tsides To set the properties for the command button controls and the form window 1 On the user form, select the CommandButton1 control. In the Properties window, change the following properties for CommandButton1: (Name) = accept Caption = OK ControlTipText = Accept the options Accelerator = O Default = True 2 On the user form, select the CommandButton2 control. In the Properties window change the following properties for CommandButton2: (Name) = cancel Caption = Cancel ControlTipText = Cancel the operation Accelerator = C
3 Select the user form itself by clicking on the background of the form, away from any control. In the Properties window, change the following properties for the form: (Name) = gpDialog Caption = Garden Path Your form should now look like this:
Because the code in the form accesses trad and tspac, you update their definitions to make them public. Private variables are available only in the module in which they are defined, so the variables need to be changed to public. Additionally, you have added tsides for the number of polygon tile sides and tshape for the user's choice of tile shape, which is either circle or polygon. 3 Go to the gpuser subroutine. Remove the two lines that obtain the radius of the tiles and the spacing between the tiles, because this information comes from the form. Specifically, remove the following:
trad = ThisDrawing.Utility. _ GetDistance(sp, "Radius of tiles: ") tspac = ThisDrawing.Utility. _ GetDistance(sp, "Spacing between tiles: ")
4 Add the lines that load and display the form. Add the following lines in place of the lines removed in step 3:
Load gpDialog gpDialog.Show
5 Add a subroutine to the end of the code file that draws either the circular tiles or the polygon tiles:
'Draw the tile with the designated shape Sub DrawShape(pltile) Dim angleSegment As Double Dim currentAngle As Double Dim angleInRadians As Double Dim currentSide As Integer
Dim varRet As Variant Dim aCircle As AcadCircle Dim aPolygon As AcadLWPolyline ReDim points(1 To tsides * 2) As Double 'Branch based on the type of shape to draw Select Case tshape Case "Circle" Set aCircle = ThisDrawing.ModelSpace. _ AddCircle(pltile, trad) Case "Polygon" angleSegment = 360 / tsides currentAngle = 0 For currentSide = 0 To (tsides - 1) angleInRadians = dtr(currentAngle) varRet = ThisDrawing.Utility.PolarPoint(pltile, _ angleInRadians, trad) points((currentSide * 2) + 1) = varRet(0) points((currentSide * 2) + 2) = varRet(1) currentAngle = currentAngle + angleSegment Next currentSide Set aPolygon = ThisDrawing.ModelSpace. _ AddLightWeightPolyline(points) aPolygon.Closed = True End Select End Sub
This subroutine uses a Select Case statement to branch control of the program based on the type of shape to draw. The tshape variable is used to determine the type of shape. 6 Next, go to the drow subroutine. Find the two occurrences of the following line:
Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad)
To add event handlers for the dialog box 1 Open the Code window for gpDialog. 2 Enter the following code at the top of the window:
Private Sub gp_poly_Click() gp_tsides.Enabled = True ThisDrawing.tshape = "Polygon" End Sub Private Sub gp_circ_Click() gp_tsides.Enabled = False ThisDrawing.tshape = "Circle" End Sub
Notice that the subroutines gp_poly_Click() and gp_circ_Click() are named after the two option controls you added earlier, with the addition of _Click. These subroutines are automatically executed when the user clicks the respective control. Also notice that the Object Box lists the controls on the form, sorted alphabetically by Name property.
3 Place your cursor on the Private Sub gp_poly_Click() line and open the Procedure/Event Box. You see a list of all the events that you can respond to for the
gp_polyoption control. The two subroutines you entered handle the Click event. You can also add code to respond to the DblClick event
that would automatically be executed when the user double-clicked the control. You can add code for any of the events listed. These types of subroutines are called event handlers. Look at the code you entered for these two event handlers. The first event handler responds to the Click event for the gp_poly option control. The first line of code enables the text box for the number of sides. This text box is available only for polygons, so it is not enabled unless you
select the Polygon control. The next line of code sets the tshape variable to Polygon. The second event handler responds to the Click event for the gp_circ option control. This handler disables the text box for the number of sides and sets the tshape variable to Circle. 4 Add the following event handler for the OK button:
Private Sub accept_Click() If ThisDrawing.tshape = "Polygon" Then ThisDrawing.tsides = CInt(gp_tsides.text) If (ThisDrawing.tsides < 3#) Or _ (ThisDrawing.tsides > 1024#) Then MsgBox "Enter a value between 3 and " & _ "1024 for the number of sides." Exit Sub End If End If ThisDrawing.trad = CDbl(gp_trad.text) ThisDrawing.tspac = CDbl(gp_tspac.text) If ThisDrawing.trad < 0# Then MsgBox "Enter a positive value for the radius." Exit Sub End If If (ThisDrawing.tspac < 0#) Then MsgBox "Enter a positive value for the spacing." Exit Sub End If GPDialog.Hide End Sub
This code tests whether the final choice of shape was polygon. If so, the code retrieves the number of sides from the gp_tsides control. The value the user enters is stored in the Text property. Because it is stored as a text string, you convert the string to the integer equivalent using the CInt function. Once obtained, the event handler tests the range of the value to make sure it is between 3 and 1024. If it is not, a message is displayed and the event handler is exited without further processing. The result is that a message is displayed and the user is given an opportunity to change the value. After the OK button is clicked again, this event handler triggers and tests the value again. The macro obtains radius and spacing values, but these values are doubles, not integers, and are obtained using the CDbl function. These values are also tested to make sure they are positive.
After the values are obtained and verified, the gpDialog.Hide statement hides the form, passing control back to the subroutine that first called the form. 5 Add the following event handler for the Cancel button:
Private Sub cancel_Click() Unload Me End End Sub
This simple event handler unloads the form and ends the entire macro. The only thing you haven't done is add the initial values for the form. There is an event called Initialize that applies to the form. It is executed when the form is first loaded. 6 Add the following event handler for the form initialization:
Private Sub UserForm_Initialize() gp_circ.Value = True gp_trad.Text = ".2" gp_tspac.Text = ".1" gp_tsides.Text = "5" gp_tsides.Enabled = False ThisDrawing.tsides = 5 End Sub
This code sets the initial values for the form and for the tsides variable. The tsides variable must be set to a positive number greater than 3, even if the user selects a circle. To understand this, look in the DrawShape subroutine that you entered earlier. There is a variable there called points that is defined using the number of sides for the polygon. That variable gets memory allocated to it whether or not a polygon shape has been requested. Because of this, tsides must have a valid range defined for it. The user is free to change this value during macro execution. You can now save and run the macro from AutoCAD.
Most of the capabilities found in the Visual LISP interface can also be found in the ActiveX and VBA interface. This appendix serves as a reference to help developers familiar with Visual LISP find the equivalent ActiveX and VBA functionality.
Index
.NET 40 2D objects 93, 220 editing 93 positioning 220 3D modeling 220, 223227 3DSolid object 223 Add 3DPoly method 220 mirroring (illustration) 226 rectangular arrays (illustration) 225 rotating (illustration) 224 solids 223, 227 analyzing properties (list) 223 combining 227 methods for creating (list) 223 wireframes, creating 220 3D polylines, creating 220 3DMesh object 221 example code 221 3DSolid object 223224, 226 defined 223 example code 223224, 226 acExtents 233 ACI numbers 121122, 127 assigning colors to objects 122 changing objects' colors 127 layers 121 acIntersection constant 80 acLayout 233 acLimits 233 AcSmComponents16.tlb type library 40 acSubtraction constant 80 Activate event 207 Active UCS property 59 ActiveDimStyle property 159 ActiveLayer property, example code 119 ActiveLinetype property 124 ActivePViewport property, example code 238 ActiveSpace property 235236 example code 236 view changing 235236 ActiveTextStyle property 59 ActiveUCS property, User Coordinate System 217 ActiveViewport property 57, 59, 221 current viewport 57 example code 59, 221 resetting objects 59 ActiveX Automation interface 6 automation projects. See automation projects new objects 6 ActiveX interface 13, 6 advantages with AutoCAD 12, 6 and AutoCAD objects 3 and VBA applications 3 types of objects 12, 6 acUnion constant 80 acView 233 acWindow 233
A
ACAD_LAYERSTATE dictionary 129 acad.dvb project file 10 ACADProject file 12 acAttributeModeConstant constant 259 acAttributeModeInvisible constant 259 acAttributeModeNormal constant 259, 261 acAttributeModePreset constant 260 acax16enu.tlb type library 40 acByBlock constant 121 acByLayer constant 122 AcCmColor object 122, 127 assigning colors to objects 122 changing objects' colors 127 example code 127 acDisplay 233
325 | Index
Add method 31, 37, 4748, 84, 94, 135, 159, 168, 174, 176, 185, 216 217, 256 blocks, example code 256 collections 31, 37 dimension styles 159 Documents collection 47 example code 48 layers, example code 94 leader lines 168 menu groups, example code 174 menus, example code 176 selection sets, example code 84 text styles 135 toolbars, example code 185 UCS, example code 217 User Coordinate System 216 Add3DMesh method 221 creating rectangular meshes 221 example code 221 Add3DPoly method, 3D modeling 220 AddArc method 75 AddAttribute method 259 defining blocks 259 AddBox method 223224, 226227 creating solids 223 example code 224, 226227 AddCircle method 75, 79 creating circles 75 example code 79 AddCone method 223 AddCylinder method 223, 227 creating solids 223 example code 227 AddDimAligned method 153, 159, 165 example code 159, 165 linear dimensions 153 AddDimAngular method 155 angular dimensions 155 example code 155 AddDimDiametric method 154 AddDimOrdinate method 156157 example code 157 ordinate dimensions 156 AddDimRadial method 153154 example code 154
radial dimensions 153 AddDimRotated method 153 AddEllipse method 75 AddEllipticalCone method 223 AddEllipticalCylinder method 223 AddExtrudedSolid method 223 AddFitPoint method, splines 113 AddHatch method 81, 83, 115, 117 creating objects 81 example code 83, 115, 117 AddItem method 84 AddLeader method 167168 creating leader lines 167 example code 167168 AddLightweightPolyline method 75, 97, 301 example code 75, 97 Garden Path tutorial 301 AddLine method 34, 107, 109 example code 107, 109 object hierarchy 34 AddMenuItem method 174, 178 creating menu items 178 example code 174 AddMText method 144145, 168 example code 144145, 168 multiline text 144 AddPoint method, example code 77 AddPolyfaceMesh method 222 creating meshes 222 example code 222 AddPViewport method 238 example code 238 paper space 238 AddRaster method 247248 attaching images 247 example code 248 AddRegion method 7879 calculating total number of regions 79 example code 79 AddRevolvedSolid method 223 AddSeparator method, using Type property 179 AddSolid method 7778, 223 creating solids 223
326 | Index
example code 78 solid-filled area 77 AddSphere method 223 AddSpline method, example code 75, 114 AddSubMenu method, example code 181 AddText method 138 example code 138 AddTolerance method 169170 example code 170 geometric tolerance 169 AddToolbarButton method 185186, 188 creating flyout toolbars 188 example code 186, 188 AddTorus method 223 AddVertex property, polylines 111 AddWedge method 223 creating solids 223 example code 223 AddXLine method, in 3D 62 AddXLine object, example code 62 Alignment property 141142 example code 142 in text 142 AltFontFile property 147 AngleFromXAxis method 64, 299 AngleToReal method 64 AngleToString method 64 angular dimensions 149, 155 creating 155 illustration 149 AppActivate event 203 AppDeactivate event 203 AppendInnerLoop method 82, 115 boundaries 82 example code 115 hatches 115 AppendOuterLoop method 8283, 115, 117 boundaries 82 example code 83, 115, 117 hatches 115 application level events 203, 205 declaring objects with events 205
enabling 203 events (list) 203 Application object 30, 37, 203, 205206, 292 collections, accessing 37 declaring objects with events 205 events (list) 203 example code 206, 292 root object, accessing 30 Application window 30, 5051 changing visibility 30 finding state 50 finding status, example code 51 modifying 30 sizing 50 Visible property 51 applications 287, 289, 291292, 294 declaring Windows APIs 294 distribution options 287 exchanging data with AutoCAD 289 instances, creating 291 object model referencing 289 quit methods 292 referencing application objects 291 variables, declaring 291 applicaton-level events 205 enabling 205 Arc object creating 75 Area property 65, 7980, 113 calculating for closed objects 65 example code 65, 79 splines 113 array data, converting to variants 41 arraying, patterns 94 ArrayPolar method 99, 143, 158, 262 attributes 262 creating arrays 99 dimension editing 158 Text object 143 ArrayRectangular method 101, 143, 158, 225 dimension editing 158 Text object 143 arrays 99, 101 polar arrays 99 rectangular 101
327 | Index
rectangular arrays 99 ARXLoaded event 203 ARXUnloaded event 203 associative dimensions, defined 152 AssociativeHatch property 114 AttachExternalReference method 266 268 example code 266268 AttachmentPoint property 145 AttachToolbarToFlyout method, example code 188 Attribute object 261, 264 editing 261 example code 264 attributes 259, 261263 associating 259 in blocks (illustration) 259 constants (list) 259 creating references 259 and definitions 263 editing methods (list) 262 editing properties (list) 261 extracting 259 and references 263 for text 259 visibility 259 Auto Data Tips, Code window 24 auto embedding, setting for VBA projects 15 Auto Indent, Code window 24 Auto List Member, Code window 24 Auto Quick Info, Code window 24 Auto Syntax Check, Code window 24 AutoCAD 4, 289 exchanging data 289 reinstalling 4 AutoCAD Color Index numbers. See ACI numbers AutoCAD.Application.16 registry key 43 Autodesk.AutoCAD.Interop.Common.dll 40 Autodesk.AutoCAD.Interop.dll 40 automation projects 67 automation-compatible environments 6 migrating 67
migrating to AutoCAD 2004 See also ActiveX Automation interface annotations, and leader lines 166
B
BACKGROUNDPLOT system variable 243 backslash (\\) 196 in macros 196 base point, rotating objects 103 BasePoint property 62 BeginClose event 207 BeginCommand event 202203, 207 BeginDoubleClick event 207 BeginFileDrop event 204, 206 defined 204 example code 206 BeginLISP event 204, 208 BeginModal event 204 BeginOpen event 204 BeginPlot event 204, 208 BeginQuit event 204 BeginRightClick event 208 BeginSave event 204, 208 BeginShortcutMenuCommand event 208 BeginShortcutMenuDefault event 208, 211 defined 208 example code 211 BeginShortcutMenuEdit event 208 BeginShortcutMenuGrip event 208 BeginShortcutMenuOsnap event 208 Big Font files 137 BigFontFile property 135, 137 example code 137 TextStyle object 135 Bind method 270 external references 270 bitonal images. See raster images BLIPMODE system variable 304 Block object 232, 256257 example code 256257 in layouts 232
328 | Index
Block property, in layouts 232 block references 254255, 257, 292 arrays and 255 base points 255 exploding 254, 257 fastener (illustration) 255 iterating 255 listing attributes 292 naming 255 redefining 255 See alsoblocks BlockReference object 167, 257, 264, 292 example code 257, 264, 292 leader lines 167 See also block references blocks 73, 110, 121, 126, 254255, 258 259, 270 attributes 259 binding 270 creating new blocks 254 creating objects 73 defined 254 exploding 110 inserting 255 and layers 126 and layers 121 nesting (illustration) 254 organizing objects 254 redefining 258 referencing in ActiveX code 73 BMP files 71 exporting to 71 importing 71 Boolean intersection (illustration) 227 Boolean method 65, 79, 227 calculating area 65 composite regions 79 creating regions 79 example code 79 boundaries, Hatch object 81 Boundary Hatch dialog box pattern option 116 boxes 224, 226228 adding, example code 224, 227 mirroring, example code 226
slicing, example code 228 Break mode, defined in VBA 16 break on errors, for VBA projects 16 Brightness property 252
C
calculations 60, 79 AddRegion method 79 performing in drawings 60 CanonicalMediaName property 232 cascading menus. See submenus CELTSCALE system variable 125 Center property 39, 239 example code 239 WCS coordinate 39 character formatting, example code 145 CheckInterference method 227 example code 227 child object 39 relation to root object 39 Circle object 39, 75, 79, 95 creating 75 example code 79, 95 circular references 23 Clear method 92 in selection sets 92 ClipBoundary method 253 ClippingEnabled property 250 Close method 47 Documents collection 47 Closed property 111, 113 polylines 111 splines 113 CMDECHO system variable 304 Code window 20, 24, 296, 298 Garden Path tutorial in 296 margin indicator bar 20 Object Box 298 Procedure/Event Box 298 resizing 20 settings 24 split bar 20 collections 3032, 35, 37, 171 adding members 31 Application object, accessing 37
329 | Index
available in AutoCAD (list) 35 Count Property 32 defined 35 Document object, accessing 37 Documents 30 Item method 32 MenuBar 171 MenuGroup 171 as object groups 31 Color property 85, 121, 251 example code 85 layers 121 raster images 251 See also TrueColor property colors 122, 126127 assigning to objects 122, 126 changing objects' colors 127 changing, example code 127 overriding layers' color settings 127 COM applications 43 command line 66, 69, 286 controlling user input 69 in zero document state 286 prompting user 66 compile time 282 errors in VBA 282 compile time, object referencing 40 ConfigName property 234, 245 construction lines 62 modifying 62 rays 62 xlines 62 ContourlinesPerSurface property 223 Contrast property 252 control codes, text formatting (table) 147 ControlPoints property, splines 112 controls for forms 277279 adding code 279 adding to forms 277 control toolbox 277 formatting in VBA for 278 modifying 278 conversion functions, operation methods 33 converting coordinates 218
converting, sample code to other languages 42 coordinates 218 converting between systems 218 Coordinates property 111 polylines 111 Copy method 94, 143, 158, 262 copying 9496 arraying 94 from one drawing to another 9596 mirroring 94 multiple objects 94 objects to other drawings 9596 offsetting 94 single object 94 CopyObjects method 9496 example code 9596 Count property 32, 177 for menus 177 CreateObject function 7 CreatePoint object 77 example code 77 CreateRegion, example code 79 CreateSolid object 78 example code 78 CreateSpline object 75 example code 75 CreateTypedArray method 41, 64 creating lines 74 Add Polyline 74 AddLightweightPolyline method 74 AddLine method 74 AddMLine method 74 creating objects 32, 73 blocks in 73 graphical 32 model space in 73 nongraphical 32 paper space in 73 crosshairs 49 resizing 49 cursor 6061 restricting with Ortho mode 61 restricting with Snap mode 60 cursor menus 176, 198 adding new items 198
330 | Index
creating 176 deleting 176 on graphics screen 176 Shortcut menu property 198 truncating 176 CursorSize property 49 crosshairs, resizing 49 curved objects 75 arcs 75 circles 75 ellipses 75 spline curves 75 CustomDictionary property 148 cylinder, example code for adding 227
D
DatabasePreferences object 50 storing options 50 DCS 218 converting coordinates 218 definition 218 DDIM Annotation dialog box 159 DDIM Format dialog box 159 DDIM Geometry dialog box 159 Deactivate event 208 Declare statement 294 Default to Full Module View 24 Project window 24 default VBA project name 12 Degree property 113 splines 113 degrees 296 converting from radians 296 Delete method 55, 92, 104, 122, 124, 181 layers 122 collections 104 deleting views, example code 55 example code 181 in selection sets 92 linetypes 124 DeleteFitPoint method 113 splines 113 deleting 39 collection member 39
demand loading 271 and indexes 271 performance benefits 271 Description property 124125 example code 125 linetypes 124 design mode, VBA environment and 277 Detach method 267 example code 267 external references 267 dialog boxes 10, 13, 2223, 281 in modal forms 281 macro 13 options for VBA IDE 23 Save Project 22 VBA Manager 10 dialog controls. See controls DIESEL string expressions 178 DimAligned object 159, 165 example code 159, 165 DimAngular object 155 example code 155 DIMASSOC system variable 152 DIMCLRD system variable 170 DIMCLRT system variable 169170 dimension lines 150 illustration 150 dimension styles 152, 159 active 152 Add method 159 creating dimensions 159 modifying 159 parent 159 dimension styles (illustration) 159 dimension system variables 150, 153 list 150, 153 dimensions 149, 151157, 165166 and geometry 165 angular 149 angular (illustration) 155 annotations 151 associative 152 hook lines (illustration) 154, 166 in model space 165 in paper space 165 leader lines (illustration) 151, 166
331 | Index
LeaderLength setting 155 linear 149 methods, editing 157 modifying 152 ordinate (illustration) 156 properties, editing 157 radial 149, 153 creating 153 rotating 153 text styles 151 illustration 151 types of illustration 149 DIMFIT system variable 153 DIMGAP system variable 170 DIMJUST system variable 150, 153 DIMLFAC system variable 166 DimOrdinate object 157 example code 157 DimRadial object 154 example code 154 DIMTAD system variable 150, 153 DIMTIH system variable 150, 153 DIMTOFL system variable 150, 153 DIMTOH system variable 150, 153 DIMTXSTY system variable 169 DIMTXT system variable 169170 DIMTXTSTY system variable 170 DIMUPT system variable 150, 153 Direction property 221, 238 example code 221, 238 DirectionVector property 62 example code 62 displacement vector 102 Display Coordinate System 218 definition 218 Display method 236 in viewports 236 Display preference, Options dialog box 48 Display property 237238 example code 237238 DisplayPlotPreview method 244 DisplayScreenMenu property 49 DisplayScrollBar property 49 DistanceToReal method 64
distributing applications 287 VB 287 VBA 287 Dock method 189190 docking toolbars 189 example code 190 document level events 210211 and Document object 210 coding 211 declaring objects with events 210 Document object 30, 47, 54, 57, 207, 210211, 236, 238 ActiveViewport property 57 as AutoCAD drawing 30 declaring objects with events 210 enabling events 207 events (list) 207 example code 211, 236, 238 model space, accessing 30 modifying drawings 47 paper space, accessing 30 ZoomAll method 54 ZoomExtents method 54 Document object, SummaryInfo property 31 Document window 5156, 58 creating views 55 Delete method 55 displaying views 51 maximizing 51 minimizing 51 modifying position 51 Regen method 58 sizing 51 Split method 56 status of active document 51 Update method 58 viewports 56 WindowState property 51 Zoom option 52 zoom scale, specifying 53 ZoomAll method 54 ZoomCenter method 54 ZoomExtents method 54 ZoomPickWindow 52 ZoomWindow 52
332 | Index
document- level events 207 enabling 207 document-level events 207 events (list) 207 right-clicking 207 Documents collection 30 links to drawing 30 Drafting preference, Options dialog box 48 Drag and Drop Text Editing 24 Project window 24 drawing display, defined 29 drawing extents 54, 63 and rays 63 zooming to 54 drawing units, converting 244 drawing-stored options, setting 50 drawings 60, 122, 127, 135 assigning colors to objects 122 changing objects' colors 127 performing calculations 60 text styles 135 drawings, accessing properties 31 dtr function 296 in Garden Path tutorial 296 DWF files 71 exporting to 71 DXF codes, and filter types (table) 86 DXF files 71 exporting to 71 importing 71
E
editing 15, 93 2D objects 93 macros 15 nongraphical objects 93 ElevateOrder method 113 splines 113 Ellipse object 75 creating 75 embedded projects 15, 34 auto embed feature 15 ThisDrawing object 34 enabling, application-level events
205
EndAngle property 109 EndCommand event 202, 204, 208 EndLISP event 204, 209 EndModal event 204 EndOpen event 202, 204 EndPlot event 204, 209 EndPoint property 109 example code 109 EndSave event 204, 209 EndShortcutMenu event 209, 211 example code 211 EndTangent property 112 splines 112 EPS (Encapsulated PostScript) files 71 exporting to 71 ERASE command 197 macros 197 Erase method 92, 98, 143, 158, 168 in selection sets 92 leader lines 168 Err object 284 errors 16, 281284 at runtime 282 Break mode 16 at compile time 282 Err object 284 error messages 281 error trapping 281 ignoring errors 283 user input control 284 Evaluate method 83, 115, 169 example code 83, 115 in hatches 115 leader lines 169 event handlers 201202, 207 and infinite loops 202 and interactive functions 202 and parameters 201 and subroutines 201 Begin events 202 creating objects 202 deleting objects 202 enabling doc-level eventsdocument-level events 207 End events 202
333 | Index
writing guidelines 202 events 201, 205, 207, 211212 enabling application-level events 205 enabling object-level events 212 handling 207 in AutoCAD 201 InitializeEvents procedure 211 Excel, extracting attributes, example code 292 Explode method 257 example code 257 exploding 110 blocks 110 objects 110 polylines 110 Export method 71, 133 for saved layer settings 133 extended data 32 uses of 32 with graphical objects 32 external references 265269, 271 defined 265 demand loading 271 detaching 267 and indexes 271 reloading 268 unloading 269 updating 266 ExternalReference object 266269 example code 266269
F
Fade property 252 FieldLength property 261 Files preference, Options dialog box 49 FILLMODE system variable 77 filter lists 8591 example code 8691 filter types, and DXF codes (table) 86 filtering 8586, 91 example code 86 selection sets 8591 FitPoints property 112 splines 112
FitTolerance property 112 splines 112 Float method 189 floating toolbars 189 flyout button 186 Flyout property 192 ToolbarItem object 192 flyout toolbars 188 AddToolbarButton method 188 example code 188 FontFile property 135, 137 example code 137 FontFileMap property 147 fonts 136137, 147148 alternative, specifying 147 and text styles 147 assigning in drawings 136 Big Font files 137 exporting in drawings 137 font mapping tables 147 SHX fonts 137 substituting 147 substitution rules 148 TEXTFILL system variable 137 TrueType 137 Unicode 137 form controls. See controls Format menu 278 VBA IDE 278 formatting characters 145 example code 145 forms 17, 19, 276281, 314 adding controls 277 control toolbox 277 displaying 280 formatting controls in VBA 278 hiding 279 hiding in Garden Path tutorial 314 importing into VBA 19 loading at runtime 280 as macros 280 modal dialog boxes 281 modal versus modeless 276 modal, defined 279 modifying controls 278 unloading 280
334 | Index
VBA environment 276 VBA project component 17 visibility at runtime 279 Freeze property 120
G
Garden Path tutorial 295299, 301302, 304307, 312314 adding dialog boxes 306 AddLightweightPolyline method 301 Code window (illustration) 312 creating dialog boxes (illustration) 307 creating new macro 295 determining corners 301 determining values 313 dtr function 296 entering code 296 event handling 312 GetDistance method 299 GetPoint method 299 gpuser subroutine 298 hiding forms 314 installing VBA environment 295 locating rows 302 macro control 304 option controls 312 pangle variable 299 PolarPoint method 301 prompt sequence 295 running macros 305 saving files 297 setting parameters 299 stepping through code 304 text edit box 313 ThisDrawing object 299 using prompts 296 Utility object 297 geometric tolerances 169 creating 169 modifying 169 GetAttributes method 263264, 292 example code 264, 292
GetBitmaps method 187 example code 187 GetDistance method 64, 299 example code 64 Garden Path tutorial 299 GetFitPoint method 113 splines 113 GetFont method 136 example code 136 GetInterfaceObject function 7 GetKeyword method 68 example code 68 GetObject function 7 GetPoint method 6768, 217, 299, 304 defined 67 example code 67, 217 Garden Path tutorial 299 GetString method 6768 example code 67 GetUCSMatrix method 216 GetVariable method 59 global projects 9, 34 defined 9 ThisDrawing object 34 graphical objects 29, 32 defined 29 editing commands 32 properties 32 visible objects 32 GridOn property 238
H
Hatch object 8083, 114117 AppendInnerLoop method 82 AppendOuterLoop method 82 AssociativeHatch property 114 associativity 81, 114 boundaries 82 Boundary Hatch dialog box 116 creating 80 editing 114, 116 example code 83, 115, 117 handling islands 82 patterns 81, 116 specifying loops 80
335 | Index
hatches, editing 114 HatchStyle property 8283 definitions (table) 83 handling islands 82 Height property 135, 138, 239, 251, 261 example code 138, 239 Help, status line 197 for menus and toolbars 197 HelpString property 186, 191 ToolbarItem object 186, 191 hidden lines in model space viewports 243 hierarchy 34 accessing objects in VBA 34 referencing objects 34 hook lines 166 illustration 166
from PopupMenu object 174 InsertionPoint property 141 InsertLoopAt method 115 InsertMenuInMenuBar method 173174 example code 174 from PopupMenus collection 174 interop assemblies 40 intersecting regions 80 Region object 80 IsPeriodic property 113 splines 113 IsPlanar property 114 splines 114 IsRational property 114 splines 114 Item method 32, 38 iterating collections 38
I
image boundaries, defined 249 ImageFile property 249 ImageVisibility property 251 Import method 71, 133 file conversions 71 for saved layer settings 133 importing 19 forms 19 modules 19 Index property 191 ToolbarItem object 191 INDEXCTL system variable 271272 indexes 271 and demand loading 271 and external references 271 InitializeUserInput 69 example code 69 InitializeUserInput method 6768, 284 (list) 68 defining keywords 68 InsertBlock method 255257 example code 256257 InsertInMenuBar method 173175, 178, 181, 184, 198 example code 175, 178181, 184, 198
K
keywords 68 command line 68 user input keywords Knots property 112 splines 112
68
L
Label property 179 accelerator key 179 Labels for menus 178 captions 178 special codes 178 LAYER command 195 macros 195 Layer object 94, 119120 example code 94, 119120 layer properties, saving. See layer settings, saving Layer property 126, 238, 250 raster images 250 layer settings 128134 deleting saved settings 132 example code 132 exporting saved settings 133134 example code 134
336 | Index
importing saved settings 133134 example code 134 listing saved settings 129 managing 130 renaming saved settings 132 example code 132 restoring saved settings 132133 example code 133 saving 129, 131132 example code 132 illustrated 129 storing 128, 132 LayerOn property 120 example code 120 layers 117, 119122, 126127 ACI number 121 ActiveLayer property 119 assigning colors to 122 assigning linetypes 122 assigning to objects 126 and blocks 121 changing layers 126 color and 117 Color property 121 color, assigning 121 color, settings 127 freezing 120 linetypes and 117 locking 121 plotting 120 turning off (illustration) 120 Layers collection 129 saved layer settings and 129 LayerStateManager object 129131 accessing 131 associating database with 131 Layout object 232, 243244 example code 244 PlotHidden property 243 plotting with 243 layouts 231234, 236 Block object 232 Block property 232 CanonicalMediaName property 232 Layout object 232 lineweight scale 234
in model space 231 paper size 232 in paper space 231 PaperUnits property 232 plot elements 232 PlotConfiguration object 232 plotting input values (list) 233 switching model space and paper space 236 LayoutSwitched event 209 leader lines 166167, 169 annotations 167 associativity and editing 169 associativity with annotations 167 color 166 creating 166 determining type 167 illustration 166 modifying 166 scale 166 scaling 169 updating geometry 169 Leader object 167168 example code 167168 LensLength property 238 LightweightPolyline object 7475, 97, 99, 111 creating 74 example code 75, 97, 99 LIN library files 123 and linetypes 123 Line object 74, 107, 109 creating 74 example code 107, 109 linear dimensions 152153 aligning 153 creating 152 modifying properties (illustration) 152153 rotating 153 lines 62, 74, 109 creating 74 lengthening 109 Ray object 62 Xline object 62
337 | Index
Linetype object 123, 125 example code 123, 125 Linetype property 122, 127128, 238, 251 defining for layers 127 example code 128 raster images 251 linetypes 122127 active 124 assigning to layers 122 assigning to objects 126 changing descriptions 124 complex 123 continuous (illustration) 127 deleting 124 examples of (illustration) 123 LIN library files 123 Load method 123 new object properties 124 renaming 124 scales (illustration) 125 x-ref dependent 124 LinetypeScale property 125, 238 lineweights 234 scaling in layouts 234 LISPCancelled event 205, 209 Load method 123, 128, 172173 example code 123, 172 linetypes 123, 128 MenuGroups collection 173 loading 30, 285 ObjectARX applications 30 VBA projects on startup 285 loading projects 10, 23 in AutoCAD 10 in VBA 23 Lock property 121 loops 78 defining regions 78 LowerLeftCorner property 57 illustration 57 LTSCALE system variable 125
M
macro libraries 22
Macro property 178, 186, 191, 285 ToolbarItem object 186, 191 macros 9, 1416, 192, 194197, 286, 295 and projects 9 backslash character 196 canceling commands 196 command handling 196 creating in tutorial 295 delays (list) 196 enabling virus protection 16 ERASE command 197 guidelines for writing 192 in menus 192 in toolbars 192 in VBA 16 LAYER command 195 naming 14 object selection, single 197 running 14 running on startup 286 SELECT command 196 setting Break mode 16 special characters (table) 194 stepping into 15 terminating 194 use of repetition 197 user input 195 Macros dialog box 13, 28 VBARUN command 28 MainDictionary property 148 matrix See transformation matrices maximizing, Document window 51 MAXSORT system variable 59 MClose property 221 menu macros 194 special characters (table) 194 menu objects 172 ActiveX (illustration) 172 See also PopupMenu objects MenuBar collection 171172, 174175 inserting menus 174 object model (illustration) 172 rearranging menus 175 removing menus 175
338 | Index
MenuBar object 175 example code 175 MenuBar property 175 example code 175 MenuGroup object 172, 174 example code 172, 174 MenuGroups collection 171173 Load method 173 modifying (list) 173 object model (illustration) 172 popup menus and 172 and toolbars 172 See also menu objects menus 180181, 183184 assigning menu items 184 checking 183 creating submenus 180 deleting 181 disabling 183 enabling 183 menu macros, special characters 184 positioning 183 returning submenus 183 type of menu item 183 meshes 220, 222 density, defined 220 polyface mesh, creating 222 rectangular, defined 220 and solids 220 and wireframes 220 methods. See specific method names Microsoft Visual Studio .NET 40 migrating automation projects 67 minimizing, Document window 51 MInsertBlock object 256 Mirror method 9899, 143, 158 example code 99 illustration 98 Mirror3D method 226 example code 226 mirroring 94, 9899, 226 in 3D 226 example code 99 objects 94 Text objects 98 with two coordinates 98
MIRRTEXT system variable 98, 143 MLine object 74 creating 74 Mode property 261 model space 30, 35, 7374, 165, 231, 234, 236, 243244 accessing objects 30 and paper space, switching 236 creating objects 73 defined 231 dimensioning in 165 example code 74 hidden lines 243 layouts 231 plot settings, modifying 244 plotting 243 referencing in ActiveX code 73 returning objects 35 viewports 234 ModelSpace property 73 Modified event 212 module 17 VBA object component 17 modules 19 importing into VBA 19 MomentOfInertia property 223 Move method 102, 143, 158, 169 vectors 102 Move object 102103 example code 103 illustration 102 MSpace property 236, 238 example code 236, 238 mtext 134, 143144, 146147 control codes (table) 147 creating 144 in drawings 134 Unicode fonts (table) 146 uses for 143 MText object 144145, 167168 creating text, example code 145 example code 144, 168 formatting options 145 justification (illustration) 144 leader lines 167 modifying 144
339 | Index
orientation options 145 overriding default 145 text boundary 145 multiline text. See mtext
N
Name property 57, 94, 124, 176, 184 185, 191, 249 example code 94 linetypes 124 PopupMenus collection 176 raster images 249 setting active viewport 57 ToolbarItem object 185, 191 toolbars 184 named colors 122, 127 assigning colors to objects 122 changing objects' colors 127 color names (table) 122 named objects 93 character length 93 purging 93 renaming 93 specifying 93 naming macros 14 naming projects, in VBA IDE 21 NClose property 221 NewDrawing event 205 nongraphical objects, editing 93 NumberOfControlPoints property 114 splines 114 NumberOfCopies method 244 NumberOfFitPoints property 114 splines 114 NURBS, AddSpline method 75
O
Object Coordinate System 218 definition 218 object level events 212213 and event handlers 213 and VBA keywords 212 class modules 212 enabling 212
object libraries 2, 290 AutoCAD as Automation controller 2 referencing in VBA IDE 290 object methods, defined 39 object model 172 MenuBar collection (illustration) 172 MenuGroups collection (illustration) 172 object-oriented, VBA interface 2 ObjectAdded event 209 ObjectARX applications 30 specific actions 30 ObjectDBX host applications 40 ObjectErased event 209 ObjectModified event 209 objects 14, 17, 29, 32, 39, 59, 65, 73, 92 93, 97, 102, 105106, 109110, 122, 126127, 171, 212, 224 active, resetting 59 assigning colors 122 changing colors 127 changing layers 126 closed 65 calculating area (illustration) 65 defining from user input points 65 creating 73 enabling events 212 existing, modifying 93 exploding 110 extending 109 for menus 171 graphical 32 in ActiveX 29 moving along a vector 102 named, specifying 93 nongraphical 32 object component 17 offsetting 97 open, calculating area (illustration) 65 properties, defined 39 removing from selection sets 92 rotating in 3D 224
340 | Index
scale factor 105 scaling 105 ThisDrawing 14 transforming 106 trimming 109 See also specific object names ObliqueAngle property 135, 138, 141 obliquing angles, in text 138 illustration 138 OCS 74, 218 converting coordinates 218 creating polylines 74 definition 218 Offset method 39, 97 creating objects 39 example code 97 offsetting, objects 94 On Error 283 forms of (list) 283 VBA statement, example code 283 Open method 47 Documents collection 47 example code 47 Open VBA Project dialog box 286 opening VBA IDE 16 from command line 16 from menu bar 16 OpenSave preference, Options dialog box 49 operating system 4 rebooting 4 options 15 setting for VBA projects 15 Options dialog box 23, 48 in VBA IDE 23 preferences objects (list) 48 ordinate dimensions 156 and error preventing 156 creating 156 leader lines 156 organizational structures, defined 29 organizing projects, with VBA Manager 10 Ortho mode 61 cursor movement 61 defining axes (illustration) 61
P
paper space 30, 35, 7374, 165, 231, 234, 237, 240, 242243, 245 accessing objects 30 and model space, switching 237 creating objects 73, 240 defined 231 dimensioning in 165 editing models 234 example code 74 layouts 231 plotting 243, 245 referencing in ActiveX code 73 returning objects 35 scaling linetypes 242 scaling views 240 viewports, floating 234 zooming (illustration) 242 Paper Space Display Coordinate System 218 definition 218 PaperSpace property 73 PaperUnits property 232 parent objects 39 relation to root object 39 Parent property 192 ToolbarItem object 192 PatternAngle property 116 PatternDouble property 116 PatternName property 116 patterns 81 asssigning hatch patterns 81 PatternScale property 116 PatternSpace property 117 example code 117 PatternType constants 81 defined 81 pausing macros 196 delays (list) 196
341 | Index
PDMODE system variable 76 illustration 76 PDSIZE system variable 76 illustration 76 PICKADD system variable 192 PICKAUTO system variable 192 Plot object 33, 243244 example code 243244 Plot dialog box 33 PlotConfiguration object 232 PlotHidden property 243 plotting 233, 243245 layout input values (list) 233 methods (list) 244 in model space 243244 in paper space 243, 245 properties (list) 244 from shaded viewports 243 PlotToDevice method 244 about 244 example code 244 PlotToFile method 244 PlotType property 244 Point object 7677 controlling appearance of 76 creating 76 example code 77 polar arrays 99100 center point, specifying 99 creating 99 example code 100 reference points 100 PolarPoint method 64, 301 PolyfaceMesh object 222 example code 222 PolygonMesh object 220 Polyline object 65, 74, 111 defining from user input points creating 74 polylines 74, 110111 creating in OCS 74 editing 111 exploding 110 fit and spline fit 111 modifying 111
65
PopupMenu object 174177, 180181 creating submenus 180 deleting menu items 181 example code 174176 InsertInMenuBar method 174 menu items, ordering (illustration) 177 PopupMenuItem object 174, 177179, 181183, 192, 197 accelerator keys, assigning 179 AddSeparator method 179 Caption property 182 Check property 183 creating 177 deleting menu items 181 editing labels 178 Enable property 183 example code 174 HelpString property 183 Index property 183 index, defined 177 Label property 182 label, defined 178 Macro property 182 macro, defined 178 new menu items, adding 177 Parent property 183 position menu, changing 177 status-line Help message 197 Submenu property 183 Tag property 182 tag, defined 178 Type property 183 writing macros 192 PopupMenus collection 175176 cursor menus 176 Name property 176 new menus, creating 176 RemoveMenuFromMenuBar method 175 PostScript files, importing 71 preferences in AutoCAD 4950 accessing 49 CursorSize property 49 drawing-stored options 50 properties 49
342 | Index
registry-stored options 49 Preferences object, Options dialog box 32 Preferences objects, accessing 49 PrincipalDirections property 223 PrincipalMoments property 223 Procedure Separator Display 24 Project window 24 ProductOfInertia property 223 Profiles preference, Options dialog box 49 ProgIDs 7 programming languages, other than VBA 42 project components 17, 19 forms 17 importing 19 modules 17 new 17 references 17 Project window 17, 24 defined in VBA IDE 17 settings 24 projects 912, 15, 17, 19, 2123, 27 .dvb file 21 automation. See automation projects circular references 23 components in VBA 17 embedded 9, 11, 27 extracting 12 global 9, 27 importing 19 loading in AutoCAD 10 naming in VBA IDE 21 referencing 22 setting options for VBA 15 unloading 11 VBA default name 12 VBA terms defined 27 prompts for user input 296 Garden Path tutorial 296 PromptString property 261 Properties window 21 VBA IDE 21 properties. See specific property names
PSDCS 218 converting coordinates 218 definition 218 PSLTSCALE system variable 242 pull-down menus 176 creating 176 from menu bar 176 truncating 176 PurgeAll method 93 example code 93 purging, named objects 93 PViewport object 235, 237239 example code 237239 PViewport object, ShadePlot property 243
Q
QuietErrorMode method Quit method 292 example code 292 244
R
radial dimensions 149, 153 creating 153 illustration 149 TextPosition property 153 radians 296 converting degrees 296 RadiiOfGyration property 223 raster images 247253 and vector files 247 attachments 247 bitonal images 252 clipping (illustration) 253 clipping boundaries 252 display properties (list) 252 display, adjusting 252 DPI, defined 248 file naming 249 geometry scale 248 image boundaries, defined 249 linking paths 247 modifying (list) 250251 Name property 249
343 | Index
path, modifying 249 redraw speed 251 resolution 248 scale factor 248 vectors 252 visibility 251 Raster object 247248 example code 248 Ray object 6263 BasePoint property 63 DirectionVector property 63 example code 63 rectangular arrays 101, 225 creating in 3D 225 example code 101 in 3D (illustration) 225 snap rotation angle 101 reference points, in polar arrays 100 referenced projects, loading in AutoCAD 23 referencing objects 34 calling hierarchy 34 referencing objects, type libraries 39 Regen method 136, 239 example code 239 for text styles 136 Region object 7880 Boolean method 79 calculating total number 79 creating composite 79 defining loops 78 example code 79 intersecting regions 80 subtracting 79 uniting regions 80 registry keys, COM application access 43 registry-stored settings 30, 48 accessing 30 Reload method 268 example code 268 external references 268 RemoveFromMenuBar method 175 example code 175 RemoveItems method 92 in selection sets 92
RemoveMenuFromMenuBar method 175 from PopupMenus collection 175 RenderSmoothness property 223 Require Variable Declaration 24 Code window 24 Reverse method 113 splines 113 RGB values 122, 127 assigning colors to objects 122 changing objects' colors 127 right-click menu. See cursor menu root object 35, 39 accessing 35 hierarchy 35 relation to parent object 39 See also Application object Rotate method 103104, 143, 158 example code 104 Rotate3D method 224 example code 224 rotating objects 103 illustration 103 rotation angles 138 Rotation property 141, 145, 157, 262 run mode, in VBA environment 277 running macros 14 runtime 282 error trapping 282 errors in VBA 282 runtime, object referencing 40
S
sample code, finding for ActiveX and VBA 5 SAT files 71 exporting to 71 importing 71 SAVE command 22 from VBA IDE 22 Save method 48, 131 for layer settings 131 verifying changes 48 Save Project dialog box 22, 28 accessing 22 VBAUNLOAD command 28
344 | Index
SaveAs method 47 saving projects, in VBA IDE 22 scale factor 105 illustration 105 object dimensions 105 ScaleEntity method 105106, 158, 169, 251, 262 example code 106 ScaleFactor property 141, 262 scaling 105, 169, 233, 240242 viewports (illustration) 241 in layouts 233 in paper space 240 leader lines 169 linetypes 242 objects 105 SELECT command 196 macros 196 Select method 84 SelectAtPoint method 85 SelectByPolygon method 85 Selection preference, Options dialog box 49 selection sets 85, 9192 filter lists 8591 removing objects 92 SelectionChanged event 209 SelectionSet object 8486 example code 8486 SelectionSets collection 84 SelectOnScreen method 85 example code 85 separators 179, 187 adding to menus 179 adding to toolbars 187 SetBitmaps method 187 LargeIconName parameter 187 SmallIconName parameter 187 SetBulge method 111 polylines 111 SetControlPoint method 113114 example code 114 splines 113 SetCustomScale method 234 SetDatabase method 131
SetFitPoint method 113 splines 113 SetFont method 136 example code 136 SetPattern method 117 SetProjectFilePath method 249 SetVariable method 59, 77, 125, 142, 150 example code 142 for dimensioning 150 linetypes 125 SetWeight method 113 splines 113 SetWidth method 111 polylines 111 shaded viewports, plotting from 243 ShadePlot property 243 sharing code by referencing projects in VBA 22 Sheet Set Manager 6, 40 automating objects 6 type library references 40 ShortcutMenu property 198 ShowRotation method 251 SHX fonts 137 Single object selection in macros 197 sizing 5051 Application window 50 Document window 51 SliceSolid method 228 example code 228 snap angle 60 illustration 60 Snap mode 60 cursor movement 60 snap rotation angle 101 rectangular arrays 101 SnapBasePoint property 60 example code 60 SnapRotationAngle property 60, 101 example code 60 Solid object 7778, 223, 227 analyzing properties 223 Boolean intersection (illustration) 227 CheckInterference method 227
345 | Index
combining solids 227 creating 77 creating solids 223 example code 78 properties (list) 223 solid-filled areas 77 illustration 77 See also Solid object spell checking 148 Spline object 75, 114 creating 75 example code 75, 114 splines 112 editing 112 querying 112 SPLINETYPE system variable 111 split bar, in Code window 20 Split method 5657 viewports, example code 57 splitting viewports 58 example code 58 spreadsheets, extracting attributes to, example code 292 standard color names. See named colors StandardScale property 234 StandardScale property, example code 244 StartAngle property 109 StartPoint property 109 StartTangent property 112 splines 112 startup 285286 loading VBA projects 285 running a macro 286 status-line Help, for menus and toolbars 197 stepping into macros 15 style settings 29 StyleName property 141, 145, 157 submenus 180 adding 180 populating 180 positioning 180 subtracting regions 7980 Boolean method 79 Region object 80
SummaryInfo property 31 System preference, Options dialog box 49 SysVarChanged event 205
T
Tag property 178, 191 ToolbarItem object 191 TagString property 263264 attribute references 263 example code 264 terminating macros 194 code examples 194 terminology in VBA environment (list) 275 Text object 98, 134, 137143, 148 aligning in drawings (illustration) 142 angles, setting 138 displaying backward 139 displaying upside down 139 example code 138139, 142 formatting 140 height settings 137 line text 134 line text, creating 140 methods (list) 143 mirroring text 98 modifying 143 mtext 134 ObliqueAngle property 138 properties (list) 141 spell check 148 text generation flag 139 used in drawings 134 text styles 135136, 151 changing properties 136 creating 135 current 135 default 135 for dimensions 151 properties (table) 135 TextAlignmentPoint property 141142 example code 142 TEXTFILL system variable 137
346 | Index
TextGenerationFlag property 136, 138 139, 141 example code 138139 TextOverride property 159 example code 159 TextPosition property 157 TextRotation property 158 TextString property 141, 263264 attribute referrences 263 example code 264 TextStyle object 135, 137 example code 137 properties (list) 135 TextStyles collection 135 TextSuffix property 165 example code 165 ThisDrawing object 14, 27, 34, 286, 299 accessing Document object 34 Garden Path tutorial 299 in embedded objects 14, 34 in global objects 14 in global projects 34 working in zero document state 286 TILEMODE system variable 236 Tolerance object 167, 170 example code 170 leader lines 167 tolerances 169170 geometric 169 system variables (list) 170 toolbar macros 194 special characters (table) 194 Toolbar object 185190 naming 185 AddSeparator method 187 AddToolbarButton method 185 Dock method 189 Docked property 190 example code 185186, 188, 190 Float method 189 flyout toolbars, creating 188 using Type property 187 ToolbarItem object 185188, 190192, 197 creating flyout button 186 deleting 190
example code 186188 Flyout property 192 GetBitmaps 187 HelpString property 186, 191 Index property 191 Macro property 186, 191 Name property 185, 191 Parent property 192 positioning toolbar buttons 185 SetBitmaps method 187 status-line Help message 197 Tag property 191 Type property 191 writing macros 192 toolbars 173 modifying 173 Toolbars collection 184 Add method 184 Name property 184 transformation matrices 106, 109 assigning matrix to variable 106 rotation (table) 109 scaling (table) 109 transforming objects 106 translation (table) 109 transformation matrix 216 user coordinate system 216 world coordinate system 216 TransformBy method 106107 example code 107 TranslateCoordinates method 64, 217 219 converting coordinates 218 example code 217, 219 true colors 122, 127 assigning to objects 122 changing objects' colors 127 changing, example code 127 overriding layers' color settings 127 TrueColor property 127 changing objects' colors 127 example code 127 See also Color property TrueType fonts 137 height settings 137
347 | Index
tutorial See Garden Path tutorial type libraries 7, 3940 adding reference 40 automation projects 7 defined 39 Type property 187, 191 example code 187 ToolbarItem object 191 TypeName function 42
U
UCS 218 converting coordinates 218 definition 218 UCSIconAtOrigin property 216 UCSIconOn property 216 UCSORG system variable 216 Unicode fonts 137, 146 table 146 uniting regions 80 Region object 80 Unload method 269 example code 269 external references 269 unloading 30 ObjectARX applications 30 Update method 59, 93, 109, 136, 141 example code 59 for text styles 136 redrawing objects 93 Text object 141 UpperRightCorner property 57 illustration 57 User Coordinate System 216, 218 axis location 216 definition 218 origin point location 216 viewports 216 user input 296297 Garden Path tutorial 296297 user input functions 33 prompting 33 user input methods 66, 68 GetInteger method 66
GetKeyword 68 GetPoint 68 GetPoint method 66 GetString 68 GetString method 66 user input pausing macros 195 User preference, Options dialog box UserForm window 19 editing forms 19 UseStandardScale property 234 Utility object 33, 6466, 217, 219 calculating area 65 calculation methods (list) 64 example code 217 functions 33 TranslateCoordinates method, example code 219 user input methods 66
49
V
variants 4042, 111 CreateTypedArray method 41 defined 40 input arrays 41 output arrays 41 polyline editing 111 Typename function 42 VarType function 42 VarType function 42 VB 67 ActiveX Automation interface 6 automation projects. See automation projects migrating automation projects 7 VB6 (Visual Basic 6) 6 VBA 67 ActiveX Automation interface 6 automation projects. See automation projects migrating automation projects 67 VBA environment 275277, 285287, 290, 293, 295296 accessing applications 290 application distribution 287 control toolbox (illustration) 276
348 | Index
design mode 277 dialog boxes, creating 276 End statement 296 forms 276 installing for tutorial 295 password protection 285 referencing object libraries 290 run mode 277 running macros 285 terminology (list) 275 Windows API procedures, accessing 293 working in a zero document state 286 VBA Hide method 279 VBA IDE 1617, 2122, 25, 27, 286, 290 Properties window 21 "Hello World" exercise 25 defined 27 macro execution 16 opening 16 opening on project load 286 referencing object libraries 290 SAVE command 22 viewing project data 17 VBA interface 2 advantages 2 with AutoCAD 2 environment 2 VB, similarities with 2 VBA Load method 280 VBA Manager 1013, 27 creating projects 12 defined 27 dialog box 10 embedding projects 11 extracting projects 12 loading projects 10 saving projects 13 unloading projects 11 VBA methods, (table) 281 VBA Object Browser 290 VBA programming using ActiveX 3 VBA projects 9, 285286 acad.dvb file 285 defined 9
loading on startup 285 running macros on startup 286 VBA Show method 279 VBA statements 283 On Error, example code 283 VBAIDE command 28 VBALOAD command 11, 28 VBAMAN command 28 VBARUN command 13, 28 VBASTMT command 28 VBAUNLOAD command 11, 28 vector files, and raster images 247 vectors 102 moving objects 102 version-dependent ProgIDs 7 version-independent ProgIDs 7 version, accessing 30 Viewport object 57, 221, 235 example code 221 LowerLeftCorner property 57 UpperRightCorner property 57 Viewport object, hiding lines in 243 viewports 5658, 234236, 238241, 243 changing views (illustration) 240 detail view 56 displaying 234 floating (illustration) 234 full view 56 horizontal display (illustration) 56 in model space 234 in paper space 235 models (illustration) 236 modifying 239 properties (list) 238 scale factor 241 setting active 57 settings (table) 236 shaded 243 splitting, example code 58 tiled (illustration) 234 vertical display (illustration) 56 views 55 creating 55 Views collection 55 virus protection 11, 16 enabling for macros 16
349 | Index
setting for VBA projects 16 using project code 11 Visible property 51, 188 example code 188 setting, example code 51 Visual Basic 43 Visual Basic 6 6 Visual Basic for Applications. See entries beginning with VBA Visual Basic. See VB Visual LISP 289 accessing objects 289 calling methods 289 retrieving methods 289 Visual Studio .NET 40 Volume property 223
WMF files 71 exporting to 71 World Coordinate System 215, 218 definition 218 entering coordinates 215
X
xdata. See extended data Xline object 62 XLOADCTL system variable 271 XRefDemandLoad property 271 xrefs. See external references
Z
zero document state 286 Zoom Center method 54 illustration 54 zoom scale, specifying 53 Zoom window 52 example code 52 ZoomAll method 54, 75, 7778 example code 54, 75, 7778 illustration 54 ZoomCenter method 54 example code 54 ZoomExtents method 54, 239 example code 54, 239 illustration 54 in active viewport 54 zooming 52, 240, 242 defined 52 in paper space (illustration) 242 scale factors 240 zoom scales 242 ZoomPickWindow method 52 example code 52 ZoomScaled method 53, 239, 241 example code 53, 239 ZoomWindow method 52
W
WBlock method 168, 255 leader lines 168 WCS 218 converting coordinates 218 definition 218 wedges 223 adding, example code 223 Width property 135, 239, 251 example code 239 WindowChanged event 205, 209 WindowMovedOrResized event 205, 209 Windows APIs 293 accessing from VBA 293 WindowState property 51 WithEvents 205206, 210, 212 declaring objects with events 205, 210 enabling objects with events 212 GetObject, VBA function 206 example code 206 VBA Keyword, example code 206, 210
350 | Index