ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-12-26 15:31:15  阅读:275  来源: 互联网

标签:AcDbObjectId pBlockTable AutoCAD 函数 void pBlockTableRecord ObjectArx 二次开发 lineId


基于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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有