GridCal 5.3.19__tar.gz → 5.3.21__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Analysis/AnalysisDialogue.py +1 -1
  2. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +14 -2
  3. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/line_location_graphic_item.py +16 -0
  4. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +20 -10
  5. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +105 -14
  6. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +282 -338
  7. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +16 -6
  8. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +27 -11
  9. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +28 -28
  10. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/base_diagram_widget.py +5 -11
  11. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/grid_merge.py +48 -74
  12. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/MainWindow.py +301 -217
  13. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +132 -68
  14. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Model/objects.py +2 -5
  15. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Model/time_events.py +21 -35
  16. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Server/server.py +13 -3
  17. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +1 -1
  18. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/base_gui.py +37 -1
  19. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/io.py +7 -7
  20. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/simulations.py +57 -55
  21. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/icons_rc.py +1 -1
  22. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/icons_rc.py +450 -26
  23. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/profile_dialogue.py +297 -124
  24. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +69 -115
  25. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +5 -5
  26. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TowerBuilder/table_models.py +17 -20
  27. gridcal-5.3.21/GridCal/Gui/toast_widget.py +184 -0
  28. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Session/server_driver.py +3 -24
  29. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/__version__.py +1 -1
  30. {gridcal-5.3.19 → gridcal-5.3.21}/PKG-INFO +1 -1
  31. gridcal-5.3.19/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -14
  32. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ExecuteGridCal.py +0 -0
  33. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  34. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  35. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  36. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  37. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  38. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Analysis/__init__.py +0 -0
  39. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Analysis/gui.py +0 -0
  40. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  41. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  42. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  43. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  44. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  45. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  46. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  47. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  48. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  49. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  50. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  51. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  52. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  53. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  54. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  55. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  56. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  57. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  58. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  59. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  60. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  61. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
  62. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  63. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  64. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  65. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  66. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  67. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  68. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  69. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  70. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  71. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  72. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  73. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  74. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  75. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  76. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  77. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
  78. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  79. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  80. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  81. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  82. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  83. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  84. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  85. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_editor.py +0 -0
  86. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
  87. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  88. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  89. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  90. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  91. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  92. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  93. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  94. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  95. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  96. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  97. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  98. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  99. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  100. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  101. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  102. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  103. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  104. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  105. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  106. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  107. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  108. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  109. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  110. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  111. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  112. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  113. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  114. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  115. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  116. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  117. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/__init__.py +0 -0
  118. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  119. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  120. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  121. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  122. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  123. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridGenerator/gui.py +0 -0
  124. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  125. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  126. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/__init__.py +0 -0
  127. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/build_diff_tree.py +0 -0
  128. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/demo_code.py +0 -0
  129. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/demo_code2.py +0 -0
  130. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/demo_code3.py +0 -0
  131. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/grid_diff.py +0 -0
  132. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/grid_diff_gui.py +0 -0
  133. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/grid_merge_gui.py +0 -0
  134. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/GridMerge/update_gui_file.py +0 -0
  135. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  136. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  137. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  138. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  139. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  140. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  141. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  142. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  143. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  144. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  145. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  146. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  147. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/GridCalMain.py +0 -0
  148. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  149. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  150. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  151. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  152. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  153. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  154. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  155. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  156. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  157. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  158. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/__init__.py +0 -0
  159. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/object_select_window.py +0 -0
  160. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Main/update_gui_file.py +0 -0
  161. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  162. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  163. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  164. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  165. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  166. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  167. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  168. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  169. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  170. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  171. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  172. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  173. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  174. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  175. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  176. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  177. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  178. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  179. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  180. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  181. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  182. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  183. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SubstationDesigner/__init__.py +0 -0
  184. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SubstationDesigner/substation_designer.py +0 -0
  185. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +0 -0
  186. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SubstationDesigner/update_gui_file.py +0 -0
  187. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  188. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  189. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  190. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  191. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  192. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  193. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  194. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  195. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  196. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  197. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  198. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  199. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TowerBuilder/tower_builder.py +0 -0
  200. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  201. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  202. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  203. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  204. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  205. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  206. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Visualization/__init__.py +0 -0
  207. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Visualization/visualization.py +0 -0
  208. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Widgets/__init__.py +0 -0
  209. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  210. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  211. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  212. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  213. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  214. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  215. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  216. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/__init__.py +0 -0
  217. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/associations_model.py +0 -0
  218. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/general_dialogues.py +0 -0
  219. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/gui_functions.py +0 -0
  220. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/messages.py +0 -0
  221. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/object_model.py +0 -0
  222. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/pandas_model.py +0 -0
  223. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/plot_config.py +0 -0
  224. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/profiles_model.py +0 -0
  225. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/python_console.py +0 -0
  226. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/python_highlighter.py +0 -0
  227. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/results_model.py +0 -0
  228. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/table_view_header_wrap.py +0 -0
  229. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/themes.py +0 -0
  230. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/update_gui_all.py +0 -0
  231. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/update_gui_common.py +0 -0
  232. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Gui/wrappable_table_model.py +0 -0
  233. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/LICENSE.txt +0 -0
  234. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Session/__init__.py +0 -0
  235. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Session/export_results_driver.py +0 -0
  236. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Session/file_handler.py +0 -0
  237. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Session/session.py +0 -0
  238. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/Session/synchronization_driver.py +0 -0
  239. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/__init__.py +0 -0
  240. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  241. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  242. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  243. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  244. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  245. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  246. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  247. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  248. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  249. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  250. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  251. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  252. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  253. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  254. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  255. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  256. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  257. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  258. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  259. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  260. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  261. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  262. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  263. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  264. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  265. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  266. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  267. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  268. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  269. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  270. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  271. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  272. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  273. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  274. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  275. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  276. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  277. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  278. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/__init__.py +0 -0
  279. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/data/GridCal.ico +0 -0
  280. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/data/GridCal.svg +0 -0
  281. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/data/__init__.py +0 -0
  282. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/data/cables.csv +0 -0
  283. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/data/sequence_lines.csv +0 -0
  284. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/data/transformers.csv +0 -0
  285. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/data/wires.csv +0 -0
  286. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/plugins.py +0 -0
  287. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/templates.py +0 -0
  288. {gridcal-5.3.19 → gridcal-5.3.21}/GridCal/update.py +0 -0
  289. {gridcal-5.3.19 → gridcal-5.3.21}/setup.cfg +0 -0
  290. {gridcal-5.3.19 → gridcal-5.3.21}/setup.py +0 -0
