Newer
Older
LSPipeline / FrmPolygonToWater.cs
wxn on 1 Dec 2016 8 KB first
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;

namespace WorldGIS
{
    public partial class FrmPolygonToWater : Form
    {
        GSOFeatures mFeaturesOld;
        GSOFeatures mFeatures;
        GSOGlobeControl mGlobeControl;
        GSOLayer mLayer;

        public FrmPolygonToWater(GSOGlobeControl globeControl,GSOLayer layer)
        {
            mGlobeControl = globeControl;
            mLayer = layer;
            InitializeComponent();
        }

        private void FrmPolygonToWater_Load(object sender, EventArgs e)
        {
            mFeatures = mLayer.GetAllFeatures();
            mFeaturesOld = new GSOFeatures();
            bool hasGeoWater = false;
            for (int i = 0; i < mFeatures.Length; i++)
            {
                if (mFeatures[i] != null)
                {
                    mFeaturesOld.Add(mFeatures[i].Clone());
                    if (!hasGeoWater)
                    {
                        if (mFeatures[i].Geometry != null && mFeatures[i].Geometry.Type == EnumGeometryType.GeoWater)
                        {
                            GSOGeoWater geoWater = (GSOGeoWater)mFeatures[i].Geometry;
                            // 水一般都是绝对高度模式
                            //geoWater.Altitude = EnumAltitudeMode.Absolute; 

                            textBoxWaveSpeedX.Text = geoWater.WaveSpeedX.ToString();
                            textBoxWaveSpeedY.Text = geoWater.WaveSpeedY.ToString();
                            textBoxWaveWidth.Text = geoWater.WaveWidth.ToString();
                            pictureBoxWaterColor.BackColor = geoWater.WaterColor;
                            pictureBoxReflectColor.BackColor = geoWater.ReflectColor;
                            textBoxNormalImage.Text = geoWater.WaveNormalImage;
                            textBoxDuDvImage.Text = geoWater.WaveDuDvImage;
                            checkboxReflectSky.Checked = geoWater.ReflectSky;
                            checkBoxWaveLOD.Checked = geoWater.UseWaveLOD;

                            hasGeoWater = true;
                        }
                    }
                }
            }
            if (!hasGeoWater)
            {
                textBoxWaveSpeedX.Text = "" + 0;
                textBoxWaveSpeedY.Text = "" + 0.00999999977648258;
                textBoxWaveWidth.Text = "" + 1;
                comboBoxLightType.SelectedIndex = 0;
            }
        }

        private void buttonOk_Click(object sender, EventArgs e)
        {
            if (apply())
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
        }

        private void pictureBoxWaterColor_Click(object sender, EventArgs e)
        {
            ColorDialog dlg = new ColorDialog();
            dlg.FullOpen = true;
            dlg.Color = pictureBoxWaterColor.BackColor;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                pictureBoxWaterColor.BackColor = dlg.Color;              
            }
        }  

