10
AutoCAD Programming in C/C++ Owen Ransen JOHN WILEY & SONS Chichester • New York • Weinheim • Brisbane • Singapore • Toronto

AutoCAD Programming in C/C++

  • Upload
    others

  • View
    63

  • Download
    4

Embed Size (px)

Citation preview

Page 1: AutoCAD Programming in C/C++

AutoCAD Programming in C/C++ Owen Ransen

JOHN WILEY & SONS Chichester • New York • Weinheim • Brisbane • Singapore • Toronto

Page 2: AutoCAD Programming in C/C++

Contents

PREFACE XV Who Should Read This Book? xv What Do I Need To Start Programming Autocad In C And C++? xvi A Note On The Text xvii Source Code Availability xvii Acknowledgements xviii Contacting The Author xviii

1 PROGRAMMING AUTOCAD 1 1.1 Introduction 1 1.2 why Use Autocad? 1 1.3 Autolisp, C Or C++? 2 1.4 Pure Ads, Arx And Rxads 5

1.4.1 Pure Ads 5 1.4.2 Arx 6 1.4.3 Rxads 7 1.4.4 Mixed Ads And Arx Programming 7

2 GETTING STARTED IN C FOR AUTOCAD 8 2.1 Introduction 8 2.2 Communicating With Autocad 8 2.3 Drawing Nested Polygons 12 2.4 Loading Ads Programs. 15

Page 3: AutoCAD Programming in C/C++

vi AutoCAD Programming in C/C++

2.4.1 Loading Ads Programs Manually. 15 2.4.2 Loading Ads Programs Automatically 16

2.5 Code Fragments And The Example Program. 16 2.6 Listings 18

3 GETTING AUTOCAD TO DO THE WORK 24 3.1 Introduction 24 3.2 Telling Autocad What To Do: The Ads_Command() Function 24

3.2.1 Ads_Command() With No User Input 24 3.2.2 Ads_Command(), Pausing For User Input 26 3.2.3 Ads_Command() And Wild-Cards 27 3.2.4 Using Ads_Command() To Execute Shell 27

3.3 Ads Types And Type Specifiers 28 3.3.1 Basic Ads C Types 28 3.3.2 Linking In Non-Ads Files 28 3.3.3 Type Defining Codes 29

3.3 Command Echoing 30 3.4 Listings 31

4 USER INPUT 35 4.1 Introduction 35 4.2 User Input With The Ads_Getxxx() Functions 35 4.3 Using Ads_Initget() To Control User Input 36 4.4 Allowing Default Responses To Ads_Getxxx(), Rsg_Nonull 37 4.5 Ads_Getxxx() Return Values, Gracefully Accepting Rejection, Rtcan 38 4.6 Keyword Input To Help Selection 38 4.7 Two Ready-Made Dialog Boxes 40

4.7.1 The Ads_Alert() Function 40 4.7.2 The File Selection Dialog Box 41

4.8 Other Text Output 42 4.9 Long Loops And Aborting Commands, Ads_Usrbrk() 43

4.10 Listings 45

5 RESULT BUFFERS, VARIABLES AND SYMBOL TABLES 52 5.1 Introduction 52 5.2 Result Buffers And Data Types 52 5.3 Autocad Variables 58

5.3.1 What Are Autocad Variables? 58 5.3.2 Some Commonly Used Variables 59 5.3.3 Getting And Setting Variable Values 61

5.4 Symbol Tables 61 5.4.1 Data Contained In Symbol Tables 61 5.4.2 Accessing Symbol Table Data 62 5.4.3 Creating And Modifying Layers 64

Page 4: AutoCAD Programming in C/C++

Contents vii

5.5 Listings 65

6 ACCESSING THE AUTOCAD DATABASE WITH ADS 80 6.1 Introduction 80 6.2 Scanning The Drawing Database, Ads_Entnext() And Ads_Entget() 80 6.3 Ads_Ssget() 82

6.3.1 An Overview Of Ads_Ssget() 82 6.3.2 Prompting The User For Entities 84 6.3.3 Filtering The Database To Produce A Selection Set 84 6.3.4 Filtering The User's Selection Set 85 6.3.5 Ads_Buildlist() And Filters With Boolean Operators 86

6.4 Creating, Modifying And Deleting Entities 87 6.4.1 Creating Entities With Ads_Entmake() 87 6.4.2 Modifying Existing Entities With Ads_Entmod() 88 6.4.3 Deleting And Undeleting Entities With Ads_Entdel() 88

