Newer
Older
EMS_REFACTOR / PointBuilder.cs
nn-203 on 26 Jul 2017 9 KB first commit
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;

namespace Cyberpipe
{
    public class PointBuilder:ModelBuilder
    {
        static string filedPathF = Application.StartupPath + "\\雨篦工井模型\\";
        static string filedPathG = Application.StartupPath + "\\管道配件gcm\\";

        public PointBuilder(GSODataSource ds)
            : base(ds)
        { 
        
        }

        public override bool validate(GSOLayer layer) {
            return true;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="updateMode">追加或修改</param>
        /// <param name="buildMode">高程入库或埋深入库</param>
        /// <param name="param"></param>
        public override bool doBuild(EnumUpdateMode updateMode,
                                     EnumBuildMode buildMode,
                                     BaseParam param)
        {
            PointParam pointParam = param as PointParam;
            GSOFeatureDataset newFeatureSet = ds.GetDatasetByName(pointParam.layerName) as GSOFeatureDataset;
            if (newFeatureSet == null)
            {
                newFeatureSet = CreateDBFeatureDataset(layer, pointParam.layerName);
            }
            newFeatureSet.Open();
            GSOFeatures features = layer.GetAllFeatures(true);
            for (int i = 0; i < features.Length; i++)
            {
                GSOFeature f = features[i];
                GSOGeoPoint3D shapePoint = f.Geometry as GSOGeoPoint3D;

                GSOFeature newFeature = newFeatureSet.CreateFeature();

                newFeature.Name = f.GetValue(pointParam.uniqueIdFieldName).ToString();
                newFeature.Geometry = createModel(f, pointParam, buildMode);
                setFeatureValueByShapeFeature(f, newFeature);

                if (newFeatureSet.GetFeatureByName(newFeature.Name, true).Length > 0)
                { //存在
                    if (updateMode.Equals(EnumUpdateMode.Append))
                    {
                        continue;
                    }
                    GSOFeature delFeature = newFeatureSet.GetFeatureByName(newFeature.Name, true)[0];
                    delFeature.Delete();
                }
                newFeatureSet.AddFeature(newFeature);
            }
            newFeatureSet.Save();
            newFeatureSet.Close();
            return true;
        }

        private GSOGeoModel createModel(GSOFeature f,
            PointParam pointParam, EnumBuildMode buildMode)
        {
            GSOGeoPoint3D shapePoint = f.Geometry as GSOGeoPoint3D;
            GSOGeoModel model = new GSOGeoModel();
            GSOPoint3d pt = new GSOPoint3d();
            pt.X = shapePoint.X;
            pt.Y = shapePoint.Y;

            if (ExitFiled(f, "管点编码")) //特征管点
            {
                pt.Z = (buildMode.Equals(EnumBuildMode.Alititude)) ? Convert.ToDouble(f.GetValue(pointParam.z))
                    : Convert.ToDouble(f.GetValue(pointParam.altitudeFieldName)) - Convert.ToDouble(f.GetValue(pointParam.z));
            }
            else if (ExitFiled(f, "附属物编码")) //附属物
            {
                pt.Z = (buildMode.Equals(EnumBuildMode.Alititude)) ? Convert.ToDouble(f.GetValue(pointParam.altitudeFieldName).ToString())
               + pointParam.upGround : pointParam.upGround;
            }
            else
            {
                pt.Z = (buildMode.Equals(EnumBuildMode.Alititude)) ? Convert.ToDouble(f.GetValue(pointParam.altitudeFieldName))
               - Convert.ToDouble(f.GetValue(pointParam.wellDepthFiledName)) : Convert.ToDouble(f.GetValue(pointParam.wellDepthFiledName));
            }

            model.Position = pt;
            model.Align = EnumEntityAlign.TopCenter;//
            model.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute;
            //model.RotateZ = (pointParam.symbolFiledName == "")?0:0 - (double)f.GetValue(pointParam.symbolFiledName) * 180 / Math.PI + 90;

            model.FilePath = getModelPath(f, pointParam);
            model.Name = f.GetValue(pointParam.uniqueIdFieldName).ToString();
            return model;
        }

        private String getModelPath(GSOFeature f, PointParam pointParam)
        {
            string feName = f.GetFieldAsString(pointParam.attachNameFieldName);
            string handle = f.GetFieldAsString(pointParam.pointEncodingFieldName);
            double deep = f.GetFieldAsDouble(pointParam.wellDepthFiledName);
            //TODO LIST:获取模型路径

            if(ExitFiled(f, "管点编码")) //特征管点
            {
                return filedPathG + feName + "\\" + feName + ".gcm";
            }
            if (ExitFiled(f, "附属物编码")) //附属物
            {
                deep = Math.Round(deep, 0);

                for (int i = 0; i < 10; i++)
                {
                    string strDeep = (deep + i).ToString("0.00");
                    if (File.Exists(filedPathF + handle + "-" + strDeep + ".gcm"))
                        return filedPathF + handle + "-" + strDeep + ".gcm";
                }
                return "";
            }
            return filedPathF + handle + ".gcm";
        }

        private bool ExitFiled(GSOFeature feature, string filedName)
        {
            GSOFeatureDataset featDataSet = feature.Dataset as GSOFeatureDataset;
            for (int i = 0; i < featDataSet.FieldCount; i++)
            {
                if (featDataSet.GetField(i).Name == filedName)
                    return true;
            }
            return false;
        }

        private double getRadius(LineParam lineParam, GSOFeature f) {
            double radius = 0;
            GSOFieldDefn field = f.GetFieldDefn(lineParam.diameterFieldName);
            if (field.Type == EnumFieldType.Text)
            {
                string temp = f.GetFieldAsString(lineParam.diameterFieldName);
                double outNum = 0;
                bool num = double.TryParse(temp, out outNum);
                if (num)
                    radius = outNum / 2000;
            }
            else if (field.Type == EnumFieldType.Double || field.Type == EnumFieldType.INT32)
                radius = f.GetFieldAsDouble(lineParam.diameterFieldName) / 2000;  // 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000 
            return radius;
        }

        /**
         * 获取管线style
         **/
        private GSOPipeLineStyle3D getPipeLineStyle(LineParam lineParam,GSOFeature f,double radius) {

            GSOPipeLineStyle3D style = new GSOPipeLineStyle3D();
            style.LineColor = Color.FromArgb(lineParam.transparency, lineParam.lineColor);
            style.Slice = lineParam.sliceNum;
            style.CornerSliceAngle = lineParam.cornerSliceAngle;
            style.Radius = radius;

            return style;
        }
       
        private GSOGeometry updateGemotry(GSOFeature f,LineParam lineParam,double radius, EnumBuildMode buildMode){

            f.Geometry.AltitudeMode = (buildMode.Equals(EnumBuildMode.Alititude)) ? EnumAltitudeMode.RelativeToGround : EnumAltitudeMode.Absolute;

            GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
            if (line == null) {
                return null; //log4net 记录错误处理
            }

            double deep1 = f.GetFieldAsDouble(lineParam.startDepthFieldName);
            double deep2 = f.GetFieldAsDouble(lineParam.endDepthFieldName);
            deep1 = lineParam.isRevert ? -deep1 : deep1;
            deep2 = lineParam.isRevert ? -deep2 : deep2;
            
            //根据相对模式进行深度修改
            deep1 = lineParam.relativeMode==1?deep1+radius*2:deep1-radius*2;
            deep2 = lineParam.relativeMode==1?deep2+radius*2:deep2-radius*2;

            GSOPoint3ds pt3ds = new GSOPoint3ds();
            for (int n = 0; n < line[0].Count; n++)
            {
                GSOPoint3d pt3d = line[0][n];
                int pointcount = line[0].Count;
                //TODO LIST:BUG 
                double totalLength = Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2));
                if (totalLength == 0)
                {
                    //TODOLIST:ERROR log4net
                    pt3d.Z = deep1;
                }
                else
                {
                    double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / totalLength;
                    pt3d.Z = deep1 + (deep2 - deep1) * radio;
                }

                if (double.IsInfinity(pt3d.Z))
                {
                    //TODOLIST:ERROR log4net
                    pt3d.Z = deep2;
                    //MessageBox.Show("无穷!");
                }
                pt3ds.Add(pt3d);
            }
            line[0] = pt3ds;

            return line;
        }

        private void setFeatureValueByShapeFeature(GSOFeature src,GSOFeature dst) {

            for (int j = 0; j < dst.GetFieldCount(); j++)
            {
                if (src.GetFieldCount() > j)
                {
                    GSOFieldDefn fielddef = src.GetFieldDefn(j);

                    object fieldvalue = src.GetValue(fielddef.Name);// convertFieldValue(fielddef.Name, f.GetValue(fielddef.Name));
                    dst.SetValue(fielddef.Name, fieldvalue);
                    /*
                    if (fieldvalue == null)
                        continue;
                    string fieldName = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name;
                    dst.SetValue(fieldName, fieldvalue);
                     * */

                }
            }

        }
    }
}