示例#1
0
        private bool showLine()
        {
            ArrayList usableCurves = new ArrayList();
            double    mindist      = double.MaxValue;

            if (tangCurves == null)
            {
                return(false);
            }
            for (int i = 0; i < tangCurves.Length; ++i)
            {
                Plane pl; // Element hat eine Ebene:
                if (tangCurves[i].GetPlanarState() == PlanarState.Planar)
                {
                    pl = tangCurves[i].GetPlane();
                }
                else
                { // Element hat keine Ebene: Eine machen, falls möglich!
                    try { pl = new Plane(tangCurves[i].StartPoint, tangCurves[i].EndPoint, circlePoint); }
                    catch (PlaneException) { break; }
                }
                if (Precision.IsPointOnPlane(circlePoint, pl))
                {
                    ICurve2D     l2D1          = tangCurves[i].GetProjectedCurve(pl);
                    GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, pl.Project(circlePoint), circRad);
                    if (tangentPoints.Length > 0)
                    {                                    // eine gültige Lösung ist gefunden
                        usableCurves.Add(tangCurves[i]); // zur lokalen Liste zufügen
                        for (int k = 0; k < tangentPoints.Length; k += 2)
                        {
                            double dist = Geometry.Dist(tangentPoints[k + 1], pl.Project(radiusPoint));
                            if (dist < mindist)
                            {
                                mindist  = dist;
                                selected = usableCurves.Count - 1; // merken, welche Kurve die aktuell benutzte ist
                                // (/ 2) und (* 2), da pro Lösung zwei Punkte geliefert werden
                                int l = (k + 2 * (Math.Abs(selSol) % (tangentPoints.Length / 2))) % tangentPoints.Length;
                                center = tangentPoints[l];
                            }
                        }
                    }
                    if (mindist < double.MaxValue)
                    {
                        circRadCalc = (Math.Abs(l2D1.Distance(pl.Project(radiusPoint))) + Math.Abs(Geometry.Dist(circlePoint, radiusPoint))) / 2.0;
                        //							base.MultiSolution = true;
                        base.MultiSolutionCount = tangentPoints.Length / 2;
                        circ.SetCirclePlaneCenterRadius(pl, pl.ToGlobal(center), circRad);
                        tangCurves            = (ICurve[])usableCurves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                        base.ShowActiveObject = true;
                        return(true);
                    }
                }
            }

            base.MultiSolutionCount = 0;
            //            base.MultiSolution = false;
            base.ShowActiveObject = false;
            return(false);
        }