6.5 Saving And Restoring The User's Settings 89 6.6 Listings 90

7 ADS GEOMETRIC UTILITIES 102 7.1 Introduction 102 7.2 Finding Distance, Angle And Intersection Point 102 7.3 Matrix And Vector Utilities 103 7.4 Listings 105

8 BLOCKS AND POLYLINES 113 8.1 Introduction 113 8.2 Using Blocks To Save Space And Time 113 8.3 A Function To Create Blocks 114 8.4 External Drawings As Blocks, Xrefs 115 8.5 Creating Names For Blocks 115 8.6 A Faster Block Creating Function 116 8.7 Reading Block Data 117 8.8 Polylines 119

8.8.1 Modifying Polylines 120 8.9 Listings 122

9 DRAWING IN 3D AND 3D COORDINATE SYSTEMS 134 9.1 Introduction 134 9.2 A Comparison Of Two Methods For Adding Entities 134 9.3 Coordinate Systems In Autocad 137

9.3.1 The User Coordinate System 137

Page 5: AutoCAD Programming in C/C++

viii AutoCAD Programming in C/C++

9.6 9.7

Transformations In Ads Listings

10 3D OBJECTS AND RENDERING 10.1 10.2 10.3

10.4 10.5 10.6 10.7

Introduction The 3dface Entity Shading And Rendering

10.3.1 Shading, Shadedge And Shadedif 10.3.2 The Render Command

Viewing Parameters And Variables Meshes Other 3d Objects Listings

9.3.2 The Ucs Icon 139 9.3.3 The World Coordinate System 140 9.3.4 The Entity Coordinate System 140 9.3.4 The Model Coordinate System 141

9.4 3d Lines And 2d Lines. 141 9.5 Local And Global Object Positions 144

9.5.1 The Function Ads_Nentselp() 144 9.5.2 Distances To Robot Sensors 145

148 150

164 164 164 168 168 168 168 171 172 174

11 WORKING WITH EXTENDED DATA 181 11.1 Introduction 181 11.2 Why Use Extended Data? 181 11.3 The Structure Of An Entity's Extended Data 182 11.4 Registering Your Application, Ads_Regapp() 183 11.5 Reading And Writing Extended String Data 184 11.6 Reading And Writing Other Types Of Extended Data 187 11.7 Space Limits Of Extended Data, Ads_Xdsize() And Ads_Xdroom() 187

11.7.1 Extended Data And Arx 188 11.8 General Non-Graphical Data 188 11.9 Listings 189

12 DIALOG BOXES AND THE DIALOG CONTROL LANGUAGE 199 12.1 Introduction 199 12.2 What Is Possible With Del? 199

12.2.1 Ready-Made Del Files 201 12.3 A General And Systematic Dialog Box Handler In C 201

12.3.1 The Sample Del File 201 12.3.2 A Dialog Box Handler In C 203 12.3.3 Del Functions: Ads_Load_Dialog() And Ads_New_Dialog(). 206

Page 6: AutoCAD Programming in C/C++

Contents ix

12.3.4 Del Functions: Ads_Action_Tile() And Ads_Set_Tile() 206 12.3.5 The Callback Functions And Ads_Get_Attr_String() 209 12.3.6 The Ads_Done_Dialog() Function 210 12.3.7 A Summary Of Lst_12_l.C 210 12.3.8 Adding A New Dialog 210 12.3.9 List Handling, Ads_Start_List(), Ads_Add_List(), Ads_End_List() 211

12.4 Other Features Of Del 212 12.4.1 Rows And Columns 212 12.4.2 Auditing 212 12.4.4 Further Reading 213

12.5 Listings 213

13 PRACTICAL SUGGESTIONS FOR PROGRAMMING AUTOCAD 231 13.1 Introduction 231 13.2 Memory Management And Ads 231

13.2.1 Problems With The C Standard Malloc() Function 231 13.2.2 Safe_Calloc(), A Less Cumbersome Allocator 232 13.2.3 Avoiding The "Fatal Error" Message, Check Your Memory 233 13.2.4 Free Your Malloced Memory 235

13.3 Tidier And Shorter Listings With Void_Ads Functions 236 13.4 Internationalisation 236

