GridCal 5.3.25__tar.gz → 5.3.27__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.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +8 -6
  2. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +6 -8
  3. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +5 -0
  4. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +20 -2
  5. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/MainWindow.py +81 -58
  6. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/simulations.py +21 -11
  7. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/__version__.py +1 -1
  8. {gridcal-5.3.25 → gridcal-5.3.27}/PKG-INFO +1 -1
  9. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ExecuteGridCal.py +0 -0
  10. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  11. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  12. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  13. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  14. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  15. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  16. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Analysis/__init__.py +0 -0
  17. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Analysis/gui.py +0 -0
  18. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  19. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  20. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  21. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  22. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  23. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  24. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  25. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  26. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  27. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  28. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  29. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  30. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  31. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  32. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  33. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  34. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  35. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  36. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/line_location_graphic_item.py +0 -0
  37. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  38. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  39. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  40. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  41. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  42. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  43. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  44. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  45. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  46. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  47. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  48. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  49. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  50. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  51. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  52. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  53. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  54. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  55. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  56. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
  57. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  58. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  59. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  60. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  61. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  62. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  63. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  64. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  65. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  66. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_editor.py +0 -0
  67. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
  68. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  69. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  70. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  71. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  72. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  73. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  74. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  75. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  76. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  77. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  78. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  79. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  80. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  81. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  82. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  83. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  84. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  85. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  86. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  87. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  88. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  89. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  90. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  91. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  92. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  93. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  94. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  95. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  96. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  97. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +0 -0
  98. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  99. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/__init__.py +0 -0
  100. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
  101. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  102. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  103. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  104. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  105. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  106. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridGenerator/gui.py +0 -0
  107. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  108. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  109. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/__init__.py +0 -0
  110. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/build_diff_tree.py +0 -0
  111. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/demo_code.py +0 -0
  112. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/demo_code2.py +0 -0
  113. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/demo_code3.py +0 -0
  114. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/grid_diff.py +0 -0
  115. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/grid_diff_gui.py +0 -0
  116. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/grid_merge.py +0 -0
  117. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/grid_merge_gui.py +0 -0
  118. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/GridMerge/update_gui_file.py +0 -0
  119. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  120. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  121. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  122. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  123. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  124. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  125. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  126. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  127. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  128. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  129. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  130. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  131. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/GridCalMain.py +0 -0
  132. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  133. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  134. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +0 -0
  135. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
  136. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  137. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  138. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  139. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  140. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  141. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  142. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  143. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  144. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  145. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
  146. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  147. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
  148. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/SubClasses/io.py +0 -0
  149. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/__init__.py +0 -0
  150. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/icons_rc.py +0 -0
  151. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/object_select_window.py +0 -0
  152. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Main/update_gui_file.py +0 -0
  153. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  154. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  155. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  156. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  157. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  158. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  159. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  160. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  161. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  162. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  163. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  164. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  165. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  166. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  167. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  168. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  169. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  170. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  171. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  172. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  173. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  174. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  175. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  176. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  177. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  178. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SubstationDesigner/__init__.py +0 -0
  179. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SubstationDesigner/substation_designer.py +0 -0
  180. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +0 -0
  181. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SubstationDesigner/update_gui_file.py +0 -0
  182. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  183. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  184. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  185. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  186. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  187. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  188. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  189. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  190. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  191. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  192. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  193. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  194. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  195. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  196. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TowerBuilder/tower_builder.py +0 -0
  197. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  198. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  199. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  200. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  201. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  202. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  203. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Visualization/__init__.py +0 -0
  204. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Visualization/visualization.py +0 -0
  205. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Widgets/__init__.py +0 -0
  206. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  207. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  208. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  209. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  210. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  211. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  212. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  213. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/__init__.py +0 -0
  214. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/associations_model.py +0 -0
  215. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/general_dialogues.py +0 -0
  216. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/gui_functions.py +0 -0
  217. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/messages.py +0 -0
  218. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/object_model.py +0 -0
  219. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/pandas_model.py +0 -0
  220. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/plot_config.py +0 -0
  221. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/profiles_model.py +0 -0
  222. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/python_console.py +0 -0
  223. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/python_highlighter.py +0 -0
  224. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/results_model.py +0 -0
  225. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/table_view_header_wrap.py +0 -0
  226. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/themes.py +0 -0
  227. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/toast_widget.py +0 -0
  228. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/update_gui_all.py +0 -0
  229. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/update_gui_common.py +0 -0
  230. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Gui/wrappable_table_model.py +0 -0
  231. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/LICENSE.txt +0 -0
  232. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Session/__init__.py +0 -0
  233. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Session/export_results_driver.py +0 -0
  234. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Session/file_handler.py +0 -0
  235. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Session/server_driver.py +0 -0
  236. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Session/session.py +0 -0
  237. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/Session/synchronization_driver.py +0 -0
  238. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/__init__.py +0 -0
  239. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  240. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  241. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  242. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  243. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  244. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  245. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  246. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  247. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  248. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  249. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  250. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  251. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  252. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  253. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  254. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  255. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  256. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  257. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  258. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  259. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  260. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  261. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  262. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  263. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  264. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  265. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  266. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  267. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  268. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  269. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  270. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  271. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  272. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  273. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  274. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  275. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  276. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  277. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/__init__.py +0 -0
  278. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/data/GridCal.ico +0 -0
  279. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/data/GridCal.svg +0 -0
  280. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/data/__init__.py +0 -0
  281. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/data/cables.csv +0 -0
  282. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/data/sequence_lines.csv +0 -0
  283. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/data/transformers.csv +0 -0
  284. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/data/wires.csv +0 -0
  285. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/plugins.py +0 -0
  286. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/templates.py +0 -0
  287. {gridcal-5.3.25 → gridcal-5.3.27}/GridCal/update.py +0 -0
  288. {gridcal-5.3.25 → gridcal-5.3.27}/setup.cfg +0 -0
  289. {gridcal-5.3.25 → gridcal-5.3.27}/setup.py +0 -0
