Newer
Older
GHFX_REFACTOR / Forms / FrmMnModify.cs
wxn on 2 Nov 2016 13 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.Data;
using GeoScene.Engine;
using System.Collections;
using System.IO;

namespace Cyberpipe.Forms
{
    public partial class FrmMnModify : Office2007Form
    {
        private GSOGlobeControl globecontrol;
        private string shlayername;
        MainFrm mainfrm=null;

        private double movex = 0;
        private double movey = 0;
        private double movez = 0; 

        public ArrayList shresultLists = new ArrayList();

        //定位和闪烁初始化定义
        int count = 0;
        private string flashflag = "single";
        GSOFeature hlfeature = null;

        public FrmMnModify(GSOGlobeControl _globecontrol, string _shlyr,ArrayList _shresultLists)
        {
            InitializeComponent();
            globecontrol = _globecontrol;
            shlayername = _shlyr;
            shresultLists = _shresultLists;
        }
         
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMnModify_Load(object sender, EventArgs e)
        {
            moveXLbl.Text = "";
            moveUpLbl.Text = "";

            mainfrm = (MainFrm)this.Owner;
            if (shlayername != "") {
                //MessageBox.Show("yes"+"==="+shlayername);
                GSOLayer layer = globecontrol.Globe.Layers.GetLayerByCaption(shlayername);
                layer.Editable = true;
            } else {
                //MessageBox.Show("no");
            }
            int idx = -1;
            for (int i = 0; i < shresultLists.Count; i++) {
                ShResult sr = (ShResult)shresultLists[i];

                idx = questionGrid.Rows.Add();

                questionGrid.Rows[idx].Cells[0].Value = sr.layerid;
                questionGrid.Rows[idx].Cells[1].Value = sr.question;
            } 
        }
        /// <summary>选中对象
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX1_Click(object sender, EventArgs e)
        {
            globecontrol.Globe.Action = EnumAction3D.SelectObject;
        }
        /// <summary>
        /// 选中某一行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void questionGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
             if (questionGrid.SelectedCells.Count > 0){
                 DataGridViewRow row = questionGrid.Rows[questionGrid.SelectedCells[0].RowIndex];

                 selectLbl.Text = row.Cells["问题图层编号"].Value.ToString();
             }

