/// <summary> /// Join a glulam onto another one. Returns null if join is not possible. /// </summary> /// <param name="glulam"></param> /// <returns></returns> public Glulam Join(Glulam glulam) { Rhino.Geometry.Intersect.CurveIntersections ci; ci = Rhino.Geometry.Intersect.Intersection.CurveCurve(Centreline, glulam.Centreline, Tolerance, OverlapTolerance); if (ci.Count != 1) { return(null); } if (ci[0].IsOverlap) { return(null); } if (Math.Abs(Centreline.TangentAt(ci[0].ParameterA) * glulam.Centreline.TangentAt(ci[0].ParameterB)) < AngleTolerance) { return(null); } Curve[] NewCentreline = Curve.JoinCurves(new Curve[] { Centreline, glulam.Centreline }); if (NewCentreline.Length != 1) { return(null); } GlulamOrientation NewOrientation = Orientation.Duplicate(); NewOrientation.Join(glulam.Orientation); Glulam new_glulam = CreateGlulam(NewCentreline[0], NewOrientation, Data.Duplicate()); new_glulam.Data.Samples = Data.Samples + glulam.Data.Samples; return(new_glulam); }
public Plane[] GetPlanes(IList <Point3d> pts) { var tt = new double[pts.Count]; Parallel.For(0, pts.Count, i => { Centreline.ClosestPoint(pts[i], out tt[i]); }); var orientations = Orientation.GetOrientations(Centreline, tt); var planes = new Plane[tt.Length]; Parallel.For(0, tt.Length, i => { planes[i] = Utility.PlaneFromNormalAndYAxis( Centreline.PointAt(tt[i]), Centreline.TangentAt(tt[i]), orientations[i]); }); return(planes); }