明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2005|回复: 5

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

[复制链接]
发表于 2011-10-18 21:36:38 | 显示全部楼层 |阅读模式
    下面是我写的一个函数,执行一些选择的操作。编译成功之后在AutoCAD中执行,没有问题。但打开另一个文档同样执行这个命令的时候却出现异常。百思不得其解。请各位老大帮忙看看。

  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;
        }
发表于 2011-10-19 09:40:40 | 显示全部楼层
在前面加一句
ed = ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
发表于 2011-10-19 13:39:24 | 显示全部楼层
应该加上
  1.             Document doc = Application.DocumentManager.MdiActiveDocument;
  2.             Editor ed = doc.Editor;
复制代码
另外,SelectionSet对象具有 .count属性,楼主不必再用ObjectIdCollection对象收集选集元素。
 楼主| 发表于 2011-10-19 19:28:25 | 显示全部楼层
谢谢楼上两位大哥。
不过两位大哥说的那两句在我的程序中有。程序太长,我贴的只是其中一段。

我将

            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

我将这三句作为公共代码放在类中,独立于每个函数。
上面贴的是一个函数。
不用ObjectIdCollection对象能遍历选择集中的实体不?
发表于 2011-10-19 20:07:58 | 显示全部楼层
问题就出在你的ed独立于每个函数,永远都是第一个文档的editor,所以才导致错误。按2楼修改一下就可以了
 楼主| 发表于 2011-10-19 21:03:22 | 显示全部楼层
sailorcwx兄说的和我今天测试的差不多。不过我发现不是Editor的问题,好像是Document的问题。永远是第一个文档。并且这个Document是静态的。
但如果像二楼那样的话,岂不是要在每个函数中都要声明 Document,Database,Editor?这样好像也有点臃肿啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 19:53 , Processed in 0.168375 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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