diff --git a/Etabs_Adapter/CRUD/Update/Node.cs b/Etabs_Adapter/CRUD/Update/Node.cs index e2cf089b..df9efc54 100644 --- a/Etabs_Adapter/CRUD/Update/Node.cs +++ b/Etabs_Adapter/CRUD/Update/Node.cs @@ -1,4 +1,4 @@ -/* +/* * This file is part of the Buildings and Habitats object Model (BHoM) * Copyright (c) 2015 - 2024, the respective contributors. All rights reserved. * @@ -27,6 +27,7 @@ using BH.oM.Structure.Elements; using BH.oM.Structure.Constraints; using BH.Engine.Adapters.ETABS; +using BH.oM.Physical.Elements; namespace BH.Adapter.ETABS { @@ -44,41 +45,92 @@ public partial class ETABSAdapter : BHoMAdapter private bool UpdateObjects(IEnumerable nodes) { - bool success = true; - m_model.SelectObj.ClearSelection(); + bool success = true; // θ(1) + m_model.SelectObj.ClearSelection(); // θ(1) - double factor = DatabaseLengthUnitFactor(); + double factor = DatabaseLengthUnitFactor(); // θ(1) - Engine.Structure.NodeDistanceComparer comparer = AdapterComparers[typeof(Node)] as Engine.Structure.NodeDistanceComparer; + Engine.Structure.NodeDistanceComparer comparer = AdapterComparers[typeof(Node)] // θ(1) + as Engine.Structure.NodeDistanceComparer; - foreach (Node bhNode in nodes) - { - string name = GetAdapterId(bhNode); + Dictionary> dx = new Dictionary>(); // θ(1) + Dictionary> dy = new Dictionary>(); // θ(1) + Dictionary> dz = new Dictionary>(); // θ(1) + + + // 1. GROUP NODES BY RELATIVE MOVEMENT IN X/Y/Z DIRECTION - ** HASH TABLES ** - SetObject(bhNode, name); + foreach (Node bhNode in nodes) // n*θ(1) + θ(1) + { + string name = GetAdapterId(bhNode); // θ(1) // Update position - double x = 0; - double y = 0; - double z = 0; + double x = 0; // θ(1) + double y = 0; // θ(1) + double z = 0; // θ(1) - if (m_model.PointObj.GetCoordCartesian(name, ref x, ref y, ref z) == 0) + if (m_model.PointObj.GetCoordCartesian(name, ref x, ref y, ref z) == 0) // θ(1) { - oM.Geometry.Point p = new oM.Geometry.Point() { X = x, Y = y, Z = z }; - - if (!comparer.Equals(bhNode, (Node)p)) + oM.Geometry.Point p = new oM.Geometry.Point() { X = x, Y = y, Z = z }; // θ(1) + + if (!comparer.Equals(bhNode, (Node)p)) // θ(1) { - x = bhNode.Position.X - x; - y = bhNode.Position.Y - y; - z = bhNode.Position.Z - z; + // Get BHoM vs ETABS differences in nodes coordinates + x = bhNode.Position.X - x; // θ(1) + y = bhNode.Position.Y - y; // θ(1) + z = bhNode.Position.Z - z; // θ(1) + + // Add Node name and corresponding dX in dx Hash Table + if (dx.ContainsKey(x)) dx[x].Add(name); // θ(1) + else dx.Add(x, new List() {name}); // θ(1) + // Add Node name and corresponding dY in dy Hash Table + if (dy.ContainsKey(y)) dy[y].Add(name); // θ(1) + else dy.Add(y, new List() {name}); // θ(1) + // Add Node name and corresponding dZ in dz Hash Table + if (dz.ContainsKey(z)) dz[z].Add(name); // θ(1) + else dz.Add(z, new List() {name}); // θ(1) - m_model.PointObj.SetSelected(name, true); - m_model.EditGeneral.Move(x * factor, y * factor, z * factor); - m_model.PointObj.SetSelected(name, false); } } } + + + // 2. MOVE NODES GROUP-BY-GROUP - ** STREAMS ** + + // dX Movement + dx.ToList().ForEach(kvp => // θ(n) + { + // 1. Select all nodes belonging to same group + kvp.Value.ForEach(pplbl => m_model.PointObj.SetSelected(pplbl.ToString(), true)); + // 2. Move all selected nodes by same dX + m_model.EditGeneral.Move((double)kvp.Key, 0, 0); + // 3. Deselect all selected nodes + kvp.Value.ForEach(pplbl => m_model.PointObj.SetSelected(pplbl.ToString(), false)); + }); + + // dY Movement + dy.ToList().ForEach(kvp => // θ(n) + { + // 1. Select all nodes belonging to same group + kvp.Value.ForEach(pplbl => m_model.PointObj.SetSelected(pplbl.ToString(), true)); + // 2. Move all selected nodes by same dY + m_model.EditGeneral.Move(0, (double)kvp.Key, 0); + // 3. Deselect all selected nodes + kvp.Value.ForEach(pplbl => m_model.PointObj.SetSelected(pplbl.ToString(), false)); + }); + + // dZ Movement + dz.ToList().ForEach(kvp => // θ(n) + { + // 1. Select all nodes belonging to same group + kvp.Value.ForEach(pplbl => m_model.PointObj.SetSelected(pplbl.ToString(), true)); + // 2. Move all selected nodes by same dZ + m_model.EditGeneral.Move(0, 0, (double)kvp.Key); + // 3. Deselect all selected nodes + kvp.Value.ForEach(pplbl => m_model.PointObj.SetSelected(pplbl.ToString(), false)); + }); + return success; } diff --git a/Etabs_Adapter/ETABSAdapter.cs b/Etabs_Adapter/ETABSAdapter.cs index c4bcb3fe..49c559d8 100644 --- a/Etabs_Adapter/ETABSAdapter.cs +++ b/Etabs_Adapter/ETABSAdapter.cs @@ -156,13 +156,8 @@ public ETABSAdapter(string filePath = "", EtabsSettings etabsSetting = null, boo private bool ForceRefresh() { - //Forcing refresh of the model by moving all elements in back and forward along the x-axis. - //If a more elegant way can be found to do this, this should be changed. - m_model.SelectObj.All(); - m_model.EditGeneral.Move(1, 0, 0); - m_model.SelectObj.All(); - m_model.EditGeneral.Move(-1, 0, 0); - m_model.SelectObj.ClearSelection(); + m_model.View.RefreshView(); + m_model.View.RefreshWindow(); return true; }