Newer
Older
GHFX_REFACTOR / FrmAddFlagBatch.cs
xiaowei on 28 Nov 2016 15 KB 增加标识器管理
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using GeoScene.Globe;
using GeoScene.Engine;
using System.Collections;
using GeoScene.Data;
using System.Text.RegularExpressions;

namespace Cyberpipe
{
    public partial class FrmAddFlagBatch : Office2007Form
    {
        GSOGlobeControl globeControl1;
        GSODataSource ds;
        GSOLayer layer;
        string selectLayerName = "";
        public GSOLayer flags = null;
        private Hashtable fm_types = new Hashtable();
        private Hashtable fm_cns = new Hashtable();

        public FrmAddFlagBatch(GSOGlobeControl _globeControl1, GSODataSource _ds)
        {
            InitializeComponent();
            this.globeControl1 = _globeControl1;
            this.ds = _ds;
        }

        private void btn_file_select_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog dlg = new OpenFileDialog();
                dlg.Filter = "*.shp|*.shp";
                dlg.Multiselect = false;
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    layer = globeControl1.Globe.Layers.Add(dlg.FileName);
                    string txtMessage = valiValvedata(layer);
                    if (txtMessage != "")
                    {
                        btn_imp.Enabled = false;
                        txt_layer_file.Text = "";
                        txt_layer_name.Text = "";
                        combo_model_path.Items.Clear();
                        combo_z_value.Items.Clear();
                        combo_model_name.Items.Clear();
                        globeControl1.Globe.Layers.Remove(layer);
                        FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(dlg.FileName, txtMessage);
                        showErrorMessage.Show();
                        return;
                    }
                    else
                    {
                        btn_imp.Enabled = true;
                        txt_layer_file.Text = dlg.FileName;
                        selectLayerName = layer.Caption;
                        txt_layer_name.Text = layer.Caption;
                        GSOFeatures features = layer.GetAllFeatures();
                        if (features.Length == 0)
                            return;

                        combo_model_path.Items.Clear();
                        combo_z_value.Items.Clear();
                        combo_model_name.Items.Clear();

                        for (int i = 0; i < features[0].GetFieldCount(); i++)
                        {
                            GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i));
                            combo_model_path.Items.Add(fielddef.Name);
                            combo_z_value.Items.Add(fielddef.Name);
                            combo_model_name.Items.Add(fielddef.Name);
                        }
                        combo_model_name.SelectedItem = "编号";
                        combo_z_value.SelectedItem = "标识器埋深";
                        combo_model_path.SelectedItem = "模型路径";
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("SHP文件选取失败:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

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

                GSODataset dataset = ds.GetDatasetByName(txt_layer_name.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(txt_layer_name.Text.Trim());
                }

                featdataset.Open();

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

                GSOFeatures features = shpLayer.GetAllFeatures(true);
                if (dataset != null)
                {
                    //根据编号删除数据库图层中已经存在的记录即要素
                    string sql = "delete from " + txt_layer_name.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 (!String.IsNullOrEmpty(fieldID))
                            {
                                sql += "'" + fieldID + "',";
                            }
                        }
                    }
                    sql = sql.Substring(0, sql.Length - 1);
                    sql += ")";
                    OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql);
                }

                featdataset.Close();
                featdataset.Open();

                for (int j = 0; j < features.Length; j++)
                {
                    GSOFeature f = features[j];
                    GSOGeoPoint3D shpPoint = f.Geometry as GSOGeoPoint3D;

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

                    double deep = f.GetFieldAsDouble(combo_z_value.SelectedItem.ToString());

                    double z = deep / 100;

                    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.FilePath = Application.StartupPath + "\\" + f.GetFieldAsString(combo_model_path.SelectedItem.ToString());
                    model.FilePath = Application.StartupPath + "\\" + "管道配件gcm\\电子标识器\\电子标识器黑.gcm";
                    model.Name = f.GetValue(combo_model_name.SelectedItem.ToString()).ToString();
                    feature.Name = f.GetValue(combo_model_name.SelectedItem.ToString()).ToString();
                    feature.Geometry = model;

                    for (int i = 0; i < feature.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 = fm_cns.ContainsKey(fielddef.Name) == true ? fm_cns[fielddef.Name].ToString() : fielddef.Name;
                            feature.SetValue(fieldName, obu);
                        }
                    }
                    featdataset.AddFeature(feature);
                }
                featdataset.Save();
                MessageBox.Show("入库成功!", "提示");
                if (shpLayer == null)
                {
                    globeControl1.Globe.Layers.Remove(shpLayer);
                }
                GSOLayer layer = globeControl1.Globe.Layers.Add(featdataset);
                this.layer = layer;
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("批量导入失败:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            } 
        }


        #region 自定义方法

        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 = fm_cns.ContainsKey(fielddef.Name) == true ? fm_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;
        }

        private string valiValvedata(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 (fm_types.ContainsKey(fieldName))
                    {
                        string fieldType = fm_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";
                    }
                }
                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 (fm_types.ContainsKey(fieldName))
                        {
                            if (f.GetValue(fieldName).ToString().Trim().Length > 8000)
                            {
                                txtMessage += "名称为" + f.Name + "的要素的字段" + fieldName + "的长度大于8000 !\r\n";
                            }
                        }
                    }
                }
            }
            return txtMessage;
        }

        #endregion
    }
}