示例#2
0
        /// <summary>
        /// Determines the commomn plane of a point and a curve. Returns the common plane in the
        /// parameter and true if there is such a plane. Returns false, if the point lies not
        /// in the plane. <seealso cref="Precision"/>
        /// </summary>
        /// <param name="p">The point</param>
        /// <param name="c2">The curve</param>
        /// <param name="CommonPlane">The common plane</param>
        /// <returns>true, if there is a common plane, else false</returns>
        public static bool GetCommonPlane(GeoPoint p, ICurve c2, out Plane CommonPlane)
        {   // kommt erstaunlicherweise ohne Zugriff auf die konkreten Kurven aus
            PlanarState ps2 = c2.GetPlanarState();

            if (ps2 == PlanarState.NonPlanar)
            {
                CommonPlane = new Plane(Plane.StandardPlane.XYPlane, 0.0); // braucht leider ein Ergebnis
                return(false);
            }

            if (ps2 == PlanarState.Planar)
            {
                Plane p2 = c2.GetPlane();
                if (Precision.IsPointOnPlane(p, p2))
                {
                    CommonPlane = p2;
                    return(true);
                }
            }
            else
            {   // UnderDetermined, also Linie oder so
                GeoVector v1 = p - c2.StartPoint;
                GeoVector v2 = c2.StartDirection;
                if (!Precision.SameDirection(v1, v2, false) && !Precision.IsNullVector(v1))
                {
                    Plane pl = new Plane(p, v1, v2);
                    if (c2.IsInPlane(pl))
                    {
                        CommonPlane = pl;
                        return(true);
                    }
                }
            }
            CommonPlane = new Plane(Plane.StandardPlane.XYPlane, 0.0); // braucht leider ein Ergebnis
            return(false);
        }
        private bool showLine()
        {
            ArrayList usableCurves = new ArrayList();
            double    mindist      = double.MaxValue;
            double    arcRadLoc;

            if (tangCurves == null)
            {
                return(false);
            }
            arcRadLoc = arcRad;
            for (int i = 0; i < tangCurves.Length; ++i)
            {
                Plane pl;
                if (tangCurves[i].GetPlanarState() == PlanarState.Planar)
                {
                    pl = tangCurves[i].GetPlane();
                }
                else
                {
                    try { pl = new Plane(tangCurves[i].StartPoint, tangCurves[i].EndPoint, circlePoint); }
                    catch (PlaneException) { break; }
                }
                if (Precision.IsPointOnPlane(circlePoint, pl))
                {
                    ICurve2D l2D1 = tangCurves[i].GetProjectedCurve(pl);
                    if (l2D1 is Path2D)
                    {
                        (l2D1 as Path2D).Flatten();
                    }
                    GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, pl.Project(circlePoint), arcRad);
                    if (tangentPoints.Length > 0)
                    {                                    // eine gültige Linie ist gefunden
                        usableCurves.Add(tangCurves[i]); // zur lokalen Liste zufügen
                        for (int k = 0; k < tangentPoints.Length; k += 2)
                        {
                            double dist = Geometry.Dist(tangentPoints[k + 1], pl.Project(objectPoint));
                            if (dist < mindist)
                            {
                                mindist  = dist;
                                selected = usableCurves.Count - 1; // merken, welche Kurve die aktuell benutzte ist
                                // die Punkte werden als sortiert erwartet!! Hier nur über modulo (%) den Index bestimmen
                                // selSol / 2 shifted nach rechts, um 3 Zeilen tiefer weitere Möglichkeiten auswählen zu können
                                // (/ 3) und (* 3), da pro Lösung drei Punkte geliefert werden
                                int l = (k + 2 * ((Math.Abs(selSol) / 2) % (tangentPoints.Length / 2))) % tangentPoints.Length;
                                center = tangentPoints[l];
                                if ((Math.Abs(selSol) & 0x1) == 0) // 0 und 1 dienen zur Unterscheidung der Kreisbogenausrichtung
                                {
                                    startAngle = new Angle(tangentPoints[l + 1], center);
                                    endAngle   = new Angle(pl.Project(circlePoint), center);
                                }
                                else
                                {
                                    startAngle = new Angle(pl.Project(circlePoint), center);
                                    endAngle   = new Angle(tangentPoints[l + 1], center);
                                }
                            }
                        }
                    }
                    if (mindist < double.MaxValue)
                    {
                        arcRadCalc = (Math.Abs(l2D1.Distance(pl.Project(radiusPoint))) + Math.Abs(Geometry.Dist(circlePoint, radiusPoint))) / 2.0;
                        //							base.MultiSolution = true;
                        base.MultiSolutionCount = tangentPoints.Length;                         // /2 *2
                        arc.SetArcPlaneCenterRadiusAngles(pl, pl.ToGlobal(center), arcRadLoc, startAngle, new SweepAngle(startAngle, endAngle, arcDir));
                        tangCurves            = (ICurve[])usableCurves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                        base.ShowActiveObject = true;
                        return(true);
                    }
                }
            }

            base.MultiSolutionCount = 0;
            //            base.MultiSolution = false;
            base.ShowActiveObject = false;
            return(false);
        }
        private bool showLineDiam()
        {
            ArrayList usable1Curves = new ArrayList();
            Plane     pl;
            double    mindist = double.MaxValue;

            if (tangCurves == null)
            {
                return(false);
            }
            for (int i = 0; i < tangCurves.Length; ++i)
            {
                if (tangCurves[i].GetPlanarState() == PlanarState.Planar)
                {
                    pl = tangCurves[i].GetPlane();
                }
                else
                { // Element hat keine Ebene: Eine machen, falls möglich!
                    try { pl = new Plane(tangCurves[i].StartPoint, tangCurves[i].EndPoint, circlePoint); }
                    catch (PlaneException) { break; }
                }
                if (Precision.IsPointOnPlane(radiusPoint, pl))
                {
                    ICurve2D     l2D1          = tangCurves[i].GetProjectedCurve(pl);
                    ICurve2D     l2D2          = new Circle2D(pl.Project(circlePoint), 0.0);
                    ICurve2D     l2D3          = new Circle2D(pl.Project(radiusPoint), 0.0);
                    GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, l2D2, l2D3, pl.Project(objectPoint), pl.Project(circlePoint), pl.Project(radiusPoint));
                    if (tangentPoints.Length > 0)
                    {                                     // eine gültige Linie ist gefunden
                        usable1Curves.Add(tangCurves[i]); // zur lokalen Liste zufügen
                        for (int l = 0; l < tangentPoints.Length; l += 4)
                        {
                            double dist = Geometry.Dist(tangentPoints[l + 1], pl.Project(objectPoint)) +
                                          Geometry.Dist(tangentPoints[l + 2], pl.Project(circlePoint)) +
                                          Geometry.Dist(tangentPoints[l + 3], pl.Project(radiusPoint));
                            if (dist < mindist)
                            {
                                mindist  = dist;
                                selected = usable1Curves.Count - 1; // merken, welche Kurven die aktuell benutzten sind
                                // selSol / 6 entspricht div 6, um einige Zeilen tiefer weitere 6 Möglichkeiten auswählen zu können
                                // (/ 4) und (* 4), da pro Lösung vier Punkte geliefert werden
                                int m = (l + 4 * (Math.Abs(selSol) % (tangentPoints.Length / 4))) % tangentPoints.Length;
                                center     = tangentPoints[m];
                                arcRadCalc = Geometry.Dist(tangentPoints[m + 1], center) * 2.0;
                            }
                        }
                        if (mindist < double.MaxValue)
                        {
                            //										base.MultiSolution = true;
                            base.MultiSolutionCount = tangentPoints.Length / 4;
                            arc.SetCirclePlaneCenterRadius(pl, pl.ToGlobal(center), arcRad);
                            tangCurves            = (ICurve[])usable1Curves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                            base.ShowActiveObject = true;
                            return(true);
                        }
                    }
                }
            }
            base.ShowActiveObject   = false;
            base.MultiSolutionCount = 0;
            //            base.MultiSolution = false;
            return(false);
        }
