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); } }
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); }
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); }