13.4.1 International Date And Time 237 13.5 Software Protection Of Your Programs 238 13.6 When Equal Points Are Not 239 13.7 Compiling The Same Sources With Different Compilers 240 13.8 Unlocking Locked Drawings 241 13.9 Do Not Modify Your Application As It Runs! 241

13.10 Which Error Function To Use, Ads_Fail(), Ads_Abort(), Ads_Exit()? 242

14 INTRODUCTION TO ARX 244 14.1 Introduction 244 14.2 The Goals Of Arx 244 14.3 The Arx Implementation And "Exposure" 245 14.4 Which To Use, Ads Or Arx? 246

14.4.1 When To Use Arx 246 14.4.2 When To Use Ads 246

14.5 An Overview Of Arx 247 14.5.1 The Arx Libraries 248 14.5.2 The Arx View Of The Autocad Drawing 248

14.7 Deriving Custom Objects From Autocad Object Classes. 249 14.8 Notification And Reactors 250 14.9 Arx Dictionaries 251

15 FIRST STEPS WITH ARX 253

Page 7: AutoCAD Programming in C/C++

X AutoCAD Programming in C/C++

15.1 Introduction 253 15.2 A Minimal Arx Program 253

15.2.1 The Include Files Of An Arx Source File 254 15.2.2 The Entry Point Of An Arx Application 255 15.2.3 Creating Your Own Commands In An Arx Application,

Command Groups 256 15.2.4 Definition Files 258

15.3 Loading And Unloading Arx Applications 258 15.3.1 Manually Loading Arx Applications 258 15.3.2 Automatic Loading Of Arx Applications 259 15.3.3 Unlocking And Unloading Arx Applications 259

15.4 Creating Entities In Arx Applications 260 15.4.3 The Definition Of A Line As A C++ Object 260 15.4.4 Creating, Opening, Deleting And Closing Objects 261 15.4.5 Adding An Acdbentity To The Database 263 15.4.6 Getting Variable Settings From The Database 265

15.5 Object Identifiers, And Ways Of Opening An Object 266 15.5.1 Object Identifiers 266 15.5.2 Opening An Object For Read, Acdb::Kforread 268 15.5.3 Opening An Object For Write, Acdb::Kforwrite 268 15.5.4 Objects Opened For Notify, Acdb::Kfornotify 269

15.6 Ownership Of Objects And Root Objects 269 15.7 Changing Objects In The Database 270

15.7.1 Iskindof(), Cast() And Desc() 270 15.8 Listings 272

16 ARX ITERATORS, GEOMETRY CLASSES AND CLONING 282 16.1 Introduction 282 16.2 Arx Iterators 282

16.2.1 Listing The Contents Of The Model Space 282 16.2.2 Changing The Internals Of A Block 283 16.2.3 Iterating Through The Vertices Of A Polyline 285

16.3 The Arx Geometry Library 285 16.3.1 The Difference Between Acdbpoint And Acgepoint3d 285 16.3.2 The Three-Dimensional Point Class: Acgepoint3d 286 16.3.3 The Hierarchy Of The Acge Geometry Class Library 289 16.3.4 The Acgevector3d And Acgematrix3d Classes 290

16.4 Copying Entities With Clone And Deepclone() 293 16.4.1 Copying Simple Entities With Clone 293 16.4.2 Copying Complex Entities With Deepclone 295

16.5 Erasing And Unerasing Objects 297 16.5.1 Unerasing Objects 297 16.5.2 Opening Erased Objects 298 16.5.3 Opening And Unerasing Erased Objects 298

Page 8: AutoCAD Programming in C/C++

Contents xi

16.6 Listings 298

17 DERIVED ENTITIES AND DICTIONARIES. 313 17.1 Introduction 313 17.2 Using Inheritance To Create Custom Entities 313

17.2.1 Which Member Functions To Overload When Deriving A Custom Entity? 314

17.2.2 Zombie Classes 315 17.2.3 A Simple Example Of Deriving A Custom Class, A Special Circle 316 17.2.4 Dynamic Sizing Of The Circle 317 17.2.5 Handing Over Entities 319

17.3 Dictionaries 320 17.3.1 Extension Dictionaries 320 17.3.2 The Named Object Dictionary 320 17.3.3 Creating A New Dictionary 320 17.3.4 Giving Custom Objects Persistence 321 17.3.4 Creating And Accessing Custom Dictionaries 322 17.3.5 Registering New Classes With Autocad 325

