乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 95|回复: 6

已知DxfName,获取类型和本地名称?

[复制链接]

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-1-28 18:30:00 | 显示全部楼层 |阅读模式
(1)问题-------------------------
已知"LINE",得到GetType(Line)
已知"LWPOLYLINE",得到GetType(Polyline)
(2)问题-------------------------
已知"LINE",得到"直线"
已知"LWPOLYLINE",得到"多段线"
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2011-1-28 19:31:00 | 显示全部楼层
反向的操作很简单:
RXClass.GetClass(typeof(Line)).DxfName
但必须是高版本
DxfName => type没有找到直接的方法,如果一定要实现
可以先反射DatabaseServices下所有Entity的子类,自己建一个字典
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-1-28 19:39:00 | 显示全部楼层
需要DxfName => type,如能反射所有子类,问题就好解决了。
具体从哪入手?
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2011-1-28 20:24:00 | 显示全部楼层

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);
        }
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-1-29 09:53:00 | 显示全部楼层
很好,反射成功。结果说明,DxfName和Entity Type不存在固定的对应关系。要让lisp和.NET有一致的类型限定,还得找别的方法。
  1.      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
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2011-1-29 15:08:00 | 显示全部楼层
如果是Lisp数据的话,可以考虑直接用
SystemObjects.ClassDictionary获取,这个字典是个string,RXClass的键值对
Key对应的是Axr的类名,如"AcDbLine"
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-1-30 16:20:00 | 显示全部楼层
SystemObjects.ClassDictionary可以代替反射,但是解决不了最初的问题。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 14:13 , Processed in 0.420051 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表