(1)ObjectARX2015 + vs2012创建直线

参考博客

​​​​​​ObjectARX编程--直线_sxau_milong的博客-CSDN博客

首先要了解AutoCAD数据库的基本结构,从而知道因此要创建一个图形对象,需要遵循下面的基本步骤:


1)确定要创建对象的图形数据库;

2)获得图形数据库的块表;

3)获得一个存储实体的块表记录,所有模型空间的实体都存储在模型空间的特定记录中;

4)创建实体类的一个对象,将该对象附加到特定的块表记录中。

1. 说明

           本实例运行的结果是在 AutoCAD 2002中,创建一条直线,该直线的起点是(0,00), 终点是(1001000)。

           麻雀虽小,五脏俱全。通过这个程序,了解 AutoCAD 数据库的基本结构.

2. 思路

           首先来看看,在 AutoCAD 中,使用 LINE 命令创建一条直线,需要哪些东西:

                命令: _line

                指定第一点: 0,0

                指定下一点或 [放弃(U)]: 100,100

3. 步骤

(1)创建一个新的ObjectARX项目(本例为ArxConfig);

(2)创建新类:CCreateLine并包含头文件

#include "StdAfx.h"

stdafx.h在C++中起到的作用是头文件预编译,即把C++工程中使用的MFC头文件预先编译,以后该工程编译时,直接使用预编译的结果,以加快编译速度

(3)在CreateLine.h中添加两个成员函数:

    //创建直线(起点,结束点)
    static AcDbObjectId CreateLine(AcGePoint3d ptStart, AcGePoint3d ptEnd);	
    //将实体添加到图形数据库的模型空间
    static AcDbObjectId PostToModelSpace(AcDbEntity* pLine);

 C++中AcDbObjectId的典型用法代码示例:

C++ AcDbObjectId类代码示例 - 纯净天空 (vimsky.com)

(当一个对象或实体第一次被增加至数据库中,一个新的stub对象被创建且设为指向被增加至数据库的对象和实体。这个stub在内存中的地址作为增加至数据库中的对象或实体的ads_name和AcDbObjectId使用)

((笑谈AcDb0bjectld)什么是ID(身份、标识),看过周星驰的《唐伯虎点秋香》吧?由于下人太多,名字不好记,每个人都被编了一个号码(唐伯虎自然就是9527),管理者通过这个编号来管理。图形数据库也一样,作为管理者,只能通过编号(AcDbObjectld)来管理每一个实体。)

(4) 在CreateLine.cpp中实现上述两个成员函数:

AcDbObjectId CCreateLine::CreateLine(AcGePoint3d ptStart, AcGePoint3d ptEnd)		//函数实现
{
    AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);
    /*注意,基于AutoCAD内部的实现机制,必须在堆上创建对象,而不能用下面的语句创建直线的对象:
        AcDbLine line(ptStart, ptEnd);
    此时,直线对象仅被在内存上创建,并没有添加到图形数据库中,因此不可能会显示在图形窗口中。*/

    //将实体添加到图形数据库
    AcDbObjectId lineId;
    //此时,直线对象仅被在内存上创建,并没有添加到图形数据库中,因此不可能会显示在图形窗口中。
    lineId = CCreateEnt::PostToModelSpace(pLine);

    return lineId;
}
// 将实体添加到图形数据库的模型空间
AcDbObjectId CCreateLine::PostToModelSpace(AcDbEntity* pLine) 
{ 
	
	// 获得指向块表的指针
	 AcDbBlockTable *pBlockTable; 
	 acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead); 
	 /*
	 acdbHostApplicationServices()->workingDatabase()能够获得一个指向当前活动的图形数据库的指针,这在后面还要经常遇到。getBlockTable 是 AcDbDatabase 类的一个成员函数,用于获得指向图形数据库的块表的指针,其定义为:
	inline Acad::ErrorStatus getBlockTable( 
		AcDbBlockTable*& pTable, 
		AcDb::OpenMode mode); 
	该函数的返回值 Acad::ErrorStatus 是 ObjectARX 中定义的一个枚举类型,主要用于判断函数的返回状态,如果函数成功执行会返回 Acad::eOk。
	第一个参数 pTable 返回指向块表的指针;
	第二个参数同样是一个枚举类型的变量,其类型 AcDb::OpenMode 包含了AcDb::kForRead、AcDb::kForWrite 和 AcDb::kForNotify 三个可取的值,创建直线的时候不需要更改块表,因此这里打开的模式为 AcDb::kForRead
	*/

	// 获得指向特定的块表记录(模型空间)的指针
	 AcDbBlockTableRecord *pBlockTableRecord; 
	 pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite); 
	 /*
	getAt 函数是 AcDbBlockTable 类的一个成员函数,用于获得块表中特定的记录,其定义为:	
	Acad::ErrorStatus getAt( 
		 const char* entryName, 
		 AcDbBlockTableRecord*& pRec, 
		AcDb::OpenMode openMode, 
		 bool openErasedRec = false) const; 
	第一个参数用于指定块表记录的名称,ACDB_MODEL_SPACE 是 ObjectARX 中定义的一个常量,其内容是“*Model_Space”;
	第二个参数用于返回指向块表记录的指针;
	第三个参数指定了块表记录打开的模式,下一步要向块表记录中添加实体,所以就用写的模式(AcDb::kForWrite)打开;
	第四个参数指定是否查找已经被删除的记录,
	*/

	// 将AcDbLine类的对象添加到块表记录中
	AcDbObjectId lineId; 
	pBlockTableRecord->appendAcDbEntity(lineId, pLine);
    /*appendAcDbEntity是 AcDbBlockTableRecord类的成员函数,用于将pEntity
    指向的实体添加到块表记录和图形数据库中,其定义为:
    Acad::ErrorStatus appendAcDbEntity(
                        AcDbObjectld& pOutputld,
                        AcDbEntity* pEntity);
    第一个参数返回图形数据库为添加的实体分配的ID号;
    第二个参数指定了所要添加的实体。
    */
	
	// 关闭图形数据库的各种对象
	pBlockTable->close(); 
	pBlockTableRecord->close(); 
	pLine->close(); 
	return entId; 
    /*在操作图形数据库的各种对象时,必须遵守AutoCAD的打开和关闭对象的协议。
    该协议确保当对象被访问时在物理内存中,而未被访问时可以被分页存储在磁盘中。
    创建和打开数据库的对象之后,必须在不用的时候关闭它。*/
}

(5) 在acrxEntryPoint.cpp中添加#include "CreateLine.h"头文件后添加注册命令

    //当前项目中注册一个命令 AddLine
    static void MidasMyGroupMyDrawLine() 
    { 
        AcGePoint3d ptStart(0, 0, 0); 
        AcGePoint3d ptEnd(10, 10, 0); 
        AcDbObjectId lineId; 
        lineId = CCreateLine::CreateLine(ptStart, ptEnd); 
    }
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDrawLine, MyDrawLine, ACRX_CMD_MODAL, NULL) //画直线	

注: static void MidasMyGroupMyDrawLine() 中成员函数名MidasMyGroupMyDrawLine由ACED_ARXCOMMAND_ENTRY_AUTO中第二和第三个参数组合,第四个参数为AutoCAD中命令.

(6) 调试生成在AutoCAD中加载后,输入命令MyDrawLine,实现效果

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值