Newer
Older
LSPipeline / HTForms / FrmPipelineModelDataBase.cs
using System;
using System.Drawing;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;

namespace WorldGIS.HTForms
{
    public partial class FrmPipelineModelDB : Office2007Form
    { 
        private GSOGlobeControl ctl;
        GSODataSource datasource;
        public GSOLayer rukuLayer;

        public FrmPipelineModelDB(GSOGlobeControl _ctl)
        {
            ctl = _ctl;
            InitializeComponent();
        }

        /// <summary>
        /// 窗体初始化事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmPipelineModel_Load(object sender, EventArgs e)
        {
            comboBoxDataSourceList.Items.Clear();
            foreach (DatabaseConnectParams connectParams in Utility.connectParamsOfDatabase)
            {
                if (connectParams != null &&
                    (connectParams.databaseType == EnumDataSourceType.SqlServer ||
                     connectParams.databaseType == EnumDataSourceType.Oracle))
                    comboBoxDataSourceList.Items.Add(connectParams.dataSourceFullName);
            }

            comboBoxExLayer.Items.Clear();
            for (int i = 0; i < ctl.Globe.Layers.Count; i++)
            {
                GSOLayer layer = ctl.Globe.Layers[i];
                if (Path.GetExtension(layer.Name).ToLower() == ".shp")
                    comboBoxExLayer.Items.Add(layer.Caption);
            }

            pipelineTypeCbo.Items.Add("雨水");
            pipelineTypeCbo.Items.Add("污水");
            pipelineTypeCbo.Items.Add("雨污合流");
            pipelineTypeCbo.Items.Add("给水");
            pipelineTypeCbo.Items.Add("供电");
            pipelineTypeCbo.Items.Add("天然气");
            pipelineTypeCbo.Items.Add("共通");
            pipelineTypeCbo.Items.Add("电通");
            pipelineTypeCbo.Items.Add("路灯");
            pipelineTypeCbo.Items.Add("监控");
            pipelineTypeCbo.Items.Add("有线电视");
            
            cmbReference.Items.Clear();
            cmbReference.Items.Add("管顶");
            cmbReference.Items.Add("管底");
        }
        /// <summary>
        /// 选择管线颜色
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPipelineColor_Click(object sender, EventArgs e)
        {
            colorDialog1.Color = btnPipelineColor.BackColor;
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                btnPipelineColor.BackColor = colorDialog1.Color;
            }
        }