@@ -79,7 +79,7 @@ class GridAnalysisGUI(QtWidgets.QMainWindow):
79
79
  fixable_err.fix(logger=logger,
80
80
  fix_ts=self.ui.fixTimeSeriesCheckBox.isChecked())
81
81
 
82
- if len(logger) > 0:
82
+ if logger.has_logs():
83
83
  dlg = LogsDialogue("Fixed issues", logger)
84
84
  dlg.setModal(True)
85
85
  dlg.exec()
@@ -101,20 +101,32 @@ class CoordinatesInputAssociations(QtCore.QAbstractTableModel):
101
101
 
102
102
  self.__headers = ['Name', 'Code', 'x', 'y', 'latitude', 'longitude']
103
103
 
104
+ def update(self):
105
+ """
106
+ update table
107
+ """
108
+ self.layoutAboutToBeChanged.emit()
109
+ self.layoutChanged.emit()
110
+
104
111
  def append(self, val: CoordinatesInputAssociation):
105
112
  self.__values.append(val)
113
+ self.update()
106
114
 
107
115
  def set_x_at(self, idx, value):
108
116
  self.__values[idx].x = value
117
+ self.update()
109
118
 
110
119
  def set_y_at(self, idx, value):
111
120
  self.__values[idx].y = value
121
+ self.update()
112
122
 
113
123
  def set_latitude_at(self, idx, value):
114
124
  self.__values[idx].latitude = value
125
+ self.update()
115
126
 
116
127
  def set_longitude_at(self, idx, value):
117
128
  self.__values[idx].longitude = value
129
+ self.update()
118
130
 
119
131
  def get_name_at(self, idx):
120
132
  return self.__values[idx].name
@@ -139,6 +151,7 @@ class CoordinatesInputAssociations(QtCore.QAbstractTableModel):
139
151
  self.__values[idx].y = 0
140
152
  self.__values[idx].latitude = 0
141
153
  self.__values[idx].longitude = 0
