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())); }
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()); }