AutoCAD .net 自定义:是否有 .net 的 entget 等效项?

问题描述 投票:0回答:1

我可以找到很少关于使用 .net 语言操作或读取 AutoCAD 形状实体的信息。我真正想做的只是从形状的“ShapeNumber”中检索形状的名称(如在 SHX (SHP) 文件中定义的那样)。当我编写一个简单的小 .net 扩展来收集文件中的所有线型并将其定义发送到 *.lin 文件时,我就开始了这个兔子洞。除了检索复杂线型中使用的形状名称之外,我几乎一切都在工作。

基本上,我的小程序会迭代线型符号表中的记录,并从每个表记录中提取所有属性,并将它们格式化为标准 *.lin 文件文本。我可以直接从线型的表记录中获取形状的编号,但我还没有找到获取其名称的方法。 (shx 编译器必须将形状名称转换为其编号。)

我尝试实例化一个空形状对象,将 shapenumber 分配给该对象,然后检索其 name 属性,但这不起作用(正如我完全预期的那样,因为它没有使用可以将 shapenumber 解析为名称的构造函数进行实例化) .

我怀疑答案可能在于形状的 dxf 实体代码(例如代码 2),但我不知道如何从 .net 访问 dxf 代码。是否有与 autolisp 中的 ENTGET 函数等效的 autocad .net 函数?如果我能做到这一点并从其 shapenumber 中找到保存该特定形状定义的 dxf 块,我应该能够从 entget 列表中获取形状名称。

c# vb.net autocad autocad-plugin
1个回答
0
投票

前一段时间我也曾为此苦苦挣扎。我发现的唯一方法是从外部 DLL 导入它。也许我在某个地方找到了它,但现在我不记得在哪里了。我会链接并尊重所有版权,但不知道在哪里和谁。因此,要通过代码回答,请尝试以下操作:

[DllImport("acdb19.dll", CallingConvention = CallingConvention.Cdecl,  EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AEAY01_JVAcDbObjectId@@@Z")]
extern static public ErrorStatus acdbGetAdsName(out Int64 entres, ObjectId id);


[DllImport("acCore.dll", CallingConvention = CallingConvention.Cdecl)]
extern static IntPtr acdbEntGet(out Int64 e);


Int64 e = new Int64();
IntPtr p = new IntPtr();
if (acdbGetAdsName(out e, id) == ErrorStatus.OK)
{
    p = acdbEntGet(out e);
    ResultBuffer rb = ResultBuffer.Create(p, true);
    return rb;
}

也许在不同版本和 CAD 平台中需要其他入口点。

© www.soinside.com 2019 - 2024. All rights reserved.