xBIM拡張コピー機能は、02を挿入します

  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日

おすすめ

転載: www.cnblogs.com/SavionZhang/p/10981358.html