其他分享
首页 > 其他分享> > 基于ObjectArx的AutoCAD二次开发的基础入门

基于ObjectArx的AutoCAD二次开发的基础入门

作者:互联网

基于ObjectArx的AutoCAD二次开发

简介

AutoCAD版本:2008
对应的OBjectArx版本:ObjectArx 2008
开发语言:C++
学习工具:AutoCAD ObjectARX(VC)开发基础与实例教程 —— 张帆

1、创建直线

打开vs2008,用向导创建一个名为“CreateLine的项目“

在这里插入图片描述

在acrxEntryPoint.cpp文件中,找到自己刚刚创建的函数,在里面直接添加如下代码:

static void CHAP2CreatLine(void)
	{
		// Add your code for command CHAP2.CreatLine here

		// 在内存上创建一个新的AcDbLine对象
		AcGePoint3d ptStart(0, 0, 0); 
		AcGePoint3d ptEnd(100, 100, 0); 
		AcDbLine *pLine = new AcDbLine(ptStart, ptEnd); 

		// 获得指向块表的指针
		AcDbBlockTable *pBlockTable; 
		acdbHostApplicationServices()->workingDatabase() 
			->getBlockTable(pBlockTable, AcDb::kForRead); 
		// 获得指向特定的块表记录(模型空间)的指针
		AcDbBlockTableRecord *pBlockTableRecord; 
		pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, 
			AcDb::kForWrite); 

		// 将AcDbLine类的对象添加到块表记录中
		AcDbObjectId lineId; 
		pBlockTableRecord->appendAcDbEntity(lineId, pLine); 
		//该语句用来修改线段颜色
		//pLine->setColorIndex(1);

		// 关闭图形数据库的各种对象
		pBlockTable->close(); 
		pBlockTableRecord->close();
		pLine->close();
	}

编译应用程序之后,在AutoCAD 2008中加载并运行程序中注册的命令,可看到一条起点为(0,0,0),终点为(100,100,0)的线段

2、修改图形对象的属性(修改线段颜色)

1、用向导创建一个名为“ModifyEnt.cpp”的项目,我们既然要修改线段颜色,那么首先要创建一个线段(CreateLine),其次是修改线段颜色(ChangeColor)。注册两个命令,一个用来创建线段,一个用来修改线段。
在这里插入图片描述
在ModifyEnt.cpp文件中添加如下代码:

//创建线段函数
AcDbObjectId CreateLine() 
{ 
	    AcGePoint3d ptStart(0, 0, 0);
		AcGePoint3d ptEnd(100, 100, 0);
		AcDbLine *pLine = new AcDbLine(ptStart, ptEnd); 

	AcDbBlockTable *pBlockTable;
		acdbHostApplicationServices()->workingDatabase()
		->getBlockTable(pBlockTable, AcDb::kForRead);

	AcDbBlockTableRecord *pBlockTableRecord;
		pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, 
		AcDb::kForWrite); 

	AcDbObjectId lineId;
		pBlockTableRecord->appendAcDbEntity(lineId, pLine);

		pBlockTable->close();
		pBlockTableRecord->close(); 
	pLine->close();
	return lineId;
}
//修改线段颜色函数
Acad::ErrorStatus ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex) 
{ 
	AcDbEntity *pEntity;
	// 打开图形数据库中的对象
	acdbOpenObject(pEntity, entId, AcDb::kForWrite);

		// 修改实体的颜
		pEntity->setColorIndex(colorIndex);
		//用完之后及时关闭
		pEntity->close(); 
		return Acad::eOk;
}

然后在acrxEntryPoint.cpp文件中,找到自己刚刚创建的函数,添加如下代码:

static void WDDChangeColor(void)
	{
		//函数需要声明
		AcDbObjectId CreateLine() ;
		Acad::ErrorStatus ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex) ;
		// Add your code for command WDD.ChangeColor here
		//创建直线
		AcDbObjectId lineId;
		lineId = CreateLine();
		//修改直线颜色																																																																																																																														
		ChangeColor(lineId,4);
	}
} ;

