Beispiel #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);
        }
        private bool showLine()
        {
            Plane pl;

            if (Curves.GetCommonPlane(throughPoint, iCurve, out pl))
            {
                ICurve2D l2D = iCurve.GetProjectedCurve(pl);
                if (l2D is Path2D)
                {
                    (l2D as Path2D).Flatten();
                }
                double dist = l2D.Distance(pl.Project(throughPoint));
                //			System.Diagnostics.Trace.WriteLine(dist.ToString());
                ICurve2D l2DP = l2D.Parallel(-dist, false, 0.0, 0.0);
                line.SetTwoPoints(pl.ToGlobal(l2DP.StartPoint), pl.ToGlobal(l2DP.EndPoint));
                base.ShowActiveObject = true;
                return(true);
            }
            base.ShowActiveObject = false;
            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 void AdjustPeriodic(Face face2, ICurve2D curveOnFace2, GeoPoint leaveFace1)
        {
            if (!face2.Surface.IsUPeriodic && !face2.Surface.IsVPeriodic)
            {
                return;
            }
            double uperiod = 0.0, vperiod = 0.0;

            if (face2.Surface.IsUPeriodic)
            {
                uperiod = face2.Surface.UPeriod;
            }
            if (face2.Surface.IsVPeriodic)
            {
                vperiod = face2.Surface.VPeriod;
            }
            GeoPoint2D pos = face2.Surface.PositionOf(leaveFace1);

            if (!face2.area.Contains(pos, true))
            {   // dieser Punkt muss eigentlich in Area anthalten sein, er kann höchstens um die Periode verschoben sein
                bool          found = false;
                CompoundShape tst   = face2.area.Expand((uperiod + vperiod) / 100);
                if (tst.Contains(pos, true))
                {
                    found = true;
                }
                if (!found && uperiod > 0.0)
                {
                    if (tst.Contains(pos + uperiod * GeoVector2D.XAxis, true))
                    {
                        pos   = pos + uperiod * GeoVector2D.XAxis;
                        found = true;
                    }
                    if (!found && tst.Contains(pos - uperiod * GeoVector2D.XAxis, true))
                    {
                        pos   = pos - uperiod * GeoVector2D.XAxis;
                        found = true;
                    }
                }
                if (!found && vperiod > 0.0)
                {
                    if (tst.Contains(pos + vperiod * GeoVector2D.YAxis, true))
                    {
                        pos   = pos + vperiod * GeoVector2D.YAxis;
                        found = true;
                    }
                    if (!found && tst.Contains(pos - vperiod * GeoVector2D.YAxis, true))
                    {
                        pos   = pos - vperiod * GeoVector2D.YAxis;
                        found = true;
                    }
                }
            }
            // jetzt die Kurve so verschieben, dass der Punkt draufliegt
            double du = 0.0, dv = 0.0;
            double dist = curveOnFace2.MinDistance(pos);

            if (uperiod > 0.0)
            {
                double d = curveOnFace2.MinDistance(pos + uperiod * GeoVector2D.XAxis);
                if (d < dist)
                {
                    du   = -uperiod;
                    dist = d;
                }
                d = curveOnFace2.MinDistance(pos - uperiod * GeoVector2D.XAxis);
                if (d < dist)
                {
                    du   = uperiod;
                    dist = d;
                }
            }
            if (vperiod > 0.0)
            {
                double d = curveOnFace2.Distance(pos + vperiod * GeoVector2D.YAxis);
                if (d < dist)
                {
                    dv   = -vperiod;
                    dist = d;
                }
                d = curveOnFace2.Distance(pos - vperiod * GeoVector2D.YAxis);
                if (d < dist)
                {
                    dv   = vperiod;
                    dist = d;
                }
            }
            if (du != 0.0 || dv != 0.0)
            {
                curveOnFace2.Move(du, dv);
            }
        }
Beispiel #5
0
        private bool showLine()
        {
            ArrayList usableCurves  = new ArrayList();
            ArrayList usable2Curves = new ArrayList();
            double    mindist       = double.MaxValue;

            if (tangCurves == null)
            {
                return(false);
            }
            if (tang2Curves == null)
            {
                return(false);
            }
            for (int i = 0; i < tangCurves.Length; ++i)
            {
                for (int j = 0; j < tang2Curves.Length; ++j)
                {
                    Plane pl;
                    if (Curves.GetCommonPlane(tangCurves[i], tang2Curves[j], out pl))
                    {
                        ICurve2D l2D1 = tangCurves[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();
                        }
                        GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, l2D2, circRad);
                        if (tangentPoints.Length > 0)
                        {                                      // eine gültige Linie ist gefunden
                            usableCurves.Add(tangCurves[i]);   // zur lokalen Liste zufügen
                            usable2Curves.Add(tang2Curves[j]); // zur lokalen Liste zufügen
                            for (int k = 0; k < tangentPoints.Length; k += 3)
                            {
                                double dist = Geometry.Dist(tangentPoints[k + 1], pl.Project(objectPoint)) +
                                              Geometry.Dist(tangentPoints[k + 2], pl.Project(object2Point));
                                if (dist < mindist)
                                {
                                    mindist   = dist;
                                    selected  = usableCurves.Count - 1;  // merken, welche Kurve die aktuell benutzte ist
                                    selected2 = usable2Curves.Count - 1; // merken, welche Kurve die aktuell benutzte ist
                                                                         // (/ 3) und (* 3), da pro Lösung drei Punkte geliefert werden
                                    int l = (k + 3 * (Math.Abs(selSol) % (tangentPoints.Length / 3))) % tangentPoints.Length;
                                    center = tangentPoints[l];
                                }
                            }
                        }
                        if (mindist < double.MaxValue)
                        {
                            circRadCalc = (Math.Abs(l2D1.Distance(pl.Project(radiusPoint))) + Math.Abs(l2D2.Distance(pl.Project(radiusPoint)))) / 2.0;

                            //							base.MultiSolution = true;
                            base.MultiSolutionCount = tangentPoints.Length / 3;
                            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
                            tang2Curves           = (ICurve[])usable2Curves.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);
        }
Beispiel #6
0
        private bool showLine()
        {
            ArrayList usableCurves  = new ArrayList();
            ArrayList usable2Curves = new ArrayList();
            double    mindist       = double.MaxValue;
            double    arcRadLoc;

            if (tangCurves == null)
            {
                return(false);
            }
            if (tang2Curves == null)
            {
                return(false);
            }
            //			if (!radInput.Fixed) arcRadLoc = Math.Max(arcRad,Geometry.dist(objectPoint,object2Point)/2);
            //			else arcRadLoc = arcRad;
            arcRadLoc = arcRad;

            for (int i = 0; i < tangCurves.Length; ++i)
            {
                for (int j = 0; j < tang2Curves.Length; ++j)
                {
                    Plane pl;
                    if (Curves.GetCommonPlane(tangCurves[i], tang2Curves[j], out pl))
                    {
                        ICurve2D l2D1 = tangCurves[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();
                        }
                        GeoPoint2D[] tangentPoints = Curves2D.TangentCircle(l2D1, l2D2, arcRadLoc);
                        if (tangentPoints.Length > 0)
                        {                                      // eine gültige Linie ist gefunden
                            usableCurves.Add(tangCurves[i]);   // zur lokalen Liste zufügen
                            usable2Curves.Add(tang2Curves[j]); // zur lokalen Liste zufügen
                            for (int k = 0; k < tangentPoints.Length; k += 3)
                            {
                                double dist = Geometry.Dist(tangentPoints[k + 1], pl.Project(objectPoint)) +
                                              Geometry.Dist(tangentPoints[k + 2], pl.Project(object2Point));
                                if (dist < mindist)
                                {
                                    mindist   = dist;
                                    selected  = usableCurves.Count - 1;  // merken, welche Kurve die aktuell benutzte ist
                                    selected2 = usable2Curves.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 + 3 * ((Math.Abs(selSol) / 2) % (tangentPoints.Length / 3))) % 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(tangentPoints[l + 2], center);
                                    }
                                    else
                                    {
                                        startAngle = new Angle(tangentPoints[l + 2], center);
                                        endAngle   = new Angle(tangentPoints[l + 1], center);
                                    }
                                }
                            }
                        }
                        if (mindist < double.MaxValue)
                        {
                            arcRadCalc = (Math.Abs(l2D1.Distance(pl.Project(radiusPoint))) + Math.Abs(l2D2.Distance(pl.Project(radiusPoint)))) / 2.0;
                            //							base.MultiSolution = true;
                            base.MultiSolutionCount = (tangentPoints.Length / 3) * 2;
                            if (base.ActiveObject == null)
                            {
                                base.ActiveObject = arc;
                            }
                            //							if (Math.Abs(new SweepAngle(startAngle,endAngle,arcDir)) > (Math.Abs(new SweepAngle(endAngle,startAngle,!arcDir))))
                            //							arc.SetArcPlaneCenterRadiusAngles(base.ActiveDrawingPlane,pl.ToGlobal(center),arcRadLoc,startAngle,new SweepAngle(startAngle,endAngle,arcDir));
                            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
                            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.MultiSolution = false;
            base.MultiSolutionCount = 0;
            return(false);
        }