元素
一、Element類的解析
1.1 繼承關(guān)系
所有的族、族類型、族實(shí)例都是繼承Element
- 族(Family)
- 族類型(FamilySymbol)
- 族實(shí)例(FamilyInstance)
1.2 屬性
- Category:類別
- Location:位置
- LocationPoint
- LocationCurve
- LevelId:標(biāo)高
- GroupId:組
- Id:
- UniqueId:唯一Id
1.3 方法
- GetMaterials:獲取元素的材質(zhì)
- GetAnalyticalModel:獲取元素的分析模型,返回AnalyticalModel類型的對象
- GetCurve、GetCurves、GetPoint:獲取分析模型幾何信息
- IsSingleCurve、IsSinglePoint:判斷調(diào)用上述三個方法的哪一個
Document document = commandData.Application.ActiveUIDocument.Document;
Element element = document.GetElement(new ElementId(183554));
AnalyticalModel analyticalModel = element.GetAnalyticalModel();
if (analyticalModel.IsSingleCurve())
{
Curve curve = analyticalModel.GetCurve();
}
else if (analyticalModel.IsSinglePoint())
{
XYZ p = analyticalModel.GetPoint();
}
else
{
IList<Curve> curves = analyticalModel.GetCurves(AnalyticalCurveType.ActiveCurves);
}
return Result.Succeeded;
二、獲取元素
2.1 通過ID獲取元素
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
Element element = doc.GetElement(new ElementId(30));
Level level = element as Level;
通過Document類的GetElement方法獲取ElementId對象得到元素的實(shí)例,再通過as關(guān)鍵字轉(zhuǎn)型為所需元素類型,該方法缺點(diǎn)是,用戶必須知道元素ID及類型才行
2.2 通過過濾器獲取元素
2.2.1 過濾器步驟
- 創(chuàng)建收集器
- 創(chuàng)建過濾器
- 調(diào)用收集器的WherePasses函數(shù)對元素進(jìn)行過濾,可連續(xù)調(diào)用
- 遍歷收集器,獲取想要的元素
2.2.2 收集器
FilteredElementCollector類
- 構(gòu)造函數(shù)
- FilteredElementCollector(Document document)
- FilteredElementCollector(Document document, ICollection<ElementId> elementIds)
- FilteredElementCollector(Document document, ElementId viewId)
- 方法
- WherePasses
- OfClass、OfCategoryId、OwnedByView
- UnionWith、InstersectWith
2.2.3 元素過濾器
元素過濾器層次:
- 快速過濾器
- ElementCategoryFilter:使用類別過濾元素
- ElementClassFilter:按照類型過濾元素
- ElementIsElementTypeFilter
- FamilySymbolFilter:使用族類型過濾元素
- ExclusionFilter
- ...
- 慢速過濾器
- ElementLevelFilter
- ElementParameterFilter
- FamilyInstanceFilter
- CurveElementFilter
- ...
- 邏輯過濾器
- LogicalOrFilter
- LogicalAndFilter
2.3 通過選擇獲取元素
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
ICollection<ElementId> collection = uiDoc.Selection.GetElementIds();
foreach (ElementId id in collection)
{
TaskDialog.Show("Infomation", id.IntegerValue.ToString());
}
通過UIDocument中Selection.GetElementIds方法獲取選中元素的id集合,并且可以通過ElementId下的IntegerValue屬性獲取id編號
三、編輯元素參數(shù)
3.1 參數(shù)分類
- 內(nèi)建參數(shù)(BuiltInParameter)
- 共享參數(shù)
- 項(xiàng)目參數(shù)
3.2 參數(shù)編輯
- 獲取參數(shù)
- 獲取元素所有參數(shù):Element.Parameters
- 獲取元素指定參數(shù):Element.get_Parameter(參數(shù)),返回Parameter類型
- string參數(shù)名字:效率最低
- BuiltInParameter參數(shù)枚舉:效率最高,推薦使用
- Definition參數(shù)定義
- Guid參數(shù)的guid
- 修改參數(shù)
- Parameter.Set(參數(shù))
- Parameter.IsShared屬性:判斷參數(shù)是共享參數(shù)還是項(xiàng)目參數(shù)
四、編輯元素
4.1 移動
移動的三種方法
- 通過ElementTransformUtils類下的MoveElement()/MoveElements()方法
- 不能豎向移動,只能在平面內(nèi)移動
- 依附在元素上的元素也會移動
- 無法移動被釘住的元素
- 該方法是移動到目標(biāo)坐標(biāo)值
- 通過Location類的Move()方法
- 該方法是移動一個偏移向量
- 通過直接修改Location.LocationCurve.Curve屬性或Location.LocationPoint.Point屬性
4.2 旋轉(zhuǎn)
旋轉(zhuǎn)的兩種方法
- 通過ElementTransformUtils類下的RotateElement()/RotateElements()方法
- 旋轉(zhuǎn)角度用弧度計量,正值逆時針旋轉(zhuǎn),負(fù)值順時針旋轉(zhuǎn)
- 旋轉(zhuǎn)軸是有限線段
- 通過Location類的Rotate()方法
4.3 鏡像
通過ElementTransformUtils類下的MirrorElement()/MirrorElements()方法
- MirrorElement(Document, ElementId, Plane)
- MirrorElements(Document, ICollection<ElementId>, Plane)
- CanMirrorElement(Document, ElementId):判斷元素是否可以鏡像
- CanMirrorElements(Document, ICollection<ElementId>):判斷元素集是否可以鏡像
4.4 刪除
方法
- Delete(ElementId)
- Delete(ICollection<ElementId>)
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
//刪除一面墻
Wall wall = doc.GetElement(new ElementId(184163)) as Wall;
using (Transaction tran = new Transaction(doc, "Delete the Wall"))
{
tran.Start();
ICollection<ElementId> deletedElements = doc.Delete(wall.Id);
tran.Commit();
}
//刪除多面墻
List<ElementId> elementsToDelete = new List<ElementId>();
using (Transaction tran = new Transaction(doc, "Delete the Wall"))
{
tran.Start();
foreach (var elementId in uiDoc.Selection.GetElementIds())
{
elementsToDelete.Add(elementId);
}
ICollection<ElementId> deletedElements = doc.Delete(elementsToDelete);
tran.Commit();
}
return Result.Succeeded;
4.5 組合
通過doc.Create.NewGroup()方法生成一個組合,方法返回Group類型
通過Group對象的GroupType.Name屬性修改組合的名稱
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
//組合
List<ElementId> elementsToGroup = new List<ElementId>();
using (Transaction tran = new Transaction(doc, "Group"))
{
tran.Start();
foreach (var elementId in uiDoc.Selection.GetElementIds())
{
elementsToGroup.Add(elementId);
}
Group group = doc.Create.NewGroup(elementsToGroup);
group.GroupType.Name = "MyGroup";
tran.Commit();
}
return Result.Succeeded;
4.6 陣列
- 線型陣列
- LinearArray.Create(Document, View, ElementId, int, XYZ, ArrayAnchorMember)
- LinearArray.Create(Document, View, ICollection<ElementId>, int, XYZ, ArrayAnchorMember)
- 圓弧型陣列
- RadialArray.Create(Document, View, ElementId, int, Line, double, ArrayAnchorMember)
- RadialArray.Create(Document, View, ICollection<ElementId>, int, Line, double, ArrayAnchorMember)