コード例 #1
0
        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]);
        }