乐筑天下

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

选择实体程序在两个文档中执行,一个不异常一个有异常

[复制链接]

5

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2011-10-18 21:36:00 | 显示全部楼层 |阅读模式
下面是我写的一个函数,执行一些选择的操作。编译成功之后在中执行,没有问题。但打开另一个文档同样执行这个命令的时候却出现异常。百思不得其解。请各位老大帮忙看看。
  private ObjectIdCollection GetSheet()
        {
             iA3Count = 0;
            int iA4Count = 0;
            TypedValue[] tv1 = new TypedValue[1];
            TypedValue[] tv2 = new TypedValue[1];
            tv1.SetValue(new TypedValue((int)DxfCode.BlockName, "a4"), 0);       //设置选择集,A4
            tv2.SetValue(new TypedValue((int)DxfCode.BlockName, "a3"), 0);        //设置选择集,A3
            // 赋值过滤条件给 SelectionFilter 对象    Assign the filter criteria to a SelectionFilter object
            SelectionFilter fltA4 = new SelectionFilter(tv1);
            SelectionFilter fltA3 = new SelectionFilter(tv2);
            ObjectIdCollection objIdColl = new ObjectIdCollection();
            // 要求在图形区域中选择对象,自动全选    Request for objects to be selected in the drawing area            PromptSelectionResult acSSPrompt = ed.SelectAll(fltA4);     //在第二个文档中执行出错的就是这行。            // 如果提示状态是 OK,对象就被选择了    If the prompt status is OK, objects were selected           
            if (acSSPrompt.Status == PromptStatus.OK)
            {
                SelectionSet set1 = acSSPrompt.Value;
                objIdColl = new ObjectIdCollection(set1.GetObjectIds());
                iA4Count = objIdColl.Count;
            }
            acSSPrompt = ed.SelectAll(fltA3);
            if (acSSPrompt.Status == PromptStatus.OK)
            {
                SelectionSet set2 = acSSPrompt.Value;
                if (objIdColl.Count == 0)
                {
                    objIdColl = new ObjectIdCollection(set2.GetObjectIds());
                }
                else
                {
                    foreach (ObjectId objId in set2.GetObjectIds())
                    {
                        objIdColl.Add(objId);
                    }
                    iA3Count = objIdColl.Count - iA4Count;
                    Application.ShowAlertDialog("文档 \"" + doc.Name + "\" " + "共有: " + iA3Count + " 张 A3 图纸和 " + iA4Count + " 张 A4 图纸.");
                }
            }
            if (iA4Count == 0 && iA3Count == 0)
            {
                Application.ShowAlertDialog("文档没有图纸!");
                return null;
            }
            return objIdColl;
        }
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2011-10-19 09:40:00 | 显示全部楼层
在前面加一句
ed = ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2011-10-19 13:39:00 | 显示全部楼层
应该加上复制代码另外,SelectionSet对象具有 .count属性,楼主不必再用ObjectIdCollection对象收集选集元素。
回复

使用道具 举报

5

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2011-10-19 19:28:00 | 显示全部楼层
谢谢楼上两位大哥。
不过两位大哥说的那两句在我的程序中有。程序太长,我贴的只是其中一段。
我将
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
我将这三句作为公共代码放在类中,独立于每个函数。
上面贴的是一个函数。
不用ObjectIdCollection对象能遍历选择集中的实体不?
回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2011-10-19 20:07:00 | 显示全部楼层
问题就出在你的ed独立于每个函数,永远都是第一个文档的editor,所以才导致错误。按2楼修改一下就可以了
回复

使用道具 举报

5

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2011-10-19 21:03:00 | 显示全部楼层
sailorcwx兄说的和我今天测试的差不多。不过我发现不是Editor的问题,好像是Document的问题。永远是第一个文档。并且这个Document是静态的。
但如果像二楼那样的话,岂不是要在每个函数中都要声明 Document,Database,Editor?这样好像也有点臃肿啊。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 17:24 , Processed in 0.937890 second(s), 64 queries .

© 2020-2025 乐筑天下

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