//private DataTree<Point3d> CreateControlPoints(ref List<string> msg)
        //{
        //    var oControlPoints = new DataTree<Point3d>();
        //    foreach (var member in _saveddata.GetMembers())
        //    {
        //        var gh_path = new GH_Path(member.No);
        //        var fe1delements = _rfemMesh.GetMemberNodes(member.No, ItemAt.AtNo); // We can't sort this list
        //        foreach (var node in fe1delements)
        //        {
        //            oControlPoints.Add(new Point3d(node.X, node.Y, node.Z), gh_path);
        //        }
        //    }
        //    return oControlPoints;
        //}

        private DataTree <Vector3d> GetMemberDisplacements(ref List <string> msg)
        {
            // Get control points
            _controlPoints.Clear();
            var rfmembers = Component_GetData.GetRFMembers(_saveddata.GetMembers().ToList(), _saveddata);
            // Save defoirmation vectors into a tree;
            var oDisplacements = new DataTree <Vector3d>();

            foreach (var member in rfmembers)
            {
                // Add also control points. We are just going to get one set of control points for each curve regardless thne result type
                var pts_path = new GH_Path(member.No);
                _controlPoints.RemovePath(pts_path);
                var baseline = member.BaseLine.ToCurve();
                // Get deformations
                var memberResults = _lcresults.GetMemberDeformations(member.No, ItemAt.AtNo, MemberAxesType.GlobalAxes); // We can't sort this list
                var valueType     = memberResults[0].Type;                                                               // Get deformation types to avoid duplicate control points
                foreach (var result in memberResults)
                {
                    var gh_path      = new GH_Path(member.No, (int)result.Type);
                    var displacement = new Vector3d(result.Displacements.ToPoint3d());
                    oDisplacements.Add(displacement, gh_path);
                    // Get control points
                    if (result.Type == valueType)
                    {
                        _controlPoints.Add(baseline.PointAtNormalizedLength(Math.Min(result.Location / baseline.GetLength(), 1.0)), pts_path);
                    }
                }
            }
            return(oDisplacements);
        }
Пример #2
0
        public void GetAxes(IModelData data)
        {
            Point3D pt = new Point3D();

            pt.X = 0.0;
            pt.Y = 0.0;
            pt.Z = 0.0;
            var cSys   = data.GetSurface(No, ItemAt.AtNo).GetLocalCoordinateSystem(pt).GetData();
            var origin = Edges[0].ToCurve().PointAtStart;
            var xAxis  = new Vector3d(cSys.AxisX.X, cSys.AxisX.Y, cSys.AxisX.Z);
            var yAxis  = new Vector3d(cSys.AxisY.X, cSys.AxisY.Y, cSys.AxisY.Z);
            var axes   = new Plane(origin, xAxis, yAxis);

            if (SurfaceAxes != null && SurfaceAxes.SurfaceAxesDirection == SurfaceAxesDirection.SurfaceAngularRotation)
            {
                axes.Rotate(SurfaceAxes.Rotation, axes.ZAxis);
            }
            else if (SurfaceAxes != null && SurfaceAxes.SurfaceAxesDirection == SurfaceAxesDirection.SurfaceAxisXParallelToLine)
            {
                var line = data.GetLine(SurfaceAxes.AxesLineList.ToInt()[0], ItemAt.AtNo).GetData();
                var crv  = Component_GetData.GetRFLines(new List <Dlubal.RFEM5.Line> {
                    line
                }, data)[0].ToCurve();
                var xAxis2 = new Vector3d(crv.PointAtEnd - crv.PointAtStart);
                var yAxis2 = Vector3d.CrossProduct(axes.ZAxis, xAxis2);
                axes = new Plane(origin, xAxis2, yAxis2);
            }
            else if (SurfaceAxes != null && SurfaceAxes.SurfaceAxesDirection == SurfaceAxesDirection.SurfaceAxisYParallelToLine)
            {
                var line = data.GetLine(SurfaceAxes.AxesLineList.ToInt()[0], ItemAt.AtNo).GetData();
                var crv  = Component_GetData.GetRFLines(new List <Dlubal.RFEM5.Line> {
                    line
                }, data)[0].ToCurve();
                var yAxis2 = new Vector3d(crv.PointAtEnd - crv.PointAtStart);
                var xAxis2 = Vector3d.CrossProduct(yAxis2, axes.ZAxis);
                axes = new Plane(origin, xAxis2, yAxis2);
            }
            Axes = axes;
        }
