// ads选择实体
ads_name en;
ads_point pt;
if (acedEntSel(NULL, en, pt) != RTNORM) return;
// 打开实体ads名获得对象id,并包含容错函数
AcDbObjectId id;
if (acdbGetObjectId(id, en) != Acad::eOk) return;
AcDbEntityPointer pEnt(id, AcDb::kForWrite);
if (pEnt.openStatus() != Acad::eOk) return;
AcDbEntityPointer pEnt;
if (pEnt.open(id, AcDb::kForWrite) != Acad::eOk) return;
智能指针为基础
锁定:以下方法,锁定状态不可修改,故均要判断实体或图层是否锁定,并要跳过锁定,否则CAD直接崩溃
pEnt->setDatabaseDefaults();
,可传参AcDbDatabase*
对象,未传则用当前数据库用法 | 释义 |
---|---|
pEnt->colorIndex(); | 返回实体颜色索引值:int类型 ,0随块,256随层,值在0~256间 |
pEnt->color(); | 返回实体颜色对象:AcCmColor对象 |
pEnt->setColorIndex(intColor); | 设置实体颜色索引:retColor为颜色索引值int类型 |
pEnt->setColor(color); | 设置实体颜色:color为AcCmColor对象 |
int retColor;
// 函数返回值为:Acad::ErrorStatus
// 参数:接收颜色索引值、是否允许随层或随块颜色索引值、当前颜色索引值
if (acedSetColorDialog(retColor, true, pEnt->colorIndex()))
// 以颜色索引值设置实体颜色
pEnt->setColorIndex(retColor);
AcCmColor color;
// 索引值: color.setColorIndex(7);
// RGB法:如下
color.setRGB(123, 124, 250);
// 以颜色对象设置实体颜色
pEnt->setColor(color);
颜色对象AcCmColor 方法:
- 判断:随块
color.isByBlock();
或随层color.isByLayer();
或未设置col.isByACI();
- 设置:
color.setRGB(123, 124, 250);
或color.setColorIndex(7);
- 返回值为int:
col.red();
或col.green();
或col.blue();
用法 | 释义 |
---|---|
pEnt->linetype(lineTypeName); | 传入AcString 类型字符串(可直接打印),返回Acad::ErrorStatus |
pEnt->linetype(); | 上一个的重载函数,无传入值,返回ACHAR * |
pEnt->linetypeId(); | 返回线型表记录对象id,AcDbObjectId 类型 |
pEnt->setLinetype(value); |
1、以线型名称(AcString )设置实体线型,需要加载线型(格式->线型... ),否则线型不变2、以线性表记录对象id(AcDbObjectId )设置实体线型 |
AcString lineTypeName;
if (pEnt->linetype(lineTypeName) != Acad::eOk) return;
acutPrintf(_T("\n当前实体对象线型为:%s"), lineTypeName);
AcDbObjectId lineTypeId = pEnt->linetypeId();
// 若未加载DASHED线型,则保持原线型,退出
if((pEnt->setLinetype(_T("DASHED"))) != Acad::eOk) return;
acutPrintf(_T("\n当前实体对象线型为:%s"), pEnt->linetype());
pEnt->setLinetype(lineTypeId);
double globalScale = acdbHostApplicationServices()->workingDatabase()->ltscale();
double entScale = pEnt->linetypeScale();
// 参数:
// 返回:Acad::ErrorStatus,正常Acad::eOk
pEnt->setLinetypeScale(2, true);
用法 | 释义 |
---|---|
pEnt->visibility(); | 返回:AcDb::kInvisible 或AcDb::kvisible |
pEnt->setVisibility(AcDb::kInvisible); | 返回:Acad::ErrorStatus ,传入AcDb::kInvisible 或AcDb::kvisible |
#include "stdafx.h"
void AddCommands();
void Test();
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
#include "Database.h"
void AddCommands()
{
Editor::AddCommand(L"c-test", ACRX_CMD_MODAL, Test);
}
void Test()
{
ads_name en;
ads_point pt;
// 未选中任何实体,则显示所有隐藏实体
if (acedEntSel(NULL, en, pt) != RTNORM)
{ // 获取当前数据库所有实体id列表
AcDbObjectIdArray arrId = Database::GetAllEntIds();
// 遍历实体id列表,判断可见性,设置可见性
for (int i = 0; i < arrId.length(); i++)
{
AcDbObjectId id = arrId.at(i);
AcDbEntityPointer pEnt(id, AcDb::kForWrite);
if (pEnt->visibility() == AcDb::kInvisible)
pEnt->setVisibility(AcDb::kVisible);
}
}
// 若选择了实体,则隐藏该实体(此处 非 使层不可见)
AcDbObjectId id;
if (acdbGetObjectId(id, en) != Acad::eOk) return;
AcDbEntityPointer pEnt(id, AcDb::kForWrite);
if (pEnt->visibility() == AcDb::kVisible)
pEnt->setVisibility(AcDb::kInvisible);
}
用法 | 释义 |
---|---|
pEnt->layer(layerName); | 获得实体所在层 层表记录对象 字符串名称:传入AcString 对象返回 Acad::ErrorStatus ,官方推荐 |
pEnt->layer(); | 重载函数:返回:ACHAR * ,官方不推荐 |
pEnt->layerId(); | 返回:AcDbLayerTableRecord 层表记录对象id(AcDbObjectId ) |
pEnt->setLayer(_T(“0”)); | 设置实体图层:传入图层名称,返回Acad::ErrorStatus |
pEnt->setLayer(newVal); | 重载函数:同上,传入层表记录对象id(AcDbObjectId ),返回Acad::ErrorStatus |
AcString layerName;
pEnt->layer(layerName);
acutPrintf(_T("\n实体图层名为:%s"), layerName);
// 如果没有图层1则return,若实体所在图层为锁定,则崩溃
// 需自行对实体所在层的层表记录做判断过滤
if (pEnt->setLayer(_T("1")) != Acad::eOk)
return;
acutPrintf(_T("\n实体图层名为:%s"), pEnt->layer());
常用方法表
用法 | 释义 |
---|---|
pEnt->lineWeight(); | 返回:AcDb::LineWeight ,枚举类见下 |
pEnt->setLineWeight(AcDb::kLnWt100); | 返回:Acad::ErrorStatus ,传入AcDb::LineWeight |
代码示例
// 获取实体线宽
AcDb::LineWeight lineWeight = pEnt->lineWeight();
acutPrintf(_T("\n实体LineWeight值为:%d"), lineWeight);
// 设置实体线宽
if (pEnt->setLineWeight(AcDb::kLnWt100) != Acad::eOk)
return;
acutPrintf(_T("\n修改后实体LineWeight值为:%d"), pEnt->lineWeight());
AcDb::LineWeight
enum LineWeight { kLnWt000 = 0,
kLnWt005 = 5,
kLnWt009 = 9,
kLnWt013 = 13,
kLnWt015 = 15,
kLnWt018 = 18,
kLnWt020 = 20,
kLnWt025 = 25,
kLnWt030 = 30,
kLnWt035 = 35,
kLnWt040 = 40,
kLnWt050 = 50,
kLnWt053 = 53,
kLnWt060 = 60,
kLnWt070 = 70,
kLnWt080 = 80,
kLnWt090 = 90,
kLnWt100 = 100, // 此处为1毫米
kLnWt106 = 106,
kLnWt120 = 120,
kLnWt140 = 140,
kLnWt158 = 158,
kLnWt200 = 200,
kLnWt211 = 211,
kLnWtByLayer = -1, // 随层
kLnWtByBlock = -2, // 随块
kLnWtByLwDefault = -3 }; // 默认
#include "stdafx.h"
void AddCommands();
void GetEntInters();
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
#include "Database.h"
#include "Circle.h"
void AddCommands()
{ // 点选交点
Editor::AddCommand(L"c-inter", ACRX_CMD_MODAL, GetEntInters);
}
void GetEntInters()
{ // 点选同时获取实体指针pEnt、实体id
AcDbEntity *pEnt1, *pEnt2;
AcDbObjectId id1, id2;
pEnt1 = Editor::selectEntity(id1, AcDb::kForRead);
pEnt2 = Editor::selectEntity(id2, AcDb::kForRead);
// pEnt1调用方法返回与pEnt2相交的 点列表 points
// AcDb::kOnBothOperands: 必须相交才有值
// AcDb::kExtendBoth: 可以不相交,取延长线
AcGePoint3dArray points;
pEnt1->intersectWith(pEnt2, AcDb::kOnBothOperands, points);
// 遍历点列表:在每个交点上画圆
if (points.length() > 0)
{
for (int i = 0; i < points.length(); i++)
{
AcGePoint3d pt = points.at(i);
Circle::Add(pt, 2.0);
}
}
pEnt1->close();
pEnt2->close();
}
#include "stdafx.h"
void AddCommands();
void MyExplode();
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
#include "Database.h"
#include "Circle.h"
void AddCommands()
{ // 炸开实体
Editor::AddCommand(L"c-explode", ACRX_CMD_MODAL, MyExplode);
}
// 炸开实体
void MyExplode()
{ // 获得实体的指针和id
AcDbObjectId id;
AcDbEntity *pEnt = Editor::selectEntity(id, AcDb::kForWrite);
// explode方法只接受这个对象
AcDbVoidPtrArray pVoids;
// 将pEnt炸开后方pVoids里
pEnt->explode(pVoids);
for (int i = 0; i < pVoids.length(); i++)
{
// 将列表中每个对象强制类型转换为AcDbEntity
AcDbEntity *pEnt = (AcDbEntity *)pVoids.at(i);
Database::PostToModelSpace(pEnt);
}
// 删除原实体
pEnt->erase();
pEnt->close();
}
#include "stdafx.h"
void AddCommands();
void SetEntHighlight();
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
#include "Database.h"
void AddCommands()
{ // 设置高亮
Editor::AddCommand(L"c-highlight", ACRX_CMD_MODAL, SetEntHighlight);
}
// 设置高亮
void SetEntHighlight()
{ // 获得实体的指针和id
AcDbObjectId id;
AcDbEntity *pEnt = Editor::selectEntity(id, AcDb::kForWrite);
// 高亮方法highlight
pEnt->highlight();
pEnt->close();
}
ads_name en;
ads_point pt, pt1, pt2;
// 屏幕上选择单行文字实体
acedEntSel(NULL, en, pt);
// 通过实体名en获得结果缓冲区链表
resbuf * rb = acdbEntGet(en);
// 传入链表 返回:pt1即为左下角点,pt2即为右上角点
acedTextBox(rb, pt1, pt2);
#include "stdafx.h"
void AddCommands();
void test();
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
#include "Line.h"
void AddCommands()
{
Editor::AddCommand(L"c-test", ACRX_CMD_MODAL, test);
}
// 设置实体的扩展字典
void test()
{ // 图中拾取实体,用于添加扩展字典
ads_name en;
ads_point pt;
if (acedEntSel(NULL, en, pt) != RTNORM)
{
return;
}
// 获取拾取实体的对象id
AcDbObjectId id;
acdbGetObjectId(id, en);
AcDbEntity *pEnt = NULL;
// 对象id=》对象指针
if (acdbOpenObject(pEnt, id, AcDb::kForWrite) == Acad::eOk)
{ // 给对象新建扩展字典
pEnt->createExtensionDictionary();
// 对象指针调用方法返回扩展字典 对象id,并关闭对象指针
AcDbObjectId dictId = pEnt->extensionDictionary();
pEnt->close();
// 备用:扩展字典 对象指针、扩展字典记录 对象指针、扩展字典 对象id、结果缓冲区
AcDbDictionary *pDict = NULL;
AcDbXrecord *pXrec = new AcDbXrecord;
AcDbObjectId xrecordId;
resbuf *rb = NULL;
// 获得扩展字典对象指针pDict:返回值、字典 对象id、打开方式
if (acdbOpenObject(pDict, dictId, AcDb::kForWrite) == Acad::eOk)
{ // setAt设置 扩展字典中 扩展字典记录:
// 设置 扩展字典记录名称、
// 返回 扩展字典记录 对象指针 pXrec、
// 返回 扩展字典记录 对象id xrecordId(此处没用)
pDict->setAt(_T("存量"), pXrec, xrecordId);
rb = acutBuildList(AcDb::kDxfText, _T("此处可以做文字备注"),
AcDb::kDxfInt32, 20,
RTNONE);
// 用获取的扩展字典记录 对象指针 设置 扩展数据
pXrec->setFromRbChain(*rb);
// 清理工作:表记录对象、结果缓冲区内存,给第二个记录复用
pXrec->close();
acutRelRb(rb);
// 同样方法设置第二个记录,以下给pXrec、xrecordId、rb重新赋值
pXrec = new AcDbXrecord;
pDict->setAt(_T("参数"), pXrec, xrecordId);
rb = acutBuildList(AcDb::kDxfText, _T("半径及中心"),
AcDb::kDxfReal,23.45,
AcDb::kDxfXCoord, pt,
RTNONE);
pXrec->setFromRbChain(*rb);
pXrec->close();
acutRelRb(rb);
pDict->close();
}
}
}
扩展字典记录修改:没有修改,直接 覆盖结果缓冲区链表即为修改
图中组码传送门
#include "stdafx.h"
void AddCommands();
void view();
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
void AddCommands()
{
Editor::AddCommand(L"c-view", ACRX_CMD_MODAL, view);
}
// 读取实体设置扩展字典、扩展字典记录
void view()
{ // 选取实体并获得字典:以下同上节
ads_name en;
ads_point pt;
if (acedEntSel(NULL, en, pt) != RTNORM)
{
return;
}
AcDbObjectId id;
acdbGetObjectId(id, en);
AcDbEntity *pEnt = NULL;
if (acdbOpenObject(pEnt, id, AcDb::kForRead) == Acad::eOk)
{
AcDbObjectId dictId = pEnt->extensionDictionary();
pEnt->close();
if (dictId.isNull())
{
acutPrintf(_T("\n此实体不包含扩展记录!"));
return;
}
AcDbDictionary *pDict = NULL;
AcDbXrecord *pXrecord = NULL;
resbuf *pRb = NULL;
// 后面不要acutRelRb(pTemp);,因为acutRelRb(pRb);已经释放了内存空间
resbuf *pTemp = NULL;
if (acdbOpenObject(pDict, dictId, AcDb::kForRead) == Acad::eOk)
{
/***********获取第一个扩展字典记录数据***************/
// 通过字典中 扩展记录名称 获得其对应的 扩展记录对象指针
pDict->getAt(_T("存量"), pXrecord, AcDb::kForRead);
// 通过 扩展记录对象指针 获得结果缓冲区链表
pXrecord->rbChain(&pRb);
if (pRb != NULL)
{ // 用pTemp作迭代器,需要保留pRb来最终关闭结果缓冲区链表
pTemp = pRb;
// 以下都是针对刚才设置的结果缓冲区链表依次提取,否则用switch提取
acutPrintf(_T("\n存量记录存储的备注字符串:%s"), pTemp->resval.rstring);
// 移动迭代器至下一个链表节点
pTemp = pTemp->rbnext;
acutPrintf(_T("\n存量记录存储的短整型:%d"), pTemp->resval.rint);
pXrecord->close();
acutRelRb(pRb);
}
/***********获取第二个扩展字典记录数据***************/
pDict->getAt(_T("参数"), pXrecord, AcDb::kForRead);
pXrecord->rbChain(&pRb);
if (pRb != NULL)
{
pTemp = pRb;
pTemp = pTemp->rbnext;
acutPrintf(_T("\n参数存储的浮点型:%.9f"), pTemp->resval.rreal);
pTemp = pTemp->rbnext;
acutPrintf(_T("\n参数存储的点(%.3f %.3f %.3f)"),
pTemp->resval.rpoint[X],
pTemp->resval.rpoint[Y],
pTemp->resval.rpoint[Z]);
pXrecord->close();
acutRelRb(pRb);
}
pDict->close();
}
}
}
Commands.h
#include "stdafx.h"
void AddCommands();
void del();
Commands.cpp
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
void AddCommands()
{
Editor::AddCommand(L"c-delete", ACRX_CMD_MODAL, del);
}
// 删除扩展字典记录
void del()
{ // 选取实体并获得字典:以下同上两节
ads_name en;
ads_point pt;
if (acedEntSel(NULL, en, pt) != RTNORM)
{
return;
}
// 获取实体对象指针
AcDbObjectId id;
acdbGetObjectId(id, en);
AcDbEntity *pEnt = NULL;
if (acdbOpenObject(pEnt, id, AcDb::kForRead) == Acad::eOk)
{ // 获取 实体 扩展字典id,用完关闭实体指针
AcDbObjectId dictId = pEnt->extensionDictionary();
pEnt->close();
if (dictId.isNull())
{
acutPrintf(_T("\n此实体不包含扩展记录!"));
return;
}
// 通过 字典对象id 获得 字典对象指针 pDict
AcDbDictionary *pDict = NULL;
AcDbXrecord *pXrecord = NULL;
if (acdbOpenObject(pDict, dictId, AcDb::kForRead) == Acad::eOk)
{
Acad::ErrorStatus es = pDict->getAt(_T("参数"), pXrecord, AcDb::kForWrite);
if (es)
{
AfxMessageBox(_T("记录打开失败"));
return;
}
pXrecord->erase();
pXrecord->close();
pDict->close();
AfxMessageBox(_T("已删除"));
}
}
}
LIST
命令#include "stdafx.h"
void AddCommands();
void GetEntList();
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
#include "Database.h"
void AddCommands()
{ // 查询对象属性信息
Editor::AddCommand(L"c-list", ACRX_CMD_MODAL, GetEntList);
}
// 查询对象属性信息
void GetEntList()
{
AcDbObjectId id;
AcDbEntity *pEnt = Editor::selectEntity(id, AcDb::kForRead);
// 跟list命令一样
pEnt->list();
pEnt->close();
}
功能:获取一个实体的所有属性
Commands.h
#include "stdafx.h"
void AddCommands();
void Test();
Commands.cpp
#include "stdafx.h"
#include "Commands.h"
#include "Editor.h"
// AcRxMember 类的头文件
#include "rxmember.h"
// AcRxProperty 类的头文件
#include "rxprop.h"
// AcRxValue 类的头文件
#include "rxvalue.h"
void AddCommands()
{
Editor::AddCommand(L"c-test", ACRX_CMD_MODAL, Test);
}
void Test()
{ // 选择实体
ads_name en;
ads_point pt;
if (acedEntSel(_T("\n选择要打印实体属性的对象:"),en, pt) != RTNORM)
{
return;
}
// 获得对象id:通过实体名ads_name
AcDbObjectId id;
if (acdbGetObjectId(id, en) != Acad::eOk) return;
// 智能指针基类AcDbObjectPointerBase,下面为派生类
// 使用智能指针对象的构造函数:自动释放指针,传入对象id,功能类似于acdbOpenObject
AcDbEntityPointer ent(id, AcDb::kForRead);
// 智能指针基类的函数openStatus,用于判断对象打开是否成功
if (ent.openStatus() != Acad::eOk) return;
// 函数theEngine:返回AcRxMemberQueryEngine对象指针,
// 设计模式中的单例模式(框架创建对象,且生命周期只有一个此对象)
// 函数newMemberIterator:返回可以 遍历 实体成员(属性项)的 迭代器pItr, 传入实体指针ent
AcRxMemberIterator *pItr = AcRxMemberQueryEngine::theEngine()->newMemberIterator(ent);
// 打印格式:30个字节左对齐(-30s),属性名称、值类型、属性值
acutPrintf(_T("\n%-30s\t%-35s\t%s"), _T("Name"), _T("Type"), _T("Value"));
// 用于存储 下面循环获得的 指向 属性对象(实体对象的) 的 指针
AcRxProperty *prop;
// 迭代器pItr有初始值,这里省略
for (; !pItr->done();pItr->next())
{ // 迭代器对象的current方法:返回AcRxMember对象指针
// AcRxProperty类是 AcRxMember类的派生类,所以可以强制类型转换
prop = AcRxProperty::cast(pItr->current());
if (prop != NULL)
{ // 给err赋初值
Acad::ErrorStatus err = Acad::eOk;
// 属性值对象:还有empty、isEmpty、varies、isVaries、type、toString方法
AcRxValue value;
// AcRxProperty类的获取 属性对象AcRxValue 的值的方法
// 还有setValue方法,查文档学习
if ((err = prop->getValue(ent, value)) == Acad::eOk)
{
ACHAR *szValue = NULL;
// AcRxValue方法toString:返回value值字符串长度,
// 传入用于接收字符串的指针(可为null)、传入字符串长度(可为0)
// 此处调用toString方法仅为了知道字符串长度
int valuesize = value.toString(NULL, 0);
if (valuesize > 0)
{ // 字符串加一:包含尾部的\0
valuesize++;
// 开辟 接收 字符串对象 的内存空间
szValue = new ACHAR[valuesize];
// 重新调用toString方法,给szValue赋值
value.toString(szValue, valuesize);
}
// 输出结果:AcRxProperty方法name(属性名)、
// AcRxValue方法type(属性类型)、
// AcRxValue方法toString(属性值)
acutPrintf(_T("\n%-30s\t%-35s\t%s"),prop->name(),
value.type().name(),
(szValue == NULL) ? _T("none") : szValue);
// 如果字符串指针szValue有值:delete释放掉内存空间
if (szValue) delete szValue;
}
}
}
}
效果(此处点选了一个矩形)
选择要打印实体属性的对象:
Name Type Value
Area double 71.106116
BlockId AcDbObjectId 1f62bd281f0
CastShadows bool 0
ClassName AcString none
Closed bool 1
CollisionType AcDb::CollisionType 1
Color AcCmColor BYLAYER
ConstantWidth double 0.000000
Elevation double 0.000000
EndParam double 4.000000
ExtensionDictionary AcDbObjectId 0
Handle AcDbHandle 21a
HasBulges bool 0
HasFields bool 0
HasSaveVersionOverride bool 0
HasWidth bool 0
IsA AcRxClass* AcDbPolyline
IsAProxy bool 0
IsCancelling bool 0
IsEraseStatusToggled bool 0
IsErased bool 0
IsModified bool 0
IsModifiedGraphics bool 0
IsModifiedXData bool 0
IsNewObject bool 0
IsNotifyEnabled bool 0
IsNotifying bool 0
IsObjectIdsInFlux bool 0
IsOnlyLines bool 1
IsPeriodic bool 1
IsPersistent bool 1
IsPlanar bool 1
IsReadEnabled bool 1
IsReallyClosing bool 1
IsTransactionResident bool 0
IsUndoing bool 0
IsWriteEnabled bool 0
LayerId AcDbObjectId 1f62bd28100
Length double 35.923246
LineWeight AcDb::LineWeight -1
LinetypeId AcDbObjectId 1f62bd28150
LinetypeScale double 1.000000
LocalizedName AcString 多段线
MaterialId AcDbObjectId 1f62bd285e0
MergeStyle AcDb::DuplicateRecordCloning 1
Normal AcGeVector3d 0.000000 0.000000 1.000000
ObjectId AcDbObjectId 1f62bd2c520
OwnerId AcDbObjectId 1f62bd281f0
Plinegen bool 0
PlotStyleName AcString ByColor
ReceiveShadows bool 0
StartParam double 0.000000
Thickness double 0.000000
Transparency AcCmTransparency 0
Visible AcDb::Visibility 0
传送门 返回 列表