Revit二次开发论坛链接
Building Coder原文链接
我们之前已经讨论过利用Document.Delete()的几个重载方法来发现对象之间关系的几个应用实例。比方说:标签和其标注元素的关系、墙及其墙基脚的关系、宿主及其内嵌元素的关系、Sheet的标题块、或者宿主元素及其门洞(针对粗略的材质量化计算)之间的关系。另外一种使用的场景是获取没有修改的元素几何数据。
感谢Saikat Bhattacharya提供的一个小巧的例子:ObjRel。它展示了在一个建筑模型中如何利用Document.Delete()来获取对象关系,并且将这些关系用一颗树体现出来。这棵树用.NET中的TreeView控件实现,这棵树所在的窗体(Windows Form)命名为Result。
Saikat的例子中使用一个函数GetDependentsElementIds来实现整体功能,如下所示,这个函数十分简洁,只有3行:
ElementIdSet GetDependentsElementIds( Element e ) { Document doc = _app.ActiveDocument; doc.BeginTransaction(); ElementIdSet ids = doc.Delete( e ); doc.AbortTransaction(); return ids; }
void DisplayNode( Element e, TreeNode node ) { string cat = (null == e.Category) ? "<category unknown>" : e.Category.Name; string label = string.Format( "{0}: {1} {2}", e.Name, cat, e.Id.Value ); TreeNode father = node.Nodes.Add( label ); // save element id to handle select event, // cf. treeView1_AfterSelect: father.ImageKey = e.Id.Value.ToString(); ElementIdSet ids = GetDependentsElementIds( e ); try { if( null != ids && 1 < ids.Size ) { Document doc = _app.ActiveDocument; foreach( ElementId id1 in ids ) { ElementId id = id1; Element e2 = doc.get_Element( ref id ); if( e2 != null ) { if( !e2.Id.Equals( e.Id ) && !_displayedElems.Contains( e2 ) ) { _displayedElems.Insert( e2 ); DisplayNode( e2, father ); } } } } } catch( Exception ex ) { MessageBox.Show( ex.Message.ToString() ); } } void CreateRelationships() { rootNode = new TreeNode( _app.ActiveDocument.Title ); this.treeView1.Nodes.Add( rootNode ); _displayedElems = new ElementSet(); foreach( Element e in _elems ) { if( !_displayedElems.Contains( e ) ) { DisplayNode( e, rootNode ); } } } public Result( ElementSet elems, Autodesk.Revit.Application app ) { _elems = elems; _app = app; InitializeComponent(); CreateRelationships(); treeView1.AfterSelect += new TreeViewEventHandler( treeView1_AfterSelect ); }
Application app = commandData.Application; Document doc = app.ActiveDocument; Autodesk.Revit.Geometry.Options opt = app.Create.NewGeometryOptions(); BuiltInCategory bicPreviewLegendComponent = BuiltInCategory.OST_PreviewLegendComponents; int iBic = ( int ) bicPreviewLegendComponent; try { // select all model elements: ElementSet a = app.Create.NewElementSet(); ElementIterator it = app.ActiveDocument.Elements; while( it.MoveNext() ) { Element e = it.Current as Element; if( !( e is Symbol ) && !( e is FamilyBase ) && ( null != e.Category ) && ( iBic != e.Category.Id.Value ) && ( null != e.get_Geometry( opt ) ) ) { a.Insert( e ); } } // show the object relationship dialog Result res = new Result( a, app ); res.ShowDialog(); } catch( Exception ex ) { message = ex.Message; } return IExternalCommand.Result.Failed;