2017-06-06 86 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