新建项目CreateLine。步骤和1.4HelloWorld创建相同。注册一个命令,命令名自己定义,我就跟张帆老师的一样取作CreateLine。
其中,Mode有两种选项,虽然我现在也不知道这两种有什么不同,可是先照着张帆老师的做吧。如有人知道,希望可以告诉我,先谢过。新建好命令之后同样得到一个定义好的函数static void XBCreateLine(void);在其中添加画直线的代码。
1 #include "StdAfx.h" 2 #include "resource.h" 3 4 //----------------------------------------------------------------------------- 5 #define szRDS _RXST("XB") 6 7 //----------------------------------------------------------------------------- 8 //----- ObjectARX EntryPoint 9 class CMy21CreateLineApp : public AcRxArxApp { 10 11 public: 12 CMy21CreateLineApp () : AcRxArxApp () {} 13 14 virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) { 15 // TODO: Load dependencies here 16 17 // You *must* call On_kInitAppMsg here 18 AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ; 19 20 // TODO: Add your initialization code here 21 22 return (retCode) ; 23 } 24 25 virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) { 26 // TODO: Add your code here 27 28 // You *must* call On_kUnloadAppMsg here 29 AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ; 30 31 // TODO: Unload dependencies here 32 33 return (retCode) ; 34 } 35 36 virtual void RegisterServerComponents () { 37 } 38 39 40 // - XB.CreateLine command (do not rename) 41 // 画直线命令,画一条起点为(0,0,0)终点为(100,100,0)的直线 42 static void XBCreateLine(void) 43 { 44 // Add your code for command XB.CreateLine here 45 46 //第一步,在内存上创建一个新的AcDbLine对象 47 AcGePoint3d ptStart(0,0,0); //起点 48 AcGePoint3d ptEnd(100,100,0); //终点 49 AcDbLine *pLine = new AcDbLine(ptStart,ptEnd); 50 51 //第二步,获得指向表块的指针 52 AcDbBlockTable *pBlockTable; 53 acdbHostApplicationServices()->workingDatabase() 54 ->getBlockTable(pBlockTable,AcDb::kForRead); 55 56 //第三步,获得指向特定的块表记录(模型空间)的指针 57 AcDbBlockTableRecord *pBlockTableRecord; 58 pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord, 59 AcDb::kForWrite); 60 61 //第四步,将AcDbLine对象添加到块表记录中 62 AcDbObjectId lineId; 63 pBlockTableRecord->appendAcDbEntity(lineId,pLine); 64 65 //第五步,关闭数据库的各种对象 66 pBlockTable->close(); 67 pBlockTableRecord->close(); 68 pLine->close(); 69 70 } 71 } ; 72 73 //----------------------------------------------------------------------------- 74 IMPLEMENT_ARX_ENTRYPOINT(CMy21CreateLineApp) 75 76 ACED_ARXCOMMAND_ENTRY_AUTO(CMy21CreateLineApp, XB, CreateLine, CreateLine, ACRX_CMD_MODAL, NULL)
还需在StdAfx.cpp中包含AcDbLine类的头文件dbents.h,否则AcDbLine类对象就无法识别。
最后设置好CAD的exe路径(操作方法,同1.4HelloWorld中的设置),然后编译运行,加载命令,在命令行输入命令之后显示直线。完工!
对张帆老师这一节讲解内容的一些个人总结:
1.理解数据库的几个基础名词:
表:表是数据库的组成单位,一个数据库至少包含一个表。
记录:记录是表的组成单位,一个表可能包含多条记录,也可能不包含任何记录。
2.创建一个图形对象时候需要遵循的基础步骤
(1)确定要创建对象的图形数据库;
(2)获得图形数据库的块表;
(3)获得一个存储实体的块表记录,所有模型空间的实体都存储在模型空间的特定记录中。
(4)创建实体类的一个对象,将该对象附加到特定的块表记录中。
3、关于为什么是AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);而不是AcDbLine line(ptStart,ptEnd);?
答:因为,基于AutoCAD内部实现机制(什么机制我也不清楚),必须在堆上创建对象(即用new)。
4、为什么创建完对象却不显示?
答:因为创建的对象仅在内存中创建,如果想要显示出来还必须将其添加到数据库中。
时间: 2024-09-30 23:52:19