public static void CreateModel(Karamba.Models.Model kModel)
        {
            if (RModel != null)
            {
                Node[]         rNodes         = Nodes(kModel.nodes);
                NodalSupport[] rSupports      = Supports(kModel.supports);
                Material[]     rMaterials     = Materials(kModel.materials);
                CrossSection[] rCrossSections = CrossSections(kModel.crosecs, kModel);
                Tuple <Member[], Dlubal.RFEM5.Line[]> vali = Members(kModel.elems);
                Member[]            rMembers      = vali.Item1;
                Dlubal.RFEM5.Line[] rLines        = vali.Item2;
                LoadCase[]          lCases        = LoadCases(kModel);
                MemberLoad[]        rMemberLoads  = MemberLoads(kModel.eloads);
                NodalLoad[]         rNodalLoads   = NodalLoads(kModel.ploads);
                MemberHinge[]       rMemberHinges = MemberHinges(kModel.joints);

                //Get active RFEM5 application
                try
                {
                    IModelData rData  = RModel.GetModelData();
                    ILoads     rLoads = RModel.GetLoads();

                    //Cleans the model and load data data
                    rData.PrepareModification();
                    rData.Clean();
                    rData.FinishModification();

                    rLoads.PrepareModification();
                    rLoads.Clean();
                    rLoads.FinishModification();

                    //Model elements
                    rData.PrepareModification();

                    rData.SetNodes(rNodes);
                    rData.SetNodalSupports(rSupports);
                    rData.SetMaterials(rMaterials);
                    rData.SetCrossSections(rCrossSections);
                    rData.SetMemberHinges(rMemberHinges);
                    rData.SetLines(rLines);
                    rData.SetMembers(rMembers);

                    rData.FinishModification();

                    //Load cases
                    rLoads.PrepareModification();
                    rLoads.SetLoadCases(lCases);
                    rLoads.FinishModification();

                    //Loads
                    setRFEMmemberLoads(rLoads, rMemberLoads);
                    setRFEMnodalLoads(rLoads, rNodalLoads);
                }

                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object can be used to retrieve data from input parameters and
        /// to store data in output parameters.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            sofistikConverter sofistikConverter = new sofistikConverter();
            Model             iKarambaModel     = null;
            int iBeamDiv = 1;

            DA.GetData(0, ref iKarambaModel);
            DA.GetData(1, ref iBeamDiv);


            if (iBeamDiv > 0)
            {
                sofistikConverter.beamDiv = iBeamDiv;
            }
            else
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Beam division should have a positive integer.");
            }

            Karamba.Models.Model karambaModel = (Karamba.Models.Model)iKarambaModel;

            if (karambaModel == null)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ("The input is not of type model"));
                return;
            }

            //Clone Karamba model -> otherwise data changes in other components
            karambaModel = (Karamba.Models.Model)karambaModel.Clone();

            //Initialize exportsequence
            new ExportDirector().ConstructExport(karambaModel, sofistikConverter);

            if (sofistikConverter._errors.Count != 0)
            {
                foreach (string error in sofistikConverter._errors)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, error);
                }
                DA.SetData(1, new GH_String(sofistikConverter.getLog().ToString()));
                return;
            }
            else if (sofistikConverter._warnings.Count != 0)
            {
                foreach (string warning in sofistikConverter._warnings)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, warning);
                }
            }

            DA.SetData(0, new GH_String(sofistikConverter.getProduct().ToString()));
            DA.SetData(1, new GH_String(sofistikConverter.getLog().ToString()));
        }
示例#3
0
        public void BinarySerialization_Model()
        {
            var model = new Karamba.Models.Model();

            model.in_materials.Add(new FemMaterial_Isotrop("test", "", 1, 2, 3, 4, 5, -6,
                                                           FemMaterial.FlowHypothesis.mises, 8, null));
            model.initMaterialCroSecLists();

            var formatter = ModelSerializer.GetInstance().Formatter;
            var stream    = new MemoryStream();

            formatter.Serialize(stream, model);
            var data        = Convert.ToBase64String(stream.ToArray());
            var stream_dser = new MemoryStream(Convert.FromBase64String(data));
            var model_dser  = (Karamba.Models.Model)formatter.Deserialize(stream_dser);
        }
        //Create all the load cases
        private static LoadCase[] LoadCases(Karamba.Models.Model kModel)
        {
            HashSet <int> lCaseNumbers = new HashSet <int>();

            //Get load cases used in eLoads
            foreach (Karamba.Loads.ElementLoad eLoad in kModel.eloads)
            {
                lCaseNumbers.Add(eLoad.loadcase);
            }
            //get load cases used in ploads
            foreach (Karamba.Loads.PointLoad pLoad in kModel.ploads)
            {
                lCaseNumbers.Add(pLoad.loadcase);
            }

            List <LoadCase> rLoadCases = new List <LoadCase>();

            //Create loadCases
            foreach (int elem in lCaseNumbers)
            {
                LoadCase lCase = new LoadCase();
                lCase.ToSolve    = true;
                lCase.SelfWeight = false;
                if (elem == 0)
                {
                    MessageBox.Show("0 cannot be used as loadCase number in RFEM. The number is changed to 999", "Warning", MessageBoxButtons.OK);
                    lCase.Loading.No = 999;
                }
                else
                {
                    lCase.Loading.No = elem;
                }

                rLoadCases.Add(lCase);
            }

            return(rLoadCases.ToArray());
        }
 //Gets material from the RFEM material library
 private static int getRMaterial(Karamba.Models.Model kModel, CroSec kCrossSection)
 {
     if (kCrossSection.elemIds.Count == 1 && kCrossSection.elemIds[0] == "")
     {
         foreach (Karamba.Materials.FemMaterial material in kModel.materials)
         {
             if (material.elemIds.Count != 0)
             {
                 return((int)material.ind + 1);
             }
         }
     }
     else
     {
         foreach (Karamba.Materials.FemMaterial material in kModel.materials)
         {
             if (material.elemIds.Count != 0 && material.elemIds.Contains(kCrossSection.elemIds[0]))
             {
                 return((int)material.ind + 1);
             }
         }
     }
     return(1);
 }
        //this method turns karamba cross sections into RFEM ones
        private static CrossSection[] CrossSections(List <Karamba.CrossSections.CroSec> kCrossSections, Karamba.Models.Model kModel)
        {
            List <CrossSection> rCrossSections = new List <CrossSection>();

            foreach (Karamba.CrossSections.CroSec kCrossSection in kCrossSections)
            {
                CrossSection rCrossSection = new CrossSection();
                rCrossSection.No         = (int)kCrossSection.ind + 1;
                rCrossSection.TextID     = getRName(kCrossSection);
                rCrossSection.MaterialNo = getRMaterial(kModel, kCrossSection);//kCrossSection.elemIds[0];
                rCrossSections.Add(rCrossSection);
            }

            return(rCrossSections.ToArray());
        }