public static SeatingBlock SeatingBlock(ProfileOrigin start, ProfileOrigin vom, ProfileOrigin end, SeatingBlockType t, double seatWidth, double aisleWidth) { if (start == null) { BH.Engine.Reflection.Compute.RecordError("Cannot create a seating block with a null starting profile origin."); return(null); } if (end == null) { BH.Engine.Reflection.Compute.RecordError("Cannot create a seating block with a null ending profile origin."); return(null); } return(new SeatingBlock { Start = start, Vomitory = vom, End = end, SeatWidth = seatWidth, TypeOfSeatingBlock = t, AisleWidth = aisleWidth, FrontRow = Geometry.Create.Line(start.Origin, end.Origin), }); }
/***************************************************/ private static Vector SetScaleVector(Vector unscaled, ProfileOrigin current, ProfileOrigin next) { unscaled = unscaled.Normalise(); double scaleAngle = Geometry.Query.Angle(current.Direction, next.Direction); double scalefactor = 1 / Math.Cos(scaleAngle); Vector scaleVector = unscaled * scalefactor; scaleVector = scaleVector + Vector.ZAxis; return(scaleVector); }
public static TheatronFullProfile TheatronFullProfile(List <ProfileParameters> parameters) { //this assumes no relation with the plan geometry setting out is from the origin TheatronFullProfile fullProfile = new TheatronFullProfile(); double minDist = parameters[0].StartX - parameters[0].EyePositionParameters.EyePositionX; Point origin = Geometry.Create.Point(minDist, 0, parameters[0].StartZ - parameters[0].EyePositionParameters.EyePositionZ); Vector direction = Vector.XAxis; ProfileOrigin sectionOrigin = ProfileOrigin(origin, direction); GenerateMapProfiles(ref fullProfile, parameters.DeepClone(), minDist, sectionOrigin); return(fullProfile); }
public static TheatronFullProfile TheatronFullProfile(List <ProfileParameters> parameters) { if (parameters == null) { BH.Engine.Reflection.Compute.RecordError("Cannot create a theatron full profile from a null collection of profile parameters."); return(null); } //this assumes no relation with the plan geometry setting out is from the origin TheatronFullProfile fullProfile = new TheatronFullProfile(); double minDist = parameters[0].StartX - parameters[0].EyePositionParameters.EyePositionX; Point origin = Geometry.Create.Point(minDist, 0, parameters[0].StartZ - parameters[0].EyePositionParameters.EyePositionZ); Vector direction = Vector.XAxis; ProfileOrigin sectionOrigin = ProfileOrigin(origin, direction); GenerateMapProfiles(ref fullProfile, parameters.DeepClone(), minDist, sectionOrigin); return(fullProfile); }
public static SeatingBlock SeatingBlock(ProfileOrigin start, ProfileOrigin vom, ProfileOrigin end, SeatingBlockType t, double seatWidth, double aisleWidth) { return(new SeatingBlock { Start = start, Vomitory = vom, End = end, SeatWidth = seatWidth, TypeOfSeatingBlock = t, AisleWidth = aisleWidth, FrontRow = Geometry.Create.Line(start.Origin, end.Origin), }); }
/***************************************************/ private static List <ProfileOrigin> ArcSweepBay(double centreX, double centreY, double theta, double startAngle, double radius, int numBays, bool fractionbayStart, double fraction) { List <ProfileOrigin> sectionPlane = new List <ProfileOrigin>(); double xO, yO, xP, yP; for (int d = 0; d <= numBays; d++) { // if (fractionbayStart)//half bay on first for corners { double fractionBay = theta * fraction; if (d == 0)//half bay on first { xO = centreX + radius * Math.Cos(startAngle + fractionBay); yO = centreY + radius * Math.Sin(startAngle + fractionBay); xP = radius * Math.Cos(startAngle + fractionBay); yP = radius * Math.Sin(startAngle + fractionBay); } else { xO = centreX + radius * Math.Cos(startAngle + (theta * d + fractionBay)); yO = centreY + radius * Math.Sin(startAngle + (theta * d + fractionBay)); xP = radius * Math.Cos(startAngle + (theta * d + fractionBay)); yP = radius * Math.Sin(startAngle + (theta * d + fractionBay)); } } else { xO = centreX + radius * Math.Cos(startAngle + (theta * d)); yO = centreY + radius * Math.Sin(startAngle + (theta * d)); xP = radius * Math.Cos(startAngle + (theta * d)); yP = radius * Math.Sin(startAngle + (theta * d)); } Point origin = Geometry.Create.Point(xO, yO, 0); Vector xdir = Geometry.Create.Vector(xP, yP, 0); ProfileOrigin tempPlane = Create.ProfileOrigin(origin, xdir); sectionPlane.Add(tempPlane); } return(sectionPlane); }
/***************************************************/ /**** Private Methods ****/ /***************************************************/ private static void NoCornerPlanSetUp(ref TheatronPlan plan, double length, double width, double endBound, double structBayW, double sideBound) { int nSideBays = (int)(Math.Floor(((length + endBound) / 2) / structBayW) * 2); int nEndBays = (int)(Math.Floor(((width + sideBound) / 2) / structBayW) * 2); plan.SectionOrigins = new List <ProfileOrigin>(); double actualBayW; double xMin; double yMin; double oX, oY, dX, dY; int count = 0; Point origin = new Point(); Vector xdir = new Vector(); ProfileOrigin tempPlane = new ProfileOrigin(); BayType bayType = BayType.Side;//0 = side, 1= end, 2 =corner for (int i = 0; i < 4; i++) { if (i % 2 == 0)//side bay { bayType = 0; actualBayW = (length + endBound) / nSideBays; for (int d = 0; d <= nSideBays; d++) { plan.StructBayType.Add(bayType); if (i == 0)//right side { yMin = (nSideBays * actualBayW) / -2; //origin xyz oX = ((width + sideBound) / 2); oY = yMin + (actualBayW * d); dX = 1; dY = 0; } else//left side { yMin = (nSideBays * actualBayW) / 2; //origin xyz oX = -((width + sideBound) / 2); oY = yMin - (actualBayW * d); dX = -1; dY = 0; } origin = Geometry.Create.Point(oX, oY, 0); xdir = Geometry.Create.Vector(dX, dY, 0); tempPlane = Create.ProfileOrigin(origin, xdir); plan.SectionOrigins.Add(tempPlane); count++; } } else { bayType = BayType.End; actualBayW = (width + sideBound) / nEndBays; xMin = (nEndBays * actualBayW) / 2; // for (int d = 0; d <= nEndBays; d++) { plan.StructBayType.Add(bayType); if (i == 1)// northEnd { //origin xyz oX = xMin - (actualBayW * d); oY = ((length + endBound) / 2); dX = 0; dY = 1;// 0; } else { //origin xyz oX = -xMin + (actualBayW * d); oY = -((length + endBound) / 2); dX = 0; dY = -1; } origin = Geometry.Create.Point(oX, oY, 0); xdir = Geometry.Create.Vector(dX, dY, 0); tempPlane = Create.ProfileOrigin(origin, xdir); plan.SectionOrigins.Add(tempPlane); count++; } } } }
/***************************************************/ private static void SetTransitionProfiles(ref SeatingBlock block, TierProfile sectionToMap, ProfileOrigin origin, ProfileOrigin prevVomitory, ProfileOrigin nextVomitory) { //first section //always mapping from the full profile base plane Point source = origin.Origin; Vector scaleVector = SetScaleVector(sectionToMap.SectionOrigin.Direction, block.Start, prevVomitory); double angle = Geometry.Query.Angle(origin.Direction, block.Start.Direction, Plane.XY); var start = TransformProfile(sectionToMap, scaleVector, source, block.Start.Origin, angle); block.Sections.Add(start); //end section scaleVector = SetScaleVector(sectionToMap.SectionOrigin.Direction, block.End, nextVomitory); angle = Geometry.Query.Angle(origin.Direction, block.End.Direction, Plane.XY); var end = TransformProfile(sectionToMap, scaleVector, source, block.End.Origin, angle); block.Sections.Add(end); }
/***************************************************/ /**** Private Methods ****/ /***************************************************/ private static void GenerateMapProfiles(ref TheatronFullProfile fullProfile, List <ProfileParameters> parameters, double distToFocalCurve, ProfileOrigin sectionOrigin) { Point lastpoint = new Point(); for (int i = 0; i < parameters.Count; i++) { if (i == 0) { parameters[i].StartX = distToFocalCurve + parameters[i].RowWidth - parameters[i].EyePositionParameters.EyePositionX; } TierProfile tierSection = TierProfile(parameters[i], lastpoint); fullProfile.BaseTierProfiles.Add(tierSection); if (i == 0) { fullProfile.FullProfileOrigin = fullProfile.BaseTierProfiles[0].SectionOrigin; fullProfile.FullProfileOrigin.Origin.Z = 0; } Point source = fullProfile.FullProfileOrigin.Origin; Point target = sectionOrigin.Origin; double angle = Math.Atan2(sectionOrigin.Direction.Y, sectionOrigin.Direction.X); Vector scaleVector = SetScaleVector(tierSection.SectionOrigin.Direction, tierSection.SectionOrigin, tierSection.SectionOrigin); fullProfile.MappedProfiles.Add(TransformProfile(tierSection, scaleVector, source, target, angle)); lastpoint = tierSection.FloorPoints[tierSection.FloorPoints.Count - 1]; } }
public static TheatronFullProfile TheatronFullProfile(List <ProfileParameters> parameters, Point focalPoint, ProfileOrigin sectionOrigin) { //this assumes no relation with the plan geometry setting out is from the origin TheatronFullProfile fullProfile = new TheatronFullProfile(); Point lastpoint = new Point(); //fullProfile.FocalPoint = focalPoint; Vector focalToStart = sectionOrigin.Origin - focalPoint; focalToStart.Z = 0; GenerateMapProfiles(ref fullProfile, parameters.DeepClone(), focalToStart.Length(), sectionOrigin); return(fullProfile); }
/***************************************************/ private static ProfileOrigin DefineTierOrigin(List <Point> flrPoints) { ProfileOrigin profOrigin = Create.ProfileOrigin(flrPoints[0], flrPoints[1] - flrPoints[0]); return(profOrigin); }
public static TheatronFullProfile TheatronFullProfile(List <ProfileParameters> parameters, Point focalPoint, ProfileOrigin sectionOrigin) { if (parameters == null) { BH.Engine.Reflection.Compute.RecordError("Cannot create a theatron full profile from a null collection of profile parameters."); return(null); } if (focalPoint == null) { BH.Engine.Reflection.Compute.RecordError("Cannot create a theatron full profile from a null focal point."); return(null); } if (sectionOrigin == null) { BH.Engine.Reflection.Compute.RecordError("Cannot create a theatron full profile from a null profile origin."); return(null); } //this assumes no relation with the plan geometry setting out is from the origin TheatronFullProfile fullProfile = new TheatronFullProfile(); Point lastpoint = new Point(); //fullProfile.FocalPoint = focalPoint; Vector focalToStart = sectionOrigin.Origin - focalPoint; focalToStart.Z = 0; GenerateMapProfiles(ref fullProfile, parameters.DeepClone(), focalToStart.Length(), sectionOrigin); return(fullProfile); }
/***************************************************/ /**** Private Methods ****/ /***************************************************/ private static void orthoPlanSetUp(ref TheatronPlan plan, double length, double width, double endBound, double sideBound, double cornerR, double structBayW, int nCornerBays) { int nSideBays = (int)(Math.Floor(((length + endBound) / 2 - cornerR) / structBayW) * 2); int nEndBays = (int)(Math.Floor(((width + sideBound) / 2 - cornerR) / structBayW) * 2); plan.SectionOrigins = new List <ProfileOrigin>(); double cornA = Math.PI / 2 / (nCornerBays + 1); double trueR = cornerR / Math.Cos(cornA / 2); double xMin; double yMin; double oX, oY, dX, dY; int count = 0; Point origin = new Point(); Vector xdir = new Vector(); Vector ydir = Vector.ZAxis; Vector normal = new Vector(); ProfileOrigin tempOrigin = new ProfileOrigin(); BayType bayType = 0; //0 = side, 1= end, 2 =corner for (int i = 0; i < 8; i++) { if (i == 0 || i == 4)//side bay { bayType = 0; for (int d = 0; d <= nSideBays; d++) { plan.StructBayType.Add(bayType); if (i == 0)//right side { yMin = (nSideBays * structBayW) / -2; //origin xyz oX = ((width + sideBound) / 2); oY = yMin + (structBayW * d); dX = 1; dY = 0; } else//left side { yMin = (nSideBays * structBayW) / 2; //origin xyz oX = -((width + sideBound) / 2); oY = yMin - (structBayW * d); dX = -1; dY = 0; } origin = Geometry.Create.Point(oX, oY, 0); xdir = Geometry.Create.Vector(dX, dY, 0); tempOrigin = Create.ProfileOrigin(origin, xdir); plan.SectionOrigins.Add(tempOrigin); count++; } } else { if (i == 2 || i == 6)//end bay { bayType = BayType.End; xMin = (nEndBays * structBayW) / 2; // for (int d = 0; d <= nEndBays; d++) { plan.StructBayType.Add(bayType); if (i == 2)// northEnd { //origin xyz oX = xMin - (structBayW * d); oY = ((length + endBound) / 2); dX = 0; dY = 1; } else { //origin xyz oX = -xMin + (structBayW * d); oY = -((length + endBound) / 2); dX = 0; dY = -1; } origin = Geometry.Create.Point(oX, oY, 0); xdir = Geometry.Create.Vector(dX, dY, 0); tempOrigin = Create.ProfileOrigin(origin, xdir); plan.SectionOrigins.Add(tempOrigin); count++; } } else//corners { //local centres cs at fillets bayType = BayType.Corner; double centreX = (width + sideBound) / 2 - cornerR; double centreY = (length + endBound) / 2 - cornerR; double startAngle = 0; if (i == 1) //NE++ { } if (i == 3) //NW-+ { centreX = -centreX; startAngle = Math.PI / 2; } if (i == 5) //SW-- { centreY = -centreY; centreX = -centreX; startAngle = Math.PI; } if (i == 7) //SE+- { centreY = -1 * centreY; startAngle = Math.PI * 1.5; } // for (int d = 0; d <= nCornerBays; d++) { plan.StructBayType.Add(bayType); if (d == 0)//half bay on first { oX = centreX + trueR * Math.Cos(startAngle + cornA / 2); oY = centreY + trueR * Math.Sin(startAngle + cornA / 2); dX = trueR * Math.Cos(startAngle + cornA / 2); dY = trueR * Math.Sin(startAngle + cornA / 2); } else { oX = centreX + trueR * Math.Cos(startAngle + (cornA * d + cornA / 2)); oY = centreY + trueR * Math.Sin(startAngle + (cornA * d + cornA / 2)); dX = trueR * Math.Cos(startAngle + (cornA * d + cornA / 2)); dY = trueR * Math.Sin(startAngle + (cornA * d + cornA / 2)); } origin = Geometry.Create.Point(oX, oY, 0); xdir = Geometry.Create.Vector(dX, dY, 0); tempOrigin = Create.ProfileOrigin(origin, xdir); plan.SectionOrigins.Add(tempOrigin); count++; } } } } }