private double GetDiameter(IPoint point, I3DItem item) { ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = point; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; IFeatureCursor featureCursor = item.LineLayerInfo.FeatureClass.Search(spatialFilter, false); IFeature lineFeature; double maxDiameter = 0; while ((lineFeature = featureCursor.NextFeature()) != null) { string gg = ConvertToString(lineFeature.Value[item.IdxGjField]); if (string.IsNullOrEmpty(gg) || gg == "<空>") gg = "50"; if (gg.Contains("*")) { gg = gg.Split('*')[0]; } double diameter; if (double.TryParse(gg, out diameter) == false) diameter = 0; diameter = diameter / 1000; if (maxDiameter < diameter) maxDiameter = diameter; } return maxDiameter; }
private void checkedListBoxPipelineLayers_SelectedIndexChanged(object sender, EventArgs e) { _currentItem = checkedListBoxPipelineLayers.SelectedItem as I3DItem; if (_currentItem == null) { return; } InitFields(_currentItem); }
public List <string> GetCheckPipeline() { List <string> list = new List <string>(); foreach (object checkedItem in this.checkedListBoxPipelineLayers.CheckedItems) { I3DItem pipelineLayer = checkedItem as I3DItem; if (pipelineLayer == null) { continue; } list.Add(pipelineLayer.Name); } return(list); }
public CustomPipeline(IFeature feature, I3DItem builderItem) { _builderItem = builderItem; _polyline = feature.ShapeCopy as IPolyline; _qdgc = ConvertToDouble(feature.Value[_builderItem.IdxQdgcField]); _zdgc = ConvertToDouble(feature.Value[_builderItem.IdxZdgcField]); if (Math.Abs(_qdgc) < 0.001 || double.IsNaN(_qdgc)) { _qdgc = _zdgc; } if (Math.Abs(_zdgc) < 0.001 || double.IsNaN(_zdgc)) { _zdgc = _qdgc; } _standard = feature.get_Value(_builderItem.IdxGjField).ToString().Replace(" ", ""); GetStandardList(); }
private void InitFields(I3DItem item) { if (item.HeightType == enumPipelineHeightType.Top) { cmbHeightType.SelectedItem = "管顶"; } else if (item.HeightType == enumPipelineHeightType.Middle) { cmbHeightType.SelectedItem = "管中"; } else if (item.HeightType == enumPipelineHeightType.Bottom) { cmbHeightType.SelectedItem = "管底"; } else { cmbHeightType.SelectedItem = null; } if (item.SectionType == enumPipeSectionType.HeightAndWidth) { cmbSectionType.SelectedItem = "高*宽"; } else if (item.SectionType == enumPipeSectionType.WidthAndHeight) { cmbSectionType.SelectedItem = "宽*高"; } else { cmbSectionType.SelectedItem = null; } if (item.RotationAngleType == enumRotationAngleType.Angle) { cmbRotationAngleType.SelectedItem = "角度"; } else if (item.RotationAngleType == enumRotationAngleType.Radian) { cmbRotationAngleType.SelectedItem = "弧度"; } else { cmbRotationAngleType.SelectedItem = null; } AddItemsFromFields(item.PointLayerInfo.FeatureClass.Fields, cmbDmgcField, string.IsNullOrEmpty(item.DmgcFieldName) ? item.PointLayerInfo.GetFieldName(PipeConfigWordHelper.PointWords.DMGC) : item.DmgcFieldName); AddItemsFromFields(item.PointLayerInfo.FeatureClass.Fields, cmbJgggField, string.IsNullOrEmpty(item.JgggFieldName) ? item.PointLayerInfo.GetFieldName(PipeConfigWordHelper.PointWords.JGGG) : item.JgggFieldName); AddItemsFromFields(item.PointLayerInfo.FeatureClass.Fields, cmbJdsdField, string.IsNullOrEmpty(item.JdsdFieldName) ? item.PointLayerInfo.GetFieldName(PipeConfigWordHelper.PointWords.JDSD) : item.JdsdFieldName); AddItemsFromFields(item.PointLayerInfo.FeatureClass.Fields, cmbXzjdField, string.IsNullOrEmpty(item.XzjdFieldName) ? item.PointLayerInfo.GetFieldName(PipeConfigWordHelper.PointWords.XZJD) : item.XzjdFieldName); AddItemsFromFields(item.PointLayerInfo.FeatureClass.Fields, cmbFswField, string.IsNullOrEmpty(item.FswFieldName) ? item.PointLayerInfo.GetFieldName(PipeConfigWordHelper.PointWords.FSW) : item.FswFieldName); AddItemsFromFields(item.LineLayerInfo.FeatureClass.Fields, cmbQdgcField, string.IsNullOrEmpty(item.QdgcFieldName) ? item.LineLayerInfo.GetFieldName(PipeConfigWordHelper.LineWords.QDGC) : item.QdgcFieldName); AddItemsFromFields(item.LineLayerInfo.FeatureClass.Fields, cmbZdgcField, string.IsNullOrEmpty(item.ZdgcFieldName) ? item.LineLayerInfo.GetFieldName(PipeConfigWordHelper.LineWords.ZDGC) : item.ZdgcFieldName); AddItemsFromFields(item.LineLayerInfo.FeatureClass.Fields, cmbQdmsField, string.IsNullOrEmpty(item.QdmsFieldName) ? item.LineLayerInfo.GetFieldName(PipeConfigWordHelper.LineWords.QDMS) : item.QdmsFieldName); AddItemsFromFields(item.LineLayerInfo.FeatureClass.Fields, cmbZdmsField, string.IsNullOrEmpty(item.ZdmsFieldName) ? item.LineLayerInfo.GetFieldName(PipeConfigWordHelper.LineWords.ZDMS) : item.ZdmsFieldName); AddItemsFromFields(item.LineLayerInfo.FeatureClass.Fields, cmbGjField, string.IsNullOrEmpty(item.GjFieldName) ? item.LineLayerInfo.GetFieldName(PipeConfigWordHelper.LineWords.GJ) : item.GjFieldName); AddItemsFromFields(item.LineLayerInfo.FeatureClass.Fields, cmbMsfsField, string.IsNullOrEmpty(item.MsfsFieldName) ? item.LineLayerInfo.GetFieldName(PipeConfigWordHelper.LineWords.MSFS) : item.MsfsFieldName); AddItemsFromFields(item.LineLayerInfo.FeatureClass.Fields, cmbGgField, string.IsNullOrEmpty(item.GgFieldName) ? item.LineLayerInfo.GetFieldName(PipeConfigWordHelper.LineWords.GG) : item.GgFieldName); txtCylinderSubs.Text = string.Join(";", item.CylinderSubs); txtSquareSubs.Text = string.Join(";", item.SquareSubs); txtSphereSubs.Text = string.Join(";", item.SphereSubs); txtLCylinderSubs.Text = string.Join(";", item.LCylinderSubs); txtLSquareSubs.Text = string.Join(";", item.LSquareSubs); }
private void ImportPipeClassToPointPatch(IWorkspace outWorkspace, I3DItem builderItem, IGeometry boundary = null) { try { if (builderItem.PointLayerInfo == null) return; IWorkspaceEdit workspaceEdit = outWorkspace as IWorkspaceEdit; workspaceEdit.StartEditing(false); workspaceEdit.StartEditOperation(); IFeatureCursor pCursor = null; if (boundary == null || boundary.IsEmpty == true) { pCursor = builderItem.PointLayerInfo.FeatureClass.Search(null, false); } else { ISpatialFilter pFilter = new SpatialFilterClass(); pFilter.Geometry = boundary; pFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; pCursor = builderItem.PointLayerInfo.FeatureClass.Search((IQueryFilter)pFilter, false); } IFeature sFeature = null; IFeatureCursor insertCursor = builderItem.PointPatchClass.Insert(true); IFeatureBuffer featureBuffer = builderItem.PointPatchClass.CreateFeatureBuffer(); int count = 0; while ((sFeature = pCursor.NextFeature()) != null) { try { //开始读取原始数据 IGeometry pShape = sFeature.Shape; if (pShape.IsEmpty) continue; IGeometry patchGeometry = CreatePointPatch(sFeature, builderItem); if (patchGeometry == null) continue; featureBuffer.Shape = patchGeometry; featureBuffer.Value[builderItem.IdxPointLinkField] = sFeature.OID; insertCursor.InsertFeature(featureBuffer); count++; if (count >= 1000) { count = 0; insertCursor.Flush(); Marshal.ReleaseComObject(insertCursor); insertCursor = builderItem.PointPatchClass.Insert(true); featureBuffer = builderItem.PointPatchClass.CreateFeatureBuffer(); } } catch (Exception e) { throw new Exception(string.Format("OBJECTID:{0}\r\n{1}", sFeature.OID, e.Message)); } } insertCursor.Flush(); Marshal.ReleaseComObject(insertCursor); Marshal.ReleaseComObject(pCursor); workspaceEdit.StopEditOperation(); workspaceEdit.StopEditing(true); } catch (Exception e) { throw new Exception(string.Format("{0}\r\n{1}", builderItem.PointLayerInfo.AliasName, e.Message)); } }
private IGeometry CreatePointPatch(IFeature pFeature, I3DItem builderItem) { try { IPoint oPoint = pFeature.Shape as IPoint; if (oPoint == null) return null; double z = ConvertToDouble(pFeature.Value[builderItem.IdxDmgcField]); if (double.IsNaN(z)) z = 0; double depth = ConvertToDouble(pFeature.Value[builderItem.IdxJdsdField]); if (double.IsNaN(depth)) depth = 0.01; string gg = ConvertToString(pFeature.Value[builderItem.IdxJgggField]); string fsw = ConvertToString(pFeature.Value[builderItem.IdxFswField]).Trim(); if (builderItem.CylinderSubs.Contains(fsw)) { if (string.IsNullOrEmpty(gg) || gg == "<空>") gg = "50"; if (gg.Contains("*")) { gg = gg.Split('*')[0]; } double diameter; if (double.TryParse(gg, out diameter) == false) return null; diameter = diameter / 100; return new Point3DCylinder(oPoint.X, oPoint.Y, z, depth, diameter, _3DBuilder.Division).CreateGeometry(); } else if (builderItem.SquareSubs.Contains(fsw)) { if (string.IsNullOrEmpty(gg) || gg == "<空>") gg = "50*50"; double length, width; if (gg.Split('*').Length <= 0) return null; if (double.TryParse(gg.Split('*')[0], out length) == false) return null; if (gg.Split('*').Length == 1) width = length; else if (double.TryParse(gg.Split('*')[1], out width) == false) return null; length /= 100; width /= 100; double angle = ConvertToDouble(pFeature.Value[builderItem.IdxXzjdField]); if (double.IsNaN(angle)) angle = 0; if (builderItem.RotationAngleType == enumRotationAngleType.Angle) { angle = angle * Math.PI / 180; } return new Point3DSquare(oPoint.X, oPoint.Y, z, depth, length, width, angle, _3DBuilder.Division).CreateGeometry(); } if (builderItem.SphereSubs.Contains(fsw)) { double maxDiameter = GetDiameter(oPoint, builderItem); return new Point3DSphere(oPoint.X, oPoint.Y, z, depth, maxDiameter, _3DBuilder.Division).CreateGeometry(); } return null; } catch (Exception e) { throw new Exception(e.Message); } }
private List<IGeometry> CreateLinePatch(IFeature feature, I3DItem builderItem) { List<IGeometry> list = new List<IGeometry>(); try { IPolyline polyline = feature.Shape as IPolyline; if (polyline == null || polyline.IsEmpty) return list; double qdgc = ConvertToDouble(feature.Value[builderItem.IdxQdgcField]); double zdgc = ConvertToDouble(feature.Value[builderItem.IdxZdgcField]); if (Math.Abs(qdgc) < 0.01 || double.IsNaN(qdgc)) qdgc = zdgc; if (Math.Abs(zdgc) < 0.01 || double.IsNaN(zdgc)) zdgc = qdgc; string msfs = ConvertToString(feature.Value[builderItem.IdxMsfsField]).Trim(); if (builderItem.LCylinderSubs.Contains(msfs)) { string standard = ConvertToString(feature.Value[builderItem.IdxGjField]).Replace(" ", ""); List<string> standardList = GetStandardList(standard); string[] standards = standardList[0].Split('*'); if (string.IsNullOrEmpty(standards[0])) standards[0] = "100"; double diameter = ConvertToDouble(standards[0]) / 1000; switch (builderItem.LineLayerInfo.HeightType) { case enumPipelineHeightType.Top: qdgc = qdgc - diameter / 2; zdgc = zdgc - diameter / 2; break; case enumPipelineHeightType.Bottom: qdgc = qdgc + diameter / 2; zdgc = zdgc + diameter / 2; break; } I3DLine line = new Line3DCylinder(polyline, qdgc, zdgc, diameter, builderItem.Builder.Division); list.Add(line.CreateGeometry()); list.Add(line.CreateStartSphere()); list.Add(line.CreateEndSphere()); } else if (builderItem.LSquareSubs.Contains(msfs)) { string standard = ConvertToString(feature.Value[builderItem.IdxGgField]).Replace(" ", ""); List<string> standardList = GetStandardList(standard); string[] standards = standardList[0].Split('*'); double height = 0, width = 0; switch (builderItem.LineLayerInfo.SectionType) { case enumPipeSectionType.HeightAndWidth: height = ConvertToDouble(standards[0]) / 100; width = ConvertToDouble(standards[1]) / 100; break; case enumPipeSectionType.WidthAndHeight: width = ConvertToDouble(standards[0]) / 100; height = ConvertToDouble(standards[1]) / 100; break; } switch (builderItem.LineLayerInfo.HeightType) { case enumPipelineHeightType.Top: qdgc = qdgc - height / 2; zdgc = zdgc - height / 2; break; case enumPipelineHeightType.Bottom: qdgc = qdgc + height / 2; zdgc = zdgc + height / 2; break; } I3DLine line = new Line3DSquare(polyline, qdgc, zdgc, width, height, builderItem.Builder.Division); list.Add(line.CreateGeometry()); } return list; } catch (Exception) { return list; } }