using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Collections; using GeoScene.Data; using System.Text.RegularExpressions; using GeoScene.Engine; using GeoScene.Globe; using System.Xml; using DevComponents.DotNetBar; namespace Cyberpipe { public partial class FrmAddWellShp : Office2007Form { GeoScene.Globe.GSOGlobeControl globeControl1; GSODataSource ds; private Hashtable gj_cns = new Hashtable(); private Hashtable gj_types = new Hashtable(); string selectLayerName = ""; public GSOLayer rukuLayer = null; private List<String> layernamelist = new List<string>(); public FrmAddWellShp(GeoScene.Globe.GSOGlobeControl _globeControl1, GSODataSource _ds) { globeControl1 = _globeControl1; ds = _ds; InitializeComponent(); } /// <summary> /// 验证shp格式文件 /// </summary> /// <param name="layer"></param> /// <returns></returns> private string valiFuShuWudata(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 (gj_types.ContainsKey(fieldName)) { string fieldType = gj_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"; } } if (!lstField.Contains("X坐标")) { txtMessage += "X坐标字段不存在!\r\n"; } else { GSOFieldAttr fieldZ = featDataSet.GetField("X坐标"); if (fieldZ.Type != EnumFieldType.Double && fieldZ.Type != EnumFieldType.Float && fieldZ.Type != EnumFieldType.INT16 && fieldZ.Type != EnumFieldType.INT32) { txtMessage += "\"X坐标\"字段必须为数值类型 \r\n"; } } if (!lstField.Contains("Y坐标")) { txtMessage += "Y坐标字段不存在!\r\n"; } else { GSOFieldAttr fieldZ = featDataSet.GetField("Y坐标"); if (fieldZ.Type != EnumFieldType.Double && fieldZ.Type != EnumFieldType.Float && fieldZ.Type != EnumFieldType.INT16 && fieldZ.Type != EnumFieldType.INT32) { txtMessage += "\"Y坐标\"字段必须为数值类型 \r\n"; } } if (!lstField.Contains("附属物名称")) { txtMessage += "附属物名称字段不存在!\r\n"; } else { GSOFieldAttr fieldZ = featDataSet.GetField("附属物名称"); if (fieldZ.Type != EnumFieldType.Text) { txtMessage += "\"附属物名称\"字段必须为数值类型 \r\n"; } } if (!lstField.Contains("所属道路")) { txtMessage += "所属道路字段不存在!\r\n"; } else { GSOFieldAttr fieldZ = featDataSet.GetField("所属道路"); if (fieldZ.Type != EnumFieldType.Text) { 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 (gj_types.ContainsKey(fieldName)) { if (f.GetValue(fieldName).ToString().Trim().Length > 8000) { txtMessage += "名称为" + f.Name + "的要素的字段" + fieldName + "的长度大于8000 !\r\n"; } } } } } return txtMessage; } private ArrayList files =new ArrayList (); private ArrayList modeltypes = new ArrayList(); // 井的型号 private ArrayList deeps = new ArrayList(); /// <summary> /// 确定按钮事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click(object sender, EventArgs e) { if (comboBoxEx1.SelectedItem.ToString().Trim() == "") { MessageBox.Show("请选择一个图层文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { /* if (!Utility.isNetworkConnectionSuccess(FrmDatabaseParaSetting.dbIp)) { MessageBox.Show("网络连接失败!", "提示"); return; } * */ if (txtLayerName.Text.Trim() == "") { MessageBox.Show("图层名称为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //判断是数字或者存在特殊字符串 string SuiD = txtLayerName.Text.Trim(); Regex reg = new Regex("^[0-9]");//判断是不是数据,要不是就表示没有选择,则从隐藏域里读出来 Match ma = reg.Match(SuiD); if (ma.Success) { MessageBox.Show("图层名称不能以数字开头!", "警告"); return; } Regex regNum = new Regex("^[0-9]"); GSODataset dataset = ds.GetDatasetByName(txtLayerName.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(txtLayerName.Text.Trim()); } if (featdataset == null) { return; } featdataset.Open(); GSOLayer shpLayer = globeControl1.Globe.Layers.GetLayerByCaption(selectLayerName); if (shpLayer == null) return; if (featdataset != null) { GSOFeatures features = shpLayer.GetAllFeatures(true); GSOFeatures layerFeatures = featdataset.GetAllFeatures(); List<string> listFeature = new List<string>(); if (layerFeatures.Length != 0) { for (int m = 0; m < layerFeatures.Length; m++) { GSOFeature ff = layerFeatures[m]; listFeature.Add(ff.Name); } } /* 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 && f.IsFieldValueNull("编号") == false) { string fieldID = f.GetFieldAsString("编号").Trim(); if (fieldID != "") { sql += "'" + fieldID + "',"; } } } sql = sql.Substring(0, sql.Length - 1); sql += ")"; OledbHelper.sqlExecuteNonQuery(sql); } featdataset.Close(); featdataset.Open(); **/ for (int j = 0; j < features.Length; j++) { GSOFeature f = features[j]; if (f != null) { //if (f.IsFieldValueNull("Handle") == false) //{ if (listFeature.Contains(f.GetFieldAsString("编号").Trim())) { continue; } else { GSOGeoPoint3D shpPoint = f.Geometry as GSOGeoPoint3D; double rotateAngle; double deep = f.GetFieldAsDouble(combDeep.SelectedItem.ToString()); rotateAngle = (double)f.GetValue(combAngle.SelectedItem.ToString()); string currentModelType = f.GetValue(combCode.SelectedItem.ToString()).ToString(); double z = Convert.ToDouble(txtUpGround.Text); //double z = f.GetFieldAsDouble(comboBoxGC.SelectedItem.ToString()); 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.RotateZ = 0 - rotateAngle * 180 / Math.PI + 90; string feName = f.GetFieldAsString("附属物名称"); string handle = f.GetFieldAsString("附属物编码"); double Deep = f.GetFieldAsDouble("井深"); Deep = Math.Round(Deep, 1); string ss = "GX_JSD_3503_QZL_CZ15134DJS5050"; if(f.GetFieldAsString("编号")==ss) { int a=0; } //string Name = f.GetFieldAsString("模型路径"); //"雨篦工井模型\\3501-1.6.gcm"handle:3501,deep:1.6 if (feName == "阀门") { model.FilePath = Application.StartupPath + "\\" + "管道配件gcm\\闸阀\\闸阀DN150.gcm"; } else { string str = Deep.ToString("0.00"); string Name = "雨篦工井模型" + "\\" + handle + "-" + str + ".gcm"; //System.Globalization.NumberFormatInfo formatinfo = new System.Globalization.CultureInfo("zh-CN", false).NumberFormat; // formatinfo.NumberDecimalDigits = Convert.ToInt32(1); //string filepath = ""; double tempDeep = Deep; string modelpath = Application.StartupPath + "\\" + Name; if (File.Exists(modelpath)) { model.FilePath = modelpath; } else { tempDeep = Math.Round(tempDeep, 1); for (int i = 0; i < 10; i++) { tempDeep += 0.1; string tempDeepStr = tempDeep.ToString("0.00"); string Filefsw = Application.StartupPath + "\\雨篦工井模型\\" + handle + "-" + tempDeepStr + ".gcm"; if (File.Exists(Filefsw)) { model.FilePath = Filefsw; break; } } } } model.Name = f.GetValue(combModelName.SelectedItem.ToString()).ToString(); feature.Name = f.GetValue(combModelName.SelectedItem.ToString()).ToString(); feature.Geometry = model; for (int i = 0; i < feature.GetFieldCount(); i++) { if (f.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 = gj_cns.ContainsKey(fielddef.Name) == true ? gj_cns[fielddef.Name].ToString() : fielddef.Name; feature.SetValue(fieldName, obu); } } } featdataset.AddFeature(feature); } } } } featdataset.Save(); MessageBox.Show("入库成功!", "提示"); ds = globeControl1.Globe.DataManager.OpenOracleDataSource(Utility.DBServer.Trim() + "/" + Utility.dbdatabase.Trim(), "", "", Utility.userID, Utility.DBPassword); if (shpLayer == null) { globeControl1.Globe.Layers.Remove(shpLayer); } GSOLayer layer = globeControl1.Globe.Layers.Add(featdataset); rukuLayer = layer; this.DialogResult = DialogResult.OK; this.Close(); } catch (Exception ex) { LogError.PublishError(ex); MessageBox.Show(ex.Message); } } /// <summary> /// 创建数据库表 /// </summary> /// <param name="name"></param> /// <returns></returns> 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 = gj_cns.ContainsKey(fielddef.Name) == true ? gj_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; } /// <summary> /// 窗体初始化事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmAddWellShp_Load(object sender, EventArgs e) { //////////////////////////////////////////// //填充SHP数据列表 comboBoxEx1.Items.Clear(); if (globeControl1 != null) { for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer != null && layer.Name.ToLower().EndsWith(".shp")) { string str = Path.GetFileName(layer.Name); comboBoxEx1.Items.Add(str); layernamelist.Add(layer.Name.Trim()); } } } string filename = Application.StartupPath + "\\FormText.xml"; if (File.Exists(filename)) { XmlTextReader XmlReader = new XmlTextReader(filename); try { while (XmlReader.Read()) { if (XmlReader.Name == "FuShuWu") { string str1 = XmlReader["label"]; string str3 = XmlReader["type"]; string str2 = XmlReader.ReadElementString(); gj_cns.Add(str1, str2); gj_types.Add(str1, str3); } } } catch (Exception ex) { LogError.PublishError(ex); MessageBox.Show(ex.Message); } } } private void cmbLayer_SelectedIndexChanged(object sender, EventArgs e) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(selectLayerName); GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) return; combCode.Items.Clear(); combDeep.Items.Clear(); combModelName.Items.Clear(); combAngle.Items.Clear(); comboBoxGC.Items.Clear(); for (int i = 0; i < features[0].GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); combCode.Items.Add(fielddef.Name); combDeep.Items.Add(fielddef.Name); combModelName.Items.Add(fielddef.Name); combAngle.Items.Add(fielddef.Name); comboBoxGC.Items.Add(fielddef.Name); } combCode.SelectedItem = "附属物编码"; combDeep.SelectedItem = "井深"; combModelName.SelectedItem = "编号"; combAngle.SelectedItem = "符号角度"; comboBoxGC.SelectedItem = "地面高程"; } /// <summary> /// 单击选择shp格式文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //private void buttonXLayerPath_Click(object sender, EventArgs e) //{ // OpenFileDialog dlg = new OpenFileDialog(); // dlg.Filter = "*.shp|*.shp"; // dlg.Multiselect = false; // if (dlg.ShowDialog() == DialogResult.OK) // { // GSOLayer layer = globeControl1.Globe.Layers.Add(dlg.FileName); // string txtMessage = valiFuShuWudata(layer); // if (txtMessage != "") // { // button3.Enabled = false; // textBoxLayer.Text = ""; // combCode.Items.Clear(); // combDeep.Items.Clear(); // combModelName.Items.Clear(); // //comboLoad.Items.Clear(); // combAngle.Items.Clear(); // globeControl1.Globe.Layers.Remove(layer); // FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(dlg.FileName, txtMessage); // showErrorMessage.ShowDialog(); // return; // } // else // { // button3.Enabled = true; // textBoxLayer.Text = dlg.FileName; // selectLayerName = layer.Caption; // txtLayerName.Text = layer.Caption; // GSOFeatures features = layer.GetAllFeatures(); // if (features.Length == 0) // return; // combCode.Items.Clear(); // combDeep.Items.Clear(); // combModelName.Items.Clear(); // //comboLoad.Items.Clear(); // combAngle.Items.Clear(); // for (int i = 0; i < features[0].GetFieldCount(); i++) // { // GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); // combCode.Items.Add(fielddef.Name); // combDeep.Items.Add(fielddef.Name); // combModelName.Items.Add(fielddef.Name); // //comboLoad.Items.Add(fielddef.Name); // combAngle.Items.Add(fielddef.Name); // } // combCode.SelectedItem = "附属物编码"; // combDeep.SelectedItem = "井深"; // combModelName.SelectedItem = "编号"; // //comboLoad.SelectedItem = "模型路径"; // combAngle.SelectedItem = "符号角度"; // } // } //} /// <summary> /// 窗体关闭事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmAddWellShp_FormClosing(object sender, FormClosingEventArgs e) { globeControl1.Globe.Refresh(); } private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxEx1.SelectedIndex != -1) { string layerCaption = null; for (int i = 0; i < layernamelist.Count; i++) { if (Path.GetFileName(layernamelist[i]) == comboBoxEx1.SelectedItem.ToString().Trim()) { layerCaption = layernamelist[i]; } } GSOLayer layer = globeControl1.Globe.Layers.Add(layerCaption); string txtMessage = valiFuShuWudata(layer); if (txtMessage != "") { button3.Enabled = false; //textBoxLayer.Text = ""; comboBoxGC.Items.Clear(); combCode.Items.Clear(); combDeep.Items.Clear(); combModelName.Items.Clear(); combAngle.Items.Clear(); globeControl1.Globe.Layers.Remove(layer); FrmValiDataShowErrorMessage showErrorMessage = new FrmValiDataShowErrorMessage(layerCaption, txtMessage); showErrorMessage.ShowDialog(); return; } else { button3.Enabled = true; //textBoxLayer.Text = layerCaption; selectLayerName = layer.Caption; txtLayerName.Text = layer.Caption; GSOFeatures features = layer.GetAllFeatures(); if (features.Length == 0) return; comboBoxGC.Items.Clear(); combCode.Items.Clear(); combDeep.Items.Clear(); combModelName.Items.Clear(); combAngle.Items.Clear(); for (int i = 0; i < features[0].GetFieldCount(); i++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(features[0].GetFieldDefn(i)); comboBoxGC.Items.Add(fielddef.Name); combCode.Items.Add(fielddef.Name); combDeep.Items.Add(fielddef.Name); combModelName.Items.Add(fielddef.Name); combAngle.Items.Add(fielddef.Name); } combCode.SelectedItem = "附属物编码"; combDeep.SelectedItem = "井深"; combModelName.SelectedItem = "编号"; combAngle.SelectedItem = "符号角度"; comboBoxGC.SelectedItem = "地面高程"; } } } } }