Exemplo n.º 1
0
        public override Brep GetBoundingBrep(double offset = 0.0)
        {
            /*
             * int N = Math.Max(Data.Samples, 6);
             *
             * GenerateCrossSectionPlanes(N, out Plane[] frames, out double[] parameters, Data.InterpolationType);
             *
             * int numCorners = 4;
             * GenerateCorners(offset);
             *
             * List<Point3d>[] crvPts = new List<Point3d>[numCorners];
             * for (int i = 0; i < numCorners; ++i)
             * {
             *  crvPts[i] = new List<Point3d>();
             * }
             *
             * Transform xform;
             * Point3d temp;
             *
             * for (int i = 0; i < parameters.Length; ++i)
             * {
             *  //frames[i] = frames[i].FlipAroundYAxis();
             *  xform = Rhino.Geometry.Transform.PlaneToPlane(Plane.WorldXY, frames[i]);
             *
             *  for (int j = 0; j < numCorners; ++j)
             *  {
             *      temp = new Point3d(m_section_corners[j]);
             *      temp.Transform(xform);
             *      crvPts[j].Add(temp);
             *  }
             * }
             */

            var edge_points = GetEdgePoints(offset);
            int numCorners  = m_section_corners.Length;
            var num_points  = edge_points[0].Count;

            NurbsCurve[] edges           = new NurbsCurve[numCorners + 4];
            var          edge_parameters = new List <double> [numCorners];
            double       t;

            for (int i = 0; i < numCorners; ++i)
            {
                //edges[i] = NurbsCurve.CreateInterpolatedCurve(edge_points[i], 3, CurveKnotStyle.Chord, Centreline.TangentAtStart, Centreline.TangentAtEnd);
                edges[i]           = NurbsCurve.Create(false, 3, edge_points[i]);
                edge_parameters[i] = new List <double>();

                foreach (Point3d pt in edge_points[i])
                {
                    edges[i].ClosestPoint(pt, out t);
                    edge_parameters[i].Add(t);
                }
            }

            edges[numCorners + 0] = new Line(edge_points[3].First(), edge_points[0].First()).ToNurbsCurve();
            edges[numCorners + 1] = new Line(edge_points[2].First(), edge_points[1].First()).ToNurbsCurve();

            edges[numCorners + 2] = new Line(edge_points[2].Last(), edge_points[1].Last()).ToNurbsCurve();
            edges[numCorners + 3] = new Line(edge_points[3].Last(), edge_points[0].Last()).ToNurbsCurve();

            Brep[] sides = new Brep[numCorners + 2];
            int    ii    = 0;

            for (int i = 0; i < numCorners; ++i)
            {
                ii = (i + 1).Modulus(numCorners);

                List <Point2d> rulings = new List <Point2d>();
                for (int j = 0; j < num_points; ++j)
                {
                    rulings.Add(new Point2d(edge_parameters[i][j], edge_parameters[ii][j]));
                }

                sides[i] = Brep.CreateDevelopableLoft(edges[i], edges[ii], rulings).First();
                //sides[i] = Brep.CreateFromLoft(
                //  new Curve[] { edges[i], edges[ii] },
                //  Point3d.Unset, Point3d.Unset, LoftType.Normal, false)[0];
            }

            // Make ends

            sides[numCorners + 0] = Brep.CreateFromLoft(
                new Curve[] {
                edges[numCorners + 0],
                edges[numCorners + 1]
            },
                Point3d.Unset, Point3d.Unset, LoftType.Straight, false)[0];

            sides[numCorners + 1] = Brep.CreateFromLoft(
                new Curve[] {
                edges[numCorners + 2],
                edges[numCorners + 3]
            },
                Point3d.Unset, Point3d.Unset, LoftType.Straight, false)[0];

            // Join Breps

            Brep brep = Brep.JoinBreps(
                sides,
                Tolerance
                )[0];

            //brep.UserDictionary.Set("glulam", GetArchivableDictionary());

            return(brep);
        }