154
+ self.update()
142
155
 
143
156
  def rowCount(self, parent=None):
144
157
  return len(self.__values)
@@ -149,7 +162,6 @@ class CoordinatesInputAssociations(QtCore.QAbstractTableModel):
149
162
  def data(self, index, role=QtCore.Qt.ItemDataRole.DisplayRole):
150
163
  if index.isValid():
151
164
  if role == QtCore.Qt.ItemDataRole.DisplayRole:
152
- # return self.formatter(self._data[index.row(), index.column()])
153
165
  return str(self.__values[index.row()].get_at(index.column()))
154
166
  return None
155
167
 
@@ -394,7 +406,7 @@ class CoordinatesInputGUI(QtWidgets.QDialog):
394
406
  for hdr in duplicate_hdr:
395
407
  logger.add_error("Duplicated header", device=hdr)
396
408
 
397
- logs_dialogue = LogsDialogue(name="Duplictaed headers", logger=logger, expand_all=True)
409
+ logs_dialogue = LogsDialogue(name="Duplicated headers", logger=logger, expand_all=True)
398
410
  logs_dialogue.exec()
399
411
 
400
412
  # filter the headers
@@ -135,6 +135,21 @@ class LineLocationGraphicItem(QtWidgets.QGraphicsEllipseItem, NodeTemplate):
135
135
 
136
136
  print()
137
137
 
138
+ def update_database_position(self) -> None:
139
+ """
140
+ This function updates the position of this graphical element in the database
141
+ """
142
+ real_position = self.pos()
143
+ center_point = self.get_pos()
144
+
145
+ self.lat, self.lon = self.editor.to_lat_lon(x=center_point.x() + real_position.x(),
146
+ y=center_point.y() + real_position.y())
147
+
148
+ # print(f'Updating node position id:{self.api_object.idtag}, lat:{self.lat}, lon:{self.lon}')
149
+
150
+ self.api_object.lat = self.lat
151
+ self.api_object.long = self.lon
152
+
138
153
  def mouseMoveEvent(self, event: QtWidgets.QGraphicsSceneMouseEvent) -> None:
139
154
  """
140
155
  Event handler for mouse move events.
@@ -166,6 +181,7 @@ class LineLocationGraphicItem(QtWidgets.QGraphicsEllipseItem, NodeTemplate):
166
181
  super().mouseReleaseEvent(event)
167
182
  self.editor.disableMove = True
168
183
  self.update_position_at_the_diagram()
184
+ # self.update_database_position()
169
185
 
170
186
  def hoverEnterEvent(self, event: QtWidgets.QGraphicsSceneHoverEvent) -> None:
171
187
  """
@@ -258,23 +258,33 @@ class MapLineSegment(QGraphicsLineItem):
258
258
  # Check if a substation is selected
259
259
  selected_items = self.editor.get_selected()
260
260
  has_substation = False
261
+ counter = 0
261
262
 
262
263
  for api_obj, _ in selected_items:
263
264
  if hasattr(api_obj, 'device_type') and api_obj.device_type == DeviceType.SubstationDevice:
264
265
  has_substation = True
265
- break
266
+ counter += 1
266
267
 
267
268
  # Add the split line to substation option if a substation is selected
268
269
  if has_substation:
269
- add_menu_entry(menu=menu,
270
- text="Split line to selected substation (In-Out)",
271
- function_ptr=self.editor.split_line_to_substation,
272
- icon_path=":/Icons/icons/divide.svg")
273
-
274
- add_menu_entry(menu=menu,
275
- text="Connect line to selected substation (T-joint)",
276
- function_ptr=self.editor.create_t_joint_to_substation,
277
- icon_path=":/Icons/icons/divide.svg")
270
+ if counter == 1:
271
+ add_menu_entry(menu=menu,
272
+ text="Split line to selected substation (In-Out)",
273
+ function_ptr=self.editor.split_line_to_substation,
274
+ icon_path=":/Icons/icons/divide.svg")
275
+
276
+ add_menu_entry(menu=menu,
277
+ text="Connect line to selected substation (T-joint)",
278
+ function_ptr=self.editor.create_t_joint_to_substation,
279
+ icon_path=":/Icons/icons/divide.svg")
280
+ elif counter == 2:
281
+
282
+ add_menu_entry(menu=menu,
283
+ text="Change substation connection of the line",
284
+ function_ptr=self.editor.change_line_connection,
285
+ icon_path=":/Icons/icons/divide.svg") # TODO: Think what icon can work well
286
+ else:
287
+ pass
278
288
 
