ObjectARX编程--直线

最近在学习ObjectARX,于是想着把一些东西写到这里供个人和大家参考,博客中出现的问题我会尽快改正,全篇代码基于《[c++]ObjectARX开发实例教程》进行整理与扩展,至于能够做到哪一步,emmmm…
开发环境:VS2010 + ObjectARX2014 + AutoCAD2014 。环境搭建不再赘述,以下项目全部使用Objectarx向导进行创建,且全部放在一个项目当中,如果出现相同部分则不再重复。
注意:所有成员函数记得在头文件进行声明,以下不再进行赘述

创建直线

创建一条(0,0)到(100,100)的平面直线,并修改其颜色

  • 分别创建两个新类:CCreateEnt . CmodifyEnt ,并包含头文件。
  • 分别添加头文件
    #include "StdAfx.h"
    
  • 在"StdAfx.h"中天健头文件
    #include "dbents.h"
    
  • 在CCreate类中添加一个CreateLine成员函数,下面分别为声明方式和实现方式:
    //CCreateEnt.h:
    static AcDbObjectId CreateLine(AcGePoint3d ptStart, AcGePoint3d ptEnd);	//函数声明
    
    //CreateEnt.cpp:
    //创建直线
    AcDbObjectId CCreateEnt::CreateLine(AcGePoint3d ptStart, AcGePoint3d ptEnd)		//函数实现
    {
    	AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);
    	
    	//将实体添加到图形数据库
    	AcDbObjectId lineId;
    	//此时,直线对象仅被在内存上创建,并没有添加到图形数据库中,因此不可能会显示在图形窗口中。
    	lineId = CCreateEnt::PostToModelSpace(pLine);
    		
    	return lineId;
    }	
    
    // 将实体添加到图形数据库的模型空间
    AcDbObjectId CCreateEnt::PostToModelSpace(AcDbEntity* pEnt) 
    { 
    	
    	// 获得指向块表的指针
    	 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 entId; 
    	pBlockTableRecord->appendAcDbEntity(entId, pEnt);
    	
    	// 关闭图形数据库的各种对象
    	pBlockTable->close(); 
    	 pBlockTableRecord->close(); 
    	 pEnt->close(); 
    	 return entId; 
    }
    
  • CmodifyEnt.cpp
    //改变颜色的直线	
    Acad::ErrorStatus CModifyEnt::ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex) 
    {
    	AcDbEntity *pEntity; 
    	// 打开图形数据库中的对象
    	acdbOpenObject(pEntity, entId, AcDb::kForWrite); 
    	// 修改实体的颜色
    	pEntity->setColorIndex(colorIndex);
    	// 用完之后,及时关闭
    	pEntity->close(); 
    	return Acad::eOk;
    }
    

acrxEntryPoint.cpp

	//当前项目中注册一个命令 AddLine
	static void MLMyGroupMyChangeColor() 
 	{ 
		AcGePoint3d ptStart(0, 0, 0); 
		AcGePoint3d ptEnd(100, 100, 0); 
		AcDbObjectId lineId; 
		lineId = CCreateEnt::CreateLine(ptStart, ptEnd); 
		CmodifyEnt::ChangeColor(lineId, 1);  
	}
	ACED_ARXCOMMAND_ENTRY_AUTO(CArxProjectMLApp, MLMyGroup, MyChangeColor, ChangeColor, ACRX_CMD_MODAL, NULL) //画直线	

实现效果

输入命令:ChangeColor

ObjectARX编程--直线_第1张图片

你可能感兴趣的:(ObjectARX)