SuperMap iObjects.Net组件开发中模型合并实现方法
背景:
在使用SuperMap iDesktop产品过程中,我们会在三维场景的对象操作里遇到模型合并这一功能。经常有一些小伙伴就会问在iObjects.Net中怎么实现模型合并,没有找到相关接口,并且iDesktop是将全部或选中对象的子对象合并为一个模型对象,而实际需求可能是一次性成对合并模型的问题,本文这次就是针对这个问题写了一个例子,供大家参考和借鉴。
其实实现这个功能很简单,主要是通过如下几个步骤:
1.准备阶段
(1)在MainForm窗口添加相关控件;
(2)准备正常可显示的模型数据;
图中关联浏览属性表可知该模型数据集一共有5个子对象。
2.编码阶段
(1)加载含有该模型数据集的数据源,获取该数据源里的模型数据集。
private void button_Datasource_Click(object sender, EventArgs e)
{
try
{
string dataSourcePath = "";
DatasourceConnectionInfo datasourceConnetionInfo = new DatasourceConnectionInfo();
OpenFileDialog openFileDialog = new OpenFileDialog();//新建一个打开文件
openFileDialog.Title = "打开文件型数据源";//设置文件对话框标题
openFileDialog.Filter = "UDB 文件 (*.UDB)|*.udb";//设置对话框打开的文件类型
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
dataSourcePath = openFileDialog.FileName;//获取对话框文件路径
datasourceConnetionInfo.Alias = System.IO.Path.GetFileNameWithoutExtension (dataSourcePath);//获取数据源名称
DatasourceConnectionInfo datasourceInfo = new DatasourceConnectionInfo(dataSourcePath, datasourceConnetionInfo.Alias, "");
workspace.Datasources.Open(datasourceInfo);//根据指定的连接信息打开数据源
int count = workspace.Datasources[0].Datasets.Count;
for (int i = 0; i < count; i++)
{
dataset = workspace.Datasources[0].Datasets[i];
if (dataset.Type == DatasetType.Model)
{
comboBox_Dataset.Items.Add(dataset.Name);
}
}
}
else
{
MessageBox.Show("打开文件型数据源失败!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
(2) 判断数据源中是否有模型数据集 ,如果有获取该模型数据集的子对象个数。
private void comboBox_Dataset_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox_Dataset.Items.Count == 0)
{
MessageBox.Show("该数据源中没有模型数据集!");
}
else
{
string datasetName = comboBox_Dataset.SelectedItem.ToString();
datasetVector = workspace.Datasources[0].Datasets[datasetName] as DatasetVector;
recordset = datasetVector.GetRecordset(false, CursorType.Dynamic);
label_Message.Text = "该模型数据集有" + recordset.RecordCount.ToString() + "个子对象";
}
}
(3)先创建一个新的模型数据集,根据合并模型个数进行for循环,用ModelTools.Compose(List)接口将多个模型进行合并,在新创建的模型数据集的记录集中添加三维模型对象,最后重新计算数据集的空间范围即可。
private void button1_Click(object sender, EventArgs e)
{
try
{
//合并模型
int i, j = 0;
string datasetName = comboBox_Dataset.SelectedItem.ToString();
int count = Convert.ToInt32(textBox_Count.Text.ToString());
List<GeoModel3D> list = new List<GeoModel3D>();
recordset = datasetVector.GetRecordset(false, CursorType.Dynamic);
//新建数据集
DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
datasetVectorInfo.Type = DatasetType.Model;
datasetVectorInfo.IsFileCache = true;
datasetVectorInfo.Name = "NewModel";
Datasets datasets = workspace.Datasources[0].Datasets;
string name = "NewModel";
//判断数据集名称是否合法(不重名)
bool b = datasets.IsAvailableDatasetName(name);
if (b == true)
{
//根据指定的模型数据集模板创建新的模型数据集
newDatasetVector = datasets.CreateFromTemplate(name, workspace.Datasources[0].Datasets [datasetName]) as DatasetVector;
}
else
{
datasets.Delete(name);
newDatasetVector = datasets.CreateFromTemplate(name, workspace.Datasources[0].Datasets [datasetName]) as DatasetVector;
}
Recordset newRecordset = newDatasetVector.GetRecordset(false, CursorType.Dynamic);
if (count != 0)
{
for (i = 0; i < recordset.RecordCount; )
{
if ((count + i) > recordset.RecordCount)
{
count = recordset.RecordCount - i;
}
for (j = i; j < count + i; j++)
{
recordset.MoveTo(j);
//获取当前记录集所对应的三维模型对象
geoModel3D = recordset.GetGeometry() as GeoModel3D;
//将三维模型对象添加到对象列表中
list.Add(geoModel3D);
}
//将多个模型对象合并成一个模型对象
newGeoModel3D = ModelTools.Compose(list);
newRecordset.MoveLast();
//在新创建的模型数据集的记录集中添加三维模型对象
newRecordset.AddNew(newGeoModel3D);
newRecordset.Update();
list.Clear();
i = i + count;
}
//重新计算数据集的空间范围
newDatasetVector.ComputeBounds();
}
MessageBox.Show("模型合并已完成");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
3.结果展示
(1)加载模型数据源,并根据自己的需求设置参数。
(2)点击合并模型。
(3)在iDesktop中加载该数据源,在场景中打开合并后新生成的模型数据集,关联浏览属性表可见将之前的5个子对象合并成了2个子对象。