279
289
  add_menu_entry(menu=menu,
280
290
  text="Plot profiles",
@@ -11,9 +11,11 @@ from PySide6.QtCore import Qt, QPointF
11
11
  from PySide6.QtGui import QBrush, QColor
12
12
  from GridCal.Gui.Diagrams.MapWidget.Substation.node_template import NodeTemplate
13
13
  from GridCal.Gui.gui_functions import add_menu_entry
14
- from GridCal.Gui.messages import yes_no_question
14
+ from GridCal.Gui.messages import yes_no_question, info_msg
15
15
  from GridCal.Gui.general_dialogues import InputNumberDialogue, CheckListDialogue
16
+ from GridCal.Gui.object_model import ObjectsModel
16
17
 
18
+ from GridCalEngine.Devices.types import ALL_DEV_TYPES
17
19
  from GridCalEngine.Devices.Substation.bus import Bus
18
20
  from GridCalEngine.Devices import VoltageLevel
19
21
  from GridCalEngine.Devices.Substation.substation import Substation
@@ -347,7 +349,7 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
347
349
  function_ptr=self.remove_function_from_schematic_and_db)
348
350
 
349
351
  add_menu_entry(menu=menu,
350
- text="Show diagram",
352
+ text="Substation diagram",
351
353
  icon_path=":/Icons/icons/grid_icon.svg",
352
354
  function_ptr=self.new_substation_diagram)
353
355
 
@@ -406,8 +408,9 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
406
408
  """
407
409
  Removes the substation from the schematic only. The substation will remain in the database.
408
410
  """
409
- ok = yes_no_question(f"Remove substation {self.api_object.name} from the schematic only? It will remain in the database.",
410
- "Remove substation from schematic")
411
+ ok = yes_no_question(
412
+ f"Remove substation {self.api_object.name} from the schematic only? It will remain in the database.",
413
+ "Remove substation from schematic")
411
414
 
412
415
  if ok:
413
416
  self.editor.remove_substation(substation=self, delete_from_db=False)
@@ -417,11 +420,101 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
417
420
  Removes the substation from both the schematic and the database. This action cannot be undone.
