IFCモデルは、IFCは階層ではありませんので、エンティティは、非常に重要な課題であるマージし、削除します。これは、潜在的に円形の関係は双方向のナビゲーションで、複雑な構造です。これらのタスクを実行します(あなたがファイルにSTEP21ラインと考えることができます)単一のエンティティ上の問題ではありません。
#144 = IFCBUILDINGSTOREY(' 026ajlHVj1HBm_osQm7IDT '、#47、' 低屋根-スラブレベル'、$、$、#143、$、
' 低屋根-スラブレベル'、.ELEMENT、。3199.99999999704);
あなたは、エンティティ、およびエンティティを定義した完全なデータサイロを隔離したい場合は、データの他のエンティティの島よりも副作用を引き起こすことなく削除する、または矛盾や再現性を作成することなく、既存のデータとそれを混合するエンティティをマージしたいですそれがますます困難になります。これらの理由から、私たちは第三の選択肢を好む、あなたが欲しいものを選択し、空のモデルにコピーします。これは明らかに、潜在的に複雑な作業ですが、少なくとも、より簡単にあなたのコントロール下で。IModel
インターフェイスのコア機能があります : InsertCopy()
T InsertCopy <T>(T TOCOPY、XbimInstanceHandleMapマッピング、PropertyTranformDelegate propTransform、
BOOL includeInverses、BOOL keepLabels)。
通りのための全てのパラメータがされて簡単に説明した通り:
- TOCOPY:エンティティをコピーするには
- マッピング:以前に挿入マップ。二つのモデルの間に挿入され、すべての場合は、常に唯一のインスタンスでなければなりません。
- propTransform :オプションの代理人、あなたはフィルタリングするか、変換がコピーする前にその内容をcoppiedますそれを使用することができます。これは素晴らしい機能です。
- includeInversesは:導入オプションは、すべてのエンティティを逆転します。無制限propTransformが委託した場合、それは簡単にほぼ全モデルを持って来ることができるので、これは、潜在的に危険です。
- keepLabels :エンティティにラベルを付けるためのオプションは変更されません。時には、同じラベルを維持することが有用である可能性があります。対象モデルは新しいモデルではありませんか、複数のモデルからオブジェクトを挿入する場合は、このオプションを使用しないでください。
これらすべてのことからPropertyTranformDelegate デリゲートそれは少し神秘的に見えるかもしれません。それは複製されたデータの管理を可能にするので、それは、上記の方法の本質的な部分です。あなたが逆のを許可し、そして追加のフィルタリングを提供していない場合、あなたは1つだけの壁をコピーしようとしても、元のモデルが含まれるのは98%で終わることがあります。それを正しく使用するには、IFCの構造を非常によく理解する必要があります。ここでは、強力な変換の簡単な例ですが、それは唯一の製品の種類とその属性との間に逆の関係を記述することができ、すべてのジオメトリと位置を無視します。ジオメトリは、通常、ファイルの約90%を占めているので、あなたが作成したジオメトリのグラフィックベースの分析で使用したり、興味を持っていないことができれば、非常に小さなIFCファイルにのみ記述データが含まれています。
SemanticFilter = PropertyTranformDelegate(プロパティ、ParentObject)=> { // 省略形状および位置 IF(ParentObjectはIS IIfcProduct && (property.PropertyInfo.Name ==がNameOf(IIfcProduct.Representation)|| property.PropertyInfo.Name == がNameOf(IIfcProduct .ObjectPlacement))) 戻り NULL ; //省略マッピングジオメトリ IF(ParentObject ある IIfcTypeProduct && property.PropertyInfo.Name == がNameOf(IIfcTypeProduct.RepresentationMaps)) 戻り NULL ; //唯一の逆の関係(それはすべてのプロパティと型を引き継ぐ)isDefinedbyを達成するとistypedby property.PropertyInfo.Name ==がNameOf(IIfcProduct.IsDefinedBy)|| property.PropertyInfo.Name == がNameOf(IIfcProduct.IsTypedBy) )) のリターン はnull ; 戻り property.PropertyInfo.GetValue(ParentObject、ヌル;) }。
PropertyTranformDelegateが ある最初のどの2つのパラメータ、かかる ExpressMetaPropertyの他方は、 IPersistEntityのオブジェクト。ExpressMetaPropertyは、我々はいくつかのデータ操作を使用し、当社独自の反射素子モデルの一部であるキャッシュオブジェクト、です。他のコード、データ値及びコピーをチェックするためにC#のリフレクションを使用してコードを使用するデリゲート。あなたは()デリゲートinsertcopyを指定しない場合は、エンティティのすべての属性を使用し、それらをコピーします。
使用してXbim.Commonを。 使用してXbim.Ifcを。 使用してXbim.Ifc4.Interfacesを。 名前空間BasicExamples { クラスInsertCopy { 公共 ボイドCopyWallsOver() { CONST ストリング原= " SampleHouse.ifc " 。 constの 文字列 =挿入「SampleHouseWalls.ifc 」。 PropertyTranformDelegate semanticFilter =(プロパティ、parentObject)=> { // 省略几何图形和位置 する場合(parentObjectIS IIfcProduct && (property.PropertyInfo.Name ==がNameOf(IIfcProduct.Representation)|| property.PropertyInfo.Name == がNameOf(IIfcProduct.ObjectPlacement))) のリターン はnull ; //省略マッピングジオメトリ のIF(ParentObjectはIS IIfcTypeProduct && property.PropertyInfo.Name == がNameOf(IIfcTypeProduct.RepresentationMaps)) のリターン はnull ; // (それはisDefinedbyを達成するための唯一の逆の関係で)すべてのプロパティと種類を引き継ぎ、istypedbyます IF(property.EntityAttribute.Order < 0 &&! ( property.PropertyInfo.Name ==がNameOf(IIfcProduct.IsDefinedBy)|| property.PropertyInfo.Name == がNameOf(IIfcProduct.IsTypedBy) )) のリターン はnull ; 返す property.PropertyInfo.GetValue(parentObject、ヌル); }。 使用(VARのモデル= IfcStore.Open(オリジナル)) { VARの壁= model.Instances.OfType <IIfcWall> (); 使用(VARの IModelを= IfcStore.Create(model.IfcSchemaVersion、XbimStoreType.InMemoryModel)) { 使用(VAR= iModel.BeginTransaction TXN(「挿入コピー」)) { // 全てを2つのモデルの間に挿入されなければならないが、単一の図を使用 するvar地図= 新新XbimInstanceHandleMap(モデル、IModelをする); foreachの(VARのウォールにおける壁) { iModel.InsertCopy (壁、マップ、semanticFilter、trueに、falseに); } txn.Commit(); } } } iModel.SaveAs(挿入)。 } } }
参考:http://docs.xbim.net/examples/insert-copy-function.html
2019年6月5日