示例#5
0
        private bool showLineDiam()
        {
            ArrayList usable1Curves = new ArrayList();
            ArrayList usable2Curves = new ArrayList();
            Plane     pl;
            double    mindist = double.MaxValue;

            if (tangCurves == null)
            {
                return(false);
            }
            if (tang2Curves == null)
            {
                return(false);
            }
            //			if (tang3Curves == null) return false;
            for (int i = 0; i < tangCurves.Length; ++i)
            {
                for (int j = 0; j < tang2Curves.Length; ++j)
                {
                    if (Curves.GetCommonPlane(tangCurves[i], tang2Curves[j], out pl))
                    {
                        if (Precision.IsPointOnPlane(radiusPoint, pl))
                        {
                            ICurve2D     l2D1          = tangCurves[i].GetProjectedCurve(pl);
                            ICurve2D     l2D2          = tang2Curves[j].GetProjectedCurve(pl);
                            ICurve2D     l2D3          = new Circle2D(pl.Project(radiusPoint), 0.0);
                            GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, l2D2, l2D3, pl.Project(objectPoint), pl.Project(object2Point), pl.Project(radiusPoint));
                            if (tangentPoints.Length > 0)
                            {   // eine gültige Linie ist gefunden
                                //if (curve1Input.Fixed & curve2Input.Fixed & (tangentPoints.Length > 4))
                                //{
                                //        int debug = 0;
                                //}
                                usable1Curves.Add(tangCurves[i]);  // zur lokalen Liste zufügen
                                usable2Curves.Add(tang2Curves[j]); // zur lokalen Liste zufügen
                                for (int l = 0; l < tangentPoints.Length; l += 4)
                                {
                                    double dist = Geometry.Dist(tangentPoints[l + 1], pl.Project(objectPoint)) +
                                                  Geometry.Dist(tangentPoints[l + 2], pl.Project(object2Point)) +
                                                  Geometry.Dist(tangentPoints[l + 3], pl.Project(radiusPoint));
                                    if (dist < mindist)
                                    {
                                        mindist   = dist;
                                        selected  = usable1Curves.Count - 1; // merken, welche Kurven die aktuell benutzten sind
                                        selected2 = usable2Curves.Count - 1;
                                        // selSol / 6 entspricht div 6, um einige Zeilen tiefer weitere 6 Möglichkeiten auswählen zu können
                                        // (/ 4) und (* 4), da pro Lösung vier Punkte geliefert werden
                                        int m = (l + 4 * (Math.Abs(selSol) % (tangentPoints.Length / 4))) % tangentPoints.Length;
                                        center      = tangentPoints[m];
                                        circRadCalc = Geometry.Dist(tangentPoints[m + 1], center) * 2.0;
                                    }
                                }
                            }
                            if (mindist < double.MaxValue)
                            {
                                //										base.MultiSolution = true;
                                base.MultiSolutionCount = tangentPoints.Length / 4;
                                circ.SetCirclePlaneCenterRadius(pl, pl.ToGlobal(center), circRad);
                                tangCurves            = (ICurve[])usable1Curves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                                tang2Curves           = (ICurve[])usable2Curves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                                base.ShowActiveObject = true;
                                return(true);
                            }
                        }
                    }
                }
            }
            base.ShowActiveObject   = false;
            base.MultiSolutionCount = 0;
            //            base.MultiSolution = false;
            return(false);
        }