Пример #3
0
        /// <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, EvaluationUnit unit)
        {
            var run = false;

            var ghNodes   = new List <GH_RFEM>();
            var ghLines   = new List <GH_RFEM>();
            var ghMembers = new List <GH_RFEM>();
            var ghSfcs    = new List <GH_RFEM>();
            var ghOps     = new List <GH_RFEM>();
            var ghSupsP   = new List <GH_RFEM>();
            var ghSupsL   = new List <GH_RFEM>();
            var ghSupsS   = new List <GH_RFEM>();
            var ghMHs     = new List <GH_RFEM>();
            var ghLHs     = new List <GH_RFEM>();
            var ghCSs     = new List <GH_RFEM>();
            var ghMats    = new List <GH_RFEM>();

            var ghNodalLoads   = new List <GH_RFEM>();
            var ghLineLoads    = new List <GH_RFEM>();
            var ghMemberLoads  = new List <GH_RFEM>();
            var ghSurfaceLoads = new List <GH_RFEM>();
            var ghPolyLoads    = new List <GH_RFEM>();

            var ghLoadCases    = new List <GH_RFEM>();
            var ghLoadCombos   = new List <GH_RFEM>();
            var ghResultCombos = new List <GH_RFEM>();

            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;
            ILoads     loads     = null;

            var errorMsg = new List <string>();

            DA.GetData(0, ref run);
            if (run)
            {
                Component_SetData.ClearOutput(ref nodesNo, ref linesNo, ref membersNo, ref srfcNo, ref opNo, ref nodSupNo, ref lineSupNo, ref sfcSupNo,
                                              ref memberHingeNo, ref lineHingeNo, ref croSecNo, ref matNo, ref nodalLoadNo, ref lineLoadNo, ref memberLoadNo, ref surfaceLoadNo,
                                              ref polyLoadNo, ref loadcaseNo, ref loadcomboNo, ref resultcomboNo);
                if (!DA.GetData(modelDataCount3 + 1, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                try
                {
                    // Set data
                    data.PrepareModification();
                    if (DA.GetDataList(12, ghMats))
                    {
                        data.SetRFMaterials(ghMats, ref matNo, ref errorMsg);
                    }
                    if (DA.GetDataList(11, ghCSs))
                    {
                        data.SetRFCroSecs(ghCSs, ref croSecNo, ref errorMsg);
                    }
                    if (DA.GetDataList(9, ghMHs))
                    {
                        data.SetRFMemberHinges(ghMHs, ref memberHingeNo, ref errorMsg);
                    }
                    if (DA.GetDataList(1, ghNodes))
                    {
                        data.SetRFNodes(ghNodes, ref nodesNo, ref errorMsg);
                    }
                    if (DA.GetDataList(2, ghLines))
                    {
                        data.SetRFLines(ghLines, ref linesNo, ref errorMsg);
                    }
                    if (DA.GetDataList(3, ghMembers))
                    {
                        data.SetRFMembers(ghMembers, ref membersNo, ref errorMsg);
                    }
                    if (DA.GetDataList(4, ghSfcs))
                    {
                        data.SetRFSurfaces(ghSfcs, ref srfcNo, ref errorMsg);
                    }
                    if (DA.GetDataList(5, ghOps))
                    {
                        data.SetRFOpenings(ghOps, ref opNo, ref errorMsg);
                    }
                    if (DA.GetDataList(6, ghSupsP))
                    {
                        data.SetRFSupportsP(ghSupsP, ref nodSupNo, ref errorMsg);
                    }
                    if (DA.GetDataList(7, ghSupsL))
                    {
                        data.SetRFSupportsL(ghSupsL, ref lineSupNo, ref errorMsg);
                    }
                    if (DA.GetDataList(8, ghSupsS))
                    {
                        data.SetRFSupportsS(ghSupsS, ref sfcSupNo, ref errorMsg);
                    }
                    if (DA.GetDataList(10, ghLHs))
                    {
                        data.SetRFLineHinges(ghLHs, ref lineHingeNo, ref errorMsg);
                    }
                    data.FinishModification();
                    // Set Load Cases and Combos
                    if (DA.GetDataList(modelDataCount2 + 1, ghLoadCases))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFLoadCases(loads, ghLoadCases, ref loadcaseNo, ref errorMsg);
                    }
                    if (DA.GetDataList(modelDataCount2 + 2, ghLoadCombos))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFLoadCombos(loads, ghLoadCombos, ref loadcomboNo, ref errorMsg);
                    }
                    if (DA.GetDataList(modelDataCount2 + 3, ghResultCombos))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFResultCombos(loads, ghResultCombos, ref resultcomboNo, ref errorMsg);
                    }
                    // Set Loads
                    if (DA.GetDataList(modelDataCount + 1, ghNodalLoads))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFNodalLoads(loads, ghNodalLoads, ref nodalLoadNo, ref errorMsg);
                    }
                    if (DA.GetDataList(modelDataCount + 2, ghLineLoads))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFLineLoads(loads, ghLineLoads, ref lineLoadNo, ref errorMsg);
                    }
                    if (DA.GetDataList(modelDataCount + 3, ghMemberLoads))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFMemberLoads(loads, ghMemberLoads, ref memberLoadNo, ref errorMsg);
                    }
                    if (DA.GetDataList(modelDataCount + 4, ghSurfaceLoads))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFSurfaceLoads(loads, ghSurfaceLoads, ref surfaceLoadNo, ref errorMsg);
                    }
                    if (DA.GetDataList(modelDataCount + 5, ghPolyLoads))
                    {
                        if (loads == null)
                        {
                            Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        }
                        data.SetRFFreePolygonLoads(loads, ghPolyLoads, ref polyLoadNo, ref errorMsg);
                    }
                }
                catch (Exception ex)
                {
                    Component_SetData.ClearOutput(ref nodesNo, ref linesNo, ref membersNo, ref srfcNo, ref opNo, ref nodSupNo, ref lineSupNo, ref sfcSupNo,
                                                  ref memberHingeNo, ref lineHingeNo, ref croSecNo, ref matNo, ref nodalLoadNo, ref lineLoadNo, ref memberLoadNo, ref surfaceLoadNo,
                                                  ref polyLoadNo, ref loadcaseNo, ref loadcomboNo, ref resultcomboNo);
                    Component_GetData.DisconnectRFEM(ref model, ref data);
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }
            // Assign Output
            DA.SetDataList(0, nodesNo);
            DA.SetDataList(1, linesNo);
            DA.SetDataList(2, membersNo);
            DA.SetDataList(3, srfcNo);
            DA.SetDataList(4, opNo);
            DA.SetDataList(5, nodSupNo);
            DA.SetDataList(6, lineSupNo);
            DA.SetDataList(7, sfcSupNo);
            DA.SetDataList(8, memberHingeNo);
            DA.SetDataList(9, lineHingeNo);
            DA.SetDataList(10, croSecNo);
            DA.SetDataList(11, matNo);
            DA.SetDataList(12, nodalLoadNo);
            DA.SetDataList(13, lineLoadNo);
            DA.SetDataList(14, memberLoadNo);
            DA.SetDataList(15, surfaceLoadNo);
            DA.SetDataList(16, polyLoadNo);
            DA.SetDataList(17, loadcaseNo);
            DA.SetDataList(18, loadcomboNo);
            DA.SetDataList(19, resultcomboNo);

            if (errorMsg.Count != 0)
            {
                //errorMsg.Add("List item index may be one unit lower than object number");
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, String.Join(System.Environment.NewLine, errorMsg.ToArray()));
            }
        }
        /// <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, EvaluationUnit unit)
        {
            // RFEM variables
            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;
            ILoads     loads     = null;

            // Assign GH Input
            bool   run       = false;
            var    scale     = 0.0;
            string iLoadCase = "";

            DA.GetData(0, ref run);
            DA.GetData(1, ref scale);

            // Do stuff
            if (run)
            {
                msg = new List <string>();

                if (!DA.GetData(5, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                _saveddata = data;
                try
                {
                    // Get deformtions
                    _resetLC = true;
                    // Get loads
                    Component_GetData.GetLoadsFromRFEM(model, ref loads);
                    // Update load cases and combos to display in dropdown menu
                    _results = model.GetCalculation();

                    // Get load cases and combos to
                    var newLoadCasesAndCombos = new List <string>();
                    newLoadCasesAndCombos = loads.GetLoadCasesAndCombos(ref _countCases, ref _countCombos, ref _countRcombos);
                    if (_lCasesAndCombos == null || _lCasesAndCombos.Count == 0 || !_lCasesAndCombos.Equals(newLoadCasesAndCombos))
                    {
                        _lCasesAndCombos     = newLoadCasesAndCombos;
                        _loadDropLastValue   = 0; // reset dropdown menus if run
                        _resultDropLastValue = 0;
                        _lastLoadCase        = "";
                        _lastType            = 0;
                        _restoreDropDown     = true;
                    }
                    // Get deformed shape?
                    if (_deformationsCheck.Active)
                    {
                        _deformation_results = true;
                        // Get members
                        _rfMembers = Component_GetData.GetRFMembers(data.GetMembers().ToList(), data);
                        // Get Fe Meshes from RFEM
                        _rfemMesh = _results.GetFeMesh();
                        _feMeshes = CreateFEMeshes(ref msg);
                    }
                    else
                    {
                        _deformation_results = false;
                    }

                    // Disconnect RFEM
                    Component_GetData.DisconnectRFEM(ref model, ref data);

                    // Results are displayed just when the button is set to 0 - if no LC is provided
                    var dummyLC = "";
                    if (!DA.GetData(2, ref dummyLC))
                    {
                        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Set run to false to display results");
                        return;
                    }
                }
                catch (Exception ex)
                {
                    Component_GetData.DisconnectRFEM(ref model, ref data);
                    // Clear output!!!
                    _saveddata = null;
                    _rfemMesh  = null;
                    _results   = null;
                    _lcresults = null;
                    outResults = null;
                    _feMeshes.Clear();
                    _meshdisplacements.Clear();
                    _meshdisplacementsByType.Clear();
                    _deformedMeshes.Clear();
                    _controlPoints.Clear();
                    _memberdisplacements.Clear();
                    _memberdisplacementsByType.Clear();
                    _deformedMembers.Clear();
                    _sfcNo.Clear();
                    _memberNo.Clear();
                    _deformation_results = false;
                    throw ex;
                }
            }

            // do stuff
            if (msg.Count == 0) // if there are no calculation errors
            {
                // Get Load Case Number and result type
                int    result_type      = 0;
                string result_type_name = "";
                if (DA.GetData(2, ref iLoadCase))
                {
                    if (DA.GetData(3, ref result_type))
                    {
                        if (result_type <= 0 || result_type > Enum.GetNames(typeof(ResultsValueType)).Length - 1)
                        {
                            _loadDrop.Clear();
                            _resulttypeDrop.Clear();
                            _restoreDropDown = true; // for next time
                            AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Provide Valid Result Type.");
                            return;
                        }
                        result_type_name = Enum.GetName(typeof(ResultsValueType), result_type);
                        if (_lastLoadCase != iLoadCase || _lastType != result_type) // otherwise execution comes from change in scale and no need to reset load case
                        {
                            _resetLC = true;
                        }
                        _loadDrop.Clear();
                        _resulttypeDrop.Clear();
                        _restoreDropDown = true; // for next time
                    }
                    else
                    {
                        _loadDrop.Clear();
                        _resulttypeDrop.Clear();
                        _restoreDropDown = true; // for next time
                        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Provide Result Type.");
                        return;
                    }
                }
                else if (DA.GetData(3, ref result_type))
                {
                    _loadDrop.Clear();
                    _resulttypeDrop.Clear();
                    _restoreDropDown = true; // for next time
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Provide Load Case or Combo.");
                    return;
                }
                else // get values from dropdown menus
                {
                    if (_lCasesAndCombos.Count == 0)
                    {
                        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "No results to display");
                        _loadDrop.Clear();
                        _resulttypeDrop.Clear();
                        return;
                    }
                    if (_restoreDropDown) // from previous execution when it was overwritten
                    {
                        updateDropDownMenu(_lCasesAndCombos);
                        _resetLC         = true;
                        _restoreDropDown = false; // for next time
                    }
                    iLoadCase = _loadDrop.Items[_loadDrop.Value].name;
                }

                // Get results to display
                // 1) Results from load case or combo for all types 2) Results for selected result type 3) Apply scale
                if (_resetLC)
                {
                    int no    = Int16.Parse(iLoadCase.Split(' ')[1]);
                    var value = _lCasesAndCombos.IndexOf(iLoadCase);
                    _loadDropLastValue = value;
                    _lastLoadCase      = iLoadCase;
                    if (value == -1)
                    {
                        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"{iLoadCase} has no results. Provide valid load case.");
                        return;
                    }
                    if (value < _countCases)
                    {
                        _lcresults = _results.GetResultsInFeNodes(LoadingType.LoadCaseType, no);
                    }
                    else if (value < _countCases + _countCombos)
                    {
                        _lcresults = _results.GetResultsInFeNodes(LoadingType.LoadCombinationType, no);
                    }
                    else if (value < _countCases + _countCombos + _countRcombos)
                    {
                        _lcresults = _results.GetResultsInFeNodes(LoadingType.ResultCombinationType, no);
                    }
                    else
                    {
                        msg.Add("Load case or combo not found");
                        return;
                    }
                    // Get analysis results
                    _resultTypes = new HashSet <ResultsValueType>();
                    outResults   = new RFResults(_lcresults, _saveddata, buttonLocal.Active, ref _resultTypes, iLoadCase,
                                                 _memberForcesCheck.Active, _surfaceForcesCheck.Active, _nodalReactionsCheck.Active,
                                                 _lineReactionsCheck.Active);
                    // Get deformations
                    if (_deformationsCheck.Active)
                    {
                        if (!_deformation_results)
                        {
                            AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run component again to get deformation results.");
                        }
                        else
                        {
                            _meshdisplacements         = GetMeshDisplacements(ref _sfcNo, ref msg);
                            _memberdisplacements       = GetMemberDisplacements(ref _memberNo, ref msg);
                            _meshdisplacementsByType   = GetMeshDisplacementsByType(result_type);
                            _memberdisplacementsByType = GetMemberDisplacementsByType(result_type);
                        }
                    }
                    // Update drop down menu of result types
                    if (result_type == 0) // if no value obtaines through overwrite
                    {
                        _resultDropLastValue = 0;
                        updateDropDownMenu2(_resultTypes.ToList(), ref result_type);
                    }
                    // Set _resetLC to false again
                    _resetLC         = false;
                    _resetResultType = true;
                }
                if (_resetResultType)     // when there are changes in drop down menu
                {
                    if (result_type == 0) // if no value obtaines through overwrite
                    {
                        result_type = Int32.Parse(_resulttypeDrop.Items[_resulttypeDrop.Value].name);
                    }
                    if (_deformationsCheck.Active)
                    {
                        _meshdisplacementsByType   = GetMeshDisplacementsByType(result_type);
                        _memberdisplacementsByType = GetMemberDisplacementsByType(result_type);
                    }
                    // Get analysis results
                    if (result_type > 0)
                    {
                        outResults.ResultType = ((ResultsValueType)result_type).ToString();
                    }
                    // Set _resetType to false again
                    _resetResultType = false;
                }
                _lastType = result_type;
                // Check results
                if (_meshdisplacements.DataCount > 0 && _meshdisplacementsByType.DataCount == 0)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"No surface results found for result type {((ResultsValueType)result_type).ToString()}");
                }
                if (_memberdisplacements.DataCount > 0 && _memberdisplacementsByType.DataCount == 0)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"No member results found for result type {((ResultsValueType)result_type).ToString()}");
                }
                // Get output
                _deformedMeshes  = GetDeformedMeshes(scale, ref msg);
                _deformedMembers = GetDeformedMembers(scale, ref msg);

                // Output calculation results
                DA.SetData(0, outResults);

                // Assign GH Output
                DA.SetDataList(1, _deformedMembers);
                DA.SetDataList(2, _memberNo);
                DA.SetDataList(3, _deformedMeshes);
                DA.SetDataList(4, _sfcNo);
            }
            if (msg.Count > 0)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, String.Join(System.Environment.NewLine, msg.ToArray()));
            }
        }
        /// <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, EvaluationUnit unit)
        {
            var run = false;

            var ghNodes   = new List <GH_RFEM>();
            var ghLines   = new List <GH_RFEM>();
            var ghMembers = new List <GH_RFEM>();
            var ghSfcs    = new List <GH_RFEM>();
            var ghOps     = new List <GH_RFEM>();
            var ghSupsP   = new List <GH_RFEM>();
            var ghSupsL   = new List <GH_RFEM>();
            var ghLHs     = new List <GH_RFEM>();
            var ghCSs     = new List <GH_RFEM>();
            var ghMats    = new List <GH_RFEM>();

            var ghNodalLoads = new List <GH_RFEM>();

            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;
            ILoads     loads     = null;

            DA.GetData(modelDataCount - 1, ref run);
            if (run)
            {
                Component_SetData.ClearOutput(ref nodesNo, ref linesNo, ref membersNo, ref srfcNo, ref opNo, ref nodSupNo, ref lineSupNo,
                                              ref lineHingeNo, ref croSecNo, ref matNo, ref nodalLoadNo);
                if (!DA.GetData(modelDataCount + modelDataCount2, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                try
                {
                    // Set data
                    data.PrepareModification();
                    if (DA.GetDataList(9, ghMats))
                    {
                        data.SetRFMaterials(ghMats, ref matNo);
                    }
                    if (DA.GetDataList(8, ghCSs))
                    {
                        data.SetRFCroSecs(ghCSs, ref croSecNo);
                    }
                    if (DA.GetDataList(0, ghNodes))
                    {
                        data.SetRFNodes(ghNodes, ref nodesNo);
                    }
                    if (DA.GetDataList(1, ghLines))
                    {
                        data.SetRFLines(ghLines, ref linesNo);
                    }
                    if (DA.GetDataList(2, ghMembers))
                    {
                        data.SetRFMembers(ghMembers, ref membersNo);
                    }
                    if (DA.GetDataList(3, ghSfcs))
                    {
                        data.SetRFSurfaces(ghSfcs, ref srfcNo);
                    }
                    if (DA.GetDataList(4, ghOps))
                    {
                        data.SetRFOpenings(ghOps, ref opNo);
                    }
                    if (DA.GetDataList(5, ghSupsP))
                    {
                        data.SetRFSupportsP(ghSupsP, ref nodSupNo);
                    }
                    if (DA.GetDataList(6, ghSupsL))
                    {
                        data.SetRFSupportsL(ghSupsL, ref lineSupNo);
                    }
                    if (DA.GetDataList(7, ghLHs))
                    {
                        data.SetRFLineHinges(ghLHs, ref lineHingeNo);
                    }
                    data.FinishModification();
                    // Set Loads
                    if (DA.GetDataList(modelDataCount, ghNodalLoads))
                    {
                        Component_GetData.GetLoadsFromRFEM(model, ref loads);
                        data.SetRFNodalLoads(loads, ghNodalLoads, ref nodalLoadNo);
                    }
                }
                catch (Exception ex)
                {
                    Component_SetData.ClearOutput(ref nodesNo, ref linesNo, ref membersNo, ref srfcNo, ref opNo, ref nodSupNo, ref lineSupNo,
                                                  ref lineHingeNo, ref croSecNo, ref matNo, ref nodalLoadNo);
                    Component_GetData.DisconnectRFEM(ref model, ref data);
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }
            // Assign Output
            DA.SetDataList(0, nodesNo);
            DA.SetDataList(1, linesNo);
            DA.SetDataList(2, membersNo);
            DA.SetDataList(3, srfcNo);
            DA.SetDataList(4, opNo);
            DA.SetDataList(5, nodSupNo);
            DA.SetDataList(6, lineSupNo);
            DA.SetDataList(7, lineHingeNo);
            DA.SetDataList(8, croSecNo);
            DA.SetDataList(9, matNo);
            DA.SetDataList(10, nodalLoadNo);
        }
        /// <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, EvaluationUnit unit)
        {
            // Input counter
            modelDataCount1 = 1 + modelDataCount2;

            // RFEM variables
            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;
            ILoads     loads     = null;

            // Output message
            var msg = new List <string>();

            // Assign GH Input
            bool getnodes        = false;
            bool getlines        = false;
            bool getmembers      = false;
            bool getsurfaces     = false;
            bool getopenings     = false;
            bool getsupportsP    = false;
            bool getsupportsL    = false;
            bool getsupportsS    = false;
            bool getMemberHinges = false;
            bool getLineHinges   = false;
            bool getCroSecs      = false;
            bool getMaterials    = false;
            bool getNodalLoads   = false;
            bool getLineLoads    = false;
            bool getMemberLoads  = false;
            bool getSurfaceLoads = false;
            bool getPolyLoads    = false;
            bool getLoadCases    = false;
            bool getLoadCombos   = false;
            bool getResultCombos = false;
            bool run             = false;
            var  ghFilters       = new List <GH_RFFilter>();
            var  inFilters       = new List <RFFilter>();

            DA.GetData(0, ref run);
            DA.GetData(1, ref getnodes);
            DA.GetData(2, ref getlines);
            DA.GetData(3, ref getmembers);
            DA.GetData(4, ref getsurfaces);
            DA.GetData(5, ref getopenings);
            DA.GetData(6, ref getsupportsP);
            DA.GetData(7, ref getsupportsL);
            DA.GetData(8, ref getsupportsS);
            DA.GetData(9, ref getMemberHinges);
            DA.GetData(10, ref getLineHinges);
            DA.GetData(11, ref getCroSecs);
            DA.GetData(12, ref getMaterials);
            DA.GetData(13, ref getNodalLoads);
            DA.GetData(14, ref getLineLoads);
            DA.GetData(15, ref getMemberLoads);
            DA.GetData(16, ref getSurfaceLoads);
            DA.GetData(17, ref getPolyLoads);
            DA.GetData(18, ref getLoadCases);
            DA.GetData(19, ref getLoadCombos);
            DA.GetData(20, ref getResultCombos);
            if (DA.GetDataList(modelDataCount3 + 1, ghFilters))
            {
                inFilters = ghFilters.Select(x => x.Value).ToList();
            }

            // Do stuff
            if (run)
            {
                if (!DA.GetData(modelDataCount3 + 2, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                Component_GetData.ClearOutput(ref rfNodes, ref rfLines, ref rfMembers, ref rfSurfaces, ref rfOpenings,
                                              ref rfSupportsP, ref rfSupportsL, ref rfSupportsS, ref rfLineHinges, ref rfCroSecs, ref rfMaterials, ref rfNodalLoads,
                                              ref rfLineLoads, ref rfMemberLoads, ref rfSurfaceLoads, ref rfPolyLoads, ref rfLoadCases, ref rfLoadCombos,
                                              ref rfResultCombos, ref rfMemberHinges);

                try
                {
                    if (getnodes)
                    {
                        var filNodes = Component_GetData.FilterNodes(data, inFilters);
                        rfNodes = Component_GetData.GetRFNodes(filNodes, data);
                    }
                    if (getlines)
                    {
                        var filLines = Component_GetData.FilterLines(data, inFilters);
                        rfLines = Component_GetData.GetRFLines(filLines, data);
                    }
                    if (getmembers)
                    {
                        var filMembers = Component_GetData.FilterMembers(data, inFilters);
                        rfMembers = Component_GetData.GetRFMembers(filMembers, data);
                    }
                    if (getsurfaces)
                    {
                        var filSrfcs = Component_GetData.FilterSurfaces(data, inFilters);
                        rfSurfaces = Component_GetData.GetRFSurfaces(filSrfcs, data);
                    }
                    if (getopenings)
                    {
                        var filOpenings = Component_GetData.FilterOpenings(data, inFilters);
                        rfOpenings = Component_GetData.GetRFOpenings(filOpenings, data);
                    }
                    if (getsupportsP)
                    {
                        var filSupportsP = Component_GetData.FilterSupsP(data, inFilters);
                        rfSupportsP = Component_GetData.GetRFSupportsP(filSupportsP, data);
                    }
                    if (getsupportsL)
                    {
                        var filSupportsL = Component_GetData.FilterSupsL(data, inFilters);
                        rfSupportsL = Component_GetData.GetRFSupportsL(filSupportsL, data);
                    }
                    if (getsupportsS)
                    {
                        var filSupportsS = Component_GetData.FilterSupsS(data, inFilters);
                        rfSupportsS = Component_GetData.GetRFSupportsS(filSupportsS, data);
                    }
                    if (getMemberHinges)
                    {
                        var filMemberHinges = Component_GetData.FilterMH(data, inFilters);
                        rfMemberHinges = Component_GetData.GetRFMemberHinges(filMemberHinges, data);
                    }
                    if (getLineHinges)
                    {
                        var filLineHinges = Component_GetData.FilterLH(data, inFilters);
                        rfLineHinges = Component_GetData.GetRFLineHinges(filLineHinges, data);
                    }
                    if (getCroSecs)
                    {
                        var filCroSecs = Component_GetData.FilterCroSecs(data, inFilters);
                        rfCroSecs = Component_GetData.GetRFCroSecs(filCroSecs, model, ref msg);
                    }
                    if (getMaterials)
                    {
                        var filMaterials = Component_GetData.FilterMaterials(data, inFilters);
                        rfMaterials = Component_GetData.GetRFMaterials(filMaterials, data);
                    }
                    //Get Loads?
                    if (getNodalLoads || getLineLoads || getMemberLoads || getSurfaceLoads || getPolyLoads ||
                        getLoadCases || getLoadCombos || getResultCombos)
                    {
                        Component_GetData.GetLoadsFromRFEM(model, ref loads);
                    }
                    if (getNodalLoads)
                    {
                        var filNodalLoads = Component_GetData.FilterNodalLoads(data, loads, inFilters);
                        rfNodalLoads = Component_GetData.GetRFNodalLoads(filNodalLoads, data);
                    }
                    if (getLineLoads)
                    {
                        var filLineLoads = Component_GetData.FilterLineLoads(data, loads, inFilters);
                        rfLineLoads = Component_GetData.GetRFLineLoads(filLineLoads, data);
                    }
                    if (getMemberLoads)
                    {
                        var filMemberLoads = Component_GetData.FilterMemberLoads(data, loads, inFilters);
                        rfMemberLoads = Component_GetData.GetRFMemberLoads(filMemberLoads, data);
                    }
                    if (getSurfaceLoads)
                    {
                        var filSurfaceLoads = Component_GetData.FilterSurfaceLoads(data, loads, inFilters);
                        rfSurfaceLoads = Component_GetData.GetRFSurfaceLoads(filSurfaceLoads, data);
                    }
                    if (getPolyLoads)
                    {
                        var filPolyLoads = Component_GetData.FilterPolyLoads(data, loads, inFilters);
                        rfPolyLoads = Component_GetData.GetRFPolyLoads(filPolyLoads, data);
                    }
                    if (getLoadCases)
                    {
                        var filLoadCases = Component_GetData.FilterLoadCases(data, loads, inFilters);
                        rfLoadCases = Component_GetData.GetRFLoadCases(filLoadCases, data);
                    }
                    if (getLoadCombos)
                    {
                        var filLoadCombos = Component_GetData.FilterLoadCombos(data, loads, inFilters);
                        rfLoadCombos = Component_GetData.GetRFLoadCombos(filLoadCombos, data);
                    }
                    if (getResultCombos)
                    {
                        var filResultombos = Component_GetData.FilterResultCombos(data, loads, inFilters);
                        rfResultCombos = Component_GetData.GetRFResultCombos(filResultombos, data);
                    }
                }
                catch (Exception ex)
                {
                    Component_GetData.ClearOutput(ref rfNodes, ref rfLines, ref rfMembers, ref rfSurfaces, ref rfOpenings,
                                                  ref rfSupportsP, ref rfSupportsL, ref rfSupportsS, ref rfLineHinges, ref rfCroSecs, ref rfMaterials, ref rfNodalLoads,
                                                  ref rfLineLoads, ref rfMemberLoads, ref rfSurfaceLoads, ref rfPolyLoads, ref rfLoadCases, ref rfLoadCombos,
                                                  ref rfResultCombos, ref rfMemberHinges);
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }

            // Assign GH Output
            DA.SetDataList(0, rfNodes);
            DA.SetDataList(1, rfLines);
            DA.SetDataList(2, rfMembers);
            DA.SetDataList(3, rfSurfaces);
            DA.SetDataList(4, rfOpenings);
            DA.SetDataList(5, rfSupportsP);
            DA.SetDataList(6, rfSupportsL);
            DA.SetDataList(7, rfSupportsS);
            DA.SetDataList(8, rfMemberHinges);
            DA.SetDataList(9, rfLineHinges);
            DA.SetDataList(10, rfCroSecs);
            DA.SetDataList(11, rfMaterials);
            DA.SetDataList(12, rfNodalLoads);
            DA.SetDataList(13, rfLineLoads);
            DA.SetDataList(14, rfMemberLoads);
            DA.SetDataList(15, rfSurfaceLoads);
            DA.SetDataList(16, rfPolyLoads);
            DA.SetDataList(17, rfLoadCases);
            DA.SetDataList(18, rfLoadCombos);
            DA.SetDataList(19, rfResultCombos);

            if (msg.Count != 0)
            {
                //errorMsg.Add("List item index may be one unit lower than object number");
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, String.Join(System.Environment.NewLine, msg.ToArray()));
            }
        }
        /// <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, EvaluationUnit unit)
        {
            // Input counter
            modelDataCount1 = modelDataCount + modelDataCount2;

            // RFEM variables
            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;
            ILoads     loads     = null;

            // Assign GH Input
            bool getnodes      = false;
            bool getlines      = false;
            bool getmembers    = false;
            bool getsurfaces   = false;
            bool getopenings   = false;
            bool getsupportsP  = false;
            bool getsupportsL  = false;
            bool getLineHinges = false;
            bool getCroSecs    = false;
            bool getMaterials  = false;
            bool getNodalLoads = false;
            bool run           = false;
            var  ghFilters     = new List <GH_RFFilter>();
            var  inFilters     = new List <RFFilter>();

            DA.GetData(0, ref getnodes);
            DA.GetData(1, ref getlines);
            DA.GetData(2, ref getmembers);
            DA.GetData(3, ref getsurfaces);
            DA.GetData(4, ref getopenings);
            DA.GetData(5, ref getsupportsP);
            DA.GetData(6, ref getsupportsL);
            DA.GetData(7, ref getLineHinges);
            DA.GetData(8, ref getCroSecs);
            DA.GetData(9, ref getMaterials);
            DA.GetData(10, ref run);
            DA.GetData(11, ref getNodalLoads);
            if (DA.GetDataList(modelDataCount1, ghFilters))
            {
                inFilters = ghFilters.Select(x => x.Value).ToList();
            }

            // Do stuff
            if (run)
            {
                if (!DA.GetData(modelDataCount1 + 1, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                Component_GetData.ClearOutput(ref rfNodes, ref rfLines, ref rfMembers, ref rfSurfaces, ref rfOpenings,
                                              ref rfSupportsP, ref rfSupportsL, ref rfLineHinges, ref rfCroSecs, ref rfMaterials, ref rfNodalLoads);

                try
                {
                    if (getnodes)
                    {
                        var filNodes = Component_GetData.FilterNodes(data, inFilters);
                        rfNodes = Component_GetData.GetRFNodes(filNodes, data);
                    }
                    if (getlines)
                    {
                        var filLines = Component_GetData.FilterLines(data, inFilters);
                        rfLines = Component_GetData.GetRFLines(filLines, data);
                    }
                    if (getmembers)
                    {
                        var filMembers = Component_GetData.FilterMembers(data, inFilters);
                        rfMembers = Component_GetData.GetRFMembers(filMembers, data);
                    }
                    if (getsurfaces)
                    {
                        var filSrfcs = Component_GetData.FilterSurfaces(data, inFilters);
                        rfSurfaces = Component_GetData.GetRFSurfaces(filSrfcs, data);
                    }
                    if (getopenings)
                    {
                        var filOpenings = Component_GetData.FilterOpenings(data, inFilters);
                        rfOpenings = Component_GetData.GetRFOpenings(filOpenings, data);
                    }
                    if (getsupportsP)
                    {
                        var filSupportsP = Component_GetData.FilterSupsP(data, inFilters);
                        rfSupportsP = Component_GetData.GetRFSupportsP(filSupportsP, data);
                    }
                    if (getsupportsL)
                    {
                        var filSupportsL = Component_GetData.FilterSupsL(data, inFilters);
                        rfSupportsL = Component_GetData.GetRFSupportsL(filSupportsL, data);
                    }
                    if (getLineHinges)
                    {
                        var filLineHinges = Component_GetData.FilterLH(data, inFilters);
                        rfLineHinges = Component_GetData.GetRFLineHinges(filLineHinges, data);
                    }
                    if (getCroSecs)
                    {
                        var filCroSecs = Component_GetData.FilterCroSecs(data, inFilters);
                        rfCroSecs = Component_GetData.GetRFCroSecs(filCroSecs, data);
                    }
                    if (getMaterials)
                    {
                        var filMaterials = Component_GetData.FilterMaterials(data, inFilters);
                        rfMaterials = Component_GetData.GetRFMaterials(filMaterials, data);
                    }
                    //Get Loads?
                    if (getNodalLoads)
                    {
                        Component_GetData.GetLoadsFromRFEM(model, ref loads);
                    }
                    if (getNodalLoads)
                    {
                        var filNodalLoads = Component_GetData.FilterNodalLoads(data, loads, inFilters);
                        rfNodalLoads = Component_GetData.GetRFNodalLoads(filNodalLoads, data);
                    }
                }
                catch (Exception ex)
                {
                    Component_GetData.ClearOutput(ref rfNodes, ref rfLines, ref rfMembers, ref rfSurfaces, ref rfOpenings,
                                                  ref rfSupportsP, ref rfSupportsL, ref rfLineHinges, ref rfCroSecs, ref rfMaterials, ref rfNodalLoads);
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }

            // Assign GH Output
            DA.SetDataList(0, rfNodes);
            DA.SetDataList(1, rfLines);
            DA.SetDataList(2, rfMembers);
            DA.SetDataList(3, rfSurfaces);
            DA.SetDataList(4, rfOpenings);
            DA.SetDataList(5, rfSupportsP);
            DA.SetDataList(6, rfSupportsL);
            DA.SetDataList(7, rfLineHinges);
            DA.SetDataList(8, rfCroSecs);
            DA.SetDataList(9, rfMaterials);
            DA.SetDataList(10, rfNodalLoads);
        }
        /// <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, EvaluationUnit unit)
        {
            //OnComponentLoaded();

            // Input counter
            //modelDataCount1 = 1 + modelDataCount2;

            // RFEM variables
            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;
            ILoads     loads     = null;

            // Output message
            var msg = new List <string>();

            // Assign GH Input
            bool run   = false;
            var  scale = 0.0;

            DA.GetData(0, ref run);
            DA.GetData(1, ref scale);

            // Do stuff
            if (run)
            {
                if (!DA.GetData(3, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                _saveddata = data;
                try
                {
                    // Get deformtions
                    _resetLC = true;
                    // Get loads
                    Component_GetData.GetLoadsFromRFEM(model, ref loads);
                    // Get calculation results
                    _results = model.GetCalculation();
                    var errors = _results.CalculateAll();
                    if (errors != null)
                    {
                        msg.AddRange(errors.Select(x => x.Description));
                    }
                    // Update load cases and combos to display in dropdown menu
                    loads.GetLoadCasesAndCombos(ref _lCasesAndCombos, ref _countCases, ref _countCombos, ref _countRcombos);
                    updateDropDownMenu(_lCasesAndCombos);
                    // Get Fe Meshes from RFEM
                    _rfemMesh = _results.GetFeMesh();
                    _feMeshes = CreateFEMeshes(ref msg);
                    // _controlPoints = CreateControlPoints(ref msg); -> Obtained with displacements
                }
                catch (Exception ex)
                {
                    // Clear output!!!
                    _saveddata = null;
                    _rfemMesh  = null;
                    _results   = null;
                    _lcresults = null;
                    _feMeshes.Clear();
                    _meshdisplacements.Clear();
                    _deformedMeshes.Clear();
                    _controlPoints.Clear();
                    _memberdisplacements.Clear();
                    _deformedMembers.Clear();
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }
            // Get results to display
            if (_loadDrop.Items.Count > 0 && _resetLC && msg.Count == 0)
            {
                int no = Int16.Parse(_loadDrop.Items[_loadDrop.Value].name.Split(' ')[1]);
                if (_loadDrop.Value < _countCases)
                {
                    _lcresults = _results.GetResultsInFeNodes(LoadingType.LoadCaseType, no);
                }
                else if (_loadDrop.Value < _countCases + _countCombos)
                {
                    _lcresults = _results.GetResultsInFeNodes(LoadingType.LoadCombinationType, no);
                }
                else if (_loadDrop.Value < _countCases + _countCombos + _countRcombos)
                {
                    _lcresults = _results.GetResultsInFeNodes(LoadingType.ResultCombinationType, no);
                }
                else
                {
                    msg.Add("Load case or combo not found");
                }
                // Get deformations
                _meshdisplacements   = GetMeshDisplacements(ref msg);
                _memberdisplacements = GetMemberDisplacements(ref msg);
                // Set _resetLC to false again
                _resetLC = false;
            }

            // Get output
            _deformedMeshes  = GetDeformedMeshes(scale, ref msg);
            _deformedMembers = GetDeformedMembers(scale, ref msg);

            // Assign GH Output
            DA.SetDataTree(0, _deformedMembers);
            DA.SetDataTree(1, _deformedMeshes);

            if (msg.Count != 0)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, String.Join(System.Environment.NewLine, msg.ToArray()));
            }
        }
        /// <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, EvaluationUnit unit)
        {
            var run = false;

            var combos = new List <int>();
            var mass   = 0.0;


            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;

            var errorMsg = new List <string>();

            DA.GetData(1, ref run);
            if (run)
            {
                if (!DA.GetData(2 + 1, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                try
                {
                    //Calculate Load Combos
                    DA.GetDataList(0, combos);
                    var myCalculation = model.GetCalculation();
                    myCalculation.Clean();
                    foreach (var no in combos)
                    {
                        ErrorInfo[] errormsg = myCalculation.Calculate(LoadingType.LoadCombinationType, 1);
                    }

                    // Get EC3 LoadCase
                    var myEC3 = (Dlubal.STEEL_EC3.Module)model.GetModule("STEEL_EC3");
                    Dlubal.STEEL_EC3.ICase myCaseEC3 = myEC3.moGetCase(1, ITEM_AT.AT_NO);

                    // Get Cross Sections
                    // Select cross sections?
                    var countCS = myCaseEC3.moGetCrossSectionsCount();
                    for (int i = 0; i < countCS; i++)
                    {
                        Dlubal.STEEL_EC3.CROSS_SECTION myCSEC3 = myCaseEC3.moGetCrossSection(i + 1, ITEM_AT.AT_NO);
                        myCSEC3.Optimization = 1;
                        myCaseEC3.moSetCrossSection(myCSEC3.No, ITEM_AT.AT_NO, myCSEC3);
                    }

                    // Berechnung durchführen
                    var error = myCaseEC3.moCalculate();

                    //Querschnitt an RFEM übergeben.
                    var myCSECRFEM = new List <CrossSection>();
                    for (int i = 0; i < countCS; i++)
                    {
                        Dlubal.STEEL_EC3.CROSS_SECTION myCSEC3 = myCaseEC3.moGetCrossSection(i + 1, ITEM_AT.AT_NO);
                        var myCS = data.GetCrossSection(i + 1, ItemAt.AtNo).GetData();
                        myCS.TextID      = myCSEC3.Description;
                        myCS.Description = myCSEC3.Description;
                        myCSECRFEM.Add(myCS);
                    }

                    // Set Data
                    data.PrepareModification();
                    foreach (var crosec in myCSECRFEM)
                    {
                        data.SetCrossSection(crosec);
                    }
                    data.FinishModification();

                    // Get steel mass
                    var members = data.GetMembers();
                    mass = members.Sum(item => item.Weight);
                }
                catch (Exception ex)
                {
                    Component_GetData.DisconnectRFEM(ref model, ref data);
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }
            // Assign Output
            DA.SetData(0, mass);


            if (errorMsg.Count != 0)
            {
                //errorMsg.Add("List item index may be one unit lower than object number");
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, String.Join(System.Environment.NewLine, errorMsg.ToArray()));
            }
        }
Пример #10
0
        /// <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, EvaluationUnit unit)
        {
            // RFEM variables
            var          modelName = "";
            IModel       model     = null;
            IModelData   data      = null;
            ILoads       loads     = null;
            ICalculation results   = null;

            // Output message
            var msg = new List <string>();

            // Assign GH Input
            bool run     = false;
            var  iLcases = new List <string>();

            DA.GetData(0, ref run);

            // Do stuff
            if (run)
            {
                if (!DA.GetData(3, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                try
                {
                    // Get loads
                    Component_GetData.GetLoadsFromRFEM(model, ref loads);
                    // Get calculation
                    results = model.GetCalculation();
                    // Update results
                    _maxDisplacements   = new List <Vector3d>();
                    _loadCasesAndCombos = new List <string>();
                    // Get load cases and combos
                    if (!DA.GetDataList(1, iLcases))
                    {
                        var errors = results.CalculateApp();
                        if (errors != null)
                        {
                            msg.AddRange(errors.Select(x => x.Description));
                        }
                        _loadCasesAndCombos = loads.GetLoadCasesAndCombos(0, 0, 0);
                    }
                    else
                    {
                        _loadCasesAndCombos = iLcases;
                    }
                    // Get results
                    foreach (var lc in _loadCasesAndCombos)
                    {
                        Vector3d displacement = new Vector3d(0, 0, 0);
                        Component_GetResults.GetResults(ref results, lc, ref displacement, ref msg);
                        _maxDisplacements.Add(displacement);
                    }
                }
                catch (Exception ex)
                {
                    // Clear output!!!
                    results             = null;
                    _maxDisplacements   = null;
                    _loadCasesAndCombos = null;
                    Component_GetData.DisconnectRFEM(ref model, ref data);
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }
            if (msg.Count > 0)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, String.Join(System.Environment.NewLine, msg.ToArray()));
            }
            {
                DA.SetDataList(0, _loadCasesAndCombos);
                DA.SetDataList(1, _maxDisplacements);
            }
        }
        /// <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, EvaluationUnit unit)
        {
            // RFEM variables
            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;

            //Additional variables
            var dicMat  = new Dictionary <int, Material>();
            var dicMass = new Dictionary <int, List <double> >();
            var dicVol  = new Dictionary <int, List <double> >();
            var dicGeo  = new Dictionary <int, List <Brep> >();

            // Input
            var msg  = "";
            var msgs = new List <string>();
            var run  = false;

            DA.GetData(0, ref run);


            if (run)
            {
                if (!DA.GetData(1, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                _materials.Clear();
                _massTree.Clear();
                _volumeTree.Clear();
                _brepTree.Clear();
                try
                {
                    // Get Surfaces
                    var sfcs = Component_GetData.GetRFSurfaces(data.GetSurfaces().ToList(), data);
                    foreach (var sfc in sfcs)
                    {
                        // Add material to dictionary
                        if (!dicMat.ContainsKey(sfc.MaterialNo))
                        {
                            dicMat.Add(sfc.MaterialNo, data.GetMaterial(sfc.MaterialNo, ItemAt.AtNo).GetData());
                            dicMass.Add(sfc.MaterialNo, new List <double>());
                            dicVol.Add(sfc.MaterialNo, new List <double>());
                            dicGeo.Add(sfc.MaterialNo, new List <Brep>());
                        }
                        // Add mass to output list
                        dicVol[sfc.MaterialNo].Add(sfc.Area * sfc.Thickness);
                        dicMass[sfc.MaterialNo].Add(sfc.Area * sfc.Thickness * dicMat[sfc.MaterialNo].SpecificWeight / 10.0);

                        // Add Geometry to output list
                        dicGeo[sfc.MaterialNo].Add(sfc.ToBrep());
                    }
                    // Get Members
                    var members    = Component_GetData.GetRFMembers(data.GetMembers().ToList(), data);
                    var crosecs    = Component_GetData.GetRFCroSecs(data.GetCrossSections().ToList(), model, ref msgs);
                    var cs_indeces = crosecs.Select(x => x.No).ToList();
                    foreach (var member in members)
                    {
                        var mat_index = crosecs.Where(x => x.No == member.StartCrossSectionNo).ToList()[0].MatNo;


                        // Add material to dictionary
                        if (!dicMat.ContainsKey(mat_index))
                        {
                            dicMat.Add(mat_index, data.GetMaterial(mat_index, ItemAt.AtNo).GetData());
                            dicMass.Add(mat_index, new List <double>());
                            dicVol.Add(mat_index, new List <double>());
                            dicGeo.Add(mat_index, new List <Brep>());
                        }

                        // Add mass to output list
                        if (member.EndCrossSectionNo == 0) // In case of tension members, etc.
                        {
                            member.EndCrossSectionNo = member.StartCrossSectionNo;
                        }
                        if (!(cs_indeces.Contains(member.StartCrossSectionNo)) || (!(cs_indeces.Contains(member.EndCrossSectionNo))))
                        {
                            AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"Provide cross sections for member No {member.No}.");
                            continue;
                        }
                        var startCroSec = crosecs[cs_indeces.IndexOf(member.StartCrossSectionNo)];
                        var endCroSec   = crosecs[cs_indeces.IndexOf(member.EndCrossSectionNo)];
                        var volume      = (startCroSec.A + endCroSec.A) / 2 * member.Length;
                        dicVol[mat_index].Add(volume);
                        dicMass[mat_index].Add(member.Weight);

                        // Add Geometry to output list
                        var memberShape = Component_ExtrudeMembers.ExtrudeMembersToBrep(member, crosecs, member.Length / 8.0, out msg);
                        if (memberShape == null)
                        {
                            dicGeo[mat_index].Add(null);
                        }
                        else
                        {
                            dicGeo[mat_index].Add(memberShape[0]);
                        }
                    }
                    // Prepare Output
                    var matSorted = dicMat.Values.OrderBy(x => x.No).ToList();
                    _materials = matSorted.Select(x => x.Description).ToList();
                    for (int i = 0; i < matSorted.Count; i++)
                    {
                        var path = new GH_Path(i);
                        _volumeTree.EnsurePath(path);
                        _volumeTree.Branch(path).AddRange(dicVol[matSorted[i].No]);
                        _massTree.EnsurePath(path);
                        _massTree.Branch(path).AddRange(dicMass[matSorted[i].No]);
                        _brepTree.EnsurePath(path);
                        _brepTree.Branch(path).AddRange(dicGeo[matSorted[i].No]);
                    }
                }
                catch (Exception ex)
                {
                    Component_GetData.DisconnectRFEM(ref model, ref data);
                    _materials.Clear();
                    _massTree.Clear();
                    _volumeTree.Clear();
                    _brepTree.Clear();
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
                if (msgs.Count > 0)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, String.Join(System.Environment.NewLine, msg.ToArray()));
                }
                if (msg != "")
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, msg);
                }
            }
            DA.SetDataList(0, _materials);
            DA.SetDataTree(1, _brepTree);
            DA.SetDataTree(2, _massTree);
            DA.SetDataTree(3, _volumeTree);
        }