hanphy_cai 发表于 2008-9-21 23:55:00

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

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

hanphy_cai 发表于 2008-9-21 23:56:00


                string progid = "ObjectDBX.AxDbDocument.16"; //注意,这是AutoCAD2004的写法,
                // 若是AutoCAD2002和AutoCAD2000i则是”ObjectDBX.AxDbDocument.1“   
                AcadApplication acadApp = connector.Application;
                dbx.AxDbDocument dbxDoc;
                dbxDoc = (dbx.AxDbDocument)acadApp.GetInterfaceObject(progid);
                dbxDoc.Open(filename, null);
                foreach (dbx.AcadEntity entity in dbxDoc.ModelSpace)
                {
                  Console.WriteLine("-------------");
                  Console.WriteLine("EntityName: {0}", entity.EntityName);
                  Console.WriteLine("ObjectName: {0}", entity.ObjectName);
                  Console.WriteLine("EntityLineType: {0}", entity.Linetype);
                  Console.WriteLine("Entity.ObjectID: {0}", entity.ObjectID);
                  if (entity.EntityName == "AcDbEllipse")
                  {
                        dbx.AcadEllipseClass ellipse = entity.Get
                        dbx.AcadEllipseClass ellipse = (dbx.AcadEllipseClass)
                            dbxDoc.ModelSpace.Database.ObjectIdToObject(entity.ObjectID);
                        //dbx.AcadEllipseClass ellipse = (dbx.AcadEllipseClass)entity;//.ObjectName;
                        Console.WriteLine("", ellipse.MajorRadius);
                        Point center = (Point)ellipse.Center;
                        Point major = (Point)ellipse.MajorAxis;
                        Point minor = (Point)ellipse.MinorAxis;
                        
                        Console.WriteLine("    center{{0},{1}}", center.X, center.Y);
                        Console.WriteLine("   major{{0},{1}}", major.X, major.Y);
                        Console.WriteLine("   minor{{0},{1}}", minor.X, minor.Y);
                        xGraph.DrawEllipse(myPen,
                            center.X/100,
                            center.Y / 100,
                            major.X * 2 / 100,
                            minor.Y * 2 / 100);
                  }
                  if (entity.EntityName == "AcDbSpline")
                  {
                        //dbx.AcadSplineClass spline = (dbx.AcadSplineClass)entity;
                  }
                  if (entity.EntityName == "AcDbBlockReference")//判断实体是否是块参照
                  {
                        dbx.AcadBlockReference blkRef;
                        blkRef = (dbx.AcadBlockReference)entity;//将是块参照的实体强制转换为块参照类型
                        object[] atts = (object[])blkRef.GetAttributes();//获取块参照中的属性(为对象类型)
                        for (int i = 0; i < atts.Length; i++) //遍历块参照属性
                        {
                            dbx.AcadAttributeReference att;
                            att = (dbx.AcadAttributeReference)atts;//将块参照属性(对象类型)强制转换为块参照属性类型
                            Console.WriteLine("Tag: {0}\tValue: {1}\n",
                            att.TagString,
                            att.TextString);//显示块参照属性的Tag和Text的值
                        }
                  }


hanphy_cai 发表于 2008-9-22 00:03:00

本帖最后由 作者 于 2008-9-22 0:13:48 编辑 <br /><br /> <p>我强制转换Entry为各个图元类,可是得到异常</p><p>System.InvalidCastException:<br/>无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“AXDBLib.AcadEllipseClass”。进入 CLR 且不支持 IProvideClassInfo 或没有注册任何互操作程序集的 COM 组件都将包装在 __ComObject 类型中。这种类型的实例不能强制转换为任何其他类;不过,只要基础 COM 组件支持对接口 IID 的 QueryInterface 调用,就能将这些实例强制转换为接口。</p><p>搜索网络,这个问题以前人家问过:<a href="http://www.mjtd.com/bbs/Archive_view.asp?boardID=4&amp;ID=27173">http://www.mjtd.com/bbs/Archive_view.asp?boardID=4&amp;ID=27173</a></p><p>回帖说:</p><p><strong>- AcadEntity不用转换为相应的实体啊,如果为不同的实体就有相应实体的属性.</strong></p><p><strong>- 没有错,是没有必要</strong></p><p>Dim ss As AcadSelectionSet<br/>&nbsp;&nbsp;&nbsp; ThisDrawing.SelectionSets("TT").Delete<br/>&nbsp;&nbsp;&nbsp; Set ss = ThisDrawing.SelectionSets.Add("TT")<br/>&nbsp;&nbsp;&nbsp; ss.Select acSelectionSetAll<br/>&nbsp;&nbsp;&nbsp; Dim poly As AcadPolyline<br/>&nbsp;&nbsp;&nbsp; For Each elem In ss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \'对每一条折线提取顶点坐标<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (elem.ObjectName = "AcDb3dPolyline") Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pnts = elem.Coordinates<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox pnts(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</p><p><br/>&nbsp;&nbsp;&nbsp;&nbsp; Next elem<br/></p><p>---------------------------</p><p>那问题是到底怎么样得到各种图元的属性啊?</p><p>下面是我的代码示例,请前辈们帮帮忙:</p>

hanphy_cai 发表于 2008-9-22 00:07:00

本帖最后由 作者 于 2008-9-22 0:07:47 编辑


    foreach (dbx.AcadEntity entity in dbxDoc.ModelSpace)
    {
      Console.WriteLine("-------------");
      Console.WriteLine("EntityName: {0}", entity.EntityName);
      Console.WriteLine("ObjectName: {0}", entity.ObjectName);
      Console.WriteLine("EntityLineType: {0}", entity.Linetype);
      Console.WriteLine("Entity.ObjectID: {0}", entity.ObjectID);
      if (entity.EntityName == "AcDbEllipse")
      {
            dbx.AcadEllipseClass ellipse = (dbx.AcadEllipseClass) entity;//异常抛出!!!

            //得到椭圆属性(也不一定对)
            Point center = (Point)ellipse.Center;
            Point major = (Point)ellipse.MajorAxis;
            Point minor = (Point)ellipse.MinorAxis;
                        
            Console.WriteLine("    center{{0},{1}}", center.X, center.Y);
            Console.WriteLine("   major{{0},{1}}", major.X, major.Y);
            Console.WriteLine("   minor{{0},{1}}", minor.X, minor.Y);

            //画椭圆
                        xGraph.DrawEllipse(myPen,
                            center.X,
                            center.Y,
                            major.X * 2,
                            minor.Y * 2);
       }

页: [1]
查看完整版本: 再问如何遍历DWG文件中的图元