using System; using System.Collections.Generic; using System.Text; using GeoScene.Data; using GeoScene.Globe; using GeoScene.Engine; namespace Cyberpipe { class Pipe { public bool Splite(GSOFeature feature, GSOLayer layer) { GSOPoint3ds nodes = GetLineNodes(feature); if (nodes.Count > 2) {//节点数小于3无法分割。直接返回 int pipeCount = nodes.Count - 1; //generate for (int i = 0; i < pipeCount; i++) { GSOFeature newF = GenPipe(nodes[i], nodes[i + 1], feature, layer); newF.Name = feature.Name; if (i > 0) { newF.Name = Guid.NewGuid().ToString(); newF.SetValue("编号", newF.Name); } layer.AddFeature(newF); } //界面操作没完成 return true; } return false; } /// <summary> /// 从feature对象里找到线,并取得节点 /// </summary> /// <param name="feature">选择器选中的feature</param> /// <returns>如果管线没有节点,返回null</returns> private GSOPoint3ds GetLineNodes(GSOFeature feature) { if (feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) {//判断是否是线 GSOGeoPolyline3D geoPolyline3D = feature.Geometry as GSOGeoPolyline3D; if (geoPolyline3D.PartCount > 0) { //一条线由多条子线组成,目前就显示第一条子线的节点内容把 //返回第一个点组 Point3ds, 一个点组代表一个管线 return geoPolyline3D[0]; } } return null; } //创建feature对象 private GSOFeature GenPipe(GSOPoint3d s, GSOPoint3d e, GSOFeature f,GSOLayer reflayer) { GSOGeoPolyline3D line = CreatePipeline(s,e,f ); GSOFeature feat=f.Clone(); feat.Geometry = line; return feat; } //创建线并赋予线风格 public GSOGeoPolyline3D CreatePipeline(GSOPoint3d start, GSOPoint3d end, GSOFeature feat) { GSOGeoPolyline3D polyline = new GSOGeoPolyline3D(); GSOPoint3ds pts = new GSOPoint3ds(); pts.Add(start); pts.Add(end); polyline.AddPart(pts); GSOPipeLineStyle3D originStyle = feat.Geometry.Style as GSOPipeLineStyle3D; //set style polyline.Style = originStyle; polyline.AltitudeMode = EnumAltitudeMode.Absolute; return polyline; } } }