/// <summary> /// 显示轮廓线 张琪 20110629 /// </summary> /// <param name="pPolygon"></param> private void ShowCountour(IPolygon pPolygon) { SysCommon.CProgress vProgress = new SysCommon.CProgress("进度条"); try { Cls3DMarkDraw.DeleteAllElementsWithName(m_pCurrentSceneControl.Scene, ContourName); if (!chkShowContour.Checked) { m_pCurrentSceneControl.SceneGraph.RefreshViewers(); return; } vProgress.EnableCancel = false;//设置进度条 vProgress.ShowDescription = true; vProgress.FakeProgress = true; vProgress.TopMost = true; vProgress.ShowProgress(); vProgress.SetProgress("正在绘制轮廓线"); ITopologicalOperator pTopo = pPolygon as ITopologicalOperator; IGeometry pPolyLine = new PolylineClass(); pPolyLine = pTopo.Boundary; object StepSize = Type.Missing;; m_SurFace.InterpolateShape(pPolyLine as IGeometry, out pPolyLine, ref StepSize); IGroupElement pGroup = null; //用于绘制三维效果 Cls3DMarkDraw.AddSimpleGraphic(pPolyLine as IGeometry, Cls3DMarkDraw.getRGB(30, 255, 255), 4, ContourName, m_pCurrentSceneControl.Scene, pGroup); m_pCurrentSceneControl.SceneGraph.RefreshViewers(); vProgress.Close(); } catch { vProgress.Close(); } }
/// <summary> /// 显示参考面 张琪 20110629 /// </summary> /// <param name="pPoly">参考多边形</param> private void ShowRefPlane(IPolygon pPoly) { SysCommon.CProgress vProgress = new SysCommon.CProgress("进度条"); try { IGeometry pBoundary = new PolylineClass(); pBoundary = null; IGeometry pPolygon = new PolygonClass(); pPolygon = null; object StepSize = Type.Missing; m_SurFace.InterpolateShape(pPoly as IGeometry, out pPolygon, ref StepSize); Cls3DMarkDraw.DeleteAllElementsWithName(m_pCurrentSceneControl.Scene, sRefPlaneName); //清除已有的参考面 if (!chkShowLWRP.Checked) //当为false时不显示参考面 { m_pCurrentSceneControl.SceneGraph.RefreshViewers(); return; } vProgress.EnableCancel = false;//设置进度条 vProgress.ShowDescription = true; vProgress.FakeProgress = true; vProgress.TopMost = true; vProgress.ShowProgress(); vProgress.SetProgress("正在绘制参考面"); ITopologicalOperator pTopo = pPolygon as ITopologicalOperator; pBoundary = pTopo.Boundary as IPolyline; //设置Z值方向显示 IZAware pZAware = pBoundary as IZAware; pZAware.ZAware = true; m_SurFace.InterpolateShape(pBoundary as IGeometry, out pBoundary, ref StepSize); m_SurFace.InterpolateShape(pPoly as IGeometry, out pPolygon, ref StepSize); IExtrude pExtrude = new GeometryEnvironmentClass(); //获取参考面的多面体 IMultiPatch pMultiPatchRefPlaneWall = pExtrude.ExtrudeAbsolute(Convert.ToDouble(txtPlaneHeight.Text), pBoundary as IGeometry) as IMultiPatch; pMultiPatchRefPlaneWall.SpatialReference = m_pCurrentSceneControl.Scene.SpatialReference; IZ pZ; pZAware = pPolygon as IZAware; pZAware.ZAware = true; pZ = pPolygon as IZ; pZ.SetConstantZ(Convert.ToDouble(txtPlaneHeight.Text)); //用于绘制三维效果 IGroupElement pGroup = null; Cls3DMarkDraw.AddSimpleGraphic(pMultiPatchRefPlaneWall as IGeometry, Cls3DMarkDraw.getRGB(71, 61, 255), 1, sRefPlaneName, m_pCurrentSceneControl.Scene, pGroup); Cls3DMarkDraw.AddSimpleGraphic(pPolygon as IGeometry, Cls3DMarkDraw.getRGB(71, 61, 255), 1, sRefPlaneName, m_pCurrentSceneControl.Scene, pGroup); m_pCurrentSceneControl.SceneGraph.RefreshViewers(); vProgress.Close(); } catch { vProgress.Close(); } }
/// <summary> /// 获取点击地图上的点 /// </summary> /// <param name="Button"></param> /// <param name="Shift"></param> /// <param name="X"></param> /// <param name="Y"></param> public override void OnMouseDown(int Button, int Shift, int X, int Y) { try { ESRI.ArcGIS.Geometry.IPoint pMapPoint = new ESRI.ArcGIS.Geometry.PointClass();; ISceneGraph pSceneGraph = m_sceneHookHelper.SceneGraph; object pOwner; object pObject; object before = Type.Missing; object after = Type.Missing; object StepSize = Type.Missing; IDisplay3D pDisplay; pSceneGraph.Locate(pSceneGraph.ActiveViewer, X, Y, esriScenePickMode.esriScenePickGeography, true, out pMapPoint, out pOwner, out pObject); //获取鼠标点击的位置并转化为地理坐标 if (pMapPoint == null) { return; } pMapPoint.Z = pMapPoint.Z / m_sceneHookHelper.Scene.ExaggerationFactor; pMapPoint.Z = m_psurface.GetElevation(pMapPoint); pMapPoint.SpatialReference = pSceneGraph.Scene.SpatialReference; pDisplay = m_sceneHookHelper.SceneGraph as IDisplay3D; pDisplay.FlashLocation(pMapPoint);//闪烁显示被点击的位置 IGeometry pGeom = null; Cls3DMarkDraw.DeleteAllElementsWithName(m_sceneHookHelper.Scene, sPolyOutlineName); //根据绘制对象类型的不同定义不同的类型 switch (m_DrawType.ToString()) { case "esriGeometryPoint": m_Geometry = pMapPoint; break; case "esriGeometryLine": if (m_pPointColl == null) { m_pPointColl = new PolylineClass(); pGeom = new PolylineClass(); } m_pPointColl.AddPoint(pMapPoint, ref before, ref after); break; case "esriGeometryPolygon": if (m_pPointColl == null) { m_pPointColl = new PolygonClass(); pGeom = new PolygonClass(); } m_pPointColl.AddPoint(pMapPoint, ref before, ref after); break; } //BeginDrawed(true); IGroupElement pGroup = null; if (m_pPointColl.PointCount == 1) { //当为一个点时绘制点 Cls3DMarkDraw.AddSimpleGraphic(pMapPoint, Cls3DMarkDraw.getRGB(71, 61, 255), 4, sPolyOutlineName, m_sceneHookHelper.Scene, pGroup); } else if (m_DrawType.ToString() == "esriGeometryLine") { pGeom = m_pPointColl as IGeometry; pGeom.SpatialReference = pMapPoint.SpatialReference; m_psurface.InterpolateShape(pGeom, out pGeom, ref StepSize); Cls3DMarkDraw.AddSimpleGraphic(pGeom, Cls3DMarkDraw.getRGB(71, 61, 255), 4, sPolyOutlineName, m_sceneHookHelper.Scene, pGroup); m_pPointColl = pGeom as IPointCollection; } else { ITopologicalOperator pTopo = m_pPointColl as ITopologicalOperator; pGeom = pTopo.Boundary; pGeom.SpatialReference = pMapPoint.SpatialReference; m_psurface.InterpolateShape(pGeom, out pGeom, ref StepSize); Cls3DMarkDraw.AddSimpleGraphic(pGeom, Cls3DMarkDraw.getRGB(71, 61, 255), 4, sPolyOutlineName, m_sceneHookHelper.Scene, pGroup); } m_sceneHookHelper.SceneGraph.RefreshViewers(); } catch { return; } }
private void DrawSectionPart() { try { if (m_SectionLine == null) { return; } if (m_SurFace == null) { return; } IGeometry pGeometry = new PolylineClass(); object pObject = 1; m_SurFace.InterpolateShape(m_SectionLine, out pGeometry, ref pObject); IGroupElement pGroup = null; //用于绘制三维效果 Cls3DMarkDraw.AddSimpleGraphic(pGeometry, Cls3DMarkDraw.getRGB(71, 61, 255), 4, sPolyOutlineName, m_pCurrentSceneControl.Scene, pGroup); m_pCurrentSceneControl.SceneGraph.RefreshViewers(); double dblLength; object StepSize = Type.Missing;; m_SurFace.QuerySurfaceLength(pGeometry, out dblLength, ref StepSize); txtSurfaceLengh.Text = dblLength.ToString(); IPolyline pLine = pGeometry as IPolyline; txtPreject.Text = pLine.Length.ToString(); txtZmax.Text = pLine.Envelope.ZMax.ToString(); txtZmin.Text = pLine.Envelope.ZMin.ToString(); IPointCollection pPointCol = pLine as IPointCollection; IPolyline pPolyline2; IPointCollection pPointCol2 = new PolylineClass(); int lLOOP; double dblminY, dblPery, dblPerx, dblMaxY; dblminY = pLine.Envelope.ZMin; dblMaxY = pLine.Envelope.ZMax; if ((pLine.Envelope.ZMax - pLine.Envelope.ZMin) == 0) { return; } if (pLine.Length == 0) { return; } //重新绘制底图 Image pImage = new Bitmap(442, 230); Graphics m_mouse = Graphics.FromImage(pImage); //m_mouse.FillRectangle(Brushes.White,0,0,460,240); Pen pen1 = new Pen(Color.Black, 1); //绘制横坐标、纵坐标及其他两条边 m_mouse.DrawLine(pen1, new PointF(55, 210), new PointF(55, 6)); m_mouse.DrawLine(pen1, new PointF(55, 210), new PointF(431, 210)); m_mouse.DrawLine(pen1, new PointF(55, 6), new PointF(431, 6)); m_mouse.DrawLine(pen1, new PointF(431, 6), new PointF(431, 210)); //Brush pBrush = new HatchBrush(HatchStyle.Percent70, Color.WhiteSmoke); m_mouse.FillRectangle(Brushes.White, 56, 7, 375, 203); //填充区域及背景图 // dblPery = 200 / (pLine.Envelope.ZMax - pLine.Envelope.ZMin); //将纵坐标的高度分线段的高程差段 dblPerx = 368 / pLine.Length; //将横坐标的宽度分成线段长度份 double x, y, x1, y1; x = 0; y = 0; object before = Type.Missing; object after = Type.Missing; Pen pen3 = new Pen(Color.Red, 2); Font drawFont = new Font("宋体", 8.0f, FontStyle.Regular); StringFormat drawFormat = new StringFormat(); Brush drawBrush = new SolidBrush(Color.Black); drawFormat.FormatFlags = StringFormatFlags.DisplayFormatControl; //绘制横坐标刻度值 for (int i = 0; i <= 4; i++) { if (i == 0) { m_mouse.DrawString(i.ToString(), drawFont, Brushes.Black, new PointF(52, 214), drawFormat); } else { Single Lenvlae = Convert.ToSingle((pLine.Length / 4) * i); m_mouse.DrawLine(pen1, new PointF(55 + 92 * i, 210), new PointF(55 + 92 * i, 214)); m_mouse.DrawString(Lenvlae.ToString(), drawFont, drawBrush, new PointF(20 + 92 * i, 215), drawFormat); } } //绘制纵坐标刻度值 for (int i = 1; i <= 10; i++) { m_mouse.DrawLine(pen1, new PointF(55, 210 - 20 * i), new PointF(51, 210 - 20 * i)); Pen pen = new Pen(Color.Black, 1); pen.DashStyle = DashStyle.Dot; m_mouse.DrawLine(pen, new PointF(55, 210 - 20 * i), new PointF(431, 210 - 20 * i)); Single Lenvlae = Convert.ToSingle((((dblMaxY - dblminY) / 10) * i) + dblminY); m_mouse.DrawString(Lenvlae.ToString(), drawFont, Brushes.Black, new PointF(1, 210 - 21 * i), drawFormat); } for (lLOOP = 0; lLOOP < pPointCol.PointCount; lLOOP++) { pPointCol2.AddPoint(pPointCol.get_Point(lLOOP), ref before, ref after); pPolyline2 = pPointCol2 as IPolyline; x1 = pPolyline2.Length * dblPerx + 57; //37为坐标图在pictureBox1中离左边的距离 y1 = 210 - ((pPointCol.get_Point(lLOOP).Z - pLine.Envelope.ZMin) * dblPery); if (lLOOP == 0) //绘制起点 { SolidBrush pSolidBrush = new SolidBrush(Color.Blue); m_mouse.FillEllipse(pSolidBrush, Convert.ToSingle(x1 - 2), Convert.ToSingle(y1 - 2), 6, 6); } if (lLOOP > 0) { //绘制沿线高程变化线 m_mouse.DrawLine(pen3, new PointF(Convert.ToSingle(x), Convert.ToSingle(y)), new PointF(Convert.ToSingle(x1), Convert.ToSingle(y1))); } if (lLOOP == pPointCol.PointCount - 1)//绘制终点 { SolidBrush pSolidBrush = new SolidBrush(Color.Green); m_mouse.FillEllipse(pSolidBrush, Convert.ToSingle(x1 - 2), Convert.ToSingle(y1 - 2), 6, 6); } x = x1; y = y1; } pictureBox1.Image = pImage; m_mouse.Dispose(); drawFont.Dispose(); drawBrush.Dispose(); } catch { return; } }