Ejemplo n.º 1
0
        /// <summary>
        /// Creates the abstraction of the FeModel.
        /// </summary>
        /// <param name="inSolPoint">The solution point that contain the Gh Geometry that will define the model. Usually the model is then saved into the its FeModel parameter</param>
        public FeModel([NotNull] NlOpt_Point inSolPoint)
        {
            try
            {
                if (inSolPoint == null)
                {
                    throw new ArgumentNullException(nameof(inSolPoint));
                }

                Owner = inSolPoint;

                // Generates the model
                //////////////////////////

                // For each point list GH Geometry Parameter - Adds the joint
                foreach (PointList_GhGeom_ParamDef pointList_Output_ParamDef in inSolPoint.GhGeom_Values.Keys.OfType <PointList_GhGeom_ParamDef>())
                {
                    FeGroup grp = AddNewOrGet_Group(pointList_Output_ParamDef.FeGroupNameHelper);

                    List <Point3d> pPoints = (List <Point3d>)inSolPoint.GhGeom_Values[pointList_Output_ParamDef];

                    foreach (Point3d p in pPoints)
                    {
                        FeJoint j = AddNewOrGet_JointByCoordinate(p);
                        j.Restraint.IncorporateRestraint(pointList_Output_ParamDef.Restraint);
                        grp.AddElement(j);
                    }
                }

                // For each line list GH Geometry Parameter - Adds the joints and a frame
                foreach (LineList_GhGeom_ParamDef lineList_Output_ParamDef in inSolPoint.GhGeom_Values.Keys.OfType <LineList_GhGeom_ParamDef>())
                {
                    FeGroup grp = AddNewOrGet_Group(lineList_Output_ParamDef.FeGroupNameHelper);

                    List <Line> pLines = (List <Line>)inSolPoint.GhGeom_Values[lineList_Output_ParamDef];

                    foreach (Line l in pLines)
                    {
                        // Adds the From joint
                        FeJoint jFrom = AddNewOrGet_JointByCoordinate(l.From);
                        jFrom.Restraint.IncorporateRestraint(lineList_Output_ParamDef.Restraint);
                        grp.AddElement(jFrom);

                        // Adds the To joint
                        FeJoint jTo = AddNewOrGet_JointByCoordinate(l.To);
                        jTo.Restraint.IncorporateRestraint(lineList_Output_ParamDef.Restraint);
                        grp.AddElement(jTo);

                        // Adds the Frame
                        FeSection s = Owner.Owner.GetGhLineListSection(lineList_Output_ParamDef);
                        FeFrame   f = AddNewOrGet_LineByCoordinate(jFrom, jTo, s);
                        grp.AddElement(f);
                    }
                }

                // Adds the gravity loads
                if (AppSS.I.FeOpt.Gravity_IsLoad)
                {
                    FeLoad_Inertial gravity = FeLoad_Inertial.GetStandardGravity(AppSS.I.FeOpt.Gravity_Multiplier);
                    // Sets the direction based on the options
                    switch (AppSS.I.FeOpt.Gravity_DirectionEnum_Selected)
                    {
                    case MainAxisDirectionEnum.xPos:
                        gravity.Direction = Vector3d.XAxis;
                        break;

                    case MainAxisDirectionEnum.xNeg:
                        gravity.Direction = -Vector3d.XAxis;
                        break;

                    case MainAxisDirectionEnum.yPos:
                        gravity.Direction = Vector3d.YAxis;
                        break;

                    case MainAxisDirectionEnum.yNeg:
                        gravity.Direction = -Vector3d.YAxis;
                        break;

                    case MainAxisDirectionEnum.zPos:
                        gravity.Direction = Vector3d.ZAxis;
                        break;

                    case MainAxisDirectionEnum.zNeg:
                        gravity.Direction = -Vector3d.ZAxis;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                    Loads.Add(gravity);
                }

                // Adds the point loads
                if (AppSS.I.FeOpt.PointLoads.Count > 0)
                {
                    Loads.AddRange(AppSS.I.FeOpt.PointLoads);
                }
            }
            catch (Exception e)
            {
                throw new Exception($"Error defining the FeModel internal class.", e);
            }
        }