示例#1
0
        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),
            });
        }
示例#2
0
        /***************************************************/

        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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),
            });
        }
示例#6
0
        /***************************************************/
        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);
        }
示例#7
0
        /***************************************************/
        /**** 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++;
                    }
                }
            }
        }
示例#8
0
        /***************************************************/

        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);
        }
示例#9
0
        /***************************************************/
        /**** 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];
            }
        }
示例#10
0
        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);
        }
示例#11
0
        /***************************************************/

        private static ProfileOrigin DefineTierOrigin(List <Point> flrPoints)
        {
            ProfileOrigin profOrigin = Create.ProfileOrigin(flrPoints[0], flrPoints[1] - flrPoints[0]);

            return(profOrigin);
        }
示例#12
0
        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);
        }
示例#13
0
        /***************************************************/
        /**** 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++;
                        }
                    }
                }
            }
        }