@@ -496,7 +496,8 @@ class MapLineContainer(GenericDiagramWidget, QGraphicsItemGroup):
496
496
  def calculate_total_length(self) -> float:
497
497
  """
498
498
  Calculate the total length of the line by summing the distances between all waypoints
499
- using the haversine formula, and update the line's length property. Issue #23
499
+ using the haversine formula, and update the line's length property. The coordiates used are the
500
+ ones from the api_object, not the graphic objects, in order to avoid undesired recalculations. Issue #23
500
501
 
501
502
  :return: Total length in kilometers
502
503
  """
@@ -508,17 +509,18 @@ class MapLineContainer(GenericDiagramWidget, QGraphicsItemGroup):
508
509
  # Add the substation from
509
510
  substation_from = self.substation_from()
510
511
  if substation_from is not None:
511
- connection_points.append((substation_from.lat, substation_from.lon))
512
-
512
+ connection_points.append((substation_from.api_object.latitude, substation_from.api_object.longitude))
513
+
513
514
  # Add all intermediate points
514
515
  for node in self.nodes_list:
515
- connection_points.append((node.lat, node.lon))
516
+ connection_points.append((node.api_object.lat, node.api_object.long))
516
517
 
517
518
  # Add the substation to
518
519
  substation_to = self.substation_to()
520
+
519
521
  if substation_to is not None:
520
- connection_points.append((substation_to.lat, substation_to.lon))
521
-
522
+ connection_points.append((substation_to.api_object.latitude, substation_to.api_object.longitude))
523
+
522
524
  # Calculate total length by summing distances between consecutive points
523
525
  total_length = 0.0
524
526
  for i in range(len(connection_points) - 1):
@@ -282,7 +282,7 @@ class MapLineSegment(QGraphicsLineItem):
282
282
  add_menu_entry(menu=menu,
283
283
  text="Change substation connection of the line",
284
284
  function_ptr=self.editor.change_line_connection,
285
- icon_path=":/Icons/icons/divide.svg") # TODO: Think what icon can work well
285
+ icon_path=":/Icons/icons/move_bus.svg")
286
286
  else:
287
287
  pass
288
288
 
@@ -509,10 +509,8 @@ class MapLineSegment(QGraphicsLineItem):
509
509
  total_length = self.container.calculate_total_length()
510
510
 
511
511
  # Show a message with the calculated length
512
- from PySide6.QtWidgets import QMessageBox
513
- msg = QMessageBox()
514
- msg.setIcon(QMessageBox.Icon.Information)
515
- msg.setText(f"Line length calculated: {total_length:.2f} km")
516
- msg.setInformativeText(f"The length property of line '{self.api_object.name}' has been updated.")
517
- msg.setWindowTitle("Length Calculation")
518
- msg.exec()
512
+ self.editor.gui.show_info_toast(
513
+ message=f"Line length calculated: {total_length:.2f} km. The length property of line "
514
+ f"{self.api_object.name} has been updated.")
515
+
516
+
@@ -638,8 +638,13 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
638
638
  for line in self.editor.circuit.lines:
639
639
  if line.bus_from in removed_buses:
640
640
  line.bus_from = recipient_buses[line.bus_from.Vnom]
641
+ line_graphic = self.editor.graphics_manager.query(elm=line)
642
+ line_graphic.calculate_total_length()
643
+
641
644
  if line.bus_to in removed_buses:
