下載app免費領取會員
文章來源:CSDN博客
昨天是參加工作整一年的好日子,在這一年中逐步開始接觸C#和Revit二次開發(fā),困擾和BUG伴隨著整個學習過程。由于Revit二次開發(fā)的資料和課程不多,很多情況下都是依靠博客、技術貼和QQ群里的大神等方法度過難關。在此開始撰寫博客,一是總結歸納開發(fā)過程中的所感所得,二是回報大眾,共同進步。
大量的重復性工作會嚴重地影響效率和工作心情,這里就突出了批量修改的重要作用(請忽略logo的丑,大汗)。為了找到解決辦法,咨詢了不少大神,這里想要感謝一下“站樓頂望天空”,謝謝大神給予的提示和幫助。批量修改包含的方面有族名稱、族類型名稱、族參數(shù)、族材質等,今天只總結一下族名稱和族類型名稱的批量修改。修改的思路很簡單,就是類似于word中的查找和替換,如圖2所示,只要輸入替換和被替換的內(nèi)容,選擇相應的族實例即可。
修改族名稱在Revit中有兩種思路,一種是在項目中修改,一種是在族編輯器中修改。在項目中修改需要獲取項目文檔,而在族編輯器中修改一般需要獲取項目文檔和族文檔(族編輯器為FamilyManager)。
所有對族的修改必須要在相應的事務中進行。要在事件響應中修改文檔,必須顯式地啟動一個事務,在該事務中修改文檔。如果是在事件中打開事務,則事務必須在該事件響應結束前被關閉(提交或者撤銷),否則在該事務中的所做的所有的修改都會被丟棄(本段摘自《二次開發(fā)基礎教程》P27 同濟大學出版社,給本書點個贊,真的是小白必備)。
1、族名稱批量修改
/// <summary>
/// 族名稱批量替換修改
/// </summary>
/// <param name="app"></param>
public void ReplaceFamilyName(UIApplication app)
{
UIDocument uidoc = app.ActiveUIDocument; //取得文檔
Document doc = uidoc.Document;
//取得選擇的元素
ion sel = app.ActiveUIDocument.ion;
try
{
var ref1 = sel.PickObjects(ObjectType.Element, "請選擇模型構件");
if (0 == ref1.Count)
{
TaskDialog.Show("Revit", "你沒有選任何元素.");
}
else
{
//調用文本框中的值
string contentValue = MessageForm.contentValue;
string replaceValue = MessageForm.replaceValue;
//修改選中的族實例
foreach (var reference in ref1)
{
Element elem = doc.GetElement(reference);
if (elem != null)
{
//獲得族實例
FamilyInstance familyInstance = elem as FamilyInstance;
FamilySymbol symbol = familyInstance.Symbol;
Family family = symbol.Family;
//在事務中修改文檔
Transaction trans = new Transaction(doc);
trans.Start("changeFamilyName");
family.Name = family.Name.Replace(contentValue, replaceValue);
symbol.Name = symbol.Name.Replace(contentValue, replaceValue);
trans.Commit();
}
}
}
}
catch (Exception ex)
{
TaskDialog.Show("info", ex.ToString());
}
}
族類型名稱的修改和族名稱大同小異,但是需要注意的是每個族實例對應的只有一個族名稱,但是卻可能會存在多個族類型。因此首先需要得到一個已加載的族類型(FamilySymbol)的組,這里再次強調下修改族類型可以在項目中和族管理器中進行,兩者分別是依據(jù)FamilySymbol類和FamilyType類,需要注意區(qū)分。而想要得到族類型組,最好的方法就是通過元素過濾器取得(參考書P148)。另外需要注意的是修改后的族類型名稱有可能和現(xiàn)有的族類型名稱沖突,需要加以判斷。不沖突的話可以使用復制方法(Duplicate),沖突的話直接切換成已有的族類型名稱即可(ChangeTypeId)。目前經(jīng)過我的嘗試,改變族類型的方法只有通過ChangeTypeId,依據(jù)族類型的ID方可進行修改。
2、族類型名稱批量修改
/// <summary>
/// 族類型名稱批量替換修改
/// </summary>
/// <param name="app"></param>
public void ReplaceSymbolName(UIApplication app)
{
UIDocument uidoc = app.ActiveUIDocument; //取得文檔
Document doc = uidoc.Document;
//取得選擇的元素
ion sel = app.ActiveUIDocument.ion;
try
{
var ref1 = sel.PickObjects(ObjectType.Element, "請選擇模型構件");
if (0 == ref1.Count)
{
TaskDialog.Show("Revit", "你沒有選任何元素.");
}
else
{
//調用文本框中的值
string contentSymbolValue = MessageForm.contentSymbolValue;
string replaceSymbolValue = MessageForm.replaceSymbolValue;
//修改選中的族實例
foreach (var reference in ref1)
{
Element elem2 = doc.GetElement(reference);
if (elem2 != null)
{
//獲得族實例
FamilyInstance familyInstance2 = elem2 as FamilyInstance;
FamilySymbol symbol = familyInstance2.Symbol;
Family family = symbol.Family;
Transaction trans = new Transaction(doc);
trans.Start("changeFamilyName");
if (symbol.Name.Contains(contentSymbolValue))
{
string changedSymbolName = symbol.Name.Replace(contentSymbolValue, replaceSymbolValue);
ElementType familySymbol = null; //新建的族類型
ElementId elementId = null;
//得到一個已加載的族類型(FamilySymbol)的組
FilteredElementCollector collectorSymbol = new FilteredElementCollector(doc);
IList<Element> symbols = collectorSymbol.OfClass(typeof(FamilySymbol)).ToElements();
bool symbolExist = false;
foreach (var item in collectorSymbol)
{
if (item.Name == changedSymbolName)
{
symbolExist = true;
elementId = item.Id;
}
}
//判斷替換后的族類型名稱是否已經(jīng)存在,分別處理
if (symbolExist)
{
familyInstance2.ChangeTypeId(elementId); //依據(jù)ID改變族類型
}
else
{
familySymbol = symbol.Duplicate(changedSymbolName); //復制生成新的族類型
elementId = familySymbol.Id; //獲取新的族類型的ID
familyInstance2.ChangeTypeId(elementId); //依據(jù)ID改變族類型
}
}
trans.Commit();
}
}
}
}
catch (Exception ex)
{
TaskDialog.Show("info", ex.ToString());
}
}
新手之作,有錯誤或者改進之處歡迎大家指正,當然有不懂的地方大家也可以一起交流,努力!
————————————————
版權聲明:本文為CSDN博主「藏風聚氣得水為上」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42605872/java/article/details/94590316
本文版權歸腿腿教學網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權,謝絕轉載。