本文共 1876 字,大约阅读时间需要 6 分钟。
作者:翔翔
上一篇博客说的是移除重复点和重复面,下面就来介绍如何实例化处理。何为实例化?实例化有什么作用呢?
实例化:在面向对象的编程语言中,new一个类出来,这个就叫实例化。而本文的实例化和这个类似,new出来的这个类被无限复用。超图中的实例化:一个重复的对象只存储一次,然后将该对象重复使用多次。减少了存储空间;在场景中渲染时,内存也只需要存储一个对象,与之复用的就只需要更改位置和旋转缩放等状态即可。 在SuperMap iDesktop中,找到实例化处理的按钮然后选择一个对象即可。实例化话即可在对象属性的窗口中查看共用了多少次,如下图所示:
//实例化存储需要用到实体管理器 ModelEntityManager 虽然实体管理器提供的追加Model的功能,但是Model没有Name属性,不能用于实例化 //GeoModel3D、Model实际上都是壳,真正的数据是骨架Skeleton ModelEntityManager em = new ModelEntityManager(dv); string filename = Path.GetFileNameWithoutExtension(filesetting.FilePath); //定义字典,模型文件名称,对应的骨架名称集合;公用的对象直接取骨架名称构建Model即可 Dictionary> m_ModelAndSkeletons = new Dictionary >(); //模型获取骨架,存储到实体管理器中ModelEntityManager if (!m_ModelAndSkeletons.Keys.Contains(filename)) { m_ModelAndSkeletons[filename] = new List (); } int skeletoncount = resultModelRemove.GetSkeletonCount(-1);//-1代表精细层,如果有lod 获取lod数量 再获取每个lod层对应的骨架 for (int i = 0; i < skeletoncount; i++) { SkeletonID skeletonID = new SkeletonID(-1, i); Skeleton skeleton = resultModelRemove.GetSkeleton(skeletonID); Skeleton newskeleton = em.Append(skeleton); m_ModelAndSkeletons[filename].Add(newskeleton.Name); newskeleton.Dispose(); skeleton.Dispose(); } resultModelRemove.Dispose(); //所有骨架存储完后,em存储一下 em.Save(); //实例化对象,公用的对象 Model _model = new Model(); foreach (string skeletonName in m_ModelAndSkeletons[filename]) { _model.AddSkeleton(em, skeletonName); } //新建geomodel3d最后保存到数据集中去 GeoModel3D model3d = new GeoModel3D(); //这是模型的位置 model3d.Position = new Point3D(115, 30, 1); model3d.IsLonLat = true; model3d.Model = _model; //添加到记录集中,保存更新 recordset.AddNew(model3d); model3d.Dispose(); recordset.Batch.Update(); recordset.Dispose();
以上就是实例化的代码,如有不对还请批正。
转载请注明出处: