SuperMap iObjects.NET 模型编辑之拆分打散

模型合并,拆分,打散是模型编辑中较为常见的功能。近期遇到一些小伙伴咨询在iObjects.NET中中如何实现模型拆分和打散呢?接下来我们就来看看具体的实现思路吧。模型合并可参考该篇文档: iObjects.Net模型合并

一、打散和拆分介绍。

模型打散:有时模型数据子对象太多,可能会导致模型数据中顶点数及三角面过多,此类数据在生成缓存时有时会导致崩溃,此时需要将模型打散后进行操作。实现把模型对象中的每个“子对象”另存为模型对象,保证各个单独模型的尺寸等信息不变。
模型拆分:在完成BIM模型的搭建后,有时需要对诸如层高、墙厚、板厚、平面布置等反复核查,即需要获得模型子对象的对象。通过BIM子对象拆分可以得到这些构件的尺寸,避免自动拆分后造成预制构件尺寸不对,现场无法组装的情况。模型拆分后的对象比模型打散更加精细。

二、重要接口介绍

模型打散:

属性或方法介绍
ModelGetSkeleton获取指定的骨架
ModelGetSkeletonCount获取骨架数量
ModelAddSkeleton向精细层添加骨架
ModelGetSkeleton获取指定的骨架

模型拆分:

属性或方法介绍
ModelBuilder3DSplitSkeleton对模型的骨架进行拆分

三、实现思路

3.1 模型打散

模型打散没有直接的接口可以用,需要自行通过model.GetSkeleton获取到原始模型的骨架后,存入一个新的独立的model。具体的步骤如下:
1、获取到原始数据集的记录集,新建一个模型数据集以存储打散后的数据
2、遍历原始记录集,获取到每个对象的model
3、通过model.GetSkeletonCount遍历其中的子对象。
4、通过 model.GetSkeleton获取每一个子对象的骨架。
5、新建model类,将上一步获取到的骨架存入新建的model中。
代码如下:

                //获取原始数据集
                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、遍历原始记录集,获取到每个对象的model
3、通过ModelBuilder3D.SplitSkeleton()拆分每一个model,并将结果存入新的model
5、将新的model存入新数据集即可。
代码如下:

                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 a = modelNew.GetSkeletonCount(-1);
                    GeoModel3D geoModelNew = new GeoModel3D();
                    geoModelNew.Model = modelNew;
                    geoModelNew.Position = geoModel3D.Position;
                    recordsetNew.AddNew(geoModelNew);//将模型数据集存入新记录集
                    recordsetNew.Update();
                    recordset.MoveNext();

                }

四、实现效果

接下来让我们在桌面看一下具体的实现效果吧。
首先展示的是原始数据,该数据有1个对象,1个对象中包含了9个子对象。
在这里插入图片描述
通过模型打散后将所有的子对象存储成了对象,如下图所示,有9个对象,且每个对象只有一个子对象:

在这里插入图片描述
通过模型拆分以后,虽然还是1个对象,但子对象的个数却增加了,变成19个。如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: SuperMap iObjects .NET是一种基于.NET平台的GIS开发框架,它提供了一系列的GIS组件和API,可以帮助开发者快速构建高效、稳定的GIS应用程序。SuperMap iObjects .NET支持多种数据格式和数据源,包括Oracle、SQL Server、PostgreSQL、MySQL等数据库,以及Shapefile、GeoJSON、KML等常见的地理数据格式。同时,它还提供了丰富的地图显示和分析功能,如地图渲染、空间查询、空间分析等,可以满足各种GIS应用的需求。 ### 回答2: SuperMap iObjects .NET 是一款针对 .NET 开发者的 GIS 开发框架,它提供了一组完整的 GIS 控件、类库和 API,开发者可以使用这些工具来快速构建并定制化自己的 GIS 应用程序。 此框架可以轻松处理几何计算、数据连接、符号设计、地图绘制、空间分析和数据查询等功能。同时,SuperMap iObjects .NET 还支持多种数据格式,包括文件格式(如 Shapefile、KML、GPX 等),数据库格式(如 Oracle、SQL Server、MySQL 等),以及 OGC 标准格式(如 WMS、WFS、WCS 等)。 此外,SuperMap iObjects .NET 还提供了一套完整的开发工具,包括 SuperMap iDesktop、SuperMap iServer、SuperMap iPortal 和 SuperMap iMobile。SuperMap iDesktop 是一个功能强大的桌面 GIS 开发环境,提供了丰富的可视化编辑功能、数据管理功能、以及符号化和分析工具。SuperMap iServer 是一款高性能的 GIS 服务器,能够处理海量的 GIS 数据和请求,支持多系统、多平台引擎,兼容多种 GIS 标准和协议。SuperMap iPortal 是一个面向 Web 的 GIS 应用管理平台,便于用户快速发布和共享 GIS 数据、工具和应用。SuperMap iMobile 是一套移动端 GIS 应用开发平台,可以帮助开发者快速构建定制化的移动 GIS 应用程序。 总之,SuperMap iObjects .NET 是一款强大且全面的 GIS 开发框架,具有多种数据格式支持、良好的性能和灵活的定制化功能。它可以帮助开发者快速构建高质量的 GIS 应用程序,并具有广泛的应用范围,涉及地理信息、城市规划、资源管理、环境保护、公共安全等多个领域。 ### 回答3: SuperMap iObjects .NET是一款开发GIS应用程序的.NET框架,它提供了一系列的GIS组件和工具,方便开发人员实现GIS功能。这款产品具有如下的特点: 1.多种数据源支持:SuperMap iObjects .NET支持多种常见的数据格式(例如GDB,PostgreSQL,Oracle等),方便GIS程序访问和处理各种数据。 2.丰富的空间数据分析功能:SuperMap iObjects .NET提供了各种空间数据分析功能,例如空间查询、缓冲区分析、空间叠加、空间统计等,可以方便地实现复杂的GIS分析需求。 3.强大的空间可视化功能:SuperMap iObjects .NET提供了各种数据可视化工具,可以轻松实现图层风格设置、标注、符号等功能,使得GIS地图更加美观、精准。 4.支持跨平台开发:SuperMap iObjects .NET可以支持不同平台的开发,包括桌面、Web、移动等,方便不同应用需求的实现。 总之,SuperMap iObjects .NET是一款开发GIS应用程序的强大框架,它提供了完整的GIS解决方案和开发工具,可以大幅提升开发人员的工作效率,同时也能够满足各种GIS应用场景的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值