目录
一、实体类
1.1 继承关系
- 关系表
1.2 实体智能指针
- 功能:不必开发者手动关闭指针
- 获取实体对象id
// 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;
- 类构造函数法
二、AcDbEntity类方法
2.1 概述
- 以下方法均以1.2节
智能指针为基础
- AcDbEntity类方法官方合集: 点此处传送门
锁定:以下方法,锁定状态不可修改,故均要判断实体或图层是否锁定,并要跳过锁定,否则CAD直接崩溃
- 实体对象创建
- 默认调用:
pEnt->setDatabaseDefaults();
,可传参AcDbDatabase*
对象,未传则用当前数据库 - 设置内容:
- 颜色:Color
- 图层:Layer
- 线型:Linetype
- 线型比例:Linetype scale
- 可见性:Visibility
- 打印样式:Plot style name
- 线宽:Line weight
- 默认调用:
2.2 颜色方法
- 常用汇总
用法 释义 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();
- 判断:随块
2.3 线型
2.3.1 线型种类
- 常用汇总
用法 释义 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);
- 记录对象id查询
AcDbObjectId lineTypeId = pEnt->linetypeId();
- 记录名称查询
- 修改实体线型
- 记录名称修改
// 若未加载DASHED线型,则保持原线型,退出 if((pEnt->setLinetype(_T("DASHED"))) != Acad::eOk) return; acutPrintf(_T("\n当前实体对象线型为:%s"), pEnt->linetype());
- 记录对象id修改
pEnt->setLinetype(lineTypeId);
- 记录名称修改
2.3.2 线型比例
- 基本概念
- 全局比例:修改后,全部实体对象比例均变动
- 对象缩放比例:修改后,当前选中的对象及之后创建的对象比例均变动
- 对象实际线型缩放比例:全局比例 乘以 对象缩放比例
- 比例图示
对象缩放比例修改后:当前选中的对象 、 之后创建的对象均受影响
- 线型效果图
线实际放大比例:为全局比例 乘以 缩放比例
- 获取全局比例
double globalScale = acdbHostApplicationServices()->workingDatabase()->ltscale();
- 获取对象缩放比例
double entScale = pEnt->linetypeScale();
- 设置对象缩放比例
// 参数: // 返回:Acad::ErrorStatus,正常Acad::eOk pEnt->setLinetypeScale(2, true);
2.4 实体可见性
- 常用汇总
用法 释义 pEnt->visibility(); 返回: AcDb::kInvisible
或AcDb::kvisible
pEnt->setVisibility(AcDb::kInvisible); 返回: Acad::ErrorStatus
,传入AcDb::kInvisible
或AcDb::kvisible
- Commands.h
#include "stdafx.h" void AddCommands(); void Test();
- Commands.cpp
#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); }
2.5 实体图层
- 常用方法表
用法 释义 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());
2.6 实体线宽
-
常用方法表
用法 释义 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 }; // 默认
三、其他简单操作
3.1 求交点
- Commands.h
#include "stdafx.h" void AddCommands(); void GetEntInters();
- Commands.cpp
#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(); }
- 效果
3.2 炸开实体
- Commands.h
#include "stdafx.h" void AddCommands(); void MyExplode();
- Commands.cpp
#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(); }
3.3 设置高亮
- Commands.h
#include "stdafx.h" void AddCommands(); void SetEntHighlight();
- Commands.cpp
#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(); }
- 效果
3.4 获取文字范围盒
- 功能:获取单行文字的矩形包围框,即文字范围
- 代码示例
ads_name en; ads_point pt, pt1, pt2; // 屏幕上选择单行文字实体 acedEntSel(NULL, en, pt); // 通过实体名en获得结果缓冲区链表 resbuf * rb = acdbEntGet(en); // 传入链表 返回:pt1即为左下角点,pt2即为右上角点 acedTextBox(rb, pt1, pt2);
四、实体的扩展字典
- 功能:每个实体都可以设置一个扩展字典,用于存储用户自定义数据,CAD维护但不使用此数据
- 扩展字典:扩展字典以键值对(key-value)形式来保存 扩展字典记录,可有多个键值对
- 扩展字典键key:为字符串,详见setAt函数
- 扩展字典值(value):为扩展字典记录,其中保存结果缓冲区链表(即为数据)
4.1 增扩展字典及记录
- Commands.h
#include "stdafx.h" void AddCommands(); void test();
- Commands.cpp
#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(); } } }
扩展字典记录修改:没有修改,直接 覆盖结果缓冲区链表即为修改
- 效果
4.2 读取扩展字典
- Commands.h
#include "stdafx.h" void AddCommands(); void view();
- Commands.cpp
#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(); } } }
- 效果
4.3 删除扩展字典记录
-
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("已删除")); } } }
五、获取实体属性
5.1 简查对象属性信息
- 功能:实现CAD的
LIST
命令 - Commands.h
#include "stdafx.h" void AddCommands(); void GetEntList();
- Commands.cpp
#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(); }
- 效果
5.2 详查对象属性信息
-
功能:获取一个实体的所有属性
-
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