        private void pictureBoxReflectColor_Click(object sender, EventArgs e)
        {
            ColorDialog dlg = new ColorDialog();
            dlg.FullOpen = true;
            dlg.Color = pictureBoxReflectColor.BackColor;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                pictureBoxReflectColor.BackColor = dlg.Color;                
            }
        }  

        private void buttonNormalImage_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "(*.jpg)|*.jpg|(*.*)|*.*";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                textBoxNormalImage.Text = dlg.FileName;                
            }
        }

        private void buttonDuDvImage_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "(*.jpg)|*.jpg|(*.jpeg)|*.jpeg|(*.bmp)|*.bmp|(*.png)|*.png|(*.*)|*.*";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                textBoxDuDvImage.Text = dlg.FileName;                
            }
        }

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            mLayer.RemoveAllFeature();
            mLayer.AddFeatures(mFeaturesOld);
            mGlobeControl.Refresh();
            this.Close();
        }

        private void buttonApply_Click(object sender, EventArgs e)
        {
            apply();
        }

        private bool apply()
        {
            double waveSpeedX = 0;
            if (!double.TryParse(textBoxWaveSpeedX.Text.Trim(), out waveSpeedX))
            {
                MessageBox.Show("水波横向速度不符合要求");
                return false ;
            }
            double waveSpeedY = 0;
            if (!double.TryParse(textBoxWaveSpeedY.Text.Trim(), out waveSpeedY))
            {
                MessageBox.Show("水波纵向速度不符合要求");
                return false;
            }
            double waveWidth = 0;
            if (!double.TryParse(textBoxWaveWidth.Text.Trim(), out waveWidth))
            {
                MessageBox.Show("水波宽度不符合要求");
                return false;
            }
            Color waterColor = pictureBoxWaterColor.BackColor;
            Color reflectorColor = Color.FromArgb(Convert.ToByte(upDownReflectOpaque.Value), pictureBoxReflectColor.BackColor);
            int intLightType = comboBoxLightType.SelectedIndex;
            string waveNormalImagePath = textBoxNormalImage.Text;
            string waveDuDvImagePath = textBoxDuDvImage.Text;
            GSOFeatures featuresAdded = new GSOFeatures();
            GSOFeatures featuresNomal = new GSOFeatures();
            for (int i = mFeatures.Length - 1; i >= 0 ; i--)
            {
                GSOFeature feature = mFeatures[i];
                if (feature != null && feature.Geometry != null)
                {
                    if (feature.Geometry.Type == EnumGeometryType.GeoPolygon3D)
                    {
                        GSOGeoPolygon3D geoPolygon3d = (GSOGeoPolygon3D)feature.Geometry;
                        GSOGeoWater geoWater = geoPolygon3d.ConvertToGeoWater();
                        // 水一般都是绝对高度模式
                        //geoWater.Altitude = EnumAltitudeMode.Absolute; 

                        geoWater.WaveSpeedX = waveSpeedX;
                        geoWater.WaveSpeedY = waveSpeedY;
                        geoWater.WaveWidth = waveWidth;
                        geoWater.WaterColor = waterColor;
                        geoWater.ReflectColor = reflectorColor;
                        geoWater.WaveNormalImage = waveNormalImagePath;
                        geoWater.WaveDuDvImage = waveDuDvImagePath;
                        geoWater.ReflectSky = checkboxReflectSky.Checked;
                        geoWater.UseWaveLOD = checkBoxWaveLOD.Checked;


                        GSOFeature newFeature = feature.Clone();                                             
                        geoWater.Play();                        
                        newFeature.Geometry = geoWater;
                        
                        featuresAdded.Add(newFeature);
                        
                    }
                    else if (feature.Geometry.Type == EnumGeometryType.GeoWater)
                    {
                        GSOGeoWater geoWater = (GSOGeoWater)feature.Geometry;
                        // 水一般都是绝对高度模式
                        //geoWater.Altitude = EnumAltitudeMode.Absolute; 

                        geoWater.WaveSpeedX = waveSpeedX;
                        geoWater.WaveSpeedY = waveSpeedY;
                        geoWater.WaveWidth = waveWidth;
                        geoWater.WaterColor = waterColor;
                        geoWater.ReflectColor = reflectorColor;
                        geoWater.WaveNormalImage = waveNormalImagePath;
                        geoWater.WaveDuDvImage = waveDuDvImagePath;
                        geoWater.ReflectSky = checkboxReflectSky.Checked;
                        geoWater.UseWaveLOD = checkBoxWaveLOD.Checked;

                        GSOFeature newFeature = feature.Clone();                        
                        geoWater.Play();
                        newFeature.Geometry = geoWater;

                        featuresAdded.Add(newFeature);                      
                    }
                    else
                    {
                        featuresNomal.Add(feature);
                    }
                }
            }
            mLayer.RemoveAllFeature();
            mLayer.AddFeatures(featuresAdded);
            mLayer.AddFeatures(featuresNomal);
            mGlobeControl.Refresh();
            return true;
        }
    }
}