        private bool invalidate()
        {
            if (comboBoxDataSourceList.Text.Trim() == "")
            {
                MessageBox.Show("请选择目标数据库!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            GSODataSource ds = Utility.getDataSourceByFullName(ctl, comboBoxDataSourceList.SelectedItem.ToString().Trim());
            if (ds == null)
            {
                MessageBox.Show("选择的目标数据源为空!", "提示");
                return false;
            }
            else
                datasource = ds;
         
            if (comboBoxExLayer.Text.Trim() == "")
            {
                MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            if (txtModelLayer.Text.Trim().Length >= 20)
            {
                MessageBox.Show("请修改图层名称为20个字符以下", "提示");
                return false;
            }
            if (txtModelLayer.Text.Trim() == "")
            {
                MessageBox.Show("请输入入库图层名称!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            Regex reg = new Regex("^[0-9]");
            Match ma = reg.Match(txtModelLayer.Text.Trim());
            if (ma.Success)
            {
                MessageBox.Show("图层名称不能以数字开头!", "警告");
                return false;
            }
            return true;
        }

        private void btnCreateModel_Click(object sender, EventArgs e) //建模
        {
            if (!invalidate())
                return;
            try
            {
                GSOLayer layer = ctl.Globe.Layers.GetLayerByCaption(Path.GetFileNameWithoutExtension(
                    comboBoxExLayer.Text));
                if (layer == null) return;

                if (txtModelLayer.Text != "传感设备图层")
                {
                    if (!getValidateResult(layer))
                        return;
                }
                //reSetComboboxRansparency();
                
                LineParam lineParam = new LineParam();
                lineParam.layerName = txtModelLayer.Text;
                lineParam.uniqueIdFieldName = cmbID.Text;
                lineParam.startDepthFieldName = checkBoxDeep.Checked ? cmbFrom.Text : startH.Text;
                lineParam.endDepthFieldName = checkBoxDeep.Checked ? cmbTo.Text : endH.Text;
                lineParam.isRevert = chkDeep.Checked;
                lineParam.diameterFieldName = cmbRadius.Text;
                lineParam.relativeMode = (cmbReference.Text == "管顶") ? 0 : 1;
                lineParam.lineColor = btnPipelineColor.BackColor;
                lineParam.transparency = Convert.ToByte(ComboboxRansparency.Value);
                lineParam.cornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text);
                lineParam.sliceNum = Convert.ToInt32(txtSlice.Text);
                lineParam.channelWidth = comboBoxExWidth.Text;
                lineParam.channelHeight = comboBoxExHeight.Text;

                if (txtModelLayer.Text != "传感设备图层")
                    lineBuilder(layer, lineParam);
                else
                    gxLineBuilder(layer, lineParam);

                MessageBox.Show("入库完成!", "提示");
                addLayerToGlobeControl(lineParam.layerName);
                //this.DialogResult = DialogResult.OK;
                
                
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message);
            }
        }

        bool getValidateResult(GSOLayer layer)
        {
            FieldValidate fieldValidate = FieldValidateFactory.Create(ValidateConfig.LoadConfig(),
                        getEnumValidateType());

            if (fieldValidate.Validate(layer)) return true;
            DateTime dt = DateTime.Now;
            string logFilePath = Application.StartupPath + "\\log\\" + dt.Year + "\\" + dt.Year + dt.Month +
                                 "\\" + dt.Year + dt.Month + dt.Day + ".txt";
            MessageBox.Show("选择的数据不符合数据规范,详情见日志" + logFilePath, "提示");
            return false;
        }

        void lineBuilder(GSOLayer layer,LineParam lineParam)
        {
            ModelBuilder lineBuilder = new LineBuilder(datasource);
            lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update,
                checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam);
        }

        void gxLineBuilder(GSOLayer layer, LineParam lineParam)
        {
            ModelBuilder lineBuilder = new GXBuilder(datasource);
            lineBuilder.build(layer, checkBoxAdd.Checked ? EnumUpdateMode.Append : EnumUpdateMode.Update,
                checkBoxDeep.Checked ? EnumBuildMode.Depth : EnumBuildMode.Alititude, lineParam);
        }

        private EnumValidateType getEnumValidateType()
        {
            if (comboBoxExWidth.Text != "")
                return EnumValidateType.FangGou;
            else if ((pipelineTypeCbo.Text == "雨水") || (pipelineTypeCbo.Text == "污水") ||
                     (pipelineTypeCbo.Text == "雨污合流"))
                return EnumValidateType.PipeLineNoPress;
            else
                return EnumValidateType.PipeLinePress;
        }

        private void addLayerToGlobeControl(string layerName)
        {
            GSOLayer layerRuku = ctl.Globe.Layers.Add(datasource.GetDatasetByName(layerName));
            rukuLayer = layerRuku;
            //定位到该管线起点位置
            if (layerRuku.GetAllFeatures().Length > 0)
            {
                int num = layerRuku.GetAllFeatures().Length / 2;
                GSOFeature feature = layerRuku.GetAt(num);
                if (feature != null && feature.Geometry != null)
                    ctl.Globe.JumpToFeature(feature, 100);
                else
                    ctl.Globe.FlyToFeature(feature);
            }
        }

        private void reSetComboboxRansparency()
        {
            if (comboBoxExWidth.SelectedText != "")
                ComboboxRansparency.Value = 255;
            else
                ComboboxRansparency.Value = 125;

        }

        private void clearComboboxParam()
        {
            cmbID.Items.Clear();
            cmbFrom.Items.Clear();
            cmbTo.Items.Clear();
            startH.Items.Clear();
            endH.Items.Clear();
            cmbRadius.Items.Clear();
            comboBoxExHeight.Items.Clear();
            comboBoxExWidth.Items.Clear();
        }

        private void addComboboxParam(string strFiled)
        {
            cmbID.Items.Add(strFiled);
            cmbFrom.Items.Add(strFiled);
            cmbTo.Items.Add(strFiled);
            startH.Items.Add(strFiled);
            endH.Items.Add(strFiled);
            cmbRadius.Items.Add(strFiled);
            comboBoxExWidth.Items.Add(strFiled);
            comboBoxExHeight.Items.Add(strFiled);
        }

        private void initComboboxParam()
        {
            cmbID.SelectedItem = "编号";
            cmbFrom.SelectedItem = "起始埋深";
            cmbTo.SelectedItem = "终止埋深";
            cmbRadius.SelectedItem = "管径_毫米";
            comboBoxExHeight.SelectedItem = "沟道高";
            comboBoxExWidth.SelectedItem = "沟道宽";
        }

        private void comboBoxExLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxExLayer.SelectedIndex == -1)
                return;

            string layerName = Path.GetFileNameWithoutExtension(comboBoxExLayer.Text);
            GSOLayer layer = ctl.Globe.Layers.GetLayerByCaption(layerName);

            GSOFeatures features = layer.GetAllFeatures();
            if (features.Length == 0)
                return;
            clearComboboxParam();
            txtModelLayer.Text = layerName;

            for (int i = 0; i < features[0].GetFieldCount(); i++)
            {
                GSOFieldDefn fielddef = features[0].GetFieldDefn(i);
                addComboboxParam(fielddef.Name);
            }
            for (int i = 0; i < pipelineTypeCbo.Items.Count; i++)
            {
                if (comboBoxExLayer.Text.Contains(pipelineTypeCbo.Items[i].ToString()))
                    pipelineTypeCbo.Text = pipelineTypeCbo.Items[i].ToString();
            }

            initComboboxParam();
        }

