protected override void OnExecute(Command command, ExecutionContext context, System.Drawing.Rectangle buttonRect) { if (ScenePart == null) { return; } double stepSize = Values[Resources.TessellateLoftStepSize].Value / ActiveWindow.Units.Length.ConversionFactor; ITrimmedCurve[] curves = Window.ActiveWindow.GetAllSelectedITrimmedCurves().ToArray(); if (curves.Length != 2) { Debug.Fail("Need exactly two curves"); } ITrimmedCurve curve0 = curves[0], curve1 = curves[1]; //List<Point> points0 = curve0.Shape.GetPolyline() as List<Point>; //List<Point> points1 = curve1.Shape.GetPolyline() as List<Point>; //Debug.Assert (points0 != null && points1 != null); //if ((points1[0] - points0[0]).Magnitude > (points1[points1.Count - 1] - points0[0]).Magnitude) // points1.Reverse(); if ((curve1.StartPoint - curve0.StartPoint).Magnitude > (curve1.EndPoint - curve0.StartPoint).Magnitude) { curve1 = CurveSegment.Create(curve1.GetGeometry <Curve>(), Interval.Create(curve1.Bounds.End, curve1.Bounds.Start)); } List <Point> points0 = curve0.TessellateCurve(stepSize) as List <Point>; List <Point> points1 = curve1.TessellateCurve(stepSize) as List <Point>; if ((points1[0] - points0[0]).Magnitude > (points1[points1.Count - 1] - points0[0]).Magnitude) { points1.Reverse(); } //int steps = Math.Min(points0.Count, points1.Count); //for (int i = 0; i < steps; i++) { // AddInHelper.CreateLines(new List<Point> { points0[i], points1[i] }, part); int basePoint0 = points0.Count - 1; int basePoint1 = points1.Count - 1; List <Body> bodies = new List <Body>(); while (basePoint0 > 0 || basePoint1 > 0) { double base0Diagonal = double.MaxValue; double base1Diagonal = double.MaxValue; if (basePoint1 > 0) { base0Diagonal = (points1[basePoint1 - 1] - points0[basePoint0]).Magnitude; } if (basePoint0 > 0) { base1Diagonal = (points0[basePoint0 - 1] - points1[basePoint1]).Magnitude; } List <Point> facetPoints = new List <Point>(); facetPoints.Add(points0[basePoint0]); facetPoints.Add(points1[basePoint1]); if (base0Diagonal < base1Diagonal) { facetPoints.Add(points1[--basePoint1]); } else { facetPoints.Add(points0[--basePoint0]); } Plane plane = null; if (AddInHelper.TryCreatePlaneFromPoints(facetPoints, out plane)) { bodies.Add(ShapeHelper.CreatePolygon(facetPoints, plane, 0)); } } bodies = bodies.TryUnionBodies().ToList(); Debug.Assert(bodies.Count == 1); DesignBody.Create(ScenePart, Resources.TessellateLoftBodyName, bodies[0]); }