public InverseDirectionDLG(IEditProperties2 EditorProperties)
        {
            InitializeComponent();
            m_ToolTip1         = new System.Windows.Forms.ToolTip();
            m_EditorProperties = EditorProperties;
            Utilities Utils = new Utilities();

            string sDesktopVers = Utils.GetDesktopVersionFromRegistry();

            if (sDesktopVers.Trim() == "")
            {
                sDesktopVers = "Desktop10.1";
            }
            else
            {
                sDesktopVers = "Desktop" + sDesktopVers;
            }
            string sValues =
                Utils.ReadFromRegistry(RegistryHive.CurrentUser, "Software\\ESRI\\" + sDesktopVers + "\\ArcMap\\Cadastral",
                                       "AddIn.FabricQualityControl_InverseDirection");

            IAngularConverter pAngConv = new AngularConverterClass();

            if (m_EditorProperties != null)
            {
                esriDirectionUnits pUnits      = m_EditorProperties.DirectionUnits;
                string             sAngleUnits = pUnits.ToString();
                sAngleUnits             = sAngleUnits.Replace("esriDU", "");
                sAngleUnits             = sAngleUnits.Replace("Minutes", " Minutes ");
                sAngleUnits             = sAngleUnits.Replace("Decimal", "Decimal ");
                this.lblAngleUnits.Text = sAngleUnits;
            }

            if (sValues.Trim() == "")
            {
                sValues = "False,0.000000,True,True,180,True,0.3,True";
            }
            string[] Values = sValues.Split(',');
            try
            {
                string sTxt1 = Values[1];
                if (m_EditorProperties != null)
                {
                    int iPrec = m_EditorProperties.AngularUnitPrecision;
                    pAngConv.SetString(Values[1], esriDirectionType.esriDTNorthAzimuth, esriDirectionUnits.esriDUDecimalDegrees); //registry always stores in DD
                    sTxt1 = pAngConv.GetString(esriDirectionType.esriDTNorthAzimuth, m_EditorProperties.DirectionUnits, m_EditorProperties.AngularUnitPrecision);
                }

                this.optManualEnteredDirnOffset.Checked = (Values[0].Trim() == "True");
                this.txtDirectionOffset.Text            = sTxt1;
                this.optComputeDirnOffset.Checked       = (Values[2].Trim() == "True");
                this.chkDirectionDifference.Checked     = (Values[3].Trim() == "True");
                this.txtDirectionDifference.Text        = Values[4];
                this.chkSubtendedDistance.Checked       = (Values[5].Trim() == "True");
                this.txtSubtendedDist.Text    = Values[6];
                this.chkReportResults.Checked = (Values[7].Trim() == "True");
            }
            catch
            { }
        }
        public InverseDirectionDLG(IEditProperties2 EditorProperties)
        {
            InitializeComponent();
              m_ToolTip1 = new System.Windows.Forms.ToolTip();
              m_EditorProperties = EditorProperties;
              Utilities Utils = new Utilities();

              string sDesktopVers = Utils.GetDesktopVersionFromRegistry();
              if (sDesktopVers.Trim() == "")
            sDesktopVers = "Desktop10.1";
              else
            sDesktopVers = "Desktop" + sDesktopVers;
              string sValues =
              Utils.ReadFromRegistry(RegistryHive.CurrentUser, "Software\\ESRI\\" + sDesktopVers + "\\ArcMap\\Cadastral",
            "AddIn.FabricQualityControl_InverseDirection");

              IAngularConverter pAngConv = new AngularConverterClass();
              if (m_EditorProperties != null)
              {
            esriDirectionUnits pUnits = m_EditorProperties.DirectionUnits;
            string sAngleUnits = pUnits.ToString();
            sAngleUnits = sAngleUnits.Replace("esriDU", "");
            sAngleUnits = sAngleUnits.Replace("Minutes", " Minutes ");
            sAngleUnits = sAngleUnits.Replace("Decimal", "Decimal ");
            this.lblAngleUnits.Text = sAngleUnits;
              }

              if (sValues.Trim() == "")
            sValues = "False,0.000000,True,True,180,True,0.3,True";
              string[] Values = sValues.Split(',');
              try
              {
            string sTxt1 = Values[1];
            if (m_EditorProperties != null)
            {
              int iPrec = m_EditorProperties.AngularUnitPrecision;
              pAngConv.SetString(Values[1], esriDirectionType.esriDTNorthAzimuth, esriDirectionUnits.esriDUDecimalDegrees); //registry always stores in DD
              sTxt1 = pAngConv.GetString(esriDirectionType.esriDTNorthAzimuth, m_EditorProperties.DirectionUnits, m_EditorProperties.AngularUnitPrecision);
            }

            this.optManualEnteredDirnOffset.Checked = (Values[0].Trim() == "True");
            this.txtDirectionOffset.Text = sTxt1;
            this.optComputeDirnOffset.Checked = (Values[2].Trim() == "True");
            this.chkDirectionDifference.Checked = (Values[3].Trim() == "True");
            this.txtDirectionDifference.Text = Values[4];
            this.chkSubtendedDistance.Checked = (Values[5].Trim() == "True");
            this.txtSubtendedDist.Text = Values[6];
            this.chkReportResults.Checked = (Values[7].Trim() == "True");
              }
              catch
              { }
        }
        object OnGridCellEdit(ref int row, ref int col, ref object inValue)
        {
            string m_sFieldName       = m_ParcelEditHelperExt.FieldName;
            bool   m_bRecordFieldName = m_ParcelEditHelperExt.RecordToField;
            object OutValue           = inValue;

            if (col == 2 && m_bRecordFieldName)//this is the bearing field
            {
                IParcelConstruction pTrav   = (IParcelConstruction)m_pParcEditorMan.ParcelConstruction;
                IGSLine             pGSLine = null;
                bool IsCompleteLine         = (pTrav.GetLine(row, ref pGSLine));
                //true means it's a complete line
                //false means it's a partial line
                //note that the type of the inValue must be honoured when returning the value from this function, in this case we are rebuilding the string for the same value, unaltered.
                //however the other relevant work done is to set the record field to the same value to capture what was entered prior to resequencing and potential bearing changes.
                //this happens either for a complete line or a partial one
                //The logic could be changed to be more conservative and only capture the record for a partial line (IsCompleteLine==false), since that would only record the first time it's cogo'd,
                //compared to this code that records edits of completed lines *as well as* partial lines
                IAngularConverter pAngConv = new AngularConverterClass();
                string            sBear    = Convert.ToString(inValue);
                sBear = sBear.Replace("°", "-");
                sBear = sBear.Replace("'", "-");
                sBear = sBear.Replace("\"", "");

                if (!pAngConv.SetString(sBear, esriDirectionType.esriDTQuadrantBearing, esriDirectionUnits.esriDUDegreesMinutesSeconds)) //TODO: base this on Plan properties
                {
                    return(OutValue);
                }
                double brgRecord = pAngConv.GetAngle(esriDirectionType.esriDTNorthAzimuth, esriDirectionUnits.esriDUDecimalDegrees);

                sBear = pAngConv.GetString(esriDirectionType.esriDTQuadrantBearing, esriDirectionUnits.esriDUDegreesMinutesSeconds, 0);

                IParcelConstruction4 pTrav4 = pTrav as IParcelConstruction4;
                pTrav4.UpdateGridFromGSLines(true, false);
                sBear = sBear.Replace(" ", "");
                sBear = sBear.Insert(sBear.Length - 1, "\"");
                int i = sBear.LastIndexOf('-');
                sBear = sBear.Insert(i, "'");
                i     = sBear.IndexOf('-');
                sBear = sBear.Insert(i, "°");
                sBear = sBear.Replace("-", "");

                IGSAttributes pLineAtts = (IGSAttributes)pGSLine;
                pLineAtts.SetProperty(m_sFieldName, sBear);
                return(sBear);
                //note that the type of the inValue must be honoured when returning the value from this function.
            }
            return(OutValue);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //write the key
            Utilities Utils        = new Utilities();
            string    sDesktopVers = Utils.GetDesktopVersionFromRegistry();

            if (sDesktopVers.Trim() == "")
            {
                sDesktopVers = "Desktop10.1";
            }
            else
            {
                sDesktopVers = "Desktop" + sDesktopVers;
            }

            string sBool0 = this.optManualEnteredDirnOffset.Checked.ToString();
            string sTxt1  = this.txtDirectionOffset.Text;

            IAngularConverter pAngConv = new AngularConverterClass();

            if (!pAngConv.SetString(sTxt1, esriDirectionType.esriDTNorthAzimuth, m_EditorProperties.DirectionUnits))
            {
                sTxt1 = "0";
            }
            else
            {
                sTxt1 = pAngConv.GetString(esriDirectionType.esriDTNorthAzimuth, esriDirectionUnits.esriDUDecimalDegrees, 6);//always write as decimal deg
            }
            string sBool2 = this.optComputeDirnOffset.Checked.ToString();
            string sBool3 = this.chkDirectionDifference.Checked.ToString();
            string sTxt4  = this.txtDirectionDifference.Text;
            string sBool5 = this.chkSubtendedDistance.Checked.ToString();
            string sTxt6  = this.txtSubtendedDist.Text;
            string sBool7 = this.chkReportResults.Checked.ToString();

            Utils.WriteToRegistry(RegistryHive.CurrentUser, "Software\\ESRI\\" +
                                  sDesktopVers + "\\ArcMap\\Cadastral", "AddIn.FabricQualityControl_InverseDirection",
                                  sBool0 + "," + sTxt1 + "," + sBool2 + "," + sBool3 + "," + sTxt4 + "," + sBool5 + "," + sTxt6 + "," + sBool7);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //write the key
              Utilities Utils = new Utilities();
              string sDesktopVers = Utils.GetDesktopVersionFromRegistry();
              if (sDesktopVers.Trim() == "")
            sDesktopVers = "Desktop10.1";
              else
            sDesktopVers = "Desktop" + sDesktopVers;

              string sBool0 = this.optManualEnteredDirnOffset.Checked.ToString();
              string sTxt1 = this.txtDirectionOffset.Text;

              IAngularConverter pAngConv = new AngularConverterClass();
              if (!pAngConv.SetString(sTxt1, esriDirectionType.esriDTNorthAzimuth, m_EditorProperties.DirectionUnits))
            sTxt1 = "0";
              else
            sTxt1 = pAngConv.GetString(esriDirectionType.esriDTNorthAzimuth, esriDirectionUnits.esriDUDecimalDegrees, 6);//always write as decimal deg
              string sBool2 = this.optComputeDirnOffset.Checked.ToString();
              string sBool3 = this.chkDirectionDifference.Checked.ToString();
              string sTxt4 = this.txtDirectionDifference.Text;
              string sBool5 = this.chkSubtendedDistance.Checked.ToString();
              string sTxt6 = this.txtSubtendedDist.Text;
              string sBool7 = this.chkReportResults.Checked.ToString();

              Utils.WriteToRegistry(RegistryHive.CurrentUser, "Software\\ESRI\\" +
            sDesktopVers + "\\ArcMap\\Cadastral", "AddIn.FabricQualityControl_InverseDirection",
            sBool0 + "," + sTxt1 + "," + sBool2 + "," + sBool3 + "," + sTxt4 + "," + sBool5 + "," + sTxt6 + "," + sBool7);
        }
예제 #6
0
        private double AnglularDefaultUnitsToRadians(string inUnits)
        {
            try
            {
                IAngularConverter pAngularConverter = new AngularConverterClass();
                pAngularConverter.SetString(inUnits,m_pEditProp2.DirectionType,m_pEditProp2.DirectionUnits);

                return pAngularConverter.GetAngle(esriDirectionType.esriDTPolar,esriDirectionUnits.esriDURadians);
            }
            catch
            {
                return double.NaN;
            }
        }
        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);
        }