zoukankan      html  css  js  c++  java
  • 2.1创建直线

        新建项目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、为什么创建完对象却不显示?

    答:因为创建的对象仅在内存中创建,如果想要显示出来还必须将其添加到数据库中。

  • 相关阅读:
    easy ui 表单ajax和from两种提交数据方法
    easy ui 下拉级联效果 ,下拉框绑定数据select控件
    easy ui 下拉框绑定数据select控件
    easy ui 异步上传文件,跨域
    easy ui 菜单和按钮(Menu and Button)
    HTTP 错误 404.3
    EXTJS4.2 后台管理菜单栏
    HTML 背景图片自适应
    easy ui 表单元素input控件后面加说明(红色)
    EXTJS 4.2 添加滚动条
  • 原文地址:https://www.cnblogs.com/xueniwawa/p/3958277.html
Copyright © 2011-2022 走看看