        /// <summary>
        /// 关闭按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, EventArgs e)// 关闭
        {
            Close();
        }

        /// <summary>
        /// 窗体关闭事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmPipelineModelDB_FormClosing(object sender, FormClosingEventArgs e)
        {           
            pipelineTypeCbo.Items.Clear();
            ctl.Globe.Refresh();
        }

        private void pipelineTypeCbo_SelectedIndexChanged(object sender, EventArgs e)
        {
            if ((pipelineTypeCbo.Text =="雨水") || (pipelineTypeCbo.Text == "污水") ||
             (pipelineTypeCbo.Text == "雨污合流"))
                cmbReference.Text = "管底";
            else
                cmbReference.Text = "管顶";

            switch (pipelineTypeCbo.Text)
            {
                case "给水":
                    btnPipelineColor.BackColor = Color.FromArgb(0, 0, 255);
                    break;
                case "供电":
                    btnPipelineColor.BackColor = Color.FromArgb(255, 100, 150);
                    break;
                case "雨水":
                    btnPipelineColor.BackColor = Color.FromArgb(230, 120, 0);
                    break;
                case "污水":
                    btnPipelineColor.BackColor = Color.FromArgb(128, 64, 0);
                    break;
                case "天然气":
                    btnPipelineColor.BackColor = Color.FromArgb(215, 0, 64);
                    break;
                case "共通":
                    btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
                    break;
                case "电通":
                    btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
                    break;
                case "有线电视":
                    btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
                    break;
                case "监控":
                    btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
                    break;
                case "交通信号":
                    btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
                    break;
                case "路灯":
                    btnPipelineColor.BackColor = Color.FromArgb(255, 0, 150);
                    break;
                case "通讯":
                    btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0);
                    break;
            }
        }

        private void checkBoxAdd_CheckedChanged(object sender, EventArgs e)
        {
            checkBoxReset.Checked = !checkBoxAdd.Checked;
        }

        private void checkBoxReset_CheckedChanged(object sender, EventArgs e)
        {
            checkBoxAdd.Checked = !checkBoxReset.Checked;
        }

        private void checkBoxDeep_CheckedChanged(object sender, EventArgs e)
        {
            checkBoxH.Checked = !checkBoxDeep.Checked;
            chkDeep.Checked = true;
        }

        private void checkBoxH_CheckedChanged(object sender, EventArgs e)
        {
            checkBoxDeep.Checked = !checkBoxH.Checked;
            chkDeep.Checked = false;
        }

        private void cmbReference_SelectedIndexChanged(object sender, EventArgs e)
        {
            startH.SelectedItem = "起始" + cmbReference.Text + "高";
            endH.SelectedItem = "终止" + cmbReference.Text + "高";
        }


        /*
        private void buttonOpen_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "*.shp|*.shp";
            dlg.Multiselect = false;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                GSOLayer layer = ctl.Globe.Layers.Add(dlg.FileName);

                comboBoxExLayer.Items.Add(Path.GetFileName(dlg.FileName));
                comboBoxExLayer.SelectedItem = Path.GetFileName(dlg.FileName);
                
                GSOFeatures features = layer.GetAllFeatures();
                if (features.Length == 0)
                    return;

                clearComboboxParam();
                for (int i = 0; i < features[0].GetFieldCount(); i++)
                {
                    GSOFieldDefn fielddef = features[0].GetFieldDefn(i);
                    addComboboxParam(fielddef.Name);
                }
                initComboboxParam();
            }

            txtModelLayer.Text = "SH" + Path.GetFileNameWithoutExtension(comboBoxExLayer.Text) 
                + DateTime.Now.ToString("yyyyMMdd");
        }
         * */

    }
}