Esempio n. 1
0
        public static void GetAlignmentAndOrigin(CorridorState rwState, ref ObjectId oAlignmentId, ref PointInMem oOrigin)
        {
            //IL_001f: Unknown result type (might be due to invalid IL or missing references)
            //IL_0025: Expected O, but got Unknown
            //IL_0026: Unknown result type (might be due to invalid IL or missing references)
            //IL_002c: Invalid comparison between Unknown and I4
            //IL_0090: Unknown result type (might be due to invalid IL or missing references)
            //IL_0095: Unknown result type (might be due to invalid IL or missing references)
            //IL_00ca: Unknown result type (might be due to invalid IL or missing references)
            //IL_00cf: Unknown result type (might be due to invalid IL or missing references)
            if (rwState == null)
            {
                throw new ArgumentNullException("rwState");
            }
            if (oOrigin == null)
            {
                oOrigin = new PointInMem();
            }
            if ((int)rwState.Mode == 1)
            {
                oOrigin.Station   = 0.0;
                oOrigin.Offset    = 0.0;
                oOrigin.Elevation = 0.0;
                return;
            }
            bool isFixedAlignmentOffset = rwState.CurrentAlignmentIsOffsetAlignment & rwState.CurrentAssemblyOffsetIsFixed;

            oOrigin.Station = rwState.CurrentStation;
            if (isFixedAlignmentOffset)
            {
                oAlignmentId      = rwState.CurrentBaselineId;
                oOrigin.Offset    = rwState.CurrentOffset + rwState.CurrentAssemblyFixedOffset;
                oOrigin.Elevation = rwState.CurrentElevation + rwState.CurrentAssemblyFixedElevation;
            }
            else
            {
                oAlignmentId      = rwState.CurrentAlignmentId;
                oOrigin.Offset    = rwState.CurrentOffset;
                oOrigin.Elevation = rwState.CurrentElevation;
            }
        }
