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); }
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); }