2017-06-06 92 views
0

我正在编写一个程序,用于关闭导入的AutoCAD文件(如“DEFPOINTS”,可能会自动隐藏或不在Revit中绘制)中的某些“子类别”。下面的代码看起来应该可以工作,但是反过来会引发奇怪的错误。控制导入类别的可见性

Transaction Do_Filtered_VG = new Transaction(doc, "FilteredVG") 
Autodesk.Revit.DB.View CurrentView = doc.ActiveView; 
Categories categories = doc.Settings.Categories; string CatUp = string.Empty; 
List<Category> ToBeOff = new List<Category>(); 
List<string> myCategories = new List<string>(); 
foreach (Category c in categories) 
{ 
    if (c.Name.ToLower().EndsWith("dwg")) 
    { 
     List<Category> SubCategories = new List<Category>(); 
     foreach (Category One_Cat in c.SubCategories) 
     { 
      CatUp = One_Cat.Name.ToUpper(); 
      if (CatUp.Contains("DEFPOINTS") || CatUp.Contains("NPLT") || CatUp.Contains("RDFF") || CatUp.Contains("SDFF") || CatUp.Contains("DUCT"))//or other pattern; 
      { 
       myCategories.Add(One_Cat.Name); ToBeOff.Add(One_Cat); 
      } 
     } 
    } 
} 
Do_Filtered_VG.Start(); 
foreach (Category One_Cat in ToBeOff) 
{ 
    CurrentView.SetVisibility(One_Cat, false); 
} 
Do_Filtered_VG.Commit(); 
TestCodeX.If_Tony("Would Turn Off Layers:", TestCodeX.List_To_Dialog(myCategories)); 

给出的错误是:无法设置类别等级3的可视属性,因为它是用户hiddenA交易或子交易被打开,但没有关闭”这很奇怪,因为,‘第3级’是不是一个类别,但是ActiveView。

但是我的事务是打开和关闭的。我在一个在线搜索中找不到hiddenA。我也试过使用这个构造:One_Cat.get_Visibility(CurrentView)(尝试在至少看看类别是否可见),并且这导致了同样的错误,我也从RevitAPI(2014)到(2015)和(2016)更改了我的参考,但没有更改错误。我想关闭evidenc编辑我的“将关闭层:”MyCategories的TaskDialog回声。但是,只要.SetVisibility行没有被注释掉,我就会得到所描述的错误。

是否有其他一些关闭(打开)RevitAPI类别可见性的方法?还是有一些其他的交易方法,而不是我正在使用的?

回答

0

存在一些内部类别,但无法设置可见性。我没有方便的SDK,但是有一个属性“Category.AllowsVisibilityControl [view]”,它会告诉你在当前视图中隐藏该类别是否合法。

所以,你会做这样的事情在你的代码:

// inside your existing IF about the category name... 
if (One_Cat.AllowsVisibilityControl[CurrentView]) 
{  
    myCategories.Add(One_Cat.Name); ToBeOff.Add(One_Cat); 
} 
+0

谢谢,我会试一试。但是,由于这些“类别”实际上只是ACAD图层名称(并且都不是内部/受保护的类别),所以我看不出它会有所作为。如果程序回击,我不能改变“类别”的可见性,我回到了我开始的地方。不会发生变化,但我不会收到错误。 – KeachyPeenReturns

+0

奇怪的是,这是我收到的StackOverFlow中的第一个“答案”,实际上提供了一个答案的金块。 .AllowsVisibilityControl [CurrentView]实际上是(在RevitAPI R14中).get_AllowsVisibilityControl(CurrentView),但关键是正确的。另外,我在我的foreach(ToBeOff中的Category One_Cat)中运行了一个新的事务......这有所帮助。 – KeachyPeenReturns

+0

很高兴听到它 - 是的,我用C#语法编写,这有点不同,特别是对于某些索引属性的“get_”前缀。 Soooo如果有帮助,那么答案的“高票”怎么样? – Matt

0

我看到一个问题,在你的代码中的事务:您创建一个新的交易,但从来没有叫任何StartCommit就可以了。

请阅读Handling Transactions and Transaction Groups上关于使用事务并将它们包含在using声明中的Building Coder主题组。

+0

问题是,我都是。开始并在我的代码底部提交事务。在开始之前立即定义交易有什么魔力?另外,我可以看到“使用”帮助“捕捉”并未开始的事务,但只要我做了“SetVisibility”之外的事情,那么所讨论的事务就会开始并提交而不会触发错误,所以我没有看到确切的结构(你爱得太多)成为问题。我有十几个程序,几十个事务的完成方式与我在许多其他人的代码中看到的方式完全相同。 – KeachyPeenReturns

+0

主要问题在于,上述问题只是对我的问题的“回答”,实际上它并不涉及问题的单一方面。它以什么方式告诉我如何控制视图中ACAD层的可见性?显然,如果不回答问题的“答案”被删除,那将是最好的。 – KeachyPeenReturns