乐筑天下

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

后台打开dwg文件,删除其中的部分图层后,如何保存?

[复制链接]

10

主题

20

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-8-27 11:38:00 | 显示全部楼层 |阅读模式
用Database.ReadDwgFile(savefilename, FileShare.ReadWrite, false, "")后台打开一个dwg文件,遍历dwg文件中的对象,找出图层名为“layername”的对象,全部删除,然后删除该图层。最后用DataBase.saveas()进行保存。发现保存的dwg文件中,这个图层被删除了,但是图层里面的对象却还在,而这些对象的图层名为空。
    代码如下:
             Database myDB = new Database(false, true);
            myDB.ReadDwgFile(savefilename, FileShare.ReadWrite, false, "");
            using (Transaction myTrans = myDB.TransactionManager.StartTransaction())
            {
                LayerTable lt = (LayerTable)myTrans.GetObject(myDB.LayerTableId, OpenMode.ForWrite);
                 LayerTableRecord ltr = (LayerTableRecord)myTrans.GetObject(lt[layername], OpenMode.ForWrite);
                DBObjectCollection myObjectCollection = trans.GetAllObjects();
                DBObject[] myObjexts = new DBObject[myObjectCollection.Count];
                myObjectCollection.CopyTo(myObjexts, 0);
                myObjectCollection.Clear();
                myObjectCollection.Dispose();
                foreach (DBObject sSetEntId in myObjexts)
                {
                    Entity myEntity = (Entity)trans.GetObject(sSetEntId.ObjectId, OpenMode.ForWrite);
                    if (myEntity.Layer == layername)
                    {
                        myEntity.ReleaseExtensionDictionary();
                        sSetEntId.Erase(true);
                        myEntity.Erase();
                        myEntity.Database.Dispose();
                    }
                    myEntity.Dispose();
                }
               ltr.Erase(true);
               ltr.Dispose();
               lt.Dispose();
                trans.Commit();
                trans.Dispose();
            }
            myDB.SaveAs("D:\\test.dwg", DwgVersion.Current);
            myDB.CloseInput(true);
            myDB.Dispose();
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2011-8-27 13:28:00 | 显示全部楼层
1.呵呵,按说某个图层若还有实体,该图层应该不能被删除呀!
2,DBObjectCollection myObjectCollection = trans.GetAllObjects(); 我没有这样用过,不确定这样获取的对象是哪些东西.
3,或许你认为trans.GetAllObjects()是获取模型空间ModelSpace的全部图形实体,但即使是这样,不要忘了模型空间只是其中一个块记录,或许其他块记录里面也有属于你想要删除的图层的实体.
回复

使用道具 举报

2

主题

65

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
73
发表于 2011-8-27 15:14:00 | 显示全部楼层
不懂怎么一回事
回复

使用道具 举报

10

主题

20

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-8-29 10:43:00 | 显示全部楼层

谢谢你的回答!
1、执行删除后,我打开新dwg文件,在图层管理器中查看,图层确实被删除了。但原来图层中的线、注记之类的还在dwg文件中,颜色全变成了白色,查看其属性,图层名为空。。。。
2、这个其实我也是刚学cad开发一个月,很多东西都不太明白。因为不知道怎么遍历后台打开的dwg文件某图层的所有对象,看到有GetAllObject(),就拿来用了。不知道你知不知道后台遍历图层所有对象的方法?
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2011-8-29 12:18:00 | 显示全部楼层
1,我很奇怪你为什么要这么辛苦的去通过后台方式来删除一个图层.目的是?
2,你自己可以测试一个简单的文件,最好包括一个块记录和块参考,看看trans.GetAllObjects();返回的是一些什么对象.
回复

使用道具 举报

10

主题

20

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-8-29 14:27:00 | 显示全部楼层

1、我的程序功能是要实现沟渠控制面积的计算。dwg文件中有各种道路、田坎、边界线(格式为polyline或polyline2d),这些线围成了一个个地块。让用户在cad中选择一条线,然后计算所有与这条线有交叉或包含关系的地块面积之和。
    我的思路是把指定的几个图层转换成shp格式,然后再用AE来做面积计算功能。如果先将整个dwg文件转成shp格式,然后删除多余图层,会耗费很多时间。而如果先删除dwg中的图层,然后再转成shp格式,则时间会大大缩短
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2011-8-29 15:45:00 | 显示全部楼层
你是想一次处理很多dwg文件?不打开dwg文件?
回复

使用道具 举报

10

主题

20

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-8-30 11:06:00 | 显示全部楼层
问题解决了。确实是GetAllObjects()的问题。
最终代码如下:
        Database myDB = new Database(false, true);
            myDB.ReadDwgFile(savefilename, FileShare.None, false, "");
            using (Transaction myTrans = myDB.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)trans.GetObject(myDB.BlockTableId, OpenMode.ForWrite);
                foreach (ObjectId blID in bt)
                {
                    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(blID, OpenMode.ForWrite);
                    BlockTableRecordEnumerator btre = btr.GetEnumerator();
                    while(btre.MoveNext())
                    {
                        ObjectId myObjectID = btre.Current;
                        Entity myEntity = (Entity)trans.GetObject(myObjectID, OpenMode.ForWrite);
                        if(myEntity.Layer == LayerName)
                        {
                            myEntity.Erase();
                        }
                    }
                    btre.Dispose();
                    btr.Dispose();
                }
                bt.Dispose();
                trans.Commit();
                trans.Dispose();            
           }
            myDB.SaveAs("D:\\test.dwg", DwgVersion.Current);
            myDB.CloseInput(true);
            myDB.Dispose();
回复

使用道具 举报

4

主题

19

帖子

2

银币

初来乍到

Rank: 1

铜币
35
发表于 2011-10-31 20:30:00 | 显示全部楼层
标记下!!!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 17:36 , Processed in 0.342862 second(s), 70 queries .

© 2020-2025 乐筑天下

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