418
421
  """
419
422
 
420
- ok = yes_no_question(f"Remove substation {self.api_object.name} from both the schematic and the database? This action cannot be undone.",
421
- "Remove substation from schematic and database")
423
+ # Store the API object before deleting the graphic
424
+ api_object = self.api_object
425
+
426
+ # Get all buses connected to this substation
427
+ substation_buses = [bus for bus in self.editor.circuit.buses if bus.substation == api_object]
428
+
429
+ # Get all voltage levels associated with this substation
430
+ voltage_levels = [vl for vl in self.editor.circuit.voltage_levels if vl.substation == api_object]
431
+
432
+ # voltage_levels = api_object.voltage_levels
433
+
434
+ delete_connections = True # TODO: This option was defaulted, no input was given from the GUI
435
+
436
+ devs = []
437
+ # find associated Branches in reverse order
438
+ for obj in substation_buses:
439
+ for branch_list in self.editor.circuit.get_branch_lists():
440
+ for i in range(len(branch_list) - 1, -1, -1):
441
+ if branch_list[i].bus_from == obj:
442
+ devs.append(branch_list[i])
443
+ elif branch_list[i].bus_to == obj:
444
+ devs.append(branch_list[i])
445
+
446
+ # find the associated injection devices
447
+ for inj_list in self.editor.circuit.get_injection_devices_lists():
448
+ for i in range(len(inj_list) - 1, -1, -1):
449
+ if inj_list[i].bus == obj:
450
+ devs.append(inj_list[i])
451
+
452
+ # Show all devices that will be disconnected
453
+ title = f"Devices to be {'deleted' if delete_connections else 'disconnected'} from {api_object.name}"
454
+
455
+ self.show_devices_to_disconnect_dialog(devices=devs, buses=substation_buses,
456
+ voltage_levels=voltage_levels, dialog_title=title)
457
+
458
+ ok = yes_no_question(
459
+ f"Remove substation {self.api_object.name} from both the schematic and the database? This action cannot be undone.",
460
+ "Remove substation from schematic and database")
422
461
 
423
462
  if ok:
424
- self.editor.remove_substation(substation=self, delete_from_db=True)
463
+ self.editor.remove_substation(api_object=api_object, substation_buses=substation_buses,
464
+ voltage_levels=voltage_levels, delete_from_db=True)
465
+
466
+ def show_devices_to_disconnect_dialog(self,
467
+ devices: List[ALL_DEV_TYPES],
468
+ buses: List[Bus],
469
+ voltage_levels: List[VoltageLevel],
470
+ dialog_title: str):
471
+ """
472
+ Show a dialog with the list of all devices that will be disconnected
473
+
474
+ :param devices: List of devices to be disconnected
475
+ :param buses: List of buses associated with the substation
476
+ :param voltage_levels: List of voltage levels associated with the substation
477
+ :param dialog_title: Title for the dialog
478
+ """
479
+ from GridCal.Gui.general_dialogues import ElementsDialogue
480
+ from GridCalEngine.Devices.Parents.editable_device import GCProp
481
+
482
+ # Combine all devices
483
+ all_devices = devices + buses + voltage_levels
484
+
485
+ if not all_devices:
486
+ info_msg('No devices to disconnect', dialog_title)
487
+ return
488
+
489
+ # Create custom properties for name, type, and ID tag
490
+ name_prop = GCProp(prop_name='name', tpe=str, units='', definition='Device name',
491
+ display=True, editable=False)
492
+
493
+ type_prop = GCProp(prop_name='device_type', tpe=DeviceType, units='', definition='Device type',
494
+ display=True, editable=False)
495
+
496
+ idtag_prop = GCProp(prop_name='idtag', tpe=str, units='', definition='ID tag',
497
+ display=True, editable=False)
498
+
499
+ custom_props = [name_prop, type_prop, idtag_prop]
500
+
501
+ # Create and show the dialog
502
+ dialog = ElementsDialogue(name=dialog_title, elements=all_devices)
503
+
504
+ # Replace the model with our custom one that only shows name, type, and idtag
505
+ model = ObjectsModel(objects=all_devices,
506
+ time_index=None,
507
+ property_list=custom_props,
508
+ parent=dialog.objects_table,
509
+ editable=False)
510
+
511
+ dialog.objects_table.setModel(model)
512
+
513
+ # Make the dialog modal so the user must acknowledge it before continuing
514
+ dialog.setModal(True)
515
+ dialog.exec()
516
+
517
+
425
518
 
426
519
  def move_to_api_coordinates(self):
427
520
  """
@@ -453,10 +546,10 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
453
546
  if dlg.is_accepted:
454
547
 
455
548
  deleted_api_objs: List[Substation] = list()
456
-
549
+
457
550
  # Collect all codes to merge
458
551
  merged_codes = ""
459
-
552
+
460
553
  for i in dlg.selected_indices:
461
554
 
462
555
  se_graphics = selected[i]
@@ -464,7 +557,7 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
464
557
  merged_codes = se_graphics.api_object.code
465
558
  else:
466
559
  merged_codes = merged_codes + ',' + se_graphics.api_object.code
467
-
560
+
468
561
  deleted_api_objs.append(se_graphics.api_object)
469
562
 
470
563
  if se_graphics != self:
@@ -472,10 +565,10 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
472
565
  self.editor.remove_substation(substation=se_graphics,
473
566
  delete_from_db=True,
474
567
  delete_connections=False)
475
-
568
+
476
569
  # Update the code of the base substation
477
570
  self.api_object.code = merged_codes # Needed?
478
-
571
+
479
572
  # Find the base substation in the circuit's collection and update it
480
573
  for i, substation in enumerate(self.editor.circuit._substations):
481
574
  if substation == self.api_object:
@@ -598,5 +691,3 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
598
691
  # https://maps.google.com/?q=<lat>,<lng>
599
692
  url = f"https://www.google.com/maps/?q={self.lat},{self.lon}"
600
693
  webbrowser.open(url)
601
-
602
-