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