GridCal 5.3.19__tar.gz → 5.3.20__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 (289) hide show
  1. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/line_location_graphic_item.py +16 -0
  2. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +20 -10
  3. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +104 -13
  4. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +209 -241
  5. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +2 -2
  6. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +2 -2
  7. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/grid_merge.py +48 -74
  8. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +30 -26
  9. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Model/objects.py +1 -1
  10. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/simulations.py +11 -11
  11. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/profile_dialogue.py +47 -2
  12. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +5 -5
  13. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TowerBuilder/table_models.py +17 -20
  14. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/__version__.py +1 -1
  15. {gridcal-5.3.19 → gridcal-5.3.20}/PKG-INFO +1 -1
  16. gridcal-5.3.19/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -14
  17. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ExecuteGridCal.py +0 -0
  18. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  19. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  20. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  21. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  22. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  23. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  24. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Analysis/__init__.py +0 -0
  25. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Analysis/gui.py +0 -0
  26. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  27. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  28. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  29. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  30. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  31. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  32. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  33. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  34. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  35. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  36. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  37. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  38. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  39. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  40. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  41. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  42. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  43. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  44. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  45. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  46. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  47. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  48. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
  49. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  50. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  51. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  52. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  53. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  54. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  55. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  56. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  57. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  58. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  59. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  60. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  61. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  62. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  63. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  64. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
  65. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  66. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  67. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  68. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  69. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  70. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  71. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  72. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_editor.py +0 -0
  73. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
  74. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  75. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  76. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  77. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  78. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  79. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  80. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  81. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  82. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  83. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  84. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  85. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  86. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  87. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  88. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  89. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  90. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  91. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  92. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  93. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  94. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  95. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  96. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  97. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  98. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  99. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  100. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  101. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  102. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  103. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +0 -0
  104. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  105. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/__init__.py +0 -0
  106. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
  107. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  108. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  109. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  110. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  111. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  112. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridGenerator/gui.py +0 -0
  113. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  114. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  115. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/__init__.py +0 -0
  116. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/build_diff_tree.py +0 -0
  117. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/demo_code.py +0 -0
  118. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/demo_code2.py +0 -0
  119. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/demo_code3.py +0 -0
  120. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/grid_diff.py +0 -0
  121. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/grid_diff_gui.py +0 -0
  122. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/grid_merge_gui.py +0 -0
  123. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/GridMerge/update_gui_file.py +0 -0
  124. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  125. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  126. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  127. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  128. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  129. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  130. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  131. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  132. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  133. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  134. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  135. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  136. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/GridCalMain.py +0 -0
  137. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/MainWindow.py +0 -0
  138. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  139. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  140. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  141. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  142. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  143. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  144. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  145. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  146. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  147. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  148. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  149. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
  150. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  151. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
  152. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/SubClasses/io.py +0 -0
  153. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/__init__.py +0 -0
  154. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/icons_rc.py +0 -0
  155. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/object_select_window.py +0 -0
  156. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Main/update_gui_file.py +0 -0
  157. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  158. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  159. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  160. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  161. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  162. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  163. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  164. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  165. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  166. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  167. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  168. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  169. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  170. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  171. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  172. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  173. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  174. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  175. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  176. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  177. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  178. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  179. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  180. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  181. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SubstationDesigner/__init__.py +0 -0
  182. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SubstationDesigner/substation_designer.py +0 -0
  183. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +0 -0
  184. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SubstationDesigner/update_gui_file.py +0 -0
  185. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  186. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  187. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  188. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  189. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  190. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  191. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  192. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  193. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  194. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  195. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  196. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  197. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TowerBuilder/tower_builder.py +0 -0
  198. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  199. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  200. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  201. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  202. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  203. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  204. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Visualization/__init__.py +0 -0
  205. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Visualization/visualization.py +0 -0
  206. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Widgets/__init__.py +0 -0
  207. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  208. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  209. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  210. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  211. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  212. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  213. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  214. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/__init__.py +0 -0
  215. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/associations_model.py +0 -0
  216. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/general_dialogues.py +0 -0
  217. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/gui_functions.py +0 -0
  218. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/messages.py +0 -0
  219. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/object_model.py +0 -0
  220. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/pandas_model.py +0 -0
  221. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/plot_config.py +0 -0
  222. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/profiles_model.py +0 -0
  223. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/python_console.py +0 -0
  224. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/python_highlighter.py +0 -0
  225. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/results_model.py +0 -0
  226. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/table_view_header_wrap.py +0 -0
  227. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/themes.py +0 -0
  228. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/update_gui_all.py +0 -0
  229. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/update_gui_common.py +0 -0
  230. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Gui/wrappable_table_model.py +0 -0
  231. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/LICENSE.txt +0 -0
  232. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Session/__init__.py +0 -0
  233. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Session/export_results_driver.py +0 -0
  234. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Session/file_handler.py +0 -0
  235. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Session/server_driver.py +0 -0
  236. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Session/session.py +0 -0
  237. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/Session/synchronization_driver.py +0 -0
  238. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/__init__.py +0 -0
  239. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  240. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  241. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  242. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  243. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  244. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  245. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  246. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  247. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  248. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  249. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  250. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  251. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  252. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  253. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  254. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  255. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  256. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  257. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  258. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  259. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  260. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  261. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  262. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  263. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  264. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  265. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  266. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  267. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  268. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  269. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  270. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  271. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  272. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  273. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  274. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  275. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  276. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  277. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/__init__.py +0 -0
  278. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/data/GridCal.ico +0 -0
  279. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/data/GridCal.svg +0 -0
  280. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/data/__init__.py +0 -0
  281. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/data/cables.csv +0 -0
  282. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/data/sequence_lines.csv +0 -0
  283. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/data/transformers.csv +0 -0
  284. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/data/wires.csv +0 -0
  285. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/plugins.py +0 -0
  286. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/templates.py +0 -0
  287. {gridcal-5.3.19 → gridcal-5.3.20}/GridCal/update.py +0 -0
  288. {gridcal-5.3.19 → gridcal-5.3.20}/setup.cfg +0 -0
  289. {gridcal-5.3.19 → gridcal-5.3.20}/setup.py +0 -0
@@ -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
@@ -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
-