Esempio n. 2
0
        public static bool GetRoundingCurve(IPoint oIntersectPt, double dSlope1, double dSlope2, RoundingOption nRoundingOption, RoundingBy nRoundingBy, double dRoundingValue, long nRoundingTesselation, double dTangentLength1, double dTangentLength2, bool isRight, ref IPoint[] tesselatedPts)
        {
            //IL_0602: Unknown result type (might be due to invalid IL or missing references)
            //IL_0608: Expected O, but got Unknown
            //IL_0883: Unknown result type (might be due to invalid IL or missing references)
            //IL_0889: Expected O, but got Unknown
            int  num = default(int);
            bool GetRoundingCurve;
            int  num4 = default(int);

            try
            {
                ProjectData.ClearProjectError();
                num = -2;
                GetRoundingCurve = false;
                switch (nRoundingOption)
                {
                case RoundingOption.NoneType:
                    goto end_IL_0001;

                case RoundingOption.CircularType:
                {
                    double dAngle6 = Math.Atan(dSlope1);
                    dAngle6  = ((dAngle6 < 0.0) ? ((!isRight) ? (Math.PI - dAngle6) : (Math.PI * 2.0 + dAngle6)) : ((dAngle6 > 0.0) ? ((!isRight) ? (Math.PI - dAngle6) : dAngle6) : ((!isRight) ? Math.PI : 0.0)));
                    dAngle6 += Math.PI;
                    if (dAngle6 > Math.PI * 2.0)
                    {
                        dAngle6 -= Math.PI * 2.0;
                    }
                    double dAngle3 = Math.Atan(dSlope2);
                    dAngle3 = ((dAngle3 < 0.0) ? ((!isRight) ? (Math.PI - dAngle3) : (Math.PI * 2.0 + dAngle3)) : ((dAngle3 > 0.0) ? ((!isRight) ? (Math.PI - dAngle3) : dAngle3) : ((!isRight) ? Math.PI : 0.0)));
                    double dArcAngle = Math.Abs(Math.PI - Math.Abs(dAngle6 - dAngle3));
                    double dRadius2  = dRoundingValue;
                    if (nRoundingBy == RoundingBy.ByLength)
                    {
                        dRadius2 = dRoundingValue / dArcAngle;
                    }
                    double dTangentLength3 = dRadius2 * Math.Tan(dArcAngle / 2.0);
                    if (dTangentLength1 < dTangentLength3)
                    {
                        dTangentLength3 = dTangentLength1;
                    }
                    if (dTangentLength2 < dTangentLength3)
                    {
                        dTangentLength3 = dTangentLength2;
                    }
                    dRadius2 = dTangentLength3 / Math.Tan(dArcAngle / 2.0);
                    double[] vIntersectPt = new double[3]
                    {
                        oIntersectPt.Offset,
                        oIntersectPt.Elevation,
                        0.0
                    };
                    double[] vStartPt    = Utility.PolarPoint(vIntersectPt, dAngle6, dTangentLength3);
                    double[] vEndPt      = Utility.PolarPoint(vIntersectPt, dAngle3, dTangentLength3);
                    double   dIntPtAngle = (!(Math.Abs(dAngle3 - dAngle6) > Math.PI)) ? (dAngle6 + (dAngle3 - dAngle6) / 2.0) : (dAngle6 + (dAngle3 - dAngle6) / 2.0 + Math.PI);
                    if (dIntPtAngle > Math.PI * 2.0)
                    {
                        dIntPtAngle -= Math.PI * 2.0;
                    }
                    double[] vCenterPt = new double[3]
                    {
                        oIntersectPt.Offset + dRadius2 / Math.Cos(dArcAngle / 2.0) * Math.Cos(dIntPtAngle),
                        oIntersectPt.Elevation + dRadius2 / Math.Cos(dArcAngle / 2.0) * Math.Sin(dIntPtAngle),
                        0.0
                    };
                    double dStartAng;
                    if (Math.Abs(vStartPt[0] - vCenterPt[0]) < 1E-05)
                    {
                        dStartAng = ((!(vStartPt[1] < vCenterPt[1])) ? (Math.PI / 2.0) : 4.71238898038469);
                    }
                    else
                    {
                        dStartAng = Math.Atan((vStartPt[1] - vCenterPt[1]) / (vStartPt[0] - vCenterPt[0]));
                        if (!(dStartAng > 0.0))
                        {
                            dStartAng = ((!(vStartPt[0] < vCenterPt[0])) ? (Math.PI * 2.0 + dStartAng) : (Math.PI + dStartAng));
                        }
                        else if (vStartPt[0] < vCenterPt[0])
                        {
                            dStartAng = Math.PI + dStartAng;
                        }
                    }
                    double dEndAng;
                    if (Math.Abs(vEndPt[0] - vCenterPt[0]) < 1E-05)
                    {
                        dEndAng = ((!(vEndPt[1] < vCenterPt[1])) ? (Math.PI / 2.0) : 4.71238898038469);
                    }
                    else
                    {
                        dEndAng = Math.Atan((vEndPt[1] - vCenterPt[1]) / (vEndPt[0] - vCenterPt[0]));
                        if (!(dEndAng > 0.0))
                        {
                            dEndAng = ((!(vEndPt[0] < vCenterPt[0])) ? (Math.PI * 2.0 + dEndAng) : (Math.PI + dEndAng));
                        }
                        else if (vEndPt[0] < vCenterPt[0])
                        {
                            dEndAng = Math.PI + dEndAng;
                        }
                    }
                    double dDeltaAng = (dEndAng - dStartAng) / (double)checked (nRoundingTesselation + 1);
                    int    num3      = checked ((int)(nRoundingTesselation + 1));
                    for (int i = 0; i <= num3; i = checked (i + 1))
                    {
                        double[] vCurrentPt = Utility.PolarPoint(vCenterPt, dStartAng + (double)i * dDeltaAng, dRadius2);
                        tesselatedPts[i]           = new PointInMem();
                        tesselatedPts[i].Station   = oIntersectPt.Station;
                        tesselatedPts[i].Offset    = vCurrentPt[0];
                        tesselatedPts[i].Elevation = vCurrentPt[1];
                    }
                    break;
                }

                default:
                {
                    if (!isRight)
                    {
                        double dTempSwap2 = dSlope2;
                        dSlope2         = 0.0 - dSlope1;
                        dSlope1         = 0.0 - dTempSwap2;
                        dTempSwap2      = dTangentLength2;
                        dTangentLength2 = dTangentLength1;
                        dTangentLength1 = dTempSwap2;
                    }
                    double dL;
                    double dK;
                    if (nRoundingBy == RoundingBy.ByLength)
                    {
                        dL = dRoundingValue;
                        dK = (dSlope2 - dSlope1) / dL;
                    }
                    else
                    {
                        dK = dRoundingValue / 100.0;
                        dL = (dSlope2 - dSlope1) / dK;
                        if (dL < 0.0)
                        {
                            dK = 0.0 - dK;
                            dL = 0.0 - dL;
                        }
                    }
                    double dT5 = Math.Abs(dL / 2.0 / Math.Cos(Math.Atan(dSlope1)));
                    if (dTangentLength1 < dT5)
                    {
                        dT5 = dTangentLength1;
                        dL  = dT5 * Math.Cos(Math.Atan(dSlope1)) * 2.0;
                    }
                    double dT3 = Math.Abs(dL / 2.0 / Math.Cos(Math.Atan(dSlope2)));
                    if (dTangentLength2 < dT3)
                    {
                        dT3 = dTangentLength2;
                        dL  = dT3 * Math.Cos(Math.Atan(dSlope2)) * 2.0;
                        Math.Abs(dL / 2.0 / Math.Cos(Math.Atan(dSlope1)));
                    }
                    double dDeltaX = dL / (double)checked (nRoundingTesselation + 1);
                    int    num2    = checked ((int)(nRoundingTesselation + 1));
                    for (int j = 0; j <= num2; j = checked (j + 1))
                    {
                        double x             = (double)j * dDeltaX;
                        int    nCurrentIndex = (!isRight) ? checked ((int)(nRoundingTesselation + 1 - j)) : j;
                        tesselatedPts[nCurrentIndex]         = new PointInMem();
                        tesselatedPts[nCurrentIndex].Station = oIntersectPt.Station;
                        tesselatedPts[nCurrentIndex].Offset  = oIntersectPt.Offset + (x - dL / 2.0);
                        if (x < dL / 2.0)
                        {
                            tesselatedPts[nCurrentIndex].Elevation = oIntersectPt.Elevation - (dL / 2.0 - x * dSlope1 + dK / 2.0 * x * x);
                        }
                        else
                        {
                            tesselatedPts[nCurrentIndex].Elevation = oIntersectPt.Elevation + (x - dL / 2.0 * dSlope2 + dK / 2.0 * (dL * dL + x * x) - dL * dK * x);
                        }
                    }
                    break;
                }
                }
                GetRoundingCurve = true;
            }
            catch (object obj) when((obj is Exception && num != 0) & (num4 == 0))
            {
                ProjectData.SetProjectError((Exception)obj);
                /*Error near IL_0ca2: Could not find block for branch target IL_0c6a*/
                ;
            }
            if (num4 != 0)
            {
                ProjectData.ClearProjectError();
            }
            return(GetRoundingCurve);
        }