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.Engine; using System.Collections; using GeoScene.Globe; using GeoScene.Data; using System.IO; using System.Xml; using System.Text.RegularExpressions; namespace Cyberpipe.Forms { public partial class FrmPipelineModelDataOneStep : Office2007Form { private GeoScene.Globe.GSOGlobeControl ctl; GSODataSource ds; TreeView layerTree; private Hashtable en_cns = new Hashtable(); private Hashtable fields_types = new Hashtable(); private ArrayList layernamelist = new ArrayList(); string selectLayerName = ""; public GSOLayer rukuLayer = null; string layername = ""; GSOLayer shpLayer = null; public FrmPipelineModelDataOneStep(GSOGlobeControl _ctl, GSODataSource _ds, TreeView _layerTree) { ctl = _ctl; ds = _ds; layerTree = _layerTree; InitializeComponent(); } /// <summary> /// 单击选择shp格式文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnBrowseModel_Click(object sender, EventArgs e) { saveFileDialog1.Filter = "*.lgd|*.lgd"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { txtModelLayer.Text = saveFileDialog1.FileName; } } /// <summary> /// 窗体初始化事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmPipelineModelDataOneStep_Load(object sender, EventArgs e) { string pipelinetype = Utility.pipelinetype; pipelinetype += ",管沟"; string[] pipelinetypes = pipelinetype.Split(','); for (int i = 0; i < pipelinetypes.Length; i++) { pipelineTypeCbo.Items.Add(pipelinetypes[i]); } if (ctl != null) { for (int i = 0; i < ctl.Globe.Layers.Count; i++) { GSOLayer layer = ctl.Globe.Layers[i]; if (layer != null && layer.Name.ToLower().EndsWith(".shp")) { comboBoxEx1.Items.Add(layer.Name); layernamelist.Add(layer.Name); } } } string filename = Application.StartupPath + "\\FormText.xml"; if (File.Exists(filename)) { XmlTextReader XmlReader = new XmlTextReader(filename); try { while (XmlReader.Read()) { if (XmlReader.Name == "Field") { string str1 = XmlReader["label"]; string str3 = XmlReader["type"]; string str2 = XmlReader.ReadElementString(); en_cns.Add(str1, str2); fields_types.Add(str1, str3); } } } catch (Exception ex) { LogError.PublishError(ex); MessageBox.Show(ex.Message); } } } private object convertFieldValue(string fieldname, object obj) { if (obj == null) return null; try { string type = fields_types[fieldname].ToString(); switch (type) { case "string": return obj.ToString(); case "int": //return 101; int intResult; if (int.TryParse(obj.ToString(), out intResult)) return intResult; else return null; case "double": //return 202.5; double doubleResult; if (double.TryParse(obj.ToString(), out doubleResult)) return doubleResult; else return null; case "date": DateTime dtResult; if (DateTime.TryParse(obj.ToString(), out dtResult)) return dtResult; else return null; } return null; } catch (Exception ex) { LogError.PublishError(ex); return null; } } public string lgdFilePath = ""; /// <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; } } /// <summary> /// 建模按钮事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnCreateModel_Click(object sender, EventArgs e) //建模 { if (ds == null) { MessageBox.Show("未连接数据库,请先连接数据库!", "提示"); return; } /* if (!Utility.isNetworkConnectionSuccess(Utility.sgdbip)) { MessageBox.Show("网络连接失败!", "提示"); return; }*/ if (textBoxLayer.Text.Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (pipelineTypeCbo.Text.Trim() == "") { MessageBox.Show("请选择管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (!txtLayername.Text.Trim().Contains("SH")) { txtLayername.Text = "SH" + txtLayername.Text.ToString(); } if (txtLayername.Text.Trim().Length >= 20) { MessageBox.Show("请修改图层名称为20个字符以下", "提示"); return; } if (txtLayername.Text.Trim().Contains(@"-") || txtLayername.Text.Trim().Contains(@"\") || txtLayername.Text.Trim().Contains(@"/")||txtLayername.Text.Trim().Contains(@"@")) { MessageBox.Show("图层名称中不能包含“-”、“\\”、“/”、“@”等字符!", "提示"); return; } //判断是数字或者存在特殊字符串 string SuiD = txtLayername.Text.ToString().Trim(); Regex reg = new Regex("^[0-9]");//判断是不是数据,要不是就表示没有选择。则从隐藏域里读出来 Match ma = reg.Match(SuiD); if (ma.Success) { MessageBox.Show("管线图层名称不能全部为数字!", "警告"); return; } if (string.IsNullOrEmpty(txtLayername.Text)) { MessageBox.Show("管线图层名称无效!", "提示"); return; } try { string txtMessage = valiPipeData(shpLayer); if (txtMessage != "") { FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(shpLayer.Name, txtMessage); showErrorMessage.ShowDialog(); return; } GSODataset dataset = ds.GetDatasetByName(txtLayername.Text.Trim()); GSOFeatureDataset layer; if (dataset != null) { DialogResult result = MessageBox.Show("管线图层名称在数据库中已存在!是否向该表追加", "提示", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { layer = dataset as GSOFeatureDataset; } else { return; } } else { layer = CreateDBFeatureDataset(txtLayername.Text.Trim()); } if (layer == null) { return; } GSOLayer sourceLayer = ctl.Globe.Layers.GetLayerByCaption(selectLayerName); layer.Open(); lgdFilePath = txtLayername.Text; GSOFeatures features = sourceLayer.GetAllFeatures(true); 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) { if (f.IsFieldValueNull("Handle") == false) { string fieldID = f.GetFieldAsString("Handle").Trim(); if (fieldID != "") { sql += "'" + fieldID + "',"; } } } } sql = sql.Substring(0, sql.Length - 1); sql += ")"; OledbHelper.sqlExecuteNonQuery(sql, Utility.sgdbip, Utility.sgdbname, Utility.sgdbuser, Utility.sgdbpwd); } layer.Close(); layer.Open(); string message = ""; if (layer != null) { for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; GSOGeoPolyline3D lineeee = f.Geometry as GSOGeoPolyline3D; if (lineeee == null) { message += "ID为" + f.ID + "的对象不是一个线对象\n"; continue; } double length = lineeee.GetSpaceLength(true, 6378137); if (length == 0) { message += "ID为" + f.ID + "的管线长度为0\n"; continue; } GSOFeature newFeature = layer.CreateFeature(); GSOPipeLineStyle3D style = new GSOPipeLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); double radius = 0; GSOFieldDefn field = (GSOFieldDefn)(f.GetFieldDefn(cmbRadius.SelectedItem.ToString())); if (field.Type == EnumFieldType.Text) { string temp = f.GetFieldAsString(cmbRadius.SelectedItem.ToString()); double outNum = 0; bool num = double.TryParse(temp, out outNum); if (num) radius = outNum / 2000; } else if (field.Type == EnumFieldType.Double || field.Type == EnumFieldType.INT32) radius = f.GetFieldAsDouble(cmbRadius.SelectedItem.ToString()) / 2000;// 探测数据的单位一般是毫米,需换算为米; 管径一般是 直径, 这个需要半径, 所有除以2000 string eventid = f.GetFieldAsString(cmbID.SelectedItem.ToString()); if (radius == 0) { message += "ID为" + f.ID + "的管线半径为0\n"; continue; } /* int num_width = 1; int num_height = 1; if (f.GetFieldAsString("Hor_Num") != null && f.GetFieldAsString("Ver_Num") != null) { if (!int.TryParse(f.GetFieldAsString("Hor_Num"), out num_width)) { message += "ID为" + f.ID + "的对象的宽度字段值不符合要求!\r\n"; } if (!int.TryParse(f.GetFieldAsString("Ver_Num"), out num_height)) { message += "ID为" + f.ID + "的对象的高度字段值不符合要求!\r\n"; } if (num_height == 0 || num_width == 0) { num_width = 1; num_height = 1; } } else { num_width = 1; num_height = 1; } double rectWidth = Math.Round(radius * 2.0 * num_width + 0.08, 5);//两端空出0.04 double rectHeight = Math.Round(radius * 2.0 * num_height + 0.08, 5); * */ style.Radius = radius; style.Slice = int.Parse(txtSlice.Text); style.CornerSliceAngle = Convert.ToDouble(textBoxCornerSliceAngle.Text); f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) return; double deep1 = f.GetFieldAsDouble(cmbFrom.SelectedItem.ToString()); double deep2 = f.GetFieldAsDouble(cmbTo.SelectedItem.ToString()); if (chkDeep.Checked) { deep1 = 0 - deep1; deep2 = 0 - deep2; } if (cmbReference.SelectedIndex == 0) //管底 { deep1 = deep1 + radius * 2; deep2 = deep2 + radius * 2; } else if (cmbReference.SelectedIndex == 1) //管顶 { deep1 = deep1 - radius * 2; deep2 = deep2 - radius * 2; } GSOPoint3ds pt3ds = new GSOPoint3ds(); for (int n = 0; n < line[0].Count; n++) { GSOPoint3d pt3d = line[0][n]; int pointcount = line[0].Count; double fenmu = Math.Sqrt(Math.Pow(line[0][pointcount - 1].Y - line[0][0].Y, 2) + Math.Pow(line[0][pointcount - 1].X - line[0][0].X, 2)); if (fenmu == 0) { pt3d.Z = deep1; } else { double radio = Math.Sqrt(Math.Pow(pt3d.Y - line[0][0].Y, 2) + Math.Pow(pt3d.X - line[0][0].X, 2)) / fenmu; pt3d.Z = deep1 + (deep2 - deep1) * radio; } if (double.IsInfinity(pt3d.Z)) { pt3d.Z = deep2; } pt3ds.Add(pt3d); } line[0] = pt3ds; if (checkBox1.Checked == true) { newFeature.Geometry = line; // f.Geometry; newFeature.Geometry.Style = style; newFeature.Name = eventid; for (int i = 0; i < f.GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(f.GetFieldDefn(i)); if (fielddef == null) { continue; } if (!en_cns.Contains(fielddef.Name)) { continue; } object fieldvalue = f.GetValue(fielddef.Name); if (fieldvalue == null) continue; string fieldName = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name; newFeature.SetValue(fieldName, fieldvalue); } layer.AddFeature(newFeature); } else if (checkBox2.Checked == true) { double rectWidth = f.GetFieldAsDouble("Weight"); double rectHeight = f.GetFieldAsDouble("Height"); /* double rectWidth = Math.Round(radius * 2.0 * num_width + 0.08, 5);//两端空出0.04 double rectHeight = Math.Round(radius * 2.0 * num_height + 0.08, 5); */ GSOFeature rectfeat = layer.CreateFeature(); rectfeat.Geometry = CreatePipeRect(line, rectWidth, rectHeight); rectfeat.Name = eventid; if (rectfeat != null) { SetFields(f, rectfeat); layer.AddFeature(rectfeat); } } } } ctl.Refresh(); layer.Save(); MessageBox.Show("入库成功!", "提示"); //重新连接数据库,添加图层 ds = ctl.Globe.DataManager.OpenOracleDataSource(Utility.sgdbip.Trim() + "/" + Utility.sgdbname.Trim(), "", "", Utility.sgdbuser, Utility.sgdbpwd); GSOLayer sourceLayer2 = ctl.Globe.Layers.GetLayerByCaption(selectLayerName); if (sourceLayer2 != null) { ctl.Globe.Layers.Remove(sourceLayer2); } layer.Caption = layer.Name; GSOLayer layerRuku = ctl.Globe.Layers.Add(layer); rukuLayer = layerRuku; //重新调整模型位置,这样可以保证新入库的管线也能通过调节透明度隐现 ctl.Globe.Layers.MoveTo(0, ctl.Globe.Layers.Count - 1); ctl.Globe.Refresh(); //定位到该管线起点位置 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); } } //tree 取消enable foreach (TreeNode n in layerTree.Nodes) { if (n.Text == "基础背景图层") { if (n.Checked) { n.Checked = false; } } } this.DialogResult = DialogResult.OK; this.Close(); } catch (Exception ex) { LogError.PublishError(ex); MessageBox.Show(ex.Message); } } /// <summary> /// 验证shp格式文件 /// </summary> /// <param name="layer"></param> /// <returns></returns> private string valiPipeData(GSOLayer layer) //验证shp格式文件 { 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 (fields_types.ContainsKey(fieldName)) { string fieldType = fields_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("Deep1")) { txtMessage += "Deep1字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Deep1"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Deep1字段必须为数值类型\r\n"; } } if (!lstField.Contains("Deep2")) { txtMessage += "Deep2字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Deep2"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Deep2字段必须为数值类型\r\n"; } } if (!lstField.Contains("Diameter")) { txtMessage += "Diameter字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Diameter"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Diameter字段必须为数值类型\r\n"; } } if (checkBox2.Checked == true) { if (!lstField.Contains("Weight")) { txtMessage += "Weight字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Weight"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Weight字段必须为数值类型\r\n"; } } if (!lstField.Contains("Height")) { txtMessage += "Height字段不存在!\r\n"; } else { GSOFieldAttr fieldDeep1 = featDataSet.GetField("Height"); if (fieldDeep1.Type != EnumFieldType.Double && fieldDeep1.Type != EnumFieldType.Float && fieldDeep1.Type != EnumFieldType.INT16 && fieldDeep1.Type != EnumFieldType.INT32) { txtMessage += "Height字段必须为数值类型\r\n"; } } } if (!lstField.Contains("Handle")) { txtMessage += "Handle字段不存在!\r\n"; } List<string> lstHandle = new List<string>(); 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 (fields_types.ContainsKey(fieldName)) { if (f.GetValue(fieldName).ToString().Trim().Length > 8000) { txtMessage += "ID为" + f.ID + "的要素的字段" + fieldName + "的长度大于8000 !\r\n"; } } } if (f.GetFieldAsFloat("Diameter") <= 0) { txtMessage += "ID为" + f.ID + "\"Diameter\"字段中的值必须大于0 \r\n"; } if (checkBox2.Checked == true) { if (f.GetFieldAsFloat("Weight") <= 0) { txtMessage += "ID为" + f.ID + "\"Weight\"字段中的值必须大于0 \r\n"; } if (f.GetFieldAsFloat("Height") <= 0) { txtMessage += "ID为" + f.ID + "\"Height\"字段中的值必须大于0 \r\n"; } } if (!lstHandle.Contains(f.GetFieldAsString("Handle"))) { lstHandle.Add(f.GetFieldAsString("Handle")); } else { txtMessage += "ID为" + f.ID + "的\"Handle\"字段中的值重复\r\n"; } } } return txtMessage; } /// <summary> /// 创建数据库表对象 /// </summary> /// <param name="name"></param> /// <returns></returns> private GSOFeatureDataset CreateDBFeatureDataset(string name) { GSOLayer layer = ctl.Globe.Layers.GetLayerByCaption(selectLayerName); if (layer == null) { return null; } 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)); if (fielddef == null) { continue; } GSOFieldAttr field = new GSOFieldAttr(); field.Name = en_cns.ContainsKey(fielddef.Name) == true ? en_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 void cmbLayer_SelectedIndexChanged(object sender, EventArgs e) //选择图层 { GSOLayer layer = ctl.Globe.Layers.GetLayerByCaption(selectLayerName); GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) return; cmbFrom.Items.Clear(); cmbTo.Items.Clear(); cmbRadius.Items.Clear(); cmbID.Items.Clear(); for (int i = 0; i < features[0].GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); cmbFrom.Items.Add(fielddef.Name); cmbTo.Items.Add(fielddef.Name); cmbRadius.Items.Add(fielddef.Name); cmbID.Items.Add(fielddef.Name); } cmbFrom.SelectedItem = "Deep1"; cmbTo.SelectedItem = "Deep2"; cmbRadius.SelectedItem = "Diameter"; cmbID.SelectedItem = "Handle"; } private void buttonXLayerPath_Click(object sender, EventArgs e)//单击 选择shp格式的文件 { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "*.shp|*.shp"; dlg.Multiselect = false; if (dlg.ShowDialog() == DialogResult.OK) { GSOLayer layer = ctl.Globe.Layers.Add(dlg.FileName); shpLayer = layer; string txtMessage = valiPipeData(layer); if (txtMessage != "") { btnCreateModel.Enabled = false; textBoxLayer.Text = ""; cmbFrom.Items.Clear(); cmbTo.Items.Clear(); cmbRadius.Items.Clear(); cmbID.Items.Clear(); ctl.Globe.Layers.Remove(layer); FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(dlg.FileName, txtMessage); showErrorMessage.ShowDialog(); return; } else { btnCreateModel.Enabled = true; textBoxLayer.Text = dlg.FileName; selectLayerName = layer.Caption; txtModelLayer.Text = layer.Caption; GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) return; cmbFrom.Items.Clear(); cmbTo.Items.Clear(); cmbRadius.Items.Clear(); cmbID.Items.Clear(); for (int i = 0; i < features[0].GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); cmbFrom.Items.Add(fielddef.Name); cmbTo.Items.Add(fielddef.Name); cmbRadius.Items.Add(fielddef.Name); cmbID.Items.Add(fielddef.Name); } cmbFrom.SelectedItem = "Deep1"; cmbTo.SelectedItem = "Deep2"; cmbRadius.SelectedItem = "Diameter"; cmbID.SelectedItem = "Handle"; ShowPipelineName(dlg.FileName); } txtLayername.Text = "SH" + txtModelLayer.Text + DateTime.Now.ToString("yyyyMMdd"); layername = txtLayername.Text; } } private void ShowPipelineName(string fileName) { pipelineTypeCbo.Text = ""; for (int i = 0; i < pipelineTypeCbo.Items.Count; i++) { if (fileName.Contains(pipelineTypeCbo.Items[i].ToString())) { pipelineTypeCbo.Text = pipelineTypeCbo.Items[i].ToString(); continue; } } if (fileName.Contains("移动") || fileName.Contains("联通") || fileName.Contains("电信")) { pipelineTypeCbo.Text = "通讯"; } } /// <summary> /// 窗体关闭事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmPipelineModelDB_FormClosing(object sender, FormClosingEventArgs e) { if (ds != null) { ds.Close(); } ctl.Globe.Refresh(); } private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxEx1.SelectedIndex != -1) { string layerCaption = comboBoxEx1.SelectedItem.ToString().Trim(); GSOLayer layer = ctl.Globe.Layers.Add(layerCaption); string txtMessage = valiPipeData(layer); if (txtMessage != "") { btnCreateModel.Enabled = false; textBoxLayer.Text = ""; cmbFrom.Items.Clear(); cmbTo.Items.Clear(); cmbRadius.Items.Clear(); cmbID.Items.Clear(); ctl.Globe.Layers.Remove(layer); FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(layerCaption, txtMessage); showErrorMessage.ShowDialog(); return; } else { btnCreateModel.Enabled = true; textBoxLayer.Text = layerCaption; selectLayerName = layer.Caption; txtModelLayer.Text = layer.Caption; GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) return; cmbFrom.Items.Clear(); cmbTo.Items.Clear(); cmbRadius.Items.Clear(); cmbID.Items.Clear(); for (int i = 0; i < features[0].GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); cmbFrom.Items.Add(fielddef.Name); cmbTo.Items.Add(fielddef.Name); cmbRadius.Items.Add(fielddef.Name); cmbID.Items.Add(fielddef.Name); } cmbFrom.SelectedItem = "Deep1"; cmbTo.SelectedItem = "Deep2"; cmbRadius.SelectedItem = "Diameter"; cmbID.SelectedItem = "Handle"; } } } /// <summary> /// 选择不同管线 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pipelineTypeCbo_SelectedIndexChanged(object sender, EventArgs e) { string type = pipelineTypeCbo.Text; if ((pipelineTypeCbo.Text != "给水") && (pipelineTypeCbo.Text != "天然气") && (pipelineTypeCbo.Text != "燃气") && (pipelineTypeCbo.Text != "中水")) { cmbReference.Text = "管底"; } else { cmbReference.Text = "管顶"; } if (pipelineTypeCbo.Text == "给水") { btnPipelineColor.BackColor = Color.FromArgb(0, 0, 255); } else if (pipelineTypeCbo.Text == "供电") { btnPipelineColor.BackColor = Color.FromArgb(255, 100, 150); } else if (pipelineTypeCbo.Text == "雨水") { btnPipelineColor.BackColor = Color.FromArgb(230, 120, 0); } else if (pipelineTypeCbo.Text == "污水") { btnPipelineColor.BackColor = Color.FromArgb(128, 64, 0); } else if (pipelineTypeCbo.Text == "天然气") { btnPipelineColor.BackColor = Color.FromArgb(215, 0, 64); } else if (pipelineTypeCbo.Text == "共通") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "电通") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "有线电视") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "监控") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "交通信号") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "路灯") { btnPipelineColor.BackColor = Color.FromArgb(255, 0, 150); } else if (pipelineTypeCbo.Text == "通讯") { btnPipelineColor.BackColor = Color.FromArgb(0, 255, 0); } else if (pipelineTypeCbo.Text == "管沟") { btnPipelineColor.BackColor = Color.FromArgb(130, 60, 0); } else { btnPipelineColor.BackColor = Color.FromArgb(0, 0, 0); } //txtLayername.Text = type + layername; } /// <summary> /// 连接数据库 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX1_Click(object sender, EventArgs e) { if (ds == null) { //没连的话,直接连接审核库; //审核库配置读配置文件 string dbIp = Utility.sgdbip; string database = Utility.sgdbname; string user = Utility.sgdbuser; string pass = Utility.sgdbpwd; /* if (!Utility.isNetworkConnectionSuccess(dbIp.Trim())) { MessageBox.Show("网络连接失败!", "提示"); return; }*/ ds = ctl.Globe.DataManager.OpenOracleDataSource(dbIp + "/" + database, "", "", user, pass); if (ds == null) { MessageBox.Show("数据库连接失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { btnCreateModel.Enabled = true; } } } private void btnClose_Click(object sender, EventArgs e) { this.Close(); } /// <summary> /// 管线数据导入 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked == true) { checkBox2.Checked = false; } else { return; } } /// <summary> /// 管沟数据导入 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void checkBox2_CheckedChanged(object sender, EventArgs e) { if (checkBox2.Checked == true) { checkBox1.Checked = false; } else { return; } } private GSOGeoPolyline3D CreatePipeRect(GSOGeoPolyline3D line, double width, double height) { GSOGeoPolyline3D cloneline = line.Clone() as GSOGeoPolyline3D; GSOExtendSectionLineStyle3D style = createRectStyle(width, height); if (style == null) { return null; } cloneline.Style = style; return cloneline; } private GSOExtendSectionLineStyle3D createRectStyle(double width, double height) { GSOExtendSectionLineStyle3D style = new GSOExtendSectionLineStyle3D(); style.LineColor = Color.FromArgb(Convert.ToByte(numericUpDownLineOpaque.Value), btnPipelineColor.BackColor); if (width == 0 || height == 0) { return null; } GSOPoint3ds sectionpts = new GSOPoint3ds(); sectionpts.Add(new GSOPoint3d(width / -2, height / 2, 0)); sectionpts.Add(new GSOPoint3d(width / -2, height / -2, 0)); sectionpts.Add(new GSOPoint3d(width / 2, height / -2, 0)); sectionpts.Add(new GSOPoint3d(width / 2, height / 2, 0)); style.SetSectionPoints(sectionpts); style.IsClosed = true; style.SetAnchorByAlign(EnumAlign.MiddleCenter); return style; } private void SetFields(GSOFeature oldfeat, GSOFeature newFeature) { for (int i = 0; i < oldfeat.GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(oldfeat.GetFieldDefn(i)); object fieldvalue = oldfeat.GetValue(fielddef.Name); if (fieldvalue == null) continue; string fieldName = en_cns.ContainsKey(fielddef.Name) == true ? en_cns[fielddef.Name].ToString() : fielddef.Name; newFeature.SetValue(fieldName, fieldvalue); } } /* private void one2Multi(GSOGeoPolyline3D line, int num_width, int num_height, double interval, GSOPipeLineStyle3D style, GSOFeatureDataset layer, string name, GSOFeature oldfeat) { line = LatLon2Coord_Line(line); double width_all = interval * (num_width - 1); double height_all = interval * (num_height - 1); GSOGeoPolyline3D line_1 = line.Clone() as GSOGeoPolyline3D; GSOPoint3d p1 = line[0][0]; GSOPoint3d p2 = line[0][1]; double daltaX = p2.X - p1.X; double daltaY = p2.Y - p1.Y; double agree = Math.Atan(daltaY / daltaX); GSOPoint2d point = new GSOPoint2d((-0.5 * width_all - interval) * Math.Sin(agree), (0.5 * width_all + interval) * Math.Cos(agree)); line.MoveXY(point.X, point.Y); line.MoveZ(height_all / -2); for (int i = 0; i < num_width; i++) { for (int j = 0; j < num_height; j++) { GSOGeoPolyline3D templine = line.Clone() as GSOGeoPolyline3D; point = new GSOPoint2d((i + 1) * interval * Math.Sin(agree), -1 * (i + 1) * interval * Math.Cos(agree)); templine.MoveXY(point.X, point.Y); templine.MoveZ(interval * j); templine = Coord2LatLon_Line(templine); GSOFeature feat = layer.CreateFeature(); feat.Geometry = templine; feat.Geometry.Style = style; feat.Name = name; SetFields(oldfeat, feat); layer.AddFeature(feat); } } } private GSOGeoPolyline3D Coord2LatLon_Line(GSOGeoPolyline3D line) { GSOGeoPolyline3D newline = line.Clone() as GSOGeoPolyline3D; GSOPoint3ds ps = newline[0]; for (int i = 0; i < ps.Count; i++) { GSOPoint3d pt = ps[i]; GSOPoint2d pt2d = new GSOPoint2d(pt.X, pt.Y); GSOPoint2d pt2dnew = Coord2LatLon(pt2d); GSOPoint3d ptnew = new GSOPoint3d(pt2dnew.X, pt2dnew.Y, pt.Z); ps[i] = ptnew; } newline[0] = ps; return newline; } private GSOPoint2d LatLon2Coord(GeoScene.Data.GSOPoint2d pt2d) { int id = GeoScene.Data.GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=-50000 +y_0=-4210000 +ellps=krass +units=m +no_defs"); GeoScene.Data.GSOPoint2d result = GeoScene.Data.GSOProjectManager.Forward(pt2d, id); return result; } private GSOPoint2d Coord2LatLon(GeoScene.Data.GSOPoint2d pt2d) { int id = GeoScene.Data.GSOProjectManager.AddProject("+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=-50000 +y_0=-4210000 +ellps=krass +units=m +no_defs"); GeoScene.Data.GSOPoint2d result = GeoScene.Data.GSOProjectManager.Inverse(pt2d, id); return result; } */ } }