SuperMap iObjects.Net组件开发中模型合并实现方法

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个子对象。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值