Newer
Older
GHFX_REFACTOR / Backup / Pipe.cs
wxn on 2 Nov 2016 2 KB 提交
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;
        }
    }
}