明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1649|回复: 6

[图元] 已知DxfName,获取类型和本地名称?

[复制链接]
发表于 2011-1-28 18:30 | 显示全部楼层 |阅读模式
(1)问题-------------------------
已知"LINE",得到GetType(Line)
已知"LWPOLYLINE",得到GetType(Polyline)

(2)问题-------------------------
已知"LINE",得到"直线"
已知"LWPOLYLINE",得到"多段线"
发表于 2011-1-28 19:31 | 显示全部楼层
反向的操作很简单:
RXClass.GetClass(typeof(Line)).DxfName
但必须是高版本
DxfName => type没有找到直接的方法,如果一定要实现
可以先反射DatabaseServices下所有Entity的子类,自己建一个字典
 楼主| 发表于 2011-1-28 19:39 | 显示全部楼层
需要DxfName => type,如能反射所有子类,问题就好解决了。
具体从哪入手?
发表于 2011-1-28 20:24 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2011-1-28 20:31 编辑

DxfName有重复项,:)
就没有直接用字典了,比如"Insert"
        [CommandMethod("t2")]
        public static void Test2()
        {

            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;

            Type t = typeof(Entity);
            var dict =
                Assembly.GetAssembly(t)
                .GetTypes()
                .Where(type => type.IsSubclassOf(t))
                .Where(type => RXClass.GetClass(type) != null)
                .GroupBy(type => RXClass.GetClass(type).DxfName);

            foreach (var s in dict)
                ed.WriteMessage("\n{0}:{1}", s.Key,s.ElementAt(0).Name);
        }
 楼主| 发表于 2011-1-29 09:53 | 显示全部楼层
很好,反射成功。结果说明,DxfName和Entity Type不存在固定的对应关系。要让lisp和.NET有一致的类型限定,还得找别的方法。
  1.     <CommandMethod("TTT")> Public Sub TTT()
  2.         Dim doc = Application.DocumentManager.MdiActiveDocument
  3.         Dim ed = doc.Editor
  4.         Dim et As Type = GetType(Entity)
  5.         Dim typs() As Type = Assembly.GetAssembly(et).GetTypes

  6.         Dim var = From typ As Type In typs Where typ.IsSubclassOf(et)
  7.         Dim dict As New Dictionary(Of String, Type)
  8.         For Each typ As Type In var
  9.             Dim cls As RXClass = RXClass.GetClass(typ)
  10.             If cls IsNot Nothing Then
  11.                 Dim dxf As String = cls.DxfName
  12.                 If dxf <> Nothing Then
  13.                     If Not dict.ContainsKey(dxf) Then
  14.                         dict.Add(dxf, typ)
  15.                     Else
  16.                         ed.WriteMessage(vbLf & "Same DXF: {0}({1})", dxf, typ.Name)
  17.                     End If
  18.                 Else
  19.                     ed.WriteMessage(vbLf & "DXF Nothing: {0}", typ.Name)
  20.                 End If
  21.             Else
  22.                 ed.WriteMessage(vbLf & "RXClass Nothing: {0}", typ.Name)
  23.             End If
  24.         Next

  25.         For Each s In dict
  26.             ed.WriteMessage(vbLf & "{0}:{1}", s.Key, s.Value.Name)
  27.         Next
  28.     End Sub
发表于 2011-1-29 15:08 | 显示全部楼层
如果是Lisp数据的话,可以考虑直接用
SystemObjects.ClassDictionary获取,这个字典是个string,RXClass的键值对
Key对应的是Axr的类名,如"AcDbLine"
 楼主| 发表于 2011-1-30 16:20 | 显示全部楼层
SystemObjects.ClassDictionary可以代替反射,但是解决不了最初的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-28 22:22 , Processed in 0.338252 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表