示例#6
0
        private bool showLine()
        {
            ArrayList usable1Curves = new ArrayList();
            ArrayList usable2Curves = new ArrayList();
            Plane     pl;
            int       selSolLoc;
            double    mindist = double.MaxValue;

            if (tang1Curves == null)
            {
                return(false);
            }
            if (tang2Curves == null)
            {
                return(false);
            }
            //			if (tang3Curves == null) return false;
            for (int i = 0; i < tang1Curves.Length; ++i)
            {
                for (int j = 0; j < tang2Curves.Length; ++j)
                {
                    if (Curves.GetCommonPlane(tang1Curves[i], tang2Curves[j], out pl))
                    {
                        if (Precision.IsPointOnPlane(circlePoint, pl))
                        {
                            ICurve2D l2D1 = tang1Curves[i].GetProjectedCurve(pl);
                            if (l2D1 is Path2D)
                            {
                                (l2D1 as Path2D).Flatten();
                            }
                            ICurve2D l2D2 = tang2Curves[j].GetProjectedCurve(pl);
                            if (l2D2 is Path2D)
                            {
                                (l2D2 as Path2D).Flatten();
                            }
                            // der Trick, den OpenCascade mitmacht: 3. Kreis mit Radius 0!!
                            ICurve2D     l2D3          = new Circle2D(pl.Project(circlePoint), 0.0);
                            GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, l2D2, l2D3, pl.Project(object1Point), pl.Project(object2Point), pl.Project(circlePoint));
                            if (tangentPoints.Length > 0)
                            {                                      // eine gültige lösung ist gefunden
                                usable1Curves.Add(tang1Curves[i]); // zur lokalen Liste zufügen
                                usable2Curves.Add(tang2Curves[j]); // zur lokalen Liste zufügen
                                for (int l = 0; l < tangentPoints.Length; l += 4)
                                {                                  // mittlerer Abstand zu den Klickpunkten als Ausscheidungskriterium
                                    double dist = Geometry.Dist(tangentPoints[l + 1], pl.Project(object1Point)) +
                                                  Geometry.Dist(tangentPoints[l + 2], pl.Project(object2Point)) +
                                                  Geometry.Dist(tangentPoints[l + 3], pl.Project(circlePoint));
                                    if (dist < mindist)
                                    {
                                        mindist   = dist;
                                        selected1 = usable1Curves.Count - 1; // merken, welche Kurven die aktuell benutzten sind
                                        selected2 = usable2Curves.Count - 1;
                                        // selSol / 6 entspricht div 6, um einige Zeilen tiefer weitere 6 Möglichkeiten auswählen zu können
                                        // (/ 4) und (* 4), da pro Lösung vier Punkte geliefert werden
                                        int m = (l + 4 * ((Math.Abs(selSol) / 6) % (tangentPoints.Length / 4))) % tangentPoints.Length;
                                        selSolLoc = (Math.Abs(selSol) % 6) / 2; // liefert 0, 1, oder 2, "/2" um unten die Orientierung umschalten zu können
                                        center    = tangentPoints[m];
                                        arcRad    = Geometry.Dist(tangentPoints[m + selSolLoc + 1], center);
                                        if ((Math.Abs(selSol) & 0x1) == 0) // 0 und 1 dienen zur Unterscheidung der Kreisbogenausrichtung
                                        {
                                            startAngle = new Angle(tangentPoints[m + selSolLoc + 1], center);
                                            endAngle   = new Angle(tangentPoints[m + ((selSolLoc + 1) % 3) + 1], center); // "%3", also modulo 3, da der Index läuft: 2,3,1
                                        }
                                        else
                                        {
                                            endAngle   = new Angle(tangentPoints[m + selSolLoc + 1], center);
                                            startAngle = new Angle(tangentPoints[m + ((selSolLoc + 1) % 3) + 1], center); // "%3", also modulo 3, da der Index läuft: 2,3,1
                                        }
                                    }
                                }
                            }
                            if (mindist < double.MaxValue)
                            {
                                base.MultiSolutionCount = (tangentPoints.Length / 4) * 6;
                                arc.SetArcPlaneCenterRadiusAngles(pl, pl.ToGlobal(center), arcRad, startAngle, new SweepAngle(startAngle, endAngle, arcDir));
                                base.ShowActiveObject = true;
                                tang1Curves           = (ICurve[])usable1Curves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                                tang2Curves           = (ICurve[])usable2Curves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                                return(true);
                            }
                        }
                    }
                }
            }
            base.ShowActiveObject   = false;
            base.MultiSolutionCount = 0;
            //            base.MultiSolution = false;
            return(false);
        }
        private bool showLine()
        {
            ArrayList usable1Curves = new ArrayList();
            ArrayList usable2Curves = new ArrayList();
            Plane     pl;
            double    mindist = double.MaxValue;

            if (tang1Curves == null)
            {
                return(false);
            }
            if (tang2Curves == null)
            {
                return(false);
            }
            for (int i = 0; i < tang1Curves.Length; ++i)
            {
                for (int j = 0; j < tang2Curves.Length; ++j)
                {
                    if (Curves.GetCommonPlane(tang1Curves[i], tang2Curves[j], out pl))
                    {
                        if (Precision.IsPointOnPlane(circlePoint, pl))
                        {
                            ICurve2D l2D1 = tang1Curves[i].GetProjectedCurve(pl);
                            if (l2D1 is Path2D)
                            {
                                (l2D1 as Path2D).Flatten();
                            }
                            ICurve2D l2D2 = tang2Curves[j].GetProjectedCurve(pl);
                            if (l2D2 is Path2D)
                            {
                                (l2D2 as Path2D).Flatten();
                            }
                            // der Trick, den OpenCascade mitmacht: 3. Kreis mit Radius 0!!
                            ICurve2D     l2D3          = new Circle2D(pl.Project(circlePoint), 0.0);
                            GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, l2D2, l2D3, pl.Project(object1Point), pl.Project(object2Point), pl.Project(circlePoint));
                            if (tangentPoints.Length > 0)
                            {                                      // eine gültige Lösung ist gefunden
                                usable1Curves.Add(tang1Curves[i]); // zur lokalen Liste zufügen
                                usable2Curves.Add(tang2Curves[j]); // zur lokalen Liste zufügen
                                for (int l = 0; l < tangentPoints.Length; l += 4)
                                {                                  // mittlerer Abstand zu den Klickpunkten als Ausscheidungskriterium
                                    double dist = Geometry.Dist(tangentPoints[l + 1], pl.Project(object1Point)) +
                                                  Geometry.Dist(tangentPoints[l + 2], pl.Project(object2Point)) +
                                                  Geometry.Dist(tangentPoints[l + 3], pl.Project(circlePoint));
                                    if (dist < mindist)
                                    {
                                        mindist   = dist;
                                        selected1 = usable1Curves.Count - 1; // merken, welche Kurven die aktuell benutzten sind
                                        selected2 = usable2Curves.Count - 1;
                                        // selSol / 6 entspricht div 6, um einige Zeilen tiefer weitere 6 Möglichkeiten auswählen zu können
                                        // (/ 4) und (* 4), da pro Lösung vier Punkte geliefert werden
                                        int m = (l + 4 * (Math.Abs(selSol) % (tangentPoints.Length / 4))) % tangentPoints.Length;
                                        center  = tangentPoints[m];
                                        circRad = Geometry.Dist(tangentPoints[m + 1], center);
                                    }
                                }
                            }
                            if (mindist < double.MaxValue)
                            {
                                //										base.MultiSolution = true;
                                base.MultiSolutionCount = tangentPoints.Length / 4;
                                circ.SetCirclePlaneCenterRadius(pl, pl.ToGlobal(center), circRad);
                                tang1Curves           = (ICurve[])usable1Curves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                                tang2Curves           = (ICurve[])usable2Curves.ToArray(typeof(ICurve)); // überschreibt die eigentliche Liste und wird unten an den Sender zurückgeliefert
                                base.ShowActiveObject = true;
                                return(true);
                            }
                        }
                    }
                }
            }
            base.ShowActiveObject   = false;
            base.MultiSolutionCount = 0;
            //            base.MultiSolution = false;
            return(false);
        }
示例#8
0
文件: Line.cs 项目: SOFAgh/CADability
 /// <summary>
 /// Implements <see cref="CADability.GeoObject.ICurve.IsInPlane (Plane)"/>
 /// </summary>
 /// <param name="p"></param>
 /// <returns></returns>
 public bool IsInPlane(Plane p)
 {
     return(Precision.IsPointOnPlane(startPoint, p) && Precision.IsPointOnPlane(endPoint, p));
 }