控制导入类别的可见性

时间:2017-06-06 18:38:53

标签: c# revit-api

我正在编写一个程序来关闭导入的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的可见属性,因为它是用户隐藏的事务或子事务已打开但未关闭“。这很奇怪,因为”级别3“不是类别,而是是ActiveView。

但是我的交易是开放和关闭的。我无法在在线搜索中找到hiddenA。我也尝试使用构造:One_Cat.get_Visibility(CurrentView)(试图至少看看该类别是否可见),这导致了同样的错误。我还将我的参考文献从RevitAPI(2014)更改为(2015)和(2016),错误没有变化。我的代码正确地过滤了我想关闭的图层名称,正如我的“将关闭图层:”myDategog的TaskDialog回声中所证明的那样。但是,每当.SetVisibility行未被注释掉时,我都会收到描述的错误。

是否有其他方法可以关闭(on)RevitAPI中类别的可见性?或者除了我正在使用的方法之外还需要其他一些交易方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我发现代码中的交易存在一个问题:您创建了一个新的交易,但从不在其上调用StartCommit

请阅读Handling Transactions and Transaction Groups上有关使用交易的Building Coder主题组,并将其括在using声明中。