杜斌 发表于 2011-10-18 21:36:38

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

    下面是我写的一个函数,执行一些选择的操作。编译成功之后在AUTOCAD中执行,没有问题。但打开另一个文档同样执行这个命令的时候却出现异常。百思不得其解。请各位老大帮忙看看。

private ObjectIdCollection GetSheet()
      {
             iA3Count = 0;
            int iA4Count = 0;
            TypedValue[] tv1 = new TypedValue;
            TypedValue[] tv2 = new TypedValue;
            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;
      }

sieben 发表于 2011-10-19 09:40:40

在前面加一句
ed = ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor

syeanwoo 发表于 2011-10-19 13:39:24

应该加上            Document doc = Application.DocumentManager.MdiActiveDocument;
            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对象能遍历选择集中的实体不?

sailorcwx 发表于 2011-10-19 20:07:58

问题就出在你的ed独立于每个函数,永远都是第一个文档的editor,所以才导致错误。按2楼修改一下就可以了

杜斌 发表于 2011-10-19 21:03:22

sailorcwx兄说的和我今天测试的差不多。不过我发现不是Editor的问题,好像是Document的问题。永远是第一个文档。并且这个Document是静态的。
但如果像二楼那样的话,岂不是要在每个函数中都要声明 Document,Database,Editor?这样好像也有点臃肿啊。
页: [1]
查看完整版本: 选择实体程序在两个文档中执行,一个不异常一个有异常