             GSOLayer centerlayer = globecontrol.Globe.Layers.GetLayerByCaption(shlayername);
             GSOFeatures feats = centerlayer.GetFeatureByName(selectLbl.Text, true);
             if (centerlayer != null)
             {
                 for (int j = 0; j < feats.Length; j++)
                 {
                     if (feats[j].Name == selectLbl.Text)
                     {
                         //m_feature = features[j];
                         GSOFeature rowFeature = feats[j];
                         if (rowFeature == null)
                             continue;
                         if (rowFeature.Geometry != null && rowFeature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                         {
                             GSOGeoPolyline3D line = rowFeature.Geometry as GSOGeoPolyline3D;
                             double length = line.GetSpaceLength(true, 6378137);//线的长度;
                             GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2);
                             GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1];
                             globecontrol.Globe.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 50);
                             //globecontrol.Globe.FlyAroundPosition(point3d, true, 10, EnumFlyRepeatValueType.Degrees);

                             hlfeature = rowFeature;
                             highlight();
                         }
                         else
                         {
                             globecontrol.Globe.JumpToFeature(rowFeature, 300);
                         }
                     }
                 }
             }
        }
        /// <summary>
        /// 高亮显示
        /// </summary>
        public void highlight()
        {
            flashflag = "single";
            timer1.Start();
        }

        /// <summary>
        /// 平移对象
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (selectLbl.Text != "")
            {
                if (isNumber(moveXTxt.Text.Trim()) && isNumber(moveYTxt.Text.Trim()))
                {

                    double disx = double.Parse(moveXTxt.Text.Trim());//jingdu
                    double disy = double.Parse(moveYTxt.Text.Trim());//weidu


                    GSOLayer moniLayer = globecontrol.Globe.Layers.GetLayerByCaption(shlayername);
                    if (moniLayer != null)
                    {
                        GSOFeatures monifeats = moniLayer.GetFeatureByFieldValue("编号", selectLbl.Text, true);
                        for (int i = 0; i < monifeats.Length; i++)
                        {
                            GSOFeature monifeat = monifeats[i];
                            GSOGeometry monifeatline = monifeat.Geometry;
                            GSOPoint3d pts = monifeatline.GeoCenterPoint;
                            double pl = pts.X;
                            double pa = pts.Y;

                            double movealtitude = disy / 110 / 1000;
                            double movelongitude = disx / 110 / 1000 / Math.Cos(pa);

                            if (monifeat != null)
                            {
                                monifeat.Geometry.MoveXY(movelongitude, movealtitude);
                            }
                        }
                        moniLayer.Save();

                    }

                    movex += disx;
                    movey += disy;
                    moveXLbl.Text = movex.ToString();
                    moveYLbl.Text = movey.ToString();
                }
                else {
                    MessageBox.Show("请输入数字");
                }
            }
            else {
                MessageBox.Show("请选择要修改的管线");
            }
        }
        /// <summary>
        /// 升降对象
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (selectLbl.Text != "")
            {
                if (isNumber(moveZTxt.Text.Trim()))
                { 
                    double dis = double.Parse(moveZTxt.Text.Trim());
                    GSOLayer moniLayer = globecontrol.Globe.Layers.GetLayerByCaption(shlayername);
                    if (moniLayer != null)
                    {
                        GSOFeatures monifeats = moniLayer.GetFeatureByFieldValue("编号", selectLbl.Text, true);
                        for (int i = 0; i < monifeats.Length; i++)
                        {
                            GSOFeature monifeat = monifeats[i];
                            if (monifeat != null)
                            {
                                monifeat.Geometry.MoveZ(dis);
                            }
                        }
                        moniLayer.Save();
                    }
                    moniLayer.Dataset.Save();

                    movez += dis;
                    moveUpLbl.Text = movez.ToString();
                }
                else {
                    MessageBox.Show("请输入数字");
                }
            }
            else {
                MessageBox.Show("请选择要修改的管线");
            }
        }
        /// <summary>
        /// 判断是否为数字
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        private bool isNumber(string s)
        {
            int Flag = 0;
            char[] str = null;

            if (s.Contains('-'))
            {
                double ds  = Math.Abs(Double.Parse(s));
                s = ds.ToString();

                str = s.ToCharArray();
                for (int i = 0; i < str.Length; i++)
                {
                    if (Char.IsNumber(str[i]))
                    {
                        Flag++;
                    }
                    else
                    {
                        Flag = -1;
                        break;
                    }
                }
            }
            else {
                str = s.ToCharArray();
                for (int i = 0; i < str.Length; i++)
                {
                    if (Char.IsNumber(str[i]))
                    {
                        Flag++;
                    }
                    else
                    {
                        Flag = -1;
                        break;
                    }
                }
            }
            if (Flag > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        } 

        /// <summary>
        /// 导出cad
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            string checkItemText = "";
            if (shlayername!=null)
            {
                checkItemText = shlayername;
                try
                {
                    GSOLayer layer = globecontrol.Globe.Layers.GetLayerByCaption(checkItemText.Trim());
                    if (layer != null)
                    {
                        if (layer.GetAllFeatures().Length <= 0)
                        {
                            MessageBox.Show("要导出的图层为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return;
                        }
                        layer.Dataset.ImportProjectionRefFromProj4(Utility.projectStr);
                        SaveFileDialog dlg = new SaveFileDialog();
                        dlg.Filter = "*.dxf|*.dxf";
                        dlg.FileName = layer.Caption;
                        if (dlg.ShowDialog() == DialogResult.OK)
                        {
                            if (layer.GetAllFeatures().Length > 0)
                            {
                                layer.SaveAs(dlg.FileName);
                                string lprjFileName = dlg.FileName.Substring(0, dlg.FileName.LastIndexOf(".")) + ".lprj";
                                string lprjFileContent = "<Projects><Project><Index>0</Index><Type>prj4</Type><Param>" + Utility.projectStr + "</Param></Project></Projects>";
                                StreamWriter writer = new StreamWriter(lprjFileName, false);
                                writer.Write(lprjFileContent);
                                writer.Close();
                                //导出prj文件
                                string prjFileName = dlg.FileName.Substring(0, dlg.FileName.LastIndexOf(".")) + ".prj";
                                StreamWriter writer2 = new StreamWriter(prjFileName, false);
                                writer2.Write("");
                                writer2.Close();
                                if (!GSODataEngineUtility.ConvertProj4ToEsriPrjFile(Utility.projectStr, prjFileName))
                                {
                                    MessageBox.Show("导出CAD完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                    this.Close();
                                }

                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("请选中要导出的图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
                catch (Exception ex)
                {
                    LogError.PublishError(ex);
                }
            }
            else
            {
                MessageBox.Show("请选中要导出的图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            GSOFeature rowFeature = hlfeature;// as GSOFeature;
            if (rowFeature == null)
                return;

            if (count < 40)
            {
                count++; 
                    if (rowFeature != null)
                    {
                        if (count % 2 != 0)
                        {
                            rowFeature.HighLight = true;
                            globecontrol.Refresh();
                        }
                        else
                        {
                            rowFeature.HighLight = false;
                            globecontrol.Refresh();
                        }
                    }
                
            }
            else
            {
                timer1.Stop();
                rowFeature.HighLight = false;
                count = 0;
            }
        }

        private void FrmMnModify_FormClosed(object sender, FormClosedEventArgs e)
        {
            mainfrm.boolfrmModify = false;
           
        } 
    }
}