Building Coder(Revit 2차 개발) - 객체 관계

4308 단어
Revit 2차 개발 포럼 링크
Building Coder 텍스트 링크
우리는 이전에 이미 Document를 이용하는 것에 대해 토론한 적이 있다.Delete()의 몇 가지 재부팅 방법을 사용하여 객체 간 관계에 대한 몇 가지 응용 인스턴스를 발견할 수 있습니다.예를 들어 라벨과 그 표기 요소의 관계, 벽과 그 벽의 기초 발의 관계, 숙주와 그 안에 박힌 요소의 관계, Sheet의 제목 블록, 또는 숙주 요소와 그 문구멍(대략적인 재질에 대한 양적 계산) 간의 관계를 말한다.또 다른 장면은 수정되지 않은 원소 기하학적 데이터를 가져오는 것이다.Saikat Bhattacharya가 제공한 작은 예: ObjRel에 감사 드립니다.그것은 하나의 건축 모델에서 Document를 어떻게 활용하는지 보여 준다.Delete () 를 사용하여 객체 관계를 가져오고 트리로 표시합니다.이 나무는 쓴다.NET의 TreeView 컨트롤은 트리가 있는 창(Windows Form)의 이름을 Result로 지정합니다.Saikat의 예에서 하나의 함수GetDependentsElementIds를 사용하여 전체 기능을 구현합니다. 아래와 같이 이 함수는 세 줄만 있는 매우 간결합니다.
ElementIdSet GetDependentsElementIds( 
  Element e )
{
  Document doc = _app.ActiveDocument;
 
  doc.BeginTransaction();
 
  ElementIdSet ids = doc.Delete( e );
 
  doc.AbortTransaction();
 
  return ids;
}

트리 컨트롤의 두 함수(DisplayNode
및 CreateRelationships
) 호출됩니다.결과적으로 건축 모형의 모든 요소와 관련된 BIM이
요소는 모두 트리 컨트롤에 채워집니다.
DisplayNode():
이 귀속 함수는 서로 의존하는 요소 ID에 근거한다
트리 노드를 생성합니다.각 노드는 해당 요소의 이름을 표시합니다(Element Name
), 카테고리(Category)
) 및 ID
(Element ID
).
CreateRelationships():
초기 노드에 따라 트리 노드를 만들고 그것을 채우며 이미 만들어진 노드 목록을 유지하여 통일된 요소에 대응하는 트리 노드를 중복적으로 만들지 않도록 합니다.
다음은 이 두 가지 방법의 실현과 나무가 있는 창의 구조 함수가 어떻게 그것들을 호출하는지입니다.
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 );
}

다음 중 하나를 보실 수 있습니다.
Revit
외부 명령(
External Command
)의
Execute()
방법이 외부 명령은 일련의 보이는 모델 요소를 만들고 이 모델 요소를 포함하는 집합을 매개 변수로 생성합니다
Result
창문그다음에 네가 위에 있는 것처럼.
Result
창의 구조 함수에서 보듯이 창은 호출을 통해
CreateRelationships()
방법은 그 관계 나무를 채운다.
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;

우리는 간단한 모형 파일인 Simple House를 사용할 수 있습니다.rvt에서 ObjRel의 실행 결과를 테스트합니다.원본 링크의 첨부 파일에서 이 모델 파일을 찾을 수 있습니다.

좋은 웹페이지 즐겨찾기