//-------------------------------------------------------------------------------------------------- public override bool MakeConstraint(Dictionary <int, Pnt2d> points, Dictionary <int, SketchSegment> segments, SketchConstraintSolver solver) { var lineSegment1 = segments[Segments[0]] as SketchSegmentLine; if (lineSegment1 == null) { return(false); } var lineSegment2 = segments[Segments[1]] as SketchSegmentLine; if (lineSegment2 == null) { return(false); } // Find intersetion point to sort line directions var lin2d1 = lineSegment1.GetLine(points); var lin2d2 = lineSegment2.GetLine(points); if (lin2d1 == null || lin2d2 == null) { return(false); } var intersection = new IntAna2d_AnaIntersection(lin2d1, lin2d2); if (!intersection.IsDone() || intersection.IdenticalElements() || intersection.ParallelElements() || intersection.NbPoints() == 0) { return(false); } var intPnt = intersection.Point(1).Value(); bool reverse1 = intPnt.SquareDistance(lin2d1.Location()) > intPnt.SquareDistance(lin2d1.Location().Translated(lin2d1.Direction().ToVec())); bool reverse2 = intPnt.SquareDistance(lin2d2.Location()) > intPnt.SquareDistance(lin2d2.Location().Translated(lin2d2.Direction().ToVec())); // Create constraint bool valid = true; var con = new Constraint { Type = ConstraintType.InternalAngle }; valid &= solver.SetLine(ref con.Line1, lineSegment1.Points[reverse1 ? 1 : 0], lineSegment1.Points[reverse1 ? 0 : 1], false, false); valid &= solver.SetLine(ref con.Line2, lineSegment2.Points[reverse2 ? 1 : 0], lineSegment2.Points[reverse2 ? 0 : 1], false, false); valid &= solver.SetParameter(out con.Parameter, Angle.ToRad(), true); if (valid) { solver.AddConstraint(con); } return(valid); }
//-------------------------------------------------------------------------------------------------- public override bool MakeConstraint(Dictionary <int, Pnt2d> points, Dictionary <int, SketchSegment> segments, SketchConstraintSolver solver) { if (Radius <= 0) { return(false); } List <Constraint> constraints = new List <Constraint>(); bool valid = true; if (segments[Segments[0]] is SketchSegmentCircle circleSegment) { // Circle var con = new Constraint { Type = ConstraintType.CircleRadius }; valid &= solver.SetCircle(ref con.Circle1, circleSegment, constraints, points, false, false); valid &= solver.SetParameter(out con.Parameter, Radius, true); constraints.Add(con); } else if (segments[Segments[0]] is SketchSegmentArc arcRimSegment) { // Arc Rim var con = new Constraint { Type = ConstraintType.CircleRadius }; valid &= solver.SetCircle(ref con.Circle1, arcRimSegment, constraints, points, false, false); valid &= solver.SetParameter(out con.Parameter, Radius, true); constraints.Add(con); } if (valid) { constraints.ForEach(solver.AddConstraint); } return(true); }
//-------------------------------------------------------------------------------------------------- public override bool MakeConstraint(Dictionary <int, Pnt2d> points, Dictionary <int, SketchSegment> segments, SketchConstraintSolver solver) { bool valid = true; var con = new Constraint { Type = ConstraintType.PointHorizontalDistance }; valid &= solver.SetPoint(ref con.Point1, Points[0], false); valid &= solver.SetParameter(out con.Parameter, Distance, true); if (valid) { solver.AddConstraint(con); } return(valid); }
//-------------------------------------------------------------------------------------------------- public override bool MakeConstraint(Dictionary <int, Pnt2d> points, Dictionary <int, SketchSegment> segments, SketchConstraintSolver solver) { var lineSegment = segments[Segments[0]] as SketchSegmentLine; if (lineSegment == null) { return(false); } var con = new Constraint { Type = ConstraintType.LineLength }; bool valid = Length > 0; valid &= solver.SetParameter(out con.Parameter, Length, true); valid &= solver.SetLine(ref con.Line1, lineSegment.Points[0], lineSegment.Points[1], false, false); if (valid) { solver.AddConstraint(con); } return(valid); }