17.4 Dictionaries And Ads 325 17.5 Listings 325

18 DXF, THE DRAWING EXCHANGE FORMAT 339 18.1 Introduction 339 18.2 Using Dxf Files 340

18.2.1 The Dxfin And Dxfout Commands 340 18.2.2 The Dxfix Program 341

18.3 An Example Dxf File And Some Dxf Groups 342 18.4 The Dxf Sections 344

18.4.1 The Header Section 344 18.4.2 The Tables Section 345 18.4.3 The Blocks Section 345 18.4.4 The Entities Section 346

18.5 A Dxf Writing Program 346 18.6 A Dxf Reading Program 348 18.7 Future Developments Of The Dxf Format 349 18.8 Listings 349

19 CASE STUDDZS AND APPLICATIONS 359 19.1 Introduction. 359 19.2 Case Study: Moonlite An Interior Lighting Design Package 359 19.3 Case Study: Drilldwg.Exp, A Pcb Drill Hole Plotter 363 19.4 Back To Lisp 364

Page 9: AutoCAD Programming in C/C++

xii AutoCAD Programming in C/C++

19.4.1 Lisp2c, Going From Autolisp To C Automatically 364 19.4.2 5 Vital Lisp, A Lisp Compiler For Autocad 364

19.5 Gis, Geographical Information Systems 365 19.6 Medical Engineering Cad 366 19.7 Constructing Models For Virtual Reality 366 19.8 Exersises For The Reader 367 19.9 Listings 368

20 AUTOLISP AND ADS COMMUNICATIONS 371 20.1 Introduction 371 20.2 Communicating With Autolisp 371

20.2.1 Sending Data From Autolisp To Ads 371 20.2.2 Returning Data From Ads To Autolisp 372 20.2.3 Testing Lst_20_l.C 372

20.3 Communication Between Ads Applications 373 20.4 Listings. 375

APPENDIX A COMPILERS AND ENVIRONMENTS 383 A.l Introduction 383

A. 1.1 Installing The Compiler And Autocad 384 A.2 Ads For Extended Dos Autocad Release 12 384

A.2.1 Compiling The Example Programs 384 A.3 Compiling For Release 12 Extended Dos 387 A.4 Ads For Windows 3.1 And Windows-95, Autocad 12, Watcom 9.0 390 A.5 Ads For Windows 3.1 And Windows-95, Autocad 12, Borland 3.X,4.X 390 A.6 Ads For Releases 12 & 13, Dos, Using Watcom 10.X 391 A.7 Ads For Release 13 Under Windows-95 Compiled Using Visual C++ 392 A. 8 Rxads For Windows-95 Compiled Using Microsoft Visual C++ 394 A.9 Arx For Windows-95 Compiled Using Microsoft Visual C++ 395

A. 10 Tips And Tricks For Ads And Arx Programmers 396 A. 10.1 Searching For Examples And Class Definitions Source Files 396 A. 10.2 Debugging With Visual C++ 397 A. 10.3 Common Visual C++Errors 397

APPENDIX B CATALOG O F ADS FUNCTIONS 400 B.l Introduction 400 B.2 Alphabetical Listing Of Ads And Arx Function 400

APPENDIX C AUTOCAD SYSTEM VARIABLES 424 C.l Introduction 424

Page 10: AutoCAD Programming in C/C++

Contents xiii

C.2 Autocad System Variables 425

APPENDIX D DXF CODES 452 D.l Introduction 452 D.2 Negative Group Codes 452 D.3 Positive Group Codes 452 D.4 Group Codes Related To Graphical Entities 454

D.4.1 Common Group Codes 454 D.4.2 Group Codes Of Specific Graphic Entities 454

D.5 Group Codes Which Apply To All Non-Graphical Entities 465 D.6 Group Codes For Non-Graphical Entities By Entity 465

APPENDIX E ERROR CODES 472 E.l Introduction 472 E.2 Ads Error Codes 472 E.3 Arx Error Codes, Differences Between Errno And Arx Error Values 474

478 478 478 478 478 479 479 480 481 481

END F.l F.2

F.3 F.4 F.5

ix F FURTHER SOURCES OF INFORMATION Introduction Books

F.2.1 C Programming F.2.2 C++ Programming F.2.3 Graphics Progamming F.2.4 Autocad

Magazines World Wide Web Addresses And Internet User Groups Company And Society Addresses

INDEX 483