protected override void OnClick() { IEnumLayer EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); ILayer pLayer = EnumLayer.Next(); ProgressForm progressForm = new ProgressForm(); progressForm.Show(); while (null != pLayer) { //string b = pLayer.Name.Substring(pLayer.Name.LastIndexOf('_') + 1); if ("Point" == pLayer.Name.Substring(pLayer.Name.LastIndexOf('_') + 1) || "Line" == pLayer.Name.Substring(pLayer.Name.LastIndexOf('_') + 1) || "Polygon" == pLayer.Name.Substring(pLayer.Name.LastIndexOf('_') + 1) ) { break; } pLayer = EnumLayer.Next(); }//加入的图层中至少有点线面中的一个,点线面图层中有DWG字段,表明了shp的来源 progressForm.AddProgress(10); IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer; IFeature pfeature = pFeatureLayer.Search(null, false).NextFeature(); IDataLayer DataLayer = pLayer as IDataLayer; IDatasetName tem_DatasetName = DataLayer.DataSourceName as IDatasetName; string PathName = tem_DatasetName.WorkspaceName.PathName; string DatasetName = pfeature.get_Value(pfeature.Fields.FindField("DWG")) as string;//获取生成shp的DWG文件名称 string MDB_FullName = PathName; //*******************************************开 始 拓 扑 检 查***************************************************** IWorkspaceFactory iwsf = new AccessWorkspaceFactoryClass(); IFeatureWorkspace ifws = (IFeatureWorkspace)iwsf.OpenFromFile(MDB_FullName, 0); IFeatureDataset topocheckDataset = ifws.OpenFeatureDataset(DatasetName); IFeatureClassContainer MyFeatureClassContainer = topocheckDataset as IFeatureClassContainer; #if true TopologyChecker topocheck = new TopologyChecker(topocheckDataset); topocheck.PUB_TopoBuild(DatasetName + "_TopoCheck");//创建拓扑层 progressForm.AddProgress(20); List <IFeatureClass> allFeatureClass_tem = topocheck.PUB_GetAllFeatureClass(); //List<IFeatureClass> TopoClass; List <IFeatureClass> allFeatureClass = new List <IFeatureClass>(); IFeatureClass topocheckFeatureClass_Point = null; IFeatureClass topocheckFeatureClass_Line = null; IFeatureClass topocheckFeatureClass_Polygon = null; foreach (IFeatureClass tem in allFeatureClass_tem) { switch (tem.AliasName.Substring(tem.AliasName.LastIndexOf('_') + 1)) { case "Point": allFeatureClass.Add(tem); topocheckFeatureClass_Point = tem; break; case "Line": allFeatureClass.Add(tem); topocheckFeatureClass_Line = tem; break; case "Polygon": allFeatureClass.Add(tem); topocheckFeatureClass_Polygon = tem; break; default: break; } }//只对点线面图层进行拓扑检查 topocheck.PUB_AddFeatureClass(allFeatureClass); progressForm.AddProgress(10); List <string> ErrorInfo = null; topocheck.PUB_AddRuleToTopology(TopologyChecker.TopoErroType.线要素不能自相交, topocheckFeatureClass_Line, out ErrorInfo); progressForm.AddProgress(10); topocheck.PUB_AddRuleToTopology(TopologyChecker.TopoErroType.线要素之间不能相交, topocheckFeatureClass_Line, out ErrorInfo); progressForm.AddProgress(10); topocheck.PUB_AddRuleToTopology(TopologyChecker.TopoErroType.点要素之间不相交, topocheckFeatureClass_Point, out ErrorInfo); progressForm.AddProgress(10); topocheck.PUB_AddRuleToTopology(TopologyChecker.TopoErroType.面要素间无重叠, topocheckFeatureClass_Polygon, out ErrorInfo); progressForm.AddProgress(10); System.IO.File.WriteAllLines(MDB_FullName.Substring(0, MDB_FullName.LastIndexOf('\\')) + "\\拓扑错误报告.txt", ErrorInfo.ToArray()); //生成检查报告 progressForm.AddProgress(10); //----------------------------------------------打 开 错 误 报 告 器------------------------------------------------------ EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); ArcMap.Document.FocusMap.ClearLayers(); ArcMap.Document.FocusMap.AddLayers(EnumLayer, true); pLayer = EnumLayer.Next(); while (null != pLayer) { if ((DatasetName + "_Polygon") == pLayer.Name) { pLayer = EnumLayer.Next(); continue; } DirectRender(pLayer); pLayer = EnumLayer.Next(); } ESRI.ArcGIS.Framework.ICommandBars CommandBars = ArcMap.Application.Document.CommandBars; UID uid = new UIDClass(); uid.Value = "esriEditor.StartEditingCommand"; //bool isEditable = true; try { ESRI.ArcGIS.Framework.ICommandItem CommandItem = CommandBars.Find(uid, false, false); if (CommandItem != null) { CommandItem.Execute(); } uid.Value = "esriEditorExt.ErrorWindowCommand"; CommandItem = CommandBars.Find(uid, false, false); if (CommandItem != null) { CommandItem.Execute(); } } catch { //isEditable = false;//如果初次打开出现不可编辑的错误,下面将尝试重新添加图层并打开错误编辑器 } /* * if (!isEditable) * { * try * { * ESRI.ArcGIS.Framework.ICommandItem CommandItem = CommandBars.Find(uid, false, false); * if (CommandItem != null) * { * CommandItem.Execute(); * } * * uid.Value = "esriEditorExt.ErrorWindowCommand"; * CommandItem = CommandBars.Find(uid, false, false); * if (CommandItem != null) * { * CommandItem.Execute(); * } * * }catch{} * * * }*/ //------------------------------------------完成打开错误报告器--------------------------------------------- progressForm.Close(); #endif }
protected override void OnClick() { #if true #if true if (0 >= ArcMap.Document.FocusMap.LayerCount) { MessageBox.Show("未加入图层"); return; } IEnumLayer EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); ILayer tem_Layer = EnumLayer.Next(); // string d = tem_Layer.Name; IDataLayer DataLayer; IDatasetName tem_DatasetName; string tem_Name; DataLayer = tem_Layer as IDataLayer; tem_DatasetName = DataLayer.DataSourceName as IDatasetName; tem_Name = tem_DatasetName.WorkspaceName.PathName; string tem_SubstringRef = tem_Name.Substring(tem_Name.LastIndexOf('.') + 1); while (null != tem_Layer) { DataLayer = tem_Layer as IDataLayer; tem_DatasetName = DataLayer.DataSourceName as IDatasetName; tem_Name = tem_DatasetName.WorkspaceName.PathName; string tem_Substring = tem_Name.Substring(tem_Name.LastIndexOf('.') + 1); if (tem_Substring != tem_SubstringRef) { MessageBox.Show("图层来自不同的dwg", "错误"); return; } tem_Layer = EnumLayer.Next(); } if ("mdb" == tem_SubstringRef) { MessageBox.Show("图层来自个人地理数据库,如需重新生成,请清空图层后加入shp文件", "提示"); return; } EnumLayer.Reset(); tem_Layer = EnumLayer.Next(); string DatasetName = tem_Layer.Name.Substring(0, tem_Layer.Name.LastIndexOf('_')); //string DatasetName = tem_SubstringRef.Substring(tem_SubstringRef.LastIndexOf('\\') + 1); OpenFileDialog OFD = new OpenFileDialog(); OFD.Multiselect = true; OFD.Title = "请选择要加入的个人地理数据库"; OFD.Filter = "(*.mdb)|*.mdb"; OFD.InitialDirectory = "C:\\"; OFD.Multiselect = false; string MDB_FullName = null; if (OFD.ShowDialog() == DialogResult.OK) { MDB_FullName = OFD.FileName; } if (null == MDB_FullName) { return; } string MDB_Path = MDB_FullName.Substring(0, MDB_FullName.LastIndexOf('\\') + 1); string MDB_Name = MDB_FullName.Substring(MDB_Path.Length, MDB_FullName.LastIndexOf('.') - MDB_Path.Length); EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); tem_Layer = EnumLayer.Next(); //string a = tem_Layer.Name.Substring(DatasetName.Length + 1); string[] shps = new string[ArcMap.Document.FocusMap.LayerCount]; int i = 0; bool isPointExist = false; bool isLineExist = false; bool isPolygonExist = false; bool isAnnotationExist = false; while (null != tem_Layer) { shps[i] = tem_Name + "\\" + tem_Layer.Name + ".shp"; switch (tem_Layer.Name.Substring(DatasetName.Length + 1)) { case "Point": isPointExist = true; break; case "Line": isLineExist = true; break; case "Polygon": isPolygonExist = true; break; case "Annotation": isAnnotationExist = true; break; } tem_Layer = EnumLayer.Next(); i++; } if (!isPointExist) { DialogResult Result = MessageBox.Show("未加入点图层,是否继续", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (Result == DialogResult.No) { return; } } if (!isLineExist) { DialogResult Result = MessageBox.Show("未加入线图层,是否继续", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (Result == DialogResult.No) { return; } } if (!isPolygonExist) { DialogResult Result = MessageBox.Show("未加入面图层,是否继续", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (Result == DialogResult.No) { return; } } if (!isAnnotationExist) { DialogResult Result = MessageBox.Show("未加入注记层,是否继续", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (Result == DialogResult.No) { return; } } #endif #if false string MDB_FullName = "C:\\Users\\JabinGuo\\Desktop\\dwg\\test.mdb"; string DatasetName = "db"; string MDB_Path = "C:\\Users\\JabinGuo\\Desktop\\dwg\\"; string MDB_Name = "test"; OpenFileDialog OFD = new OpenFileDialog(); OFD.Multiselect = true; OFD.Title = "请选择文件"; OFD.Filter = "shp files(*.shp)|*.shp|所有文件(*.*)|*.*"; OFD.InitialDirectory = "C:\\"; IEnumLayer EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); //AxMapControl mc = new AxMapControl(); // ICommand command = new ESRI string[] shps = null; if (OFD.ShowDialog() == DialogResult.OK) { shps = OFD.FileNames; } if (null == shps || shps.Length < 1) { return;//如果没有选择文件,退出函数 } #endif ProgressForm progressForm = new ProgressForm(); progressForm.Show(); C_MDBBuilder buil = new C_MDBBuilder(); //*********************************************** IWorkspaceFactory iwsf = new AccessWorkspaceFactoryClass(); IFeatureWorkspace ifws = null; if (File.Exists(MDB_FullName)) { ifws = (IFeatureWorkspace)iwsf.OpenFromFile(MDB_FullName, 0); try { ifws.OpenFeatureDataset(DatasetName).Delete(); } catch { } } //如果mdb存在,那么dataset也有可能存在,尝试删除dataset ArcMap.Document.FocusMap.ClearLayers(); foreach (string shpName in shps) { bool isFeatureClassExists = buil.MDB_Builder(shpName, MDB_Path, MDB_Name, DatasetName);//将shp导入mdb文件 progressForm.AddProgress(20 / (shps.Length)); } //**********************************开 始 渲 染************************************** EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); ILayer pLayer = EnumLayer.Next(); while (null != pLayer) { if ((DatasetName + "_Point") == pLayer.Name || (DatasetName + "_Line") == pLayer.Name) { DirectRender(pLayer);//渲染的方法 } pLayer = EnumLayer.Next(); } progressForm.AddProgress(10); //*********************************渲 染 结 束***************************************** //*********************************开 始 标 注 转 注 记********************************** //IEnumLayer EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); //ILayer pLayer = EnumLayer.Next(); EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); pLayer = EnumLayer.Next(); while (((DatasetName + "_Annotation") != pLayer.Name) && (null != pLayer) && ((DatasetName + "_AnnotationZJ") != pLayer.Name)) { pLayer = EnumLayer.Next(); } if (null == pLayer) { progressForm.Close(); return; } if (((DatasetName + "_AnnotationZJ") == pLayer.Name)) { progressForm.Close(); MessageBox.Show("注记层已存在"); return; } MyAnnotation myAnnotation = new MyAnnotation(); string errstring = null; myAnnotation.LabelConvertToAnnotation(ArcMap.Document.FocusMap, pLayer, false, out errstring);//生成的注记层名字为“标注层名称+ZJ” progressForm.AddProgress(20); IGeoFeatureLayer single_useGeoFeatureLayer = pLayer as IGeoFeatureLayer; single_useGeoFeatureLayer.DisplayAnnotation = false;//隐藏标注 ifws = (IFeatureWorkspace)iwsf.OpenFromFile(MDB_FullName, 0); //IFeatureDataset MyfeatureDataset = ifws.OpenFeatureDataset(DatasetName); IFeatureClassContainer MyFeatureClassContainer = ifws.OpenFeatureDataset(DatasetName) as IFeatureClassContainer; IEnumFeatureClass enumFeatureClass = MyFeatureClassContainer.Classes; IFeatureClass MyAnnotationFeatureClass = enumFeatureClass.Next(); while (null != MyAnnotationFeatureClass && ((DatasetName + "_AnnotationZJ") != MyAnnotationFeatureClass.AliasName)) { MyAnnotationFeatureClass = enumFeatureClass.Next(); } //获取生成的注记层 if (null == MyAnnotationFeatureClass) { MessageBox.Show("未找到注记层,请检查是否生成注记层", "警告"); return; } progressForm.AddProgress(10); //IFeatureClass MyAnnotationFeatureClass = ifws.OpenFeatureClass("AnnotationZJ");//在mdb空间下打开FeatureClass,所以不同dataset下不能有重名FeatureClass //IFeatureCursor AnnotationFeatureCursor = MyAnnotationFeatureClass.Search(null, false); //IFeature MyAnnotationFeature = AnnotationFeatureCursor.NextFeature(); enumFeatureClass = MyFeatureClassContainer.Classes; IFeatureClass LabelFeatureClass = enumFeatureClass.Next(); while (null != LabelFeatureClass && ((DatasetName + "_Annotation") != LabelFeatureClass.AliasName)) { LabelFeatureClass = enumFeatureClass.Next(); }//获取原注记层 if (null == LabelFeatureClass) { MessageBox.Show("未找到原注记层,可能造成生成的注记层要素缺失", "警告"); return; } IFeature MyAnnotationFeature; IFeatureCursor AnnotationFeatureCursor = MyAnnotationFeatureClass.Search(null, false); MyAnnotationFeature = AnnotationFeatureCursor.NextFeature(); while (null != MyAnnotationFeature) { int LabelFeatureID = (int)MyAnnotationFeature.get_Value(MyAnnotationFeature.Fields.FindField("FeatureID")); IFeature LabelFeature = LabelFeatureClass.GetFeature(LabelFeatureID); string st = LabelFeature.get_Value(LabelFeature.Fields.FindField("Text_")) as string; myAnnotation.ConfigAnnotation(MyAnnotationFeature, LabelFeature.Shape, st, 8, esriTextVerticalAlignment.esriTVABottom, esriTextHorizontalAlignment.esriTHALeft); MyAnnotationFeature = AnnotationFeatureCursor.NextFeature(); }//逐个要素修改生成的注记 progressForm.AddProgress(20); EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); pLayer = EnumLayer.Next(); while (null != pLayer) { if ((DatasetName + "_Annotation") == pLayer.Name) { ArcMap.Document.FocusMap.DeleteLayer(pLayer); } pLayer = EnumLayer.Next(); }//移除原注记层 progressForm.AddProgress(10); progressForm.Close(); //******************************标 注 转 注 记 结 束******************************************** //Thread.Sleep(1000); #endif #region 标注转注记 #if false List <string> shps = new List <string>(); shps.Add("C:\\Users\\JabinGuo\\Desktop\\注记\\Annotation.shp"); C_MDBBuilder buil = new C_MDBBuilder(); bool isFeatureClassExists = buil.MDB_Builder(shps[0], "C:\\Users\\JabinGuo\\Desktop\\dwg\\", "test", "db");//将shp导入mdb文件 IWorkspaceFactory iwsf = new AccessWorkspaceFactoryClass(); IFeatureWorkspace ifws = (IFeatureWorkspace)iwsf.OpenFromFile("C:\\Users\\JabinGuo\\Desktop\\dwg\\test.mdb", 0); IEnumLayer EnumLayer = ArcMap.Document.FocusMap.get_Layers(null, false); ILayer pLayer = EnumLayer.Next(); while ("Annotation" != pLayer.Name) { pLayer = EnumLayer.Next(); } //ArcMap.Document.FocusMap.get_Layer(0); //IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer; //IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer; MyAnnotation myAnnotation = new MyAnnotation(); string errstring = null; myAnnotation.LabelConvertToAnnotation(ArcMap.Document.FocusMap, pLayer, true, out errstring);//生成的注记层名字为“标注层名称+ZJ” IGeoFeatureLayer single_useGeoFeatureLayer = pLayer as IGeoFeatureLayer; single_useGeoFeatureLayer.DisplayAnnotation = false;//隐藏标注 IFeatureClass MyAnnotationFeatureClass = ifws.OpenFeatureClass("AnnotationZJ"); //IFeatureCursor AnnotationFeatureCursor = MyAnnotationFeatureClass.Search(null, false); //IFeature MyAnnotationFeature = AnnotationFeatureCursor.NextFeature(); IFeatureClass LabelFeatureClass = ifws.OpenFeatureClass("Annotation"); IFeature MyAnnotationFeature = MyAnnotationFeatureClass.GetFeature(10);//选定要修改的要素 int LabelFeatureID = (int)MyAnnotationFeature.get_Value(MyAnnotationFeature.Fields.FindField("FeatureID")); IFeature LabelFeature = LabelFeatureClass.GetFeature(LabelFeatureID); myAnnotation.ConfigAnnotation(MyAnnotationFeature, LabelFeature.Shape, "kkk", 12, esriTextVerticalAlignment.esriTVACenter, esriTextHorizontalAlignment.esriTHACenter); //myAnnotation.ConfigFields(MyAnnotationFeatureClass, AnnotationFeatureCursor, MyAnnotationFeature);//保留此函数,可以用于修改要素字段 #endif #endregion #region 拓扑检查 #if false IFeatureDataset topocheckDataset = ifws.OpenFeatureDataset("db"); TopologyChecker topocheck = new TopologyChecker(topocheckDataset); topocheck.PUB_TopoBuild("addinTopo"); topocheck.PUB_AddFeatureClass(null); List <IFeatureClass> allFeatureClass = topocheck.PUB_GetAllFeatureClass(); IFeatureClass topocheckFeatureClass = null; foreach (IFeatureClass tem in allFeatureClass) { if ("" == tem.AliasName) { topocheckFeatureClass = tem; break; } } topocheck.PUB_AddRuleToTopology(TopologyChecker.TopoErroType.线要素必须不相交, topocheckFeatureClass); #endif #endregion #region 渲染 #if false List <string> shps = new List <string>(); shps.Add("C:\\Users\\JabinGuo\\Desktop\\渲染\\Polygon.shp"); C_MDBBuilder buil = new C_MDBBuilder(); bool isFeatureClassExists = buil.MDB_Builder(shps[0], "C:\\Users\\JabinGuo\\Desktop\\dwg\\", "test", "db");//将shp导入mdb文件 IWorkspaceFactory iwsf = new AccessWorkspaceFactoryClass(); IFeatureWorkspace ifws = (IFeatureWorkspace)iwsf.OpenFromFile("C:\\Users\\JabinGuo\\Desktop\\dwg\\test.mdb", 0); DirectRender(ArcMap.Document.FocusMap.get_Layer(0)); #endif #endregion #region 拓扑检查 #if false List <string> shps = new List <string>(); shps.Add("C:\\Users\\JabinGuo\\Desktop\\shp\\2010.6.20-500_t3\\Line.shp"); C_MDBBuilder buil = new C_MDBBuilder(shps, "C:\\Users\\JabinGuo\\Desktop\\dwg\\", "test", "db"); AccessWorkspaceFactory MyWorkSpaceFactory = new AccessWorkspaceFactoryClass(); IFeatureWorkspace a = (IFeatureWorkspace)MyWorkSpaceFactory.OpenFromFile("C:\\Users\\JabinGuo\\Desktop\\dwg\\test.mdb", 0); IFeatureDataset k = a.OpenFeatureDataset("db"); TopologyChecker topocheck = new TopologyChecker(k); topocheck.PUB_TopoBuild("addinTopo"); topocheck.PUB_AddFeatureClass(null); List <IFeatureClass> test = topocheck.PUB_GetAllFeatureClass(); IFeatureClass ifc = test[0]; topocheck.PUB_AddRuleToTopology(TopologyChecker.TopoErroType.线要素必须不相交, test[0]); #endif #endregion }