642
645
  line.bus_to = recipient_buses[line.bus_to.Vnom]
646
+ line_graphic = self.editor.graphics_manager.query(elm=line)
647
+ line_graphic.calculate_total_length()
643
648
 
644
649
  for bus in removed_buses:
645
650
  self.editor.circuit.delete_bus(obj=bus, delete_associated=False)
@@ -55,7 +55,7 @@ from GridCal.Gui.Diagrams.graphics_manager import ALL_MAP_GRAPHICS
55
55
  from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles import Tiles
56
56
  from GridCal.Gui.Diagrams.base_diagram_widget import BaseDiagramWidget
57
57
  from GridCal.Gui.object_model import ObjectsModel
58
- from GridCal.Gui.messages import error_msg, info_msg
58
+ from GridCal.Gui.messages import error_msg, info_msg, yes_no_question
59
59
 
60
60
  if TYPE_CHECKING:
61
61
  from GridCal.Gui.Main.SubClasses.Model.diagrams import DiagramsMain
@@ -1400,6 +1400,23 @@ class GridMapWidget(BaseDiagramWidget):
1400
1400
  gelm.api_object.lat = gelm.lat
1401
1401
  gelm.api_object.long = gelm.lon
1402
1402
 
1403
+ ok = yes_no_question(title='Update lengths?',
1404
+ text='Do you want to update lengths of lines? \n'
1405
+ 'IMPORTANT: This will take into account every movement of substation and line '
1406
+ 'locations. If you are unsure of the effects of this updating, click no and perform '
1407
+ 'the individual length update in a new map or in the specific line.')
1408
+ if ok:
1409
+ line_graphics_list = self.graphics_manager.graphic_dict[DeviceType.LineDevice]
1410
+
1411
+ for key, line_graphic in line_graphics_list.items():
1412
+ line_graphic.calculate_total_length()
1413
+
1414
+ self.gui.show_info_toast(message='Line lengths UPDATED')
1415
+
1416
+
1417
+ else:
1418
+ self.gui.show_info_toast(message='Line lengths NOT UPDATED')
1419
+
1403
1420
  def plot_substation(self, i: int, api_object: Substation):
