public override void OnMouseDown(int Button, int Shift, int X, int Y) { if (Button == 2) { return; } INewLineFeedback pLineFeed; if (m_point_From == null) { m_point_From = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); //拖拽效果 m_pFeedback = new NewLineFeedbackClass(); pLineFeed = (INewLineFeedback)m_pFeedback; pLineFeed.Start(m_point_From); if (m_pFeedback != null) { m_pFeedback.Display = m_hookHelper.ActiveView.ScreenDisplay; } } else if (m_point_To == null) { m_point_To = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); //添加拖拽点 pLineFeed = (INewLineFeedback)m_pFeedback; pLineFeed.AddPoint(m_point_To); } else if (m_point_Center == null) { m_point_Center = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); //添加拖拽点 pLineFeed = (INewLineFeedback)m_pFeedback; pLineFeed.AddPoint(m_point_Center); pLineFeed.Stop(); ESRI.ArcGIS.Geometry.ICircularArc circularArc = new ESRI.ArcGIS.Geometry.CircularArcClass(); circularArc.PutCoords(m_point_Center, m_point_From, m_point_To, ESRI.ArcGIS.Geometry.esriArcOrientation.esriArcClockwise); DrawCircleByCenterAndRadius(m_pCurrentLayer, circularArc, m_hookHelper.ActiveView.ScreenDisplay); //画完后清空 m_point_From = null; m_point_To = null; m_point_Center = null; } }
public override void OnMouseDown(int Button, int Shift, int X, int Y) { if (Button == 2) return; INewLineFeedback pLineFeed; if (m_point_From == null) { m_point_From = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); //��קЧ�� m_pFeedback = new NewLineFeedbackClass(); pLineFeed = (INewLineFeedback)m_pFeedback; pLineFeed.Start(m_point_From); if (m_pFeedback != null) m_pFeedback.Display = m_hookHelper.ActiveView.ScreenDisplay; } else if (m_point_To == null) { m_point_To = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); //�����ק�� pLineFeed = (INewLineFeedback)m_pFeedback; pLineFeed.AddPoint(m_point_To); } else if (m_point_Center == null) { m_point_Center = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); //�����ק�� pLineFeed = (INewLineFeedback)m_pFeedback; pLineFeed.AddPoint(m_point_Center); pLineFeed.Stop(); ESRI.ArcGIS.Geometry.ICircularArc circularArc = new ESRI.ArcGIS.Geometry.CircularArcClass(); circularArc.PutCoords(m_point_Center, m_point_From, m_point_To, ESRI.ArcGIS.Geometry.esriArcOrientation.esriArcClockwise); DrawCircleByCenterAndRadius(m_pCurrentLayer, circularArc, m_hookHelper.ActiveView.ScreenDisplay); //�������� m_point_From = null; m_point_To = null; m_point_Center = null; } }
protected override void OnClick() { IEditor pEd = (IEditor)ArcMap.Editor; IEditor2 pEd2 = (IEditor2)ArcMap.Editor; IEditProperties pEdProps1 = pEd as IEditProperties; IEditProperties2 pEdProps2 = pEd as IEditProperties2; IEditSketch2 pSketch2 = ArcMap.Editor as IEditSketch2; ISegmentCollection pSegColl = pSketch2.Geometry as ISegmentCollection; double dLineDirection = 0; ISketchTool sketchTool = ArcMap.Application.CurrentTool.Command as ISketchTool; if (sketchTool.Constraint == esriSketchConstraint.esriConstraintAngle) { dLineDirection = sketchTool.AngleConstraint; } else { ILine pRubberBandLine = new LineClass(); pRubberBandLine.PutCoords(pSketch2.LastPoint, pEd2.Location); dLineDirection = pRubberBandLine.Angle; } IAngularConverter pAngConv = new AngularConverterClass(); pAngConv.SetAngle(dLineDirection, esriDirectionType.esriDTPolar, esriDirectionUnits.esriDURadians); int iSegCnt = pSegColl.SegmentCount; dlgSpiralParameters SpiralEntryDialog = new dlgSpiralParameters(); string sBearing = pAngConv.GetString(pEdProps2.DirectionType, pEdProps2.DirectionUnits, pEdProps2.AngularUnitPrecision); SpiralEntryDialog.txtDirection.Text = sBearing; //Display the dialog DialogResult pDialogResult = SpiralEntryDialog.ShowDialog(); esriCurveDensifyMethod DensifyMethod = esriCurveDensifyMethod.esriCurveDensifyByAngle; //default double dDensifyParameter = 2 * Math.PI / 180; //2 degrees //default if (SpiralEntryDialog.optCustomDensification.Checked) { DensifyMethod = (esriCurveDensifyMethod)SpiralEntryDialog.cboDensificationType.SelectedIndex; if (DensifyMethod == esriCurveDensifyMethod.esriCurveDensifyByAngle) { dDensifyParameter = Convert.ToDouble(SpiralEntryDialog.numAngleDensification.Value) * Math.PI / 180; } else { if (!Double.TryParse(SpiralEntryDialog.txtDensifyValue.Text, out dDensifyParameter)) { dDensifyParameter = 2; } } } if (pDialogResult != DialogResult.OK) { return; } if (SpiralEntryDialog.txtStartRadius.Text.ToLower().Trim() == "infinity" && SpiralEntryDialog.txtEndRadius.Text.ToLower().Trim() == "infinity") { return; } double dSpiralRadius1 = Double.MaxValue; //default to infinity double dFromCurvature = 0; if (SpiralEntryDialog.txtStartRadius.Text.ToLower() != "infinity") { if (Double.TryParse(SpiralEntryDialog.txtStartRadius.Text, out dSpiralRadius1)) { dFromCurvature = 1 / dSpiralRadius1; } else { return; } } double dSpiralRadius2 = Double.MaxValue; //default to infinity double dToCurvature = 0; if (SpiralEntryDialog.txtEndRadius.Text.ToLower() != "infinity") { if (Double.TryParse(SpiralEntryDialog.txtEndRadius.Text, out dSpiralRadius2)) { dToCurvature = 1 / dSpiralRadius2; } else { return; } } bool bIsCCW = (dSpiralRadius1 > dSpiralRadius2) ? SpiralEntryDialog.optRight.Checked : SpiralEntryDialog.optLeft.Checked; bool bSpecialCaseCircularArc = (dSpiralRadius1 == dSpiralRadius2); if (!pAngConv.SetString(SpiralEntryDialog.txtDirection.Text, pEdProps2.DirectionType, pEdProps2.DirectionUnits)) { return; } double dNorthAzimuthRadians = pAngConv.GetAngle(esriDirectionType.esriDTNorthAzimuth, esriDirectionUnits.esriDURadians); IVector3D pVec = new Vector3DClass(); pVec.PolarSet(dNorthAzimuthRadians, 0, 500); IPoint pTangentPoint = new PointClass(); pTangentPoint.PutCoords(pSketch2.LastPoint.X + pVec.XComponent, pSketch2.LastPoint.Y + pVec.YComponent); //double dStreamingTol = pEdProps1.StreamTolerance; //if (dStreamingTol == 0) // dStreamingTol = 0.001 * 5000; //metric //double dSpiralOffsetGeometryPrecision = 0.001 * 250; //metric 0.25 m IPolyline6 theSpiralPolyLine = null; double dExitTangent = 0; if (SpiralEntryDialog.cboPathLengthParameter.SelectedIndex == 0) { double dSpiralArcLength; if (!Double.TryParse(SpiralEntryDialog.txtPathLengthParameter.Text, out dSpiralArcLength)) { return; } if (bSpecialCaseCircularArc) { ILine pInTangentLine = new LineClass(); pInTangentLine.PutCoords(pSketch2.LastPoint, pTangentPoint); ISegment pTangentSegment = (ISegment)pInTangentLine; IConstructCircularArc2 pCircArcConstr = new ESRI.ArcGIS.Geometry.CircularArcClass() as IConstructCircularArc2; pCircArcConstr.ConstructTangentRadiusArc(pTangentSegment, false, bIsCCW, dSpiralRadius1, dSpiralArcLength); ICircularArc pArcSegment = pCircArcConstr as ICircularArc; //Get chord Line from tangent curve constructor ILine pChordLine = new LineClass(); pChordLine.PutCoords(pArcSegment.FromPoint, pArcSegment.ToPoint); double dPolarRadians = pChordLine.Angle; //to get the chord azimuth pCircArcConstr.ConstructBearingRadiusArc(pSketch2.LastPoint, dPolarRadians, bIsCCW, dSpiralRadius1, dSpiralArcLength); dExitTangent = pArcSegment.ToAngle + Math.PI / 2; ISegmentCollection segCollection = new PolylineClass() as ISegmentCollection; object obj = Type.Missing; segCollection.AddSegment((ISegment)pArcSegment, ref obj, ref obj); theSpiralPolyLine = segCollection as IPolyline6; } else { theSpiralPolyLine = ConstructSpiralbyLength(pSketch2.LastPoint, pTangentPoint, dFromCurvature, dToCurvature, bIsCCW, dSpiralArcLength, DensifyMethod, dDensifyParameter, out dExitTangent); } } if (SpiralEntryDialog.cboPathLengthParameter.SelectedIndex == 1) { if (!pAngConv.SetString(SpiralEntryDialog.txtPathLengthParameter.Text, esriDirectionType.esriDTPolar, pEdProps2.DirectionUnits)) { return; } double dSpiralDeltaAngle = pAngConv.GetAngle(esriDirectionType.esriDTPolar, esriDirectionUnits.esriDURadians); if (bSpecialCaseCircularArc) { ILine pInTangentLine = new LineClass(); pInTangentLine.PutCoords(pSketch2.LastPoint, pTangentPoint); ISegment pTangentSegment = (ISegment)pInTangentLine; IConstructCircularArc2 pCircArcConstr = new ESRI.ArcGIS.Geometry.CircularArcClass() as IConstructCircularArc2; pCircArcConstr.ConstructTangentRadiusAngle(pTangentSegment, false, bIsCCW, dSpiralRadius1, dSpiralDeltaAngle); ICircularArc pArcSegment = pCircArcConstr as ICircularArc; //Get chord Line from tangent curve constructor ILine pChordLine = new LineClass(); pChordLine.PutCoords(pArcSegment.FromPoint, pArcSegment.ToPoint); double dPolarRadians = pChordLine.Angle; //to get the chord azimuth pCircArcConstr.ConstructBearingRadiusAngle(pSketch2.LastPoint, dPolarRadians, bIsCCW, dSpiralRadius1, dSpiralDeltaAngle); dExitTangent = pArcSegment.ToAngle + Math.PI / 2; ISegmentCollection segCollection = new PolylineClass() as ISegmentCollection; object obj = Type.Missing; segCollection.AddSegment((ISegment)pArcSegment, ref obj, ref obj); theSpiralPolyLine = segCollection as IPolyline6; } else { theSpiralPolyLine = ConstructSpiralbyDeltaAngle(pSketch2.LastPoint, pTangentPoint, dFromCurvature, dToCurvature, bIsCCW, dSpiralDeltaAngle, DensifyMethod, dDensifyParameter, out dExitTangent); } } if (theSpiralPolyLine == null) { MessageBox.Show("A spiral could not be created with the entered parameters."); return; } ISegmentCollection pSpiralSegCollection = theSpiralPolyLine as ISegmentCollection; //Start a sketch operation and insert the new envelope into the sketch ISketchOperation2 sketchOp = new SketchOperationClass(); sketchOp.Start(ArcMap.Editor); sketchOp.MenuString = "Add Spiral"; pSegColl.AddSegmentCollection(pSpiralSegCollection); IGeometry geom = pSegColl as IGeometry; pSketch2.Geometry = geom; //set the angle constraint to the exit tangent of the spiral sketchTool.Constraint = esriSketchConstraint.esriConstraintAngle; sketchTool.AngleConstraint = dExitTangent; sketchOp.Finish(ArcMap.Document.ActiveView.Extent, esriSketchOperationType.esriSketchOperationGeneral, null); }