明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5250|回复: 3

再问如何遍历DWG文件中的图元

[复制链接]
发表于 2008-9-21 23:55:00 | 显示全部楼层 |阅读模式

我有个项目,需要用C#打开DWG文件,然后在程序窗口中画出。通过搜索引擎我解决了打开DWG文件,也可以遍历,但问题是,我怎么得到每个图元的属性呢?比如,我得到一个Entry,Entry.Name是椭圆,那怎么得到它的a/b半径和中心点?

 

 楼主| 发表于 2008-9-21 23:56:00 | 显示全部楼层
  1.                 string progid = "ObjectDBX.AxDbDocument.16"; //注意,这是AutoCAD2004的写法,
  2.                 // 若是AutoCAD2002和AutoCAD2000i则是”ObjectDBX.AxDbDocument.1“   
  3.                 AcadApplication acadApp = connector.Application;
  4.                 dbx.AxDbDocument dbxDoc;
  5.                 dbxDoc = (dbx.AxDbDocument)acadApp.GetInterfaceObject(progid);
  6.                 dbxDoc.Open(filename, null);
  7.                 foreach (dbx.AcadEntity entity in dbxDoc.ModelSpace)
  8.                 {
  9.                     Console.WriteLine("-------------");
  10.                     Console.WriteLine("EntityName: {0}", entity.EntityName);
  11.                     Console.WriteLine("ObjectName: {0}", entity.ObjectName);
  12.                     Console.WriteLine("EntityLineType: {0}", entity.Linetype);
  13.                     Console.WriteLine("Entity.ObjectID: {0}", entity.ObjectID);
  14.                     if (entity.EntityName == "AcDbEllipse")
  15.                     {
  16.                         dbx.AcadEllipseClass ellipse = entity.Get
  17.                         dbx.AcadEllipseClass ellipse = (dbx.AcadEllipseClass)
  18.                             dbxDoc.ModelSpace.Database.ObjectIdToObject(entity.ObjectID);
  19.                         //dbx.AcadEllipseClass ellipse = (dbx.AcadEllipseClass)entity;//.ObjectName;
  20.                         Console.WriteLine("", ellipse.MajorRadius);
  21.                         Point center = (Point)ellipse.Center;
  22.                         Point major = (Point)ellipse.MajorAxis;
  23.                         Point minor = (Point)ellipse.MinorAxis;
  24.                         
  25.                         Console.WriteLine("    center{{0},{1}}", center.X, center.Y);
  26.                         Console.WriteLine("     major{{0},{1}}", major.X, major.Y);
  27.                         Console.WriteLine("     minor{{0},{1}}", minor.X, minor.Y);
  28.                         xGraph.DrawEllipse(myPen,
  29.                             center.X/100,
  30.                             center.Y / 100,
  31.                             major.X * 2 / 100,
  32.                             minor.Y * 2 / 100);
  33.                     }
  34.                     if (entity.EntityName == "AcDbSpline")
  35.                     {
  36.                         //dbx.AcadSplineClass spline = (dbx.AcadSplineClass)entity;
  37.                     }
  38.                     if (entity.EntityName == "AcDbBlockReference")//判断实体是否是块参照
  39.                     {
  40.                         dbx.AcadBlockReference blkRef;
  41.                         blkRef = (dbx.AcadBlockReference)entity;  //将是块参照的实体强制转换为块参照类型
  42.                         object[] atts = (object[])blkRef.GetAttributes();//获取块参照中的属性(为对象类型)
  43.                         for (int i = 0; i < atts.Length; i++) //遍历块参照属性
  44.                         {
  45.                             dbx.AcadAttributeReference att;
  46.                             att = (dbx.AcadAttributeReference)atts[i];//将块参照属性(对象类型)强制转换为块参照属性类型
  47.                             Console.WriteLine("Tag: {0}\tValue: {1}\n",
  48.                             att.TagString,
  49.                             att.TextString);//显示块参照属性的Tag和Text的值
  50.                         }
  51.                     }
复制代码
 楼主| 发表于 2008-9-22 00:03:00 | 显示全部楼层
本帖最后由 作者 于 2008-9-22 0:13:48 编辑

我强制转换Entry为各个图元类,可是得到异常

System.InvalidCastException:
无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“AXDBLib.AcadEllipseClass”。进入 CLR 且不支持 IProvideClassInfo 或没有注册任何互操作程序集的 COM 组件都将包装在 __ComObject 类型中。这种类型的实例不能强制转换为任何其他类;不过,只要基础 COM 组件支持对接口 IID 的 QueryInterface 调用,就能将这些实例强制转换为接口。

搜索网络,这个问题以前人家问过:http://www.mjtd.com/bbs/Archive_view.asp?boardID=4&ID=27173

回帖说:

- AcadEntity不用转换为相应的实体啊,如果为不同的实体就有相应实体的属性.

- 没有错,是没有必要

Dim ss As AcadSelectionSet
    ThisDrawing.SelectionSets("TT").Delete
    Set ss = ThisDrawing.SelectionSets.Add("TT")
    ss.Select acSelectionSetAll
    Dim poly As AcadPolyline
    For Each elem In ss              \'对每一条折线提取顶点坐标
                If (elem.ObjectName = "AcDb3dPolyline") Then
                       pnts = elem.Coordinates
                       MsgBox pnts(0)
                End If


     Next elem

---------------------------

那问题是到底怎么样得到各种图元的属性啊?

下面是我的代码示例,请前辈们帮帮忙:

 楼主| 发表于 2008-9-22 00:07:00 | 显示全部楼层
本帖最后由 作者 于 2008-9-22 0:07:47 编辑

  1.     foreach (dbx.AcadEntity entity in dbxDoc.ModelSpace)
  2.     {
  3.         Console.WriteLine("-------------");
  4.         Console.WriteLine("EntityName: {0}", entity.EntityName);
  5.         Console.WriteLine("ObjectName: {0}", entity.ObjectName);
  6.         Console.WriteLine("EntityLineType: {0}", entity.Linetype);
  7.         Console.WriteLine("Entity.ObjectID: {0}", entity.ObjectID);
  8.         if (entity.EntityName == "AcDbEllipse")
  9.         {
  10.             dbx.AcadEllipseClass ellipse = (dbx.AcadEllipseClass) entity;  //异常抛出!!!
  11.             //得到椭圆属性(也不一定对)
  12.             Point center = (Point)ellipse.Center;
  13.             Point major = (Point)ellipse.MajorAxis;
  14.             Point minor = (Point)ellipse.MinorAxis;
  15.                         
  16.             Console.WriteLine("    center{{0},{1}}", center.X, center.Y);
  17.             Console.WriteLine("     major{{0},{1}}", major.X, major.Y);
  18.             Console.WriteLine("     minor{{0},{1}}", minor.X, minor.Y);
  19.             //画椭圆
  20.                         xGraph.DrawEllipse(myPen,
  21.                             center.X,
  22.                             center.Y,
  23.                             major.X * 2,
  24.                             minor.Y * 2);
  25.        }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:59 , Processed in 0.180553 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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