public static List <List <List <Curve> > > OrientCroSecs(List <List <List <Curve> > > cross_sections, List <Curve> segments, int nCroSecsInter, Plane start_frame, int crosecs_count)
        {
            var croSecs         = cross_sections;
            var baseline_length = segments.Sum(x => x.GetLength());

            for (int k = 0; k < segments.Count; k++)
            {
                //var domain = segments[k].Domain;
                var crosecs_original = nCroSecsInter;
                nCroSecsInter = Math.Max((int)(nCroSecsInter * segments[k].GetLength() / baseline_length), 2); // Correction polylines
                for (int i = 0; i < nCroSecsInter; i++)                                                        // loop through each station or curve parameter
                {
                    var normalized_parameter = (double)i / (nCroSecsInter - 1.0);
                    var plane       = Component_ExtrudeMembers.GetOrientedPlane(start_frame, segments[k], normalized_parameter);
                    var orientation = (ITransform) new Orientation(new Plane(Point3d.Origin, new Vector3d(0, 0, 1)), plane);
                    var trans       = orientation.ToMatrix();
                    for (int j = 0; j < crosecs_count; j++) // loop through each one of the curves that make up a cross section
                    {
                        var crv = croSecs[k][j][i].DuplicateCurve();
                        crv.Transform(trans);
                        croSecs[k][j][i] = crv;
                    }
                }
                nCroSecsInter = crosecs_original; // So it works for next segment as well
            }
            return(croSecs);
        }
Exemplo n.º 2
0
        public static List <Brep> ExtrudeMembersToBrep(RFMember iMember, List <RFCroSec> iCroSecs, double length_segment, out string msg)
        {
            var outBreps = new List <Brep>();

            msg = "";

            // Check input
            var cs_indeces = iCroSecs.Select(x => x.No);

            if (iMember.EndCrossSectionNo == 0) // In case of tension members, etc.
            {
                iMember.EndCrossSectionNo = iMember.StartCrossSectionNo;
            }
            if (!(cs_indeces.Contains(iMember.StartCrossSectionNo)) || (!(cs_indeces.Contains(iMember.EndCrossSectionNo))))
            {
                msg = $"Provide cross sections for member No {iMember.No}.";
                return(null);
            }

            // Get base geometry
            var crosecs1 = iCroSecs.Where(x => x.No == iMember.StartCrossSectionNo).ToList()[0].Shape;
            var crosecs2 = iCroSecs.Where(x => x.No == iMember.EndCrossSectionNo).ToList()[0].Shape;
            var baseline = iMember.BaseLine.ToCurve();

            // Check geometry
            if ((crosecs1.Sum(x => x.SpanCount) != crosecs2.Sum(x => x.SpanCount)) || (crosecs1.Count != crosecs2.Count))
            {
                msg = $"Provide similar cross sections for member No {iMember.No}.";
                return(null);
            }

            // Generate tween curves - still on the origin!
            List <Curve> segments;
            int          nCroSecsInter;

            length_segment = Math.Max(length_segment, 0.05); // Check minimum vlaue
            if (baseline.Degree <= 1)
            {
                nCroSecsInter = 2;
            }
            else
            {
                nCroSecsInter = Math.Max((int)(baseline.GetLength() / length_segment), 2);
            }
            var loft_crvs = Component_ExtrudeMembers.GenerateCroSecs(baseline, crosecs1, crosecs2, nCroSecsInter, 0.001, 0.001, out segments);

            // Orient cross sections
            loft_crvs = Component_ExtrudeMembers.OrientCroSecs(loft_crvs, segments, nCroSecsInter, iMember.Frames[0], crosecs1.Count);

            // Extrude members
            for (int i = 0; i < segments.Count; i++)
            {
                for (int j = 0; j < crosecs1.Count; j++)
                {
                    outBreps.AddRange(Brep.CreateFromLoft(loft_crvs[i][j], Point3d.Unset, Point3d.Unset, LoftType.Normal, false));
                }
            }
            return(outBreps);
        }
        public static List <List <List <Curve> > > GenerateCroSecs(Curve baseline, List <Curve> startCroSec, List <Curve> endCroSec, int nCroSecsInter, double tol, double ang_tol, out List <Curve> segments)
        {
            var loft_crvs = new List <List <List <Curve> > >(); // this includes also the original sections: Number segments - Number Cross Sections - NUmber stations :D
            var t_list    = new List <double>();

            //var segments = new List<Curve>();
            segments = new List <Curve>();
            // nCroSecsInter = 2;
            //nCroSecsInter = 2;

            if (baseline.Degree <= 1)
            {
                if (baseline.SpanCount > 1)
                {
                    segments = baseline.DuplicateSegments().ToList();
                }
                else
                {
                    segments.Add(baseline);
                }
                t_list.Add(baseline.Domain.T0);
                t_list.Add(baseline.Domain.T1);
                var normalized_parameter = 0.0;
                foreach (var line in segments)
                {
                    var curves_in_segment = new List <List <Curve> >();
                    var domain            = line.Domain;
                    var crosecs_original  = nCroSecsInter;
                    //var length1 = line.GetLength();
                    //var length2 = baseline.GetLength();
                    //var crosecs2 = (int)(nCroSecsInter * line.GetLength() / baseline.GetLength());
                    nCroSecsInter = Math.Max((int)(nCroSecsInter * line.GetLength() / baseline.GetLength()), 2);
                    for (int i = 0; i < startCroSec.Count; i++)
                    {
                        var crvs = new List <Curve>();
                        for (int j = 0; j < nCroSecsInter; j++)
                        {
                            //normalized_parameter += (double)j / (double)(nCroSecsInter-1) * (domain.T1 - domain.T0) + domain.T0;
                            normalized_parameter = (domain.T0 + (double)j / (double)(nCroSecsInter - 1) * (domain.T1 - domain.T0)) / (t_list[1] - t_list[0]);
                            crvs.Add(Component_ExtrudeMembers.CreateTweenCurve(startCroSec[i], endCroSec[i], normalized_parameter, tol, ang_tol));
                        }
                        //curves_in_segment.Add(crvs);
                        //var crvs = new List<Curve>();
                        //crvs.Add(startCroSec[i]);
                        //crvs.AddRange();
                        //crvs.Add(endCroSec[i]);
                        curves_in_segment.Add(crvs);
                    }
                    loft_crvs.Add(curves_in_segment);
                    nCroSecsInter = crosecs_original; // So it works for next segment as well
                }
            }
            else
            {
                segments.Add(baseline);
                var curves_in_segment = new List <List <Curve> >();
                for (int i = 0; i < startCroSec.Count; i++)
                {
                    curves_in_segment.Add(Component_ExtrudeMembers.CreateTweenCurves(startCroSec[i], endCroSec[i], nCroSecsInter, tol, ang_tol).ToList());
                }
                loft_crvs.Add(curves_in_segment);
            }
            return(loft_crvs);
        }