下載app免費領(lǐng)取會員
文章來源:CSDN博客
昨天是參加工作整一年的好日子,在這一年中逐步開始接觸C#和Revit二次開發(fā),困擾和BUG伴隨著整個學(xué)習(xí)過程。由于Revit二次開發(fā)的資料和課程不多,很多情況下都是依靠博客、技術(shù)貼和QQ群里的大神等方法度過難關(guān)。在此開始撰寫博客,一是總結(jié)歸納開發(fā)過程中的所感所得,二是回報大眾,共同進(jìn)步。
大量的重復(fù)性工作會嚴(yán)重地影響效率和工作心情,這里就突出了批量修改的重要作用(請忽略logo的丑,大汗)。為了找到解決辦法,咨詢了不少大神,這里想要感謝一下“站樓頂望天空”,謝謝大神給予的提示和幫助。批量修改包含的方面有族名稱、族類型名稱、族參數(shù)、族材質(zhì)等,今天只總結(jié)一下族名稱和族類型名稱的批量修改。修改的思路很簡單,就是類似于word中的查找和替換,如圖2所示,只要輸入替換和被替換的內(nèi)容,選擇相應(yīng)的族實例即可。
修改族名稱在Revit中有兩種思路,一種是在項目中修改,一種是在族編輯器中修改。在項目中修改需要獲取項目文檔,而在族編輯器中修改一般需要獲取項目文檔和族文檔(族編輯器為FamilyManager)。
所有對族的修改必須要在相應(yīng)的事務(wù)中進(jìn)行。要在事件響應(yīng)中修改文檔,必須顯式地啟動一個事務(wù),在該事務(wù)中修改文檔。如果是在事件中打開事務(wù),則事務(wù)必須在該事件響應(yīng)結(jié)束前被關(guān)閉(提交或者撤銷),否則在該事務(wù)中的所做的所有的修改都會被丟棄(本段摘自《二次開發(fā)基礎(chǔ)教程》P27 同濟(jì)大學(xué)出版社,給本書點個贊,真的是小白必備)。
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, "請選擇模型構(gòu)件");
if (0 == ref1.Count)
{
TaskDialog.Show("Revit", "你沒有選任何元素.");
}
else
{
//調(diào)用文本框中的值
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;
//在事務(wù)中修改文檔
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());
}
}
族類型名稱的修改和族名稱大同小異,但是需要注意的是每個族實例對應(yīng)的只有一個族名稱,但是卻可能會存在多個族類型。因此首先需要得到一個已加載的族類型(FamilySymbol)的組,這里再次強(qiáng)調(diào)下修改族類型可以在項目中和族管理器中進(jìn)行,兩者分別是依據(jù)FamilySymbol類和FamilyType類,需要注意區(qū)分。而想要得到族類型組,最好的方法就是通過元素過濾器取得(參考書P148)。另外需要注意的是修改后的族類型名稱有可能和現(xiàn)有的族類型名稱沖突,需要加以判斷。不沖突的話可以使用復(fù)制方法(Duplicate),沖突的話直接切換成已有的族類型名稱即可(ChangeTypeId)。目前經(jīng)過我的嘗試,改變族類型的方法只有通過ChangeTypeId,依據(jù)族類型的ID方可進(jìn)行修改。
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, "請選擇模型構(gòu)件");
if (0 == ref1.Count)
{
TaskDialog.Show("Revit", "你沒有選任何元素.");
}
else
{
//調(diào)用文本框中的值
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); //復(fù)制生成新的族類型
elementId = familySymbol.Id; //獲取新的族類型的ID
familyInstance2.ChangeTypeId(elementId); //依據(jù)ID改變族類型
}
}
trans.Commit();
}
}
}
}
catch (Exception ex)
{
TaskDialog.Show("info", ex.ToString());
}
}
新手之作,有錯誤或者改進(jìn)之處歡迎大家指正,當(dāng)然有不懂的地方大家也可以一起交流,努力!
————————————————
版權(quán)聲明:本文為CSDN博主「藏風(fēng)聚氣得水為上」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42605872/java/article/details/94590316
本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。
上一篇:CAD教程 | 如何在CAD中設(shè)置捕捉對象的快捷鍵
下一篇:CAD教程 | 如何將2021 CAD 背景設(shè)置為黑色?
推薦專題