需要注意的一点:在acrxEntryPoint.cpp文件中调用ModifyEnt.cpp中的CreateLine函数和ChangeColor函数的时候需要声明一下,否则会报错误 “error C3861: “CreateLine”: 找不到标识符”、“error C3861: “ChangeColor”: 找不到标识符” 这样的错误。

3、用类组织函数来修改图形对象的属性

新建一个名为“CreateEnts”的项目,新建一个包含了创建实体函数的新类CCreateEnt1,CreateLine作为其成员函数。新建一个包含修改实体函数的类 CMofifyEnt, ChangeColor 作为其成员函数。主要在以下几个文件中添加代码,如下图所示:
在CreateEnt.h文件中添加以下代码:

#include "stdafx.h"
#pragma once

class CCreateEnt
{
public:
    //只有下面这一句代码是自己添加的,其余代码都是向导自动生成的
    static AcDbObjectId CreateLine(); //函数声明
	CCreateEnt(void);
	~CCreateEnt(void);
};

在ModifyEnt.h文件中添加以下代码:

#include "stdafx.h"
#pragma once

class CModifyEnt
{
public:
只有下面这一句代码是自己添加的,其余代码都是向导自动生成的
	static Acad::ErrorStatus ChangeColor(AcDbObjectId entId, Adesk::UInt16 
		colorIndex); //函数声明
	CModifyEnt(void);
	~CModifyEnt(void);
};

在CreateEnt1.cpp添加如下代码:

#include "StdAfx.h"
#include "CreateEnt.h"
//类构造函数,向导自动生成
CCreateEnt::CCreateEnt(void)
{
}
//类析构函数,向导自动生成
CCreateEnt::~CCreateEnt(void)
{
}
//*******************需要自己添加的代码,此为创建线段函数*******************
AcDbObjectId CCreateEnt::CreateLine() // 函数实现
{ 
	AcGePoint3d ptStart(0, 0, 0);
	AcGePoint3d ptEnd(100, 100, 0);
	AcDbLine *pLine = new AcDbLine(ptStart, ptEnd); 

	AcDbBlockTable *pBlockTable;
	acdbHostApplicationServices()->workingDatabase()
		->getBlockTable(pBlockTable, AcDb::kForRead);

	AcDbBlockTableRecord *pBlockTableRecord;
	pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, 
		AcDb::kForWrite); 

	AcDbObjectId lineId;
	pBlockTableRecord->appendAcDbEntity(lineId, pLine);

	pBlockTable->close();
	pBlockTableRecord->close(); 
	pLine->close();
	return lineId;
}

在ModifyEnt.cpp添加如下代码:

#include "StdAfx.h"
#include "ModifyEnt.h"
//ModifyEnt类的构造函数,向导自动生成
CModifyEnt::CModifyEnt(void)
{
}
//ModifyEnt类的析构造函数,向导自动生成
CModifyEnt::~CModifyEnt(void)
{
}
//****************需要自己添加的函数,此为修改线段颜色函数**********************
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文件中添加如下代码:

//这两个头文件向导自动生成
#include "StdAfx.h"
#include "resource.h"
//这两个头文件需要自己手动加上
#include "CreateEnt.h"
#include "ModifyEnt.h"
#define szRDS _RXST("WDD")
//向导自动生成的代码,为了减少篇幅,生成的注释都被我删掉了
class CCreateEntsApp : public AcRxArxApp {
public:
	CCreateEntsApp () : AcRxArxApp () {}
	virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
		AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
		return (retCode) ;
	}
	virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
		AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
		return (retCode) ;
	}
	virtual void RegisterServerComponents () {
	}
	//**************************需要自己添加的代码*************************
	static void WDDAChangeColor(void)
	{
		AcDbObjectId lineId; 
		lineId = CCreateEnt::CreateLine(); 
		CModifyEnt::ChangeColor(lineId, 4);
	}
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CCreateEntsApp)
ACED_ARXCOMMAND_ENTRY_AUTO(CCreateEntsApp, WDD, AChangeColor, ACC, ACRX_CMD_TRANSPARENT, NULL)

标签:AcDbObjectId,pBlockTable,AutoCAD,函数,void,pBlockTableRecord,ObjectArx,二次开发,lineId
来源: https://blog.csdn.net/weixin_43027194/article/details/111743470