1404
1421
  """
1405
1422
  Plot branch results
@@ -2264,7 +2281,8 @@ class GridMapWidget(BaseDiagramWidget):
2264
2281
  # Remove past graphic item and add the new one
2265
2282
 
2266
2283
  self.remove_branch_graphic(line=line_graphic, delete_from_db=False)
2267
- self.add_api_line(api_object=line_api)
2284
+ line = self.add_api_line(api_object=line_api)
2285
+ line.calculate_total_length()
2268
2286
 
2269
2287
  msg = QMessageBox()
2270
2288
  msg.setIcon(QMessageBox.Icon.Information)
@@ -2590,6 +2590,12 @@ class Ui_mainWindow(object):
2590
2590
 
2591
2591
  self.verticalLayout_4.addWidget(self.orthogonalize_pf_controls_checkBox)
2592
2592
 
2593
+ self.initialize_pf_angles_checkBox = QCheckBox(self.frame_36)
2594
+ self.initialize_pf_angles_checkBox.setObjectName(u"initialize_pf_angles_checkBox")
2595
+ self.initialize_pf_angles_checkBox.setFont(font1)
2596
+
2597
+ self.verticalLayout_4.addWidget(self.initialize_pf_angles_checkBox)
2598
+
2593
2599
  self.label_54 = QLabel(self.frame_36)
2594
2600
  self.label_54.setObjectName(u"label_54")
2595
2601
 
@@ -2909,11 +2915,23 @@ class Ui_mainWindow(object):
2909
2915
  self.groupBox.setFont(font6)
2910
2916
  self.gridLayout_18 = QGridLayout(self.groupBox)
2911
2917
  self.gridLayout_18.setObjectName(u"gridLayout_18")
2912
- self.label_103 = QLabel(self.groupBox)
2913
- self.label_103.setObjectName(u"label_103")
2914
- self.label_103.setFont(font7)
2918
+ self.label_10 = QLabel(self.groupBox)
2919
+ self.label_10.setObjectName(u"label_10")
2920
+ self.label_10.setFont(font7)
2915
2921
 
2916
- self.gridLayout_18.addWidget(self.label_103, 2, 0, 1, 1)
2922
+ self.gridLayout_18.addWidget(self.label_10, 0, 0, 1, 1)
2923
+
2924
+ self.opfZonalGroupByComboBox = QComboBox(self.groupBox)
2925
+ self.opfZonalGroupByComboBox.setObjectName(u"opfZonalGroupByComboBox")
2926
+ self.opfZonalGroupByComboBox.setFont(font7)
2927
+
2928
+ self.gridLayout_18.addWidget(self.opfZonalGroupByComboBox, 2, 1, 1, 1)
2929
+
2930
+ self.opfUnitCommitmentCheckBox = QCheckBox(self.groupBox)
2931
+ self.opfUnitCommitmentCheckBox.setObjectName(u"opfUnitCommitmentCheckBox")
2932
+ self.opfUnitCommitmentCheckBox.setFont(font7)
2933
+
2934
+ self.gridLayout_18.addWidget(self.opfUnitCommitmentCheckBox, 5, 0, 1, 1)
2917
2935
 
2918
2936
  self.label_132 = QLabel(self.groupBox)
2919
2937
  self.label_132.setObjectName(u"label_132")
@@ -2926,48 +2944,39 @@ class Ui_mainWindow(object):
2926
2944
 
2927
2945
  self.gridLayout_18.addWidget(self.opf_time_grouping_comboBox, 1, 1, 1, 1)
2928
2946
 
2929
- self.label_4 = QLabel(self.groupBox)
2930
- self.label_4.setObjectName(u"label_4")
2931
- self.label_4.setFont(font7)
2947
+ self.mip_solver_comboBox = QComboBox(self.groupBox)
2948
+ self.mip_solver_comboBox.setObjectName(u"mip_solver_comboBox")
2949
+ self.mip_solver_comboBox.setFont(font7)
2932
2950
 
2933
- self.gridLayout_18.addWidget(self.label_4, 1, 0, 1, 1)
2951
+ self.gridLayout_18.addWidget(self.mip_solver_comboBox, 0, 1, 1, 1)
2952
+
2953
+ self.fixOpfCheckBox = QCheckBox(self.groupBox)
2954
+ self.fixOpfCheckBox.setObjectName(u"fixOpfCheckBox")
2955
+ self.fixOpfCheckBox.setFont(font7)
2956
+
2957
+ self.gridLayout_18.addWidget(self.fixOpfCheckBox, 8, 0, 1, 2)
2934
2958
 
2935
2959
  self.considerContingenciesOpfCheckBox = QCheckBox(self.groupBox)
2936
2960
  self.considerContingenciesOpfCheckBox.setObjectName(u"considerContingenciesOpfCheckBox")
2937
2961
  self.considerContingenciesOpfCheckBox.setFont(font7)
2938
2962
 
2939
- self.gridLayout_18.addWidget(self.considerContingenciesOpfCheckBox, 5, 0, 1, 2)
2963
+ self.gridLayout_18.addWidget(self.considerContingenciesOpfCheckBox, 6, 0, 1, 2)
2940
2964
 
2941
- self.label_10 = QLabel(self.groupBox)
2942
- self.label_10.setObjectName(u"label_10")
2943
- self.label_10.setFont(font7)
2965
+ self.label_4 = QLabel(self.groupBox)
2966
+ self.label_4.setObjectName(u"label_4")
2967
+ self.label_4.setFont(font7)
2944
2968
 
2945
- self.gridLayout_18.addWidget(self.label_10, 0, 0, 1, 1)
2969
+ self.gridLayout_18.addWidget(self.label_4, 1, 0, 1, 1)
2946
2970
 
2947
- self.opfContingencyToleranceSpinBox = QDoubleSpinBox(self.groupBox)
2948
- self.opfContingencyToleranceSpinBox.setObjectName(u"opfContingencyToleranceSpinBox")
2949
- self.opfContingencyToleranceSpinBox.setFont(font7)
2950
- self.opfContingencyToleranceSpinBox.setDecimals(4)
2951
- self.opfContingencyToleranceSpinBox.setSingleStep(0.010000000000000)
2952
- self.opfContingencyToleranceSpinBox.setValue(0.050000000000000)
2971
+ self.save_mip_checkBox = QCheckBox(self.groupBox)
2972
+ self.save_mip_checkBox.setObjectName(u"save_mip_checkBox")
2973
+ self.save_mip_checkBox.setFont(font7)
2953
2974
 
2954
- self.gridLayout_18.addWidget(self.opfContingencyToleranceSpinBox, 3, 1, 1, 1)
2975
+ self.gridLayout_18.addWidget(self.save_mip_checkBox, 11, 0, 1, 2)
2955
2976
 
2956
2977
  self.verticalSpacer_18 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
2957
2978
 
2958
- self.gridLayout_18.addItem(self.verticalSpacer_18, 10, 0, 1, 1)
2959
-
2960
- self.opfZonalGroupByComboBox = QComboBox(self.groupBox)
2961
- self.opfZonalGroupByComboBox.setObjectName(u"opfZonalGroupByComboBox")
2962
- self.opfZonalGroupByComboBox.setFont(font7)
2963
-
2964
- self.gridLayout_18.addWidget(self.opfZonalGroupByComboBox, 2, 1, 1, 1)
2965
-
2966
- self.mip_solver_comboBox = QComboBox(self.groupBox)
2967
- self.mip_solver_comboBox.setObjectName(u"mip_solver_comboBox")
2968
- self.mip_solver_comboBox.setFont(font7)
2969
-
2970
- self.gridLayout_18.addWidget(self.mip_solver_comboBox, 0, 1, 1, 1)
2979
+ self.gridLayout_18.addItem(self.verticalSpacer_18, 12, 0, 1, 1)
2971
2980
 
2972
2981
  self.label_104 = QLabel(self.groupBox)
2973
2982
  self.label_104.setObjectName(u"label_104")
@@ -2975,17 +2984,26 @@ class Ui_mainWindow(object):
2975
2984
 
2976
2985
  self.gridLayout_18.addWidget(self.label_104, 3, 0, 1, 1)
2977
2986
 
2978
- self.save_mip_checkBox = QCheckBox(self.groupBox)
2979
- self.save_mip_checkBox.setObjectName(u"save_mip_checkBox")
2980
- self.save_mip_checkBox.setFont(font7)
2987
+ self.label_103 = QLabel(self.groupBox)
2988
+ self.label_103.setObjectName(u"label_103")
2989
+ self.label_103.setFont(font7)
2981
2990
 
2982
- self.gridLayout_18.addWidget(self.save_mip_checkBox, 9, 0, 1, 2)
2991
+ self.gridLayout_18.addWidget(self.label_103, 2, 0, 1, 1)
2983
2992
 
2984
- self.fixOpfCheckBox = QCheckBox(self.groupBox)
2985
- self.fixOpfCheckBox.setObjectName(u"fixOpfCheckBox")
2986
- self.fixOpfCheckBox.setFont(font7)
2993
+ self.opfContingencyToleranceSpinBox = QDoubleSpinBox(self.groupBox)
2994
+ self.opfContingencyToleranceSpinBox.setObjectName(u"opfContingencyToleranceSpinBox")
2995
+ self.opfContingencyToleranceSpinBox.setFont(font7)
2996
+ self.opfContingencyToleranceSpinBox.setDecimals(4)
2997
+ self.opfContingencyToleranceSpinBox.setSingleStep(0.010000000000000)
2998
+ self.opfContingencyToleranceSpinBox.setValue(0.050000000000000)
2987
2999
 
2988
- self.gridLayout_18.addWidget(self.fixOpfCheckBox, 6, 0, 1, 2)
3000
+ self.gridLayout_18.addWidget(self.opfContingencyToleranceSpinBox, 3, 1, 1, 1)
3001
+
3002
+ self.opfGEPCheckBox = QCheckBox(self.groupBox)
3003
+ self.opfGEPCheckBox.setObjectName(u"opfGEPCheckBox")
3004
+ self.opfGEPCheckBox.setFont(font7)
3005
+
3006
+ self.gridLayout_18.addWidget(self.opfGEPCheckBox, 7, 0, 1, 2)
2989
3007
 
2990
3008
 
2991
3009
  self.gridLayout_10.addWidget(self.groupBox, 3, 3, 1, 1)
@@ -3065,12 +3083,6 @@ class Ui_mainWindow(object):
3065
3083
 
3066
3084
  self.gridLayout_26.addWidget(self.opfMaximizeExcahngeCheckBox, 5, 0, 1, 2)
3067
3085
 
3068
- self.opfUnitCommitmentCheckBox = QCheckBox(self.groupBox_2)
3069
- self.opfUnitCommitmentCheckBox.setObjectName(u"opfUnitCommitmentCheckBox")
3070
- self.opfUnitCommitmentCheckBox.setFont(font7)
3071
-
3072
- self.gridLayout_26.addWidget(self.opfUnitCommitmentCheckBox, 4, 0, 1, 2)
3073
-
3074
3086
  self.skipOpfGenerationLimitsCheckBox = QCheckBox(self.groupBox_2)
3075
3087
  self.skipOpfGenerationLimitsCheckBox.setObjectName(u"skipOpfGenerationLimitsCheckBox")
3076
3088
  self.skipOpfGenerationLimitsCheckBox.setFont(font7)
@@ -5624,6 +5636,10 @@ class Ui_mainWindow(object):
5624
5636
  self.orthogonalize_pf_controls_checkBox.setToolTip(QCoreApplication.translate("mainWindow", u"If checked, the controls are adjusted to their closest tap", None))
5625
5637
  #endif // QT_CONFIG(tooltip)
5626
5638
  self.orthogonalize_pf_controls_checkBox.setText(QCoreApplication.translate("mainWindow", u"Orthogonalize controls", None))
5639
+ #if QT_CONFIG(tooltip)
5640
+ self.initialize_pf_angles_checkBox.setToolTip(QCoreApplication.translate("mainWindow", u"If checked, the power flow solution is initialized with a linear (so called DC) power flow first", None))
5641
+ #endif // QT_CONFIG(tooltip)
5642
+ self.initialize_pf_angles_checkBox.setText(QCoreApplication.translate("mainWindow", u"Initialize angles", None))
5627
5643
  self.label_54.setText("")
5628
5644
  #if QT_CONFIG(tooltip)
5629
5645
  self.temperature_correction_checkBox.setToolTip(QCoreApplication.translate("mainWindow", u"Correct the branches resistance using the temperature", None))
@@ -5701,32 +5717,40 @@ class Ui_mainWindow(object):
5701
5717
  #endif // QT_CONFIG(tooltip)
5702
5718
  self.ips_control_Qlimits_checkBox.setText(QCoreApplication.translate("mainWindow", u"Control Q limits", None))
5703
5719
  self.groupBox.setTitle(QCoreApplication.translate("mainWindow", u"Linear settings", None))
5704
- self.label_103.setText(QCoreApplication.translate("mainWindow", u"Zone grouping", None))
5720
+ self.label_10.setText(QCoreApplication.translate("mainWindow", u"MIP solver", None))
5721
+ #if QT_CONFIG(tooltip)
5722
+ self.opfUnitCommitmentCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"Apply unit commitment technique", None))
5723
+ #endif // QT_CONFIG(tooltip)
5724
+ self.opfUnitCommitmentCheckBox.setText(QCoreApplication.translate("mainWindow", u"Unit commitment", None))
5705
5725
  self.label_132.setText("")
5706
5726
  #if QT_CONFIG(tooltip)
5707
5727
  self.opf_time_grouping_comboBox.setToolTip(QCoreApplication.translate("mainWindow", u"<html><head/><body><p>Choose the time grouping to possibly shorten the solution time.</p><p>This splits the time series by week, month, etc. and the subproblems are solved sequentially.</p></body></html>", None))
5708
5728
  #endif // QT_CONFIG(tooltip)
5709
- self.label_4.setText(QCoreApplication.translate("mainWindow", u"Time grouping", None))
5710
5729
  #if QT_CONFIG(tooltip)
5711
- self.considerContingenciesOpfCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"Consider the contingencies, only applies to OPF", None))
5730
+ self.mip_solver_comboBox.setToolTip(QCoreApplication.translate("mainWindow", u"Choose the external mixed integer programming solver", None))
5712
5731
  #endif // QT_CONFIG(tooltip)
5713
- self.considerContingenciesOpfCheckBox.setText(QCoreApplication.translate("mainWindow", u"Consider contingencies", None))
5714
- self.label_10.setText(QCoreApplication.translate("mainWindow", u"MIP solver", None))
5715
5732
  #if QT_CONFIG(tooltip)
5716
- self.opfContingencyToleranceSpinBox.setToolTip(QCoreApplication.translate("mainWindow", u"LODF matrix tolerance choosing contingencies", None))
5733
+ self.fixOpfCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"Fix infeasible problems and rey with the relaxed problem. Applies to OPF and NTC", None))
5717
5734
  #endif // QT_CONFIG(tooltip)
5735
+ self.fixOpfCheckBox.setText(QCoreApplication.translate("mainWindow", u"Fix infeasibilities and retry", None))
5718
5736
  #if QT_CONFIG(tooltip)
5719
- self.mip_solver_comboBox.setToolTip(QCoreApplication.translate("mainWindow", u"Choose the external mixed integer programming solver", None))
5737
+ self.considerContingenciesOpfCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"Consider the contingencies when dispatching", None))
5720
5738
  #endif // QT_CONFIG(tooltip)
5721
- self.label_104.setText(QCoreApplication.translate("mainWindow", u"Contingency tolerance", None))
5739
+ self.considerContingenciesOpfCheckBox.setText(QCoreApplication.translate("mainWindow", u"Compute contingencies", None))
5740
+ self.label_4.setText(QCoreApplication.translate("mainWindow", u"Time grouping", None))
5722
5741
  #if QT_CONFIG(tooltip)
5723
5742
  self.save_mip_checkBox.setToolTip(QCoreApplication.translate("mainWindow", u"<html><head/><body><p>The program will save the MIP file in .lp format in the user GridCal folder before running a linear optimization study.</p></body></html>", None))
5724
5743
  #endif // QT_CONFIG(tooltip)
5725
5744
  self.save_mip_checkBox.setText(QCoreApplication.translate("mainWindow", u"Save MIP file", None))
5745
+ self.label_104.setText(QCoreApplication.translate("mainWindow", u"Contingency tolerance", None))
5746
+ self.label_103.setText(QCoreApplication.translate("mainWindow", u"Zone grouping", None))
5726
5747
  #if QT_CONFIG(tooltip)
5727
- self.fixOpfCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"Fix infeasible problems and rey with the relaxed problem. Applies to OPF and NTC", None))
5748
+ self.opfContingencyToleranceSpinBox.setToolTip(QCoreApplication.translate("mainWindow", u"LODF matrix tolerance choosing contingencies", None))
5728
5749
  #endif // QT_CONFIG(tooltip)
5729
- self.fixOpfCheckBox.setText(QCoreApplication.translate("mainWindow", u"Fix infeasibilities and retry", None))
5750
+ #if QT_CONFIG(tooltip)
5751
+ self.opfGEPCheckBox.setToolTip(QCoreApplication.translate("mainWindow", u"Apply generation expansion planning", None))
5752
+ #endif // QT_CONFIG(tooltip)
5753
+ self.opfGEPCheckBox.setText(QCoreApplication.translate("mainWindow", u"Generation expansion planning", None))
5730
5754
  self.label_73.setText(QCoreApplication.translate("mainWindow", u"Optimal Power Flow", None))
5731
5755
  self.groupBox_2.setTitle(QCoreApplication.translate("mainWindow", u"General settings", None))
5732
5756
  self.label_128.setText(QCoreApplication.translate("mainWindow", u"Verbose", None))
@@ -5743,7 +5767,6 @@ class Ui_mainWindow(object):
5743
5767
  self.addOptimalPowerFlowReportCheckBox.setText(QCoreApplication.translate("mainWindow", u"Add report", None))
5744
5768
  self.label_133.setText("")
5745
5769
  self.opfMaximizeExcahngeCheckBox.setText(QCoreApplication.translate("mainWindow", u"Maximize area exchange", None))
5746
- self.opfUnitCommitmentCheckBox.setText(QCoreApplication.translate("mainWindow", u"Unit commitment", None))
5747
5770
  self.skipOpfGenerationLimitsCheckBox.setText(QCoreApplication.translate("mainWindow", u"Skip generation limits", None))
5748
5771
  self.label_72.setText("")
5749
5772
  self.settings_tabWidget.setTabText(self.settings_tabWidget.indexOf(self.opf_tab), QCoreApplication.translate("mainWindow", u"Opf", None))
@@ -13,6 +13,7 @@ from typing import List, Tuple, Dict, Union
13
13
  # GUI imports
14
14
  from PySide6 import QtGui, QtWidgets
15
15
  from matplotlib.colors import LinearSegmentedColormap
16
+
16
17
  import GridCal.Gui.gui_functions as gf
17
18
  import GridCal.Gui.Visualization.visualization as viz
18
19
  from GridCal.Gui.Diagrams.SchematicWidget.Substation.bus_graphics import BusGraphicItem
@@ -729,7 +730,6 @@ class SimulationsMain(TimeEventsMain):
729
730
  verbose=self.ui.verbositySpinBox.value(),
730
731
  tolerance=tolerance,
731
732
  max_iter=self.ui.max_iterations_spinBox.value(),
732
- max_outer_loop_iter=1000,
733
733
  control_q=self.ui.control_q_checkBox.isChecked(),
734
734
  control_taps_phase=self.ui.control_tap_phase_checkBox.isChecked(),
735
735
  control_taps_modules=self.ui.control_tap_modules_checkBox.isChecked(),
@@ -741,6 +741,7 @@ class SimulationsMain(TimeEventsMain):
741
741
  ignore_single_node_islands=self.ui.ignore_single_node_islands_checkBox.isChecked(),
742
742
  trust_radius=self.ui.muSpinBox.value(),
743
743
  use_stored_guess=self.ui.use_voltage_guess_checkBox.isChecked(),
744
+ initialize_angles=self.ui.initialize_pf_angles_checkBox.isChecked(),
744
745
  generate_report=self.ui.addPowerFlowReportCheckBox.isChecked()
745
746
  )
746
747
 
@@ -978,6 +979,11 @@ class SimulationsMain(TimeEventsMain):
978
979
  self.update_available_results()
979
980
  self.colour_diagrams()
980
981
 
982
+ if results.converged:
983
+ self.show_info_toast("Power flow converged :)")
984
+ else:
985
+ self.show_warning_toast("Power flow not converged :/")
986
+
981
987
  else:
982
988
  warning_msg('There are no power flow results.\nIs there any slack bus or generator?', 'Power flow')
983
989
 
@@ -1760,7 +1766,8 @@ class SimulationsMain(TimeEventsMain):
1760
1766
  self.update_available_results()
1761
1767
  self.colour_diagrams()
1762
1768
  else:
1763
- info_msg('The voltage stability did not converge.\nIs this case already at the collapse limit?')
1769
+ self.show_warning_toast('The voltage stability did not converge.\n'
1770
+ 'Is this case already at the collapse limit?', 5000)
1764
1771
  else:
1765
1772
  self.show_error_toast('Something went wrong, There are no voltage stability results.')
1766
1773
 
@@ -1951,6 +1958,7 @@ class SimulationsMain(TimeEventsMain):
1951
1958
  unit_commitment = self.ui.opfUnitCommitmentCheckBox.isChecked()
1952
1959
  generate_report = self.ui.addOptimalPowerFlowReportCheckBox.isChecked()
1953
1960
  robust = self.ui.fixOpfCheckBox.isChecked()
1961
+ generation_expansion_planning = self.ui.opfGEPCheckBox.isChecked()
1954
1962
 
1955
1963
  if self.ui.save_mip_checkBox.isChecked():
1956
1964
  folder = opf_file_path()
@@ -1965,11 +1973,11 @@ class SimulationsMain(TimeEventsMain):
1965
1973
  inter_aggregation_info: dev.InterAggregationInfo = self.get_compatible_from_to_buses_and_inter_branches()
1966
1974
 
1967
1975
  if len(inter_aggregation_info.lst_from) == 0:
1968
- error_msg('The area "from" has no buses!')
1976
+ self.show_error_toast('The area "from" has no buses!', 5000)
1969
1977
  return None
1970
1978
 
1971
1979
  if len(inter_aggregation_info.lst_to) == 0:
1972
- error_msg('The area "to" has no buses!')
1980
+ self.show_error_toast('The area "to" has no buses!', 5000)
1973
1981
  return None
1974
1982
  else:
1975
1983
  inter_aggregation_info = None
@@ -1995,6 +2003,7 @@ class SimulationsMain(TimeEventsMain):
1995
2003
  maximize_flows=maximize_flows,
1996
2004
  inter_aggregation_info=inter_aggregation_info,
1997
2005
  unit_commitment=unit_commitment,
2006
+ generation_expansion_planning=generation_expansion_planning,
1998
2007
  export_model_fname=export_model_fname,
1999
2008
  generate_report=generate_report,
2000
2009
  ips_method=ips_method,
@@ -2048,11 +2057,14 @@ class SimulationsMain(TimeEventsMain):
2048
2057
 
2049
2058
  self.remove_simulation(SimulationTypes.OPF_run)
2050
2059
 
2051
- if not results.converged:
2052
- warning_msg('Some islands did not solve.\n'
2053
- 'Check that all Branches have rating and \n'
2054
- 'that the generator bounds are ok.\n'
2055
- 'You may also use the diagnostic tool (F8)', 'OPF')
2060
+ if results.converged:
2061
+ self.show_info_toast("Optimal power flow converged :)")
2062
+ else:
2063
+ self.show_warning_toast('Power flow not converged :/\n'
2064
+ 'Check that all Branches have rating and \n'
2065
+ 'that the generator bounds are ok.\n'
2066
+ 'You may also use the diagnostic tool (F8)',
2067
+ duration=4000)
2056
2068
 
2057
2069
  self.update_available_results()
2058
2070
 
@@ -2730,8 +2742,6 @@ class SimulationsMain(TimeEventsMain):
2730
2742
  """
2731
2743
 
2732
2744
  self.remove_simulation(SimulationTypes.TopologyProcessor_run)
2733
- # self.update_available_results()
2734
- # self.colour_diagrams()
2735
2745
 
2736
2746
  if not self.session.is_anything_running():
2737
2747
  self.UNLOCK()
@@ -6,7 +6,7 @@ import datetime
6
6
  _current_year_ = datetime.datetime.now().year
7
7
 
8
8
  # do not forget to keep a three-number version!!!
9
- __GridCal_VERSION__ = "5.3.25"
9
+ __GridCal_VERSION__ = "5.3.27"
10
10
 
11
11
  url = 'https://github.com/SanPen/GridCal'
12
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: GridCal
3
- Version: 5.3.25
3
+ Version: 5.3.27
4
4
  Summary: GridCal is a Power Systems simulation program intended for professional use and research
5
5
  Home-page: https://github.com/SanPen/GridCal
6
6
  Author: Santiago Peñate Vera et. Al.