モデルの結合、分割、分割は、モデル編集の一般的な機能です。最近、小規模なパートナーに会って、iObjects.NET でモデルの分割と分割を実現する方法を尋ねました。次に、具体的な実装アイデアを見てみましょう。モデルのマージについては、このドキュメントを参照してください: iObjects.Net モデルのマージ
1. 解散と分割についての紹介。
モデルの粉砕: モデル データにサブオブジェクトが多すぎる場合があり、その結果、モデル データの頂点や三角形の面が多すぎる場合があります。この種のデータは、キャッシュの生成時にクラッシュを引き起こすことがあります。この場合、操作前にモデルを粉砕する必要があります。モデル オブジェクト内の各「サブオブジェクト」をモデル オブジェクトとして保存し、個々のモデルのサイズやその他の情報が変更されないようにします。
モデルの分割: BIM モデルの構築が完了した後、階高、壁厚、板厚、レイアウトなどを繰り返し確認し、モデルのサブオブジェクトのオブジェクトを取得する必要がある場合があります。これらのコンポーネントのサイズは、BIM サブオブジェクトの分割を通じて取得できるため、自動分割後にプレハブ コンポーネントのサイズが不正確になり、現場で組み立てることができないという状況が回避されます。モデルを分割した後のオブジェクトは、粉砕されたモデルよりも粒度が細かくなります。
2. 重要なインターフェースの紹介
モデルは次のように分割されます。
親切 | プロパティまたはメソッド | 導入 |
---|---|---|
モデル | スケルトンを取得する | 指定されたスケルトンを取得する |
モデル | GetSkeletonCount | スケルトンの数を取得する |
モデル | スケルトンの追加 | ファインレイヤーにスケルトンを追加 |
モデル | スケルトンを取得する | 指定されたスケルトンを取得する |
モデル分割:
親切 | プロパティまたはメソッド | 導入 |
---|---|---|
モデルエンティティマネージャー | スプリットスケルトン | モデルのスケルトンを分割する |
3. 実装アイデア
3.1 モデルの分割
モデルの分解に使用できる直接インターフェイスはありません。model.GetSkeleton
元のモデルのスケルトンを取得した後、新しい独立したモデルを保存する必要があります。具体的な手順は次のとおりです:
1. 元のデータ セットのレコード セットを取得し、分散データを保存する新しいモデル データ セットを作成します 2. 元のレコード セットをトラバースして
各オブジェクトのモデルを取得します
3. model.GetSkeletonCount を使用してその中の子オブジェクトをトラバースします。
4.model.GetSkeleton を通じて各サブオブジェクトのスケルトンを取得します。
5. 新しいモデル クラスを作成し、前の手順で取得したスケルトンを新しく作成したモデルに保存します。
コードは以下のように表示されます:
//获取原始数据集
DatasetVector datasetVector = m_workspace.Datasources[0].Datasets["单个模型"] as DatasetVector;
Recordset recordset = datasetVector.GetRecordset(false, CursorType.Dynamic);
//创建新模型数据集
DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
datasetVectorInfo.Type = DatasetType.Model;
datasetVectorInfo.IsFileCache = false;
datasetVectorInfo.Name = "模型打散706";
m_datasource = m_workspace.Datasources[0];
m_datasource.Datasets.Create(datasetVectorInfo);
DatasetVector datasetVectorNew = m_workspace.Datasources[0].Datasets["模型打散706"] as DatasetVector;
datasetVectorNew.PrjCoordSys = datasetVector.PrjCoordSys;//为新建的数据集赋坐标系
Recordset recordsetNew = datasetVectorNew.GetRecordset(false, CursorType.Dynamic);
recordsetNew.MoveFirst();
recordsetNew.Edit();
recordset.MoveFirst();
for (int i = 0; i < recordset.RecordCount; i++)//遍历记录集
{
GeoModel3D geoModel3D = recordset.GetGeometry() as GeoModel3D;
Model model = geoModel3D.Model;
for (int j = 0; j < model.GetSkeletonCount(-1); j++)//遍历子对象
{
int hh = model.GetSkeletonCount(-1);
SkeletonID skeletonID = new SkeletonID(-1, j);//-1代表LOD层,j代表骨骼编号(即子对象编号)
Skeleton skeletonNew = model.GetSkeleton(skeletonID);
Model modelNew = new Model();
modelNew.Add(skeletonNew);//将骨架存入模型
GeoModel3D geoModelNew = new GeoModel3D(modelNew)
{
Position = geoModel3D.Position,
};
geoModelNew.Position = geoModel3D.Position;
geoModelNew.Model = modelNew;
recordsetNew.AddNew(geoModelNew);//将模型数据集存入新记录集
recordsetNew.Update();
}
recordset.MoveNext();
}
datasetVectorNew.Close();
3.2 モデルの分割
モデル分割ではModelBuilder3D.SplitSkeleton()
この方法を使用します。具体的な手順は次のとおりです。
1. 元のデータ セットのレコード セットを取得し、分割データを保存する新しいモデル データ セットを作成します。 2、元のレコード セットを走査し、各
オブジェクトのモデルを取得します。
3、ModelBuilder3D.SplitSkeleton() を通じて各モデルを分割し、結果を新しいモデルに保存します。 5、新しいモデルを
新しいデータ セットに保存します。
コードは以下のように表示されます:
DatasetVector datasetVector = m_workspace.Datasources[0].Datasets["单个模型"] as DatasetVector;
Recordset recordset = datasetVector.GetRecordset(false, CursorType.Dynamic);
//创建新模型数据集
DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
datasetVectorInfo.Type = DatasetType.Model;
datasetVectorInfo.IsFileCache = false;
datasetVectorInfo.Name = "模型拆分";
m_datasource = m_workspace.Datasources[0];
m_datasource.Datasets.Create(datasetVectorInfo);
DatasetVector datasetVectorNew = m_workspace.Datasources[0].Datasets["模型拆分706114"] as DatasetVector;
datasetVectorNew.PrjCoordSys = datasetVector.PrjCoordSys;
Recordset recordsetNew = datasetVectorNew.GetRecordset(false, CursorType.Dynamic);
recordsetNew.MoveFirst();
recordsetNew.Edit();
recordset.MoveFirst();
for (int i = 0; i < recordset.RecordCount; i++)//遍历记录集
{
GeoModel3D geoModel3D = recordset.GetGeometry() as GeoModel3D;
Model model = geoModel3D.Model;
Model modelNew = new Model();
Boolean result = ModelBuilder3D.SplitSkeleton(model, modelNew, true);//对模型的骨架进行拆分
int count = modelNew.GetSkeletonCount(-1);//获取lod层级为-1的骨架数量
GeoModel3D geoModelNew = new GeoModel3D();
geoModelNew.Model = modelNew;
geoModelNew.Position = geoModel3D.Position;
recordsetNew.AddNew(geoModelNew);//将模型数据集存入新记录集
recordsetNew.Update();
recordset.MoveNext();
}
4.効果を実感する
次に、デスクトップ上での具体的な導入効果を見てみましょう。
最初に表示されるのは元のデータです。これには 1 つのオブジェクトがあり、1 つのオブジェクトには 9 つのサブオブジェクトが含まれています。
モデルが分割された後、次の図に示すように、すべてのサブオブジェクトがオブジェクトとして保存されます。オブジェクトは 9 つあり、各オブジェクトにはサブオブジェクトが 1 つだけあります。
モデルを分割した後、オブジェクトはまだ 1 つありますが、サブオブジェクトの数は 19 に増加しました。以下に示すように: