Newer
Older
GHFX_REFACTOR / FrmAddWellShp.cs
wxn on 2 Nov 2016 29 KB 提交
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using GeoScene.Data;
using System.Text.RegularExpressions;
using GeoScene.Engine;
using GeoScene.Globe;
using System.Xml;
using DevComponents.DotNetBar;

namespace Cyberpipe
{
    public partial class FrmAddWellShp : Office2007Form
    {
        GeoScene.Globe.GSOGlobeControl globeControl1;
        GSODataSource ds;
        private Hashtable gj_cns = new Hashtable();
        private Hashtable gj_types = new Hashtable();
        string selectLayerName = "";
        public GSOLayer rukuLayer = null;
        private List<String> layernamelist = new List<string>();

        public FrmAddWellShp(GeoScene.Globe.GSOGlobeControl _globeControl1, GSODataSource _ds)
        {
            globeControl1 = _globeControl1;
            ds = _ds;
            InitializeComponent();
        }
        /// <summary>
        /// 验证shp格式文件
        /// </summary>
        /// <param name="layer"></param>
        /// <returns></returns>
        private string valiFuShuWudata(GSOLayer layer)
        {
            string txtMessage = "";            
            if (layer != null)
            {
                GSOFeatureDataset featDataSet = layer.Dataset as GSOFeatureDataset;
                List<string> lstField = new List<string>();
                List<string> listFieldType_Text = new List<string>();
                for (int i = 0; i < featDataSet.FieldCount; i++)
                {
                    string fieldName = featDataSet.GetField(i).Name;
                    lstField.Add(fieldName);
                    if (gj_types.ContainsKey(fieldName))
                    {
                        string fieldType = gj_types[fieldName].ToString().ToUpper();
                        switch (featDataSet.GetField(i).Type)
                        {
                            case EnumFieldType.Text:
                                if (fieldType != "string".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                listFieldType_Text.Add(fieldName);
                                break;
                            case EnumFieldType.INT32:
                                if (fieldType != "int".ToUpper() && fieldType != "double".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                            case EnumFieldType.INT16:
                                if (fieldType != "int".ToUpper() && fieldType != "double".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                            case EnumFieldType.Double:
                                if (fieldType != "double".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                            case EnumFieldType.Date:
                                if (fieldType != "date".ToUpper())
                                {
                                    txtMessage += "" + fieldName + "数据类型不正确\r\n";
                                }
                                break;
                        }
                    }
                }
                if (!lstField.Contains("编号"))
                {
                    txtMessage += "编号字段不存在!\r\n";
                }
                if (!lstField.Contains("附属物编码"))
                {
                    txtMessage += "附属物编码字段不存在!\r\n";
                }
                if (!lstField.Contains("井深"))
                {
                    txtMessage += "井深字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldZ = featDataSet.GetField("井深");
                    if (fieldZ.Type != EnumFieldType.Double && fieldZ.Type != EnumFieldType.Float && fieldZ.Type != EnumFieldType.INT16 && fieldZ.Type != EnumFieldType.INT32)
                    {
                        txtMessage += "\"井深\"字段必须为数值类型 \r\n";
                    }
                }
                if (!lstField.Contains("X坐标"))
                {
                    txtMessage += "X坐标字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldZ = featDataSet.GetField("X坐标");
                    if (fieldZ.Type != EnumFieldType.Double && fieldZ.Type != EnumFieldType.Float && fieldZ.Type != EnumFieldType.INT16 && fieldZ.Type != EnumFieldType.INT32)
                    {
                        txtMessage += "\"X坐标\"字段必须为数值类型 \r\n";
                    }
                }

                if (!lstField.Contains("Y坐标"))
                {
                    txtMessage += "Y坐标字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldZ = featDataSet.GetField("Y坐标");
                    if (fieldZ.Type != EnumFieldType.Double && fieldZ.Type != EnumFieldType.Float && fieldZ.Type != EnumFieldType.INT16 && fieldZ.Type != EnumFieldType.INT32)
                    {
                        txtMessage += "\"Y坐标\"字段必须为数值类型 \r\n";
                    }
                }
                if (!lstField.Contains("附属物名称"))
                {
                    txtMessage += "附属物名称字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldZ = featDataSet.GetField("附属物名称");
                    if (fieldZ.Type != EnumFieldType.Text)
                    {
                        txtMessage += "\"附属物名称\"字段必须为数值类型 \r\n";
                    }
                }
                if (!lstField.Contains("所属道路"))
                {
                    txtMessage += "所属道路字段不存在!\r\n";
                }
                else
                {
                    GSOFieldAttr fieldZ = featDataSet.GetField("所属道路");
                    if (fieldZ.Type != EnumFieldType.Text)
                    {
                        txtMessage += "\"所属道路\"字段必须为数值类型 \r\n";
                    }
                }
                for (int i = 0; i < layer.GetAllFeatures().Length; i++)
                {
                    GSOFeature f = layer.GetAt(i);
                    for (int j = 0; j < listFieldType_Text.Count; j++)
                    {
                        string fieldName = listFieldType_Text[j];
                        if (gj_types.ContainsKey(fieldName))
                        {
                            if (f.GetValue(fieldName).ToString().Trim().Length > 8000)
                            {
                                txtMessage += "名称为" + f.Name + "的要素的字段" + fieldName + "的长度大于8000 !\r\n";
                            }
                        }
                    }
                }
            }
            return txtMessage;
        }

        private ArrayList files =new ArrayList ();
        private ArrayList modeltypes = new ArrayList(); // 井的型号
        private ArrayList deeps = new ArrayList();
        /// <summary>
        /// 确定按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            if (comboBoxEx1.SelectedItem.ToString().Trim() == "")
            {
                MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            try
            {
                /*
                if (!Utility.isNetworkConnectionSuccess(FrmDatabaseParaSetting.dbIp))
                {
                    MessageBox.Show("网络连接失败!", "提示");
                    return;
                }
                 * */

                if (txtLayerName.Text.Trim() == "")
                {
                    MessageBox.Show("图层名称为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                //判断是数字或者存在特殊字符串
                string SuiD = txtLayerName.Text.Trim();
                Regex reg = new Regex("^[0-9]");//判断是不是数据,要不是就表示没有选择,则从隐藏域里读出来
                Match ma = reg.Match(SuiD);
                if (ma.Success)
                {
                    MessageBox.Show("图层名称不能以数字开头!", "警告");
                    return;
                }

                Regex regNum = new Regex("^[0-9]");

                GSODataset dataset = ds.GetDatasetByName(txtLayerName.Text.Trim());
                GSOFeatureDataset featdataset = null;
                if (dataset != null)
                {
                    DialogResult result = MessageBox.Show("附属物图层名称在数据库中已存在!是否向该表追加", "提示", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        featdataset = dataset as GSOFeatureDataset;
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    featdataset = CreateDBFeatureDataset(txtLayerName.Text.Trim());
                }
                if (featdataset == null)
                {
                    return;
                }
                featdataset.Open();

                GSOLayer shpLayer = globeControl1.Globe.Layers.GetLayerByCaption(selectLayerName);
                if (shpLayer == null)
                    return;

                if (featdataset != null)
                {
                    GSOFeatures features = shpLayer.GetAllFeatures(true);

                    GSOFeatures layerFeatures = featdataset.GetAllFeatures();
                    List<string> listFeature = new List<string>();
                    if (layerFeatures.Length != 0)
                    {
                        for (int m = 0; m < layerFeatures.Length; m++)
                        {
                            GSOFeature ff = layerFeatures[m];
                            listFeature.Add(ff.Name);
                        }
                    }
                    /*
                    if (dataset != null)
                    {
                        //根据编号删除数据库图层中已经存在的记录即要素
                        string sql = "delete from " + txtLayerName.Text.Trim() + " where 编号 in (";
                        for (int j = 0; j < features.Length; j++)
                        {
                            GSOFeature f = features[j];
                            if (f != null && f.IsFieldValueNull("编号") == false)
                            {
                                string fieldID = f.GetFieldAsString("编号").Trim();
                                if (fieldID != "")
                                {
                                    sql += "'" + fieldID + "',";
                                }
                            }
                        }
                        sql = sql.Substring(0, sql.Length - 1);
                        sql += ")";
                        OledbHelper.sqlExecuteNonQuery(sql);
                    }

                    featdataset.Close();
                    featdataset.Open();
                    **/

                    for (int j = 0; j < features.Length; j++)
                    {

                        GSOFeature f = features[j];
                        if (f != null)
                        {
                            //if (f.IsFieldValueNull("Handle") == false)
                            //{
                            if (listFeature.Contains(f.GetFieldAsString("编号").Trim()))
                            {
                                continue;
                            }
                            else
                            {
                                GSOGeoPoint3D shpPoint = f.Geometry as GSOGeoPoint3D;
                                double rotateAngle;
                                double deep = f.GetFieldAsDouble(combDeep.SelectedItem.ToString());
                                rotateAngle = (double)f.GetValue(combAngle.SelectedItem.ToString());
                                string currentModelType = f.GetValue(combCode.SelectedItem.ToString()).ToString();

                                double z = Convert.ToDouble(txtUpGround.Text);

                                //double z = f.GetFieldAsDouble(comboBoxGC.SelectedItem.ToString());

                                GSOFeature feature = featdataset.CreateFeature();
                                GSOGeoModel model = new GSOGeoModel();
                                GSOPoint3d pt = new GSOPoint3d();
                                pt.X = shpPoint.X;
                                pt.Y = shpPoint.Y;
                                pt.Z = z;

                                model.Position = pt;
                                model.Align = EnumEntityAlign.TopCenter; //接口已修复作用
                                model.AltitudeMode = EnumAltitudeMode.RelativeToGround;
                                model.RotateZ = 0 - rotateAngle * 180 / Math.PI + 90;

                                string feName = f.GetFieldAsString("附属物名称");
                                string handle = f.GetFieldAsString("附属物编码");
                                double Deep = f.GetFieldAsDouble("井深");
                                Deep = Math.Round(Deep, 1);

                                string ss = "GX_JSD_3503_QZL_CZ15134DJS5050";
                                    if(f.GetFieldAsString("编号")==ss)
                                    {
                                    int a=0;
                                    }
                                //string Name = f.GetFieldAsString("模型路径");
                                //"雨篦工井模型\\3501-1.6.gcm"handle:3501,deep:1.6
                                if (feName == "阀门")
                                {
                                    model.FilePath = Application.StartupPath + "\\" + "管道配件gcm\\闸阀\\闸阀DN150.gcm";
                                }
                                else
                                {
                                    string str = Deep.ToString("0.00");
                                    string Name = "雨篦工井模型" + "\\" + handle + "-" + str + ".gcm";

                                    //System.Globalization.NumberFormatInfo formatinfo = new System.Globalization.CultureInfo("zh-CN", false).NumberFormat;
                                    // formatinfo.NumberDecimalDigits = Convert.ToInt32(1);
                                    //string filepath = "";
                                    double tempDeep = Deep;
                                    string modelpath = Application.StartupPath + "\\" + Name;
                                    if (File.Exists(modelpath))
                                    {
                                        model.FilePath = modelpath;
                                    }

                                    else
                                    {
                                        tempDeep = Math.Round(tempDeep, 1);

                                        for (int i = 0; i < 10; i++)
                                        {
                                            tempDeep += 0.1;
                                            string tempDeepStr = tempDeep.ToString("0.00");
                                            string Filefsw = Application.StartupPath + "\\雨篦工井模型\\" + handle + "-" + tempDeepStr + ".gcm";
                                            if (File.Exists(Filefsw))
                                            {
                                                model.FilePath = Filefsw;
                                                break;
                                            }
                                        }
                                    }
                                }

                                model.Name = f.GetValue(combModelName.SelectedItem.ToString()).ToString();
                                feature.Name = f.GetValue(combModelName.SelectedItem.ToString()).ToString();
                                feature.Geometry = model;

                                for (int i = 0; i < feature.GetFieldCount(); i++)
                                {
                                    if (f.GetFieldCount() > i)
                                    {
                                        GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(f.GetFieldDefn(i));

                                        if (fielddef == null)
                                            continue;

                                        object obu = f.GetValue(fielddef.Name);
                                        if (obu != null)
                                        {
                                            string fieldName = gj_cns.ContainsKey(fielddef.Name) == true ? gj_cns[fielddef.Name].ToString() : fielddef.Name;
                                            feature.SetValue(fieldName, obu);
                                        }
                                    }
                                }
                                featdataset.AddFeature(feature);
                            }
                        }

                    }
                }

                featdataset.Save();
                MessageBox.Show("入库成功!", "提示"); 

                ds = globeControl1.Globe.DataManager.OpenOracleDataSource(Utility.DBServer.Trim() + "/" + Utility.dbdatabase.Trim(), "",
                        "", Utility.userID, Utility.DBPassword);

                if (shpLayer == null)
                {
                    globeControl1.Globe.Layers.Remove(shpLayer);
                }
                GSOLayer layer = globeControl1.Globe.Layers.Add(featdataset);
                rukuLayer = layer;
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
            catch (Exception ex)
            {
                LogError.PublishError(ex);
                MessageBox.Show(ex.Message);
            }
        }
        /// <summary>
        /// 创建数据库表
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private GSOFeatureDataset CreateDBFeatureDataset(string name)
        {
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(selectLayerName);
            GSOFeatures features = layer.GetAllFeatures();
            if (features.Length == 0)
            {
                MessageBox.Show("图层要素个数为0!", "提示");
                return null;
            }

            GSOFeatureDataset featDs = ds.CreateFeatureDataset(name);
            if (featDs == null)
            {
                MessageBox.Show("图层名称不符合要求!", "提示");
                return null;
            }
            for (int i = 0; i < features[0].GetFieldCount(); i++)
            {
                GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i));
                             
                GSOFieldAttr field = new GSOFieldAttr();

                field.Name = gj_cns.ContainsKey(fielddef.Name) == true ? gj_cns[fielddef.Name].ToString() : fielddef.Name;
                switch (fielddef.Type)
                {
                    case EnumFieldType.Text:
                        field.Type = EnumFieldType.Text;
                        field.Width = 8000;
                        break;
                    case EnumFieldType.INT32:
                        field.Type = EnumFieldType.INT32;
                        field.Width = 4;
                        break;
                    case EnumFieldType.Double:
                        field.Type = EnumFieldType.Double;
                        field.Width = 8;
                        break;
                    case EnumFieldType.Date:
                        field.Type = EnumFieldType.Date;
                        field.Width = 10;
                        break;
                }
                bool res = featDs.AddField(field);
            }

            featDs.Save();
            return featDs;
        }
        /// <summary>
        /// 窗体初始化事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmAddWellShp_Load(object sender, EventArgs e)
        {
            ////////////////////////////////////////////
            //填充SHP数据列表
            comboBoxEx1.Items.Clear();
            if (globeControl1 != null)
            {
                for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
                {
                    GSOLayer layer = globeControl1.Globe.Layers[i];
                    if (layer != null && layer.Name.ToLower().EndsWith(".shp"))
                    {
                        string str = Path.GetFileName(layer.Name);
                        comboBoxEx1.Items.Add(str);
                        layernamelist.Add(layer.Name.Trim());
                    }
                }
            }

            string filename = Application.StartupPath + "\\FormText.xml";
            if (File.Exists(filename))
            {
                XmlTextReader XmlReader = new XmlTextReader(filename);
                try
                {
                    while (XmlReader.Read())
                    {
                        if (XmlReader.Name == "FuShuWu")
                        {
                            string str1 = XmlReader["label"];
                            string str3 = XmlReader["type"];
                            string str2 = XmlReader.ReadElementString();
                            gj_cns.Add(str1, str2);
                            gj_types.Add(str1, str3);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogError.PublishError(ex);
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void cmbLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(selectLayerName);
            GSOFeatures features = layer.GetAllFeatures();
            if (features.Length == 0)
                return;

            combCode.Items.Clear();
            combDeep.Items.Clear();
            combModelName.Items.Clear();
            combAngle.Items.Clear();
            comboBoxGC.Items.Clear();

            for (int i = 0; i < features[0].GetFieldCount(); i++)
            {
                GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i));
                combCode.Items.Add(fielddef.Name);
                combDeep.Items.Add(fielddef.Name);
                combModelName.Items.Add(fielddef.Name);
                combAngle.Items.Add(fielddef.Name);
                comboBoxGC.Items.Add(fielddef.Name);
            }
            combCode.SelectedItem = "附属物编码";
            combDeep.SelectedItem = "井深";
            combModelName.SelectedItem = "编号";
            combAngle.SelectedItem = "符号角度";
            comboBoxGC.SelectedItem = "地面高程";
        }
        /// <summary>
        /// 单击选择shp格式文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //private void buttonXLayerPath_Click(object sender, EventArgs e)
        //{
        //    OpenFileDialog dlg = new OpenFileDialog();
        //    dlg.Filter = "*.shp|*.shp";
        //    dlg.Multiselect = false;
        //    if (dlg.ShowDialog() == DialogResult.OK)
        //    {
        //        GSOLayer layer = globeControl1.Globe.Layers.Add(dlg.FileName);
        //        string txtMessage = valiFuShuWudata(layer);
        //        if (txtMessage != "")
        //        {
        //            button3.Enabled = false;
        //            textBoxLayer.Text = "";
        //            combCode.Items.Clear();
        //            combDeep.Items.Clear();
        //            combModelName.Items.Clear();
        //            //comboLoad.Items.Clear();
        //            combAngle.Items.Clear();
        //            globeControl1.Globe.Layers.Remove(layer);
        //            FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(dlg.FileName, txtMessage);
        //            showErrorMessage.ShowDialog();
        //            return;
        //        }
        //        else
        //        {
        //            button3.Enabled = true;
        //            textBoxLayer.Text = dlg.FileName;                
        //            selectLayerName = layer.Caption;
        //            txtLayerName.Text = layer.Caption;
        //            GSOFeatures features = layer.GetAllFeatures();
        //            if (features.Length == 0)
        //                return;

        //            combCode.Items.Clear();
        //            combDeep.Items.Clear();
        //            combModelName.Items.Clear();
        //            //comboLoad.Items.Clear();
        //            combAngle.Items.Clear();

        //            for (int i = 0; i < features[0].GetFieldCount(); i++)
        //            {
        //                GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i));
        //                combCode.Items.Add(fielddef.Name);
        //                combDeep.Items.Add(fielddef.Name);
        //                combModelName.Items.Add(fielddef.Name);
        //                //comboLoad.Items.Add(fielddef.Name);
        //                combAngle.Items.Add(fielddef.Name);
        //            }
        //            combCode.SelectedItem = "附属物编码";
        //            combDeep.SelectedItem = "井深";
        //            combModelName.SelectedItem = "编号";
        //            //comboLoad.SelectedItem = "模型路径";
        //            combAngle.SelectedItem = "符号角度";
        //        }
        //    }
        //}
        /// <summary>
        /// 窗体关闭事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmAddWellShp_FormClosing(object sender, FormClosingEventArgs e)
        {
            
            globeControl1.Globe.Refresh();
        }

        private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxEx1.SelectedIndex != -1)
            {
                string layerCaption = null;

                for (int i = 0; i < layernamelist.Count; i++)
                {
                    if (Path.GetFileName(layernamelist[i]) == comboBoxEx1.SelectedItem.ToString().Trim())
                    {
                        layerCaption = layernamelist[i];
                    }
                }

                GSOLayer layer = globeControl1.Globe.Layers.Add(layerCaption);
                string txtMessage = valiFuShuWudata(layer);
                if (txtMessage != "")
                {
                    button3.Enabled = false;
                    //textBoxLayer.Text = "";
                    comboBoxGC.Items.Clear();
                    combCode.Items.Clear();
                    combDeep.Items.Clear();
                    combModelName.Items.Clear();
                    combAngle.Items.Clear();
                    globeControl1.Globe.Layers.Remove(layer);
                    FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(layerCaption, txtMessage);
                    showErrorMessage.ShowDialog();
                    return;
                }
                else
                {
                    button3.Enabled = true;
                    //textBoxLayer.Text = layerCaption;
                    selectLayerName = layer.Caption;
                    txtLayerName.Text = layer.Caption;
                    GSOFeatures features = layer.GetAllFeatures();
                    if (features.Length == 0)
                        return;
                    comboBoxGC.Items.Clear();
                    combCode.Items.Clear();
                    combDeep.Items.Clear();
                    combModelName.Items.Clear();
                    combAngle.Items.Clear();

                    for (int i = 0; i < features[0].GetFieldCount(); i++)
                    {
                        GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i));
                        comboBoxGC.Items.Add(fielddef.Name);
                        combCode.Items.Add(fielddef.Name);
                        combDeep.Items.Add(fielddef.Name);
                        combModelName.Items.Add(fielddef.Name);
                        combAngle.Items.Add(fielddef.Name);
                    }
                    combCode.SelectedItem = "附属物编码";
                    combDeep.SelectedItem = "井深";
                    combModelName.SelectedItem = "编号";
                    combAngle.SelectedItem = "符号角度";
                    comboBoxGC.SelectedItem = "地面高程";
                }
            }
        }







    }
}