AutoCAD .NET是否有ENTGET等效函数?如何通过ShapeNumber获取SHX形状名称
问题描述
我正在开发一个AutoCAD .NET扩展程序,用来提取文件内所有线型并导出到*.lin文件,大部分功能已经实现,但卡在了复杂线型中所用形状的名称获取上。
程序遍历线型符号表记录,能提取属性并格式化为标准*.lin文本,也能直接从线型表记录里拿到形状编号,但找不到通过ShapeNumber获取对应形状名称的方法——毕竟SHX编译器会把形状名称转换成编号。我试过实例化空Shape对象并赋值ShapeNumber后获取Name属性,但没成功,因为这个构造函数没法把编号解析成名称。
我猜测可以通过形状的DXF代码(比如代码2)解决,但不知道在.NET里怎么访问DXF代码,想问问AutoCAD .NET里有没有类似AutoLISP中ENTGET的等效函数,如果能拿到对应形状定义的DXF块,就能从中提取形状名称了。
解决方案
1. 直接从ShapeTableRecord获取名称
AutoCAD .NET中没有完全等效于AutoLISP ENTGET的函数,但可以直接通过ShapeTableRecord对象获取形状名称,无需解析DXF代码:
using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; public string GetShapeNameByNumber(int targetShapeNumber) { using (Transaction tr = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction()) { // 打开形状符号表 ShapeTable shapeTable = tr.GetObject( HostApplicationServices.WorkingDatabase.ShapeTableId, OpenMode.ForRead) as ShapeTable; // 遍历所有形状记录 foreach (ObjectId shapeRecordId in shapeTable) { ShapeTableRecord shapeRecord = tr.GetObject(shapeRecordId, OpenMode.ForRead) as ShapeTableRecord; if (shapeRecord.ShapeNumber == targetShapeNumber) { // 返回形状名称(对应DXF代码2的值) return shapeRecord.Name; } } tr.Commit(); } // 未找到对应编号的形状 return null; }
这个方法直接从AutoCAD的形状符号表中查询,只要目标形状所在的SHX文件已被当前会话加载,就能拿到对应的名称。
2. 加载外部SHX文件查询
如果目标形状所在的SHX文件未被加载,可以先手动加载文件再查询:
public string GetShapeNameFromExternalShx(int targetShapeNumber, string shxFilePath) { using (Database db = HostApplicationServices.WorkingDatabase) { // 加载指定路径的SHX文件 db.LoadShapeFile(shxFilePath); // 复用上面的查询逻辑 return GetShapeNameByNumber(targetShapeNumber); } }
注意:shxFilePath需要是SHX文件的完整路径,若文件在AutoCAD支持的搜索路径中,也可以只传文件名。
3. 解析线型定义中的SHX引用
在处理复杂线型时,线型描述通常会包含[形状名称,SHX文件名]的格式,但如果只有形状编号,可以从线型的ShapeFile属性获取对应的SHX文件路径,再结合编号查询名称:
public string GetShapeNameFromLinetype(LinetypeTableRecord linetypeRecord, int shapeNumber) { // 获取线型关联的SHX文件 string shxFile = linetypeRecord.ShapeFile; if (!string.IsNullOrEmpty(shxFile)) { return GetShapeNameFromExternalShx(shapeNumber, shxFile); } // 若线型未指定SHX文件,查询当前已加载的形状 return GetShapeNameByNumber(shapeNumber); }
内容的提问来源于stack exchange,提问作者David Eisenbeisz

