自個(gè)網(wǎng)站媒體軟文推廣平臺(tái)
前言
Revit 有一套完整的幾何造型能力,每一個(gè)體量都是一個(gè)GenericForm
,這些體量可以通過拉伸、掃掠等創(chuàng)建。這個(gè)例子介紹如何將他們合并成一個(gè)體量。
內(nèi)容
合并體量的關(guān)鍵接口:
// Autodesk.Revit.DB.Document
public GeomCombination CombineElements(CombinableElementArray members);
可以合并的實(shí)體,相關(guān)類的集成體系:
如何通過UI創(chuàng)建各種類型的實(shí)體,可以參考 Revit 官方文檔:創(chuàng)建實(shí)心形狀
case 1:手動(dòng)選中了一些元素
核心邏輯:
- 遍歷所有選中元素
- 確保元素是
GenericForm
,且是實(shí)體solid - 確保都是
CombinableElement
(GenericForm
集成自CombinableElement
,這步有點(diǎn)多余) - 合并符合條件的元素:
doc.Document.CombineElements(solids)
核心代碼:
// 遍歷所有選中元素
foreach (Autodesk.Revit.DB.ElementId elementId in doc.Selection.GetElementIds())
{Autodesk.Revit.DB.Element element = doc.Document.GetElement(elementId);// 確保元素是`GenericForm`,且是實(shí)體solidGenericForm gf = element as GenericForm;if (null != gf && !gf.IsSolid)continue;// 確保都是 `CombinableElement` (`GenericForm`集成自`CombinableElement`,這步有點(diǎn)多余)CombinableElement ce = element as CombinableElement;if (null != ce)solids.Append(ce);
}
// 合并符合條件的元素
doc.Document.CombineElements(solids);
case 2:沒有選中,則處理整個(gè)文檔
核心邏輯:
- 過濾出所有的
GenericForm
和GeomCombination
- 遍歷過濾元素
- 確保元素是
GenericForm
,且是實(shí)體solid - 確保都是
CombinableElement
(GenericForm
集成自CombinableElement
,這步有點(diǎn)多余) - 對(duì)有重疊的元素進(jìn)行幾何合并:
JoinOverlapping
,判斷是否重疊的邏輯在IsOverlapped
核心代碼:
// 過濾出所有的`GenericForm`和`GeomCombination`
LogicalOrFilter filter = new LogicalOrFilter(new ElementClassFilter(typeof(GenericForm)), new ElementClassFilter(typeof(GeomCombination)));
// 遍歷過濾元素
FilteredElementIterator itor = (new FilteredElementCollector(document)).WherePasses(filter).GetElementIterator();
itor.Reset();
while (itor.MoveNext()){// 確保元素是`GenericForm`,且是實(shí)體solidGenericForm gf = itor.Current as GenericForm;if (null != gf && !gf.IsSolid)continue;// 確保都是 `CombinableElement` (`GenericForm`集成自`CombinableElement`,這步有點(diǎn)多余)CombinableElement ce = itor.Current as CombinableElement;if (null == ce)continue;m_elements.Add(ce);
}
// 對(duì)有重疊的元素進(jìn)行幾何合并
GeomCombination geomCombination = JoinOverlapping(m_elements, document);
JoinOverlapping 的核心邏輯在于判斷是否重疊的邏輯, IsOverlapped
:
- 獲取元素幾何,GeometryElement get_Geometry(Options options)
- 獲取GeometryObject所有Face
類型是 Solid,通過接口 solid.Faces
類型是 GeometryElement, 通過 GetEnumerator 接口遞歸調(diào)用 - 獲取所有的線 GetAllCurves
首先獲取所有的 Face,通過 face.EdgeLoops 獲取線的幾何信息 - 判斷線和面是否相交
部分核心代碼:
// 獲取元素幾何
Options geOptions = Command.s_appCreation.NewGeometryOptions();
elementA.get_Geometry(geOptions);// 獲取所有的 Face,需要遞歸調(diào)用
private static void GetAllFaces(GeometryElement geoElement, List<Face> faces){IEnumerator<GeometryObject> Objects = geoElement.GetEnumerator();while (Objects.MoveNext()){GeometryObject geObject = Objects.Current;GetAllFaces(geObject, faces);}
}
private static void GetAllFaces(Solid solid, List<Face> faces){foreach (Face face in solid.Faces){faces.Add(face);}
}
private static void GetAllFaces(GeometryObject geometry, List<Face> faces){if (geometry is GeometryElement){GetAllFaces(geometry as GeometryElement, faces);return;
}if (geometry is Solid){GetAllFaces(geometry as Solid, faces);return;}
}// 獲取所有的 curve,類似,省略
其它
這個(gè) sample 代碼質(zhì)量有些混亂,需自行整理分析。