Building Coder(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의 실행 결과를 테스트합니다.원본 링크의 첨부 파일에서 이 모델 파일을 찾을 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.