GridCal 5.1.41__tar.gz → 5.1.42__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 (281) hide show
  1. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +7 -1
  2. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +27 -24
  3. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/base_diagram_widget.py +114 -135
  4. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +14 -7
  5. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/simulations.py +1 -0
  6. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/server_driver.py +6 -3
  7. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/session.py +19 -4
  8. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/__version__.py +1 -1
  9. {GridCal-5.1.41 → GridCal-5.1.42}/PKG-INFO +1 -1
  10. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ExecuteGridCal.py +0 -0
  11. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  12. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  13. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  14. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  15. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  16. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  17. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/__init__.py +0 -0
  18. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/gui.py +0 -0
  19. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  20. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  21. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  22. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  23. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  24. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  25. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  26. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  27. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  28. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  29. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  30. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  31. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  32. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  33. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  34. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  35. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  36. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  37. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  38. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  39. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  40. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  41. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
  42. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +0 -0
  43. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  44. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  45. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +0 -0
  46. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  47. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +0 -0
  48. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  49. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  50. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  51. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  52. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/gmt_local.py +0 -0
  53. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapbox.py +0 -0
  54. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapquest.py +0 -0
  55. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/open_street_map.py +0 -0
  56. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_toner.py +0 -0
  57. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_transport.py +0 -0
  58. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_watercolor.py +0 -0
  59. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  60. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  61. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  62. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  63. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  64. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  65. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  66. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  67. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
  68. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  69. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  70. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  71. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  72. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  73. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  74. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  75. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  76. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  77. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
  78. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  79. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  80. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  81. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  82. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  83. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  84. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  85. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  86. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  87. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  88. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  89. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  90. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  91. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  92. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  93. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  94. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  95. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  96. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  97. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  98. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  99. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  100. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  101. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  102. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  103. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  104. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  105. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  106. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  107. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  108. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/__init__.py +0 -0
  109. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  110. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  111. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  112. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  113. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  114. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/gui.py +0 -0
  115. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  116. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  117. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  118. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  119. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  120. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  121. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  122. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  123. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  124. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  125. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  126. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  127. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  128. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  129. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/GridCalMain.py +0 -0
  130. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/MainWindow.py +0 -0
  131. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  132. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  133. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
  134. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  135. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  136. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  137. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  138. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  139. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  140. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  141. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  142. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  143. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  144. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
  145. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  146. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
  147. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/io.py +0 -0
  148. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/__init__.py +0 -0
  149. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/icons_rc.py +0 -0
  150. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/object_select_window.py +0 -0
  151. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/update_gui_file.py +0 -0
  152. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  153. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  154. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  155. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  156. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  157. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  158. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  159. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  160. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  161. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  162. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  163. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  164. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  165. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  166. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  167. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  168. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  169. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  170. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  171. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  172. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  173. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  174. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  175. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  176. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  177. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  178. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  179. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  180. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  181. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  182. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  183. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  184. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  185. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  186. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  187. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  188. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  189. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  190. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  191. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  192. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  193. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  194. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  195. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  196. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  197. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  198. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  199. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  200. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  201. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Visualization/__init__.py +0 -0
  202. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Visualization/visualization.py +0 -0
  203. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Widgets/__init__.py +0 -0
  204. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  205. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  206. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  207. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  208. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  209. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  210. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  211. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/__init__.py +0 -0
  212. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/associations_model.py +0 -0
  213. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/console_widget.py +0 -0
  214. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/general_dialogues.py +0 -0
  215. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/gui_functions.py +0 -0
  216. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/messages.py +0 -0
  217. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/object_model.py +0 -0
  218. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/pandas_model.py +0 -0
  219. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/plot_config.py +0 -0
  220. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/profiles_model.py +0 -0
  221. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/results_model.py +0 -0
  222. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/table_view_header_wrap.py +0 -0
  223. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/themes.py +0 -0
  224. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/update_gui_all.py +0 -0
  225. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/update_gui_common.py +0 -0
  226. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/wrappable_table_model.py +0 -0
  227. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/LICENSE.txt +0 -0
  228. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/__init__.py +0 -0
  229. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/export_results_driver.py +0 -0
  230. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/file_handler.py +0 -0
  231. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/synchronization_driver.py +0 -0
  232. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/__init__.py +0 -0
  233. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  234. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  235. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  236. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  237. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  238. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  239. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  240. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  241. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  242. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  243. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  244. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  245. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  246. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  247. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  248. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  249. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  250. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  251. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  252. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  253. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  254. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  255. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  256. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  257. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  258. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  259. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  260. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  261. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  262. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  263. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  264. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  265. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  266. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  267. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  268. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  269. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  270. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  271. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/__init__.py +0 -0
  272. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/__init__.py +0 -0
  273. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/cables.csv +0 -0
  274. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/sequence_lines.csv +0 -0
  275. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/transformers.csv +0 -0
  276. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/wires.csv +0 -0
  277. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/plugins.py +0 -0
  278. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/templates.py +0 -0
  279. {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/update.py +0 -0
  280. {GridCal-5.1.41 → GridCal-5.1.42}/setup.cfg +0 -0
  281. {GridCal-5.1.41 → GridCal-5.1.42}/setup.py +0 -0
@@ -14,8 +14,9 @@
14
14
  # You should have received a copy of the GNU Lesser General Public License
15
15
  # along with this program; if not, write to the Free Software Foundation,
16
16
  # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+ from __future__ import annotations
17
18
  import os
18
- from typing import Union, List, Tuple, Dict
19
+ from typing import Union, List, Tuple, Dict, TYPE_CHECKING
19
20
  import json
20
21
  import numpy as np
21
22
  import math
@@ -59,6 +60,9 @@ from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles import Tiles
59
60
  from GridCal.Gui.Diagrams.base_diagram_widget import BaseDiagramWidget
60
61
  from GridCal.Gui.messages import error_msg
61
62
 
63
+ if TYPE_CHECKING:
64
+ from GridCal.Gui.Main.GridCalMain import MainGUI
65
+
62
66
  MAP_BRANCH_GRAPHIC_TYPES = Union[
63
67
  MapAcLine, MapDcLine, MapHvdcLine, MapFluidPathLine
64
68
  ]
@@ -203,6 +207,7 @@ class GridMapWidget(BaseDiagramWidget):
203
207
  """
204
208
 
205
209
  def __init__(self,
210
+ gui: MainGUI,
206
211
  tile_src: Tiles,
207
212
  start_level: int,
208
213
  longitude: float,
@@ -226,6 +231,7 @@ class GridMapWidget(BaseDiagramWidget):
226
231
  """
227
232
 
228
233
  BaseDiagramWidget.__init__(self,
234
+ gui=gui,
229
235
  circuit=circuit,
230
236
  diagram=MapDiagram(name=name,
231
237
  tile_source=tile_src.TilesetName,
@@ -14,12 +14,13 @@
14
14
  # You should have received a copy of the GNU Lesser General Public License
15
15
  # along with this program; if not, write to the Free Software Foundation,
16
16
  # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+ from __future__ import annotations
17
18
  import sys
18
19
  import os
19
20
  import json
20
21
  import numpy as np
21
22
  import pandas as pd
22
- from typing import List, Dict, Union, Tuple
23
+ from typing import List, Dict, Union, Tuple, TYPE_CHECKING
23
24
  from collections.abc import Callable
24
25
  from warnings import warn
25
26
  import networkx as nx
@@ -53,7 +54,8 @@ from GridCalEngine.Devices.Injections.generator import Generator
53
54
  from GridCalEngine.Devices.Fluid import FluidNode, FluidPath
54
55
  from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
55
56
  from GridCalEngine.Devices.Diagrams.graphic_location import GraphicLocation
56
- from GridCalEngine.enumerations import DeviceType, SimulationTypes
57
+ from GridCalEngine.Simulations import PowerFlowTimeSeriesResults
58
+ from GridCalEngine.enumerations import DeviceType, SimulationTypes, ResultTypes
57
59
  from GridCalEngine.basic_structures import Vec, CxVec, IntVec, Logger
58
60
 
59
61
  from GridCal.Gui.Diagrams.SchematicWidget.terminal_item import BarTerminalItem, RoundTerminalItem
@@ -81,6 +83,9 @@ import GridCal.Gui.Visualization.visualization as viz
81
83
  import GridCalEngine.Devices.Diagrams.palettes as palettes
82
84
  from GridCal.Gui.messages import info_msg, error_msg, warning_msg, yes_no_question
83
85
 
86
+ if TYPE_CHECKING:
87
+ from GridCal.Gui.Main.GridCalMain import MainGUI
88
+
84
89
  BRANCH_GRAPHICS = Union[
85
90
  LineGraphicItem,
86
91
  WindingGraphicItem,
@@ -335,6 +340,7 @@ class SchematicWidget(BaseDiagramWidget):
335
340
  """
336
341
 
337
342
  def __init__(self,
343
+ gui: MainGUI,
338
344
  circuit: MultiCircuit,
339
345
  diagram: Union[SchematicDiagram, None],
340
346
  default_bus_voltage: float = 10.0,
@@ -351,6 +357,7 @@ class SchematicWidget(BaseDiagramWidget):
351
357
  """
352
358
 
353
359
  BaseDiagramWidget.__init__(self,
360
+ gui=gui,
354
361
  circuit=circuit,
355
362
  diagram=diagram,
356
363
  library_model=SchematicLibraryModel(),
@@ -3700,15 +3707,21 @@ class SchematicWidget(BaseDiagramWidget):
3700
3707
 
3701
3708
  return min_x, max_x, min_y, max_y
3702
3709
 
3703
- def plot_bus(self, i, api_object: Bus):
3710
+ def plot_bus(self, i: int, api_object: Bus):
3704
3711
  """
3705
3712
  Plot branch results
3706
- :param i: branch index (not counting HVDC lines because those are not real Branches)
3713
+ :param i: bus index
3707
3714
  :param api_object: Bus API object
3708
3715
  :return:
3709
3716
  """
3710
3717
  fig = plt.figure(figsize=(12, 8))
3711
3718
  ax_1 = fig.add_subplot(211)
3719
+ ax_1.set_title('Power', fontsize=14)
3720
+ ax_1.set_ylabel('Injections [MW]', fontsize=11)
3721
+
3722
+ ax_2 = fig.add_subplot(212, sharex=ax_1)
3723
+ ax_2.set_title('Time', fontsize=14)
3724
+ ax_2.set_ylabel('Voltage [p.u]', fontsize=11)
3712
3725
 
3713
3726
  # set time
3714
3727
  x = self.circuit.get_time_array()
@@ -3719,18 +3732,16 @@ class SchematicWidget(BaseDiagramWidget):
3719
3732
  # Get all devices grouped by bus
3720
3733
  all_data = self.circuit.get_injection_devices_grouped_by_bus()
3721
3734
 
3722
- # filter injections by bus
3723
- bus_devices = all_data.get(api_object, None)
3724
-
3725
- voltage = dict()
3726
-
3727
- for key, driver in self.results_dictionary.items():
3728
- if hasattr(driver, 'results'):
3729
- if driver.results is not None:
3730
- if key == SimulationTypes.PowerFlowTimeSeries_run:
3731
- voltage[key] = np.abs(driver.results.voltage[:, i])
3735
+ # search drivers for voltage data
3736
+ for driver, results in self.gui.session.drivers_results_iter():
3737
+ if results is not None:
3738
+ if isinstance(results, PowerFlowTimeSeriesResults):
3739
+ table = results.mdl(result_type=ResultTypes.BusVoltageModule)
3740
+ table.plot(ax=ax_2, selected_col_idx=[i])
3732
3741
 
3733
3742
  # Injections
3743
+ # filter injections by bus
3744
+ bus_devices = all_data.get(api_object, None)
3734
3745
  if bus_devices:
3735
3746
 
3736
3747
  power_data = dict()
@@ -3752,8 +3763,7 @@ class SchematicWidget(BaseDiagramWidget):
3752
3763
  raise Exception("Missing shunt device for plotting")
3753
3764
 
3754
3765
  df = pd.DataFrame(data=power_data, index=x)
3755
- ax_1.set_title('Power', fontsize=14)
3756
- ax_1.set_ylabel('Injections [MW]', fontsize=11)
3766
+
3757
3767
  try:
3758
3768
  # yt area plots
3759
3769
  df.plot.area(ax=ax_1)
@@ -3761,14 +3771,6 @@ class SchematicWidget(BaseDiagramWidget):
3761
3771
  # use regular plots
3762
3772
  df.plot(ax=ax_1)
3763
3773
 
3764
- # voltage
3765
- if len(voltage.keys()):
3766
- ax_2 = fig.add_subplot(212, sharex=ax_1)
3767
- df = pd.DataFrame(data=voltage, index=x)
3768
- ax_2.set_title('Time', fontsize=14)
3769
- ax_2.set_ylabel('Voltage [p.u]', fontsize=11)
3770
- df.plot(ax=ax_2)
3771
-
3772
3774
  plt.legend()
3773
3775
  fig.suptitle(api_object.name, fontsize=20)
3774
3776
 
@@ -4115,6 +4117,7 @@ class SchematicWidget(BaseDiagramWidget):
4115
4117
  logger=self.logger)
4116
4118
 
4117
4119
  return SchematicWidget(
4120
+ gui=self.gui,
4118
4121
  circuit=self.circuit,
4119
4122
  diagram=self.diagram,
4120
4123
  default_bus_voltage=self.default_bus_voltage,
@@ -35,21 +35,25 @@ from GridCalEngine.Devices.Branches.transformer import Transformer2W
35
35
  from GridCalEngine.Devices.Branches.vsc import VSC
36
36
  from GridCalEngine.Devices.Branches.upfc import UPFC
37
37
  from GridCalEngine.Devices.types import BRANCH_TYPES
38
+ from GridCalEngine.Simulations import (PowerFlowTimeSeriesResults, LinearAnalysisTimeSeriesResults,
39
+ ContingencyAnalysisTimeSeriesResults, OptimalPowerFlowTimeSeriesResults,
40
+ StochasticPowerFlowResults)
38
41
  from GridCalEngine.basic_structures import Vec, CxVec, IntVec
39
42
  from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
40
43
  from GridCalEngine.Devices.Diagrams.map_diagram import MapDiagram
41
44
  from GridCalEngine.Simulations.types import DRIVER_OBJECTS
42
45
  from GridCalEngine.basic_structures import Logger
43
- from GridCalEngine.enumerations import SimulationTypes
46
+ from GridCalEngine.enumerations import SimulationTypes, ResultTypes
44
47
 
45
48
  from GridCal.Gui.Diagrams.graphics_manager import GraphicsManager
46
49
  import GridCalEngine.Devices.Diagrams.palettes as palettes
47
- from GridCal.Gui.messages import yes_no_question
50
+ from GridCal.Gui.messages import yes_no_question, info_msg
48
51
  from GridCal.Gui.object_model import ObjectsModel
49
52
 
50
53
  if TYPE_CHECKING:
51
54
  from GridCal.Gui.Diagrams.MapWidget.grid_map_widget import MapLibraryModel, GridMapWidget
52
55
  from GridCal.Gui.Diagrams.SchematicWidget.schematic_widget import SchematicLibraryModel, SchematicWidget
56
+ from GridCal.Gui.Main.GridCalMain import MainGUI
53
57
 
54
58
 
55
59
  def change_font_size(obj, font_size: int):
@@ -71,6 +75,7 @@ class BaseDiagramWidget(QSplitter):
71
75
  """
72
76
 
73
77
  def __init__(self,
78
+ gui: MainGUI,
74
79
  circuit: MultiCircuit,
75
80
  diagram: Union[SchematicDiagram, MapDiagram],
76
81
  library_model: Union[MapLibraryModel, SchematicLibraryModel],
@@ -86,6 +91,8 @@ class BaseDiagramWidget(QSplitter):
86
91
  """
87
92
  QSplitter.__init__(self)
88
93
 
94
+ self.gui = gui
95
+
89
96
  # --------------------------------------------------------------------------------------------------------------
90
97
  # Widget creation
91
98
  # --------------------------------------------------------------------------------------------------------------
@@ -120,7 +127,7 @@ class BaseDiagramWidget(QSplitter):
120
127
  splitter2 = QSplitter(self)
121
128
  splitter2.addWidget(self.frame1)
122
129
  splitter2.addWidget(self.object_editor_table)
123
- splitter2.setOrientation(Qt.Vertical)
130
+ splitter2.setOrientation(Qt.Orientation.Vertical)
124
131
  self.addWidget(splitter2)
125
132
  # self.addWidget(self.editor_graphics_view)
126
133
 
@@ -222,87 +229,74 @@ class BaseDiagramWidget(QSplitter):
222
229
  :param api_object: API object
223
230
  """
224
231
  fig = plt.figure(figsize=(12, 8))
232
+ fig.suptitle(api_object.name, fontsize=20)
233
+
225
234
  ax_1 = fig.add_subplot(211)
235
+ ax_1.set_title('Probability x < value', fontsize=14)
236
+ ax_1.set_ylabel('Loading [%]', fontsize=11)
237
+
226
238
  ax_2 = fig.add_subplot(212)
239
+ ax_2.set_title('Power', fontsize=14)
240
+ ax_2.set_ylabel('Power [MW]', fontsize=11)
241
+
242
+ any_plot = False
243
+
244
+ for driver, results in self.gui.session.drivers_results_iter():
245
+
246
+ if results is not None:
247
+
248
+ if isinstance(results, PowerFlowTimeSeriesResults):
249
+
250
+ Sf_table = results.mdl(result_type=ResultTypes.BranchActivePowerFrom)
251
+ Sf_table.plot(ax=ax_1, selected_col_idx=[i])
252
+
253
+ loading_table = results.mdl(result_type=ResultTypes.BranchLoading)
254
+ loading_table.convert_to_cdf()
255
+ loading_table.plot(ax=ax_2, selected_col_idx=[i])
256
+ any_plot = True
257
+
258
+ elif isinstance(results, LinearAnalysisTimeSeriesResults):
259
+
260
+ Sf_table = results.mdl(result_type=ResultTypes.BranchActivePowerFrom)
261
+ Sf_table.plot(ax=ax_1, selected_col_idx=[i])
262
+
263
+ loading_table = results.mdl(result_type=ResultTypes.BranchLoading)
264
+ loading_table.convert_to_cdf()
265
+ loading_table.plot(ax=ax_2, selected_col_idx=[i])
266
+ any_plot = True
267
+
268
+ elif isinstance(results, ContingencyAnalysisTimeSeriesResults):
269
+
270
+ Sf_table = results.mdl(result_type=ResultTypes.MaxContingencyFlows)
271
+ Sf_table.plot(ax=ax_1, selected_col_idx=[i])
272
+
273
+ loading_table = results.mdl(result_type=ResultTypes.MaxContingencyLoading)
274
+ loading_table.convert_to_cdf()
275
+ loading_table.plot(ax=ax_2, selected_col_idx=[i])
276
+ any_plot = True
227
277
 
228
- # set time
229
- x = self.circuit.get_time_array()
230
- x_cl = x
231
-
232
- if x is not None:
233
- if len(x) > 0:
234
-
235
- p = np.arange(len(x)).astype(float) / len(x)
236
-
237
- # search available results
238
- power_data = dict()
239
- loading_data = dict()
240
- loading_st_data = None
241
- loading_clustering_data = None
242
- power_clustering_data = None
243
-
244
- for key, driver in self.results_dictionary.items():
245
- if hasattr(driver, 'results'):
246
- if driver.results is not None:
247
- if key == SimulationTypes.PowerFlowTimeSeries_run:
248
- power_data[key.value] = driver.results.Sf.real[:, i]
249
- loading_data[key.value] = np.sort(np.abs(driver.results.loading.real[:, i] * 100.0))
250
-
251
- elif key == SimulationTypes.LinearAnalysis_TS_run:
252
- power_data[key.value] = driver.results.Sf.real[:, i]
253
- loading_data[key.value] = np.sort(np.abs(driver.results.loading.real[:, i] * 100.0))
254
-
255
- # elif key == SimulationTypes.NetTransferCapacityTS_run:
256
- # power_data[key.value] = driver.results.atc[:, i]
257
- # atc_perc = driver.results.atc[:, i] / (api_object.rate_prof + 1e-9)
258
- # loading_data[key.value] = np.sort(np.abs(atc_perc * 100.0))
259
-
260
- elif key == SimulationTypes.ContingencyAnalysisTS_run:
261
- power_data[key.value] = driver.results.max_flows.real[:, i]
262
- loading_data[key.value] = np.sort(
263
- np.abs(driver.results.max_loading.real[:, i] * 100.0))
264
-
265
- elif key == SimulationTypes.OPFTimeSeries_run:
266
- power_data[key.value] = driver.results.Sf.real[:, i]
267
- loading_data[key.value] = np.sort(np.abs(driver.results.loading.real[:, i] * 100.0))
268
-
269
- elif key == SimulationTypes.StochasticPowerFlow:
270
- loading_st_data = np.sort(np.abs(driver.results.loading_points.real[:, i] * 100.0))
271
-
272
- # add the rating
273
- # power_data['Rates+'] = api_object.rate_prof
274
- # power_data['Rates-'] = -api_object.rate_prof
275
-
276
- # loading
277
- if len(loading_data.keys()):
278
- df = pd.DataFrame(data=loading_data, index=p)
279
- ax_1.set_title('Probability x < value', fontsize=14)
280
- ax_1.set_ylabel('Loading [%]', fontsize=11)
281
- df.plot(ax=ax_1)
282
-
283
- if loading_st_data is not None:
284
- p_st = np.arange(len(loading_st_data)).astype(float) / len(loading_st_data)
285
- df = pd.DataFrame(data=loading_st_data,
286
- index=p_st,
287
- columns=[SimulationTypes.StochasticPowerFlow.value])
288
- ax_1.set_title('Probability x < value', fontsize=14)
289
- ax_1.set_ylabel('Loading [%]', fontsize=11)
290
- df.plot(ax=ax_1)
291
-
292
- # power
293
- if len(power_data.keys()):
294
- df = pd.DataFrame(data=power_data, index=x)
295
- ax_2.set_title('Power', fontsize=14)
296
- ax_2.set_ylabel('Power [MW]', fontsize=11)
297
- df.plot(ax=ax_2)
298
- ax_2.plot(x, api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
299
- ax_2.plot(x, -api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
300
-
301
- plt.legend()
302
- fig.suptitle(api_object.name, fontsize=20)
303
-
304
- # plot the profiles
305
- plt.show()
278
+ elif isinstance(results, OptimalPowerFlowTimeSeriesResults):
279
+
280
+ Sf_table = results.mdl(result_type=ResultTypes.BranchActivePowerFrom)
281
+ Sf_table.plot(ax=ax_1, selected_col_idx=[i])
282
+
283
+ loading_table = results.mdl(result_type=ResultTypes.BranchLoading)
284
+ loading_table.convert_to_cdf()
285
+ loading_table.plot(ax=ax_2, selected_col_idx=[i])
286
+ any_plot = True
287
+
288
+ elif isinstance(results, StochasticPowerFlowResults):
289
+ loading_table = results.mdl(result_type=ResultTypes.BranchLoadingAverage)
290
+ loading_table.convert_to_cdf()
291
+ loading_table.plot(ax=ax_2, selected_col_idx=[i])
292
+ any_plot = True
293
+
294
+ if any_plot:
295
+ plt.legend()
296
+ plt.show()
297
+ else:
298
+ info_msg("No time series results to plot, run some time series results. Even partial results are fine",
299
+ f"{api_object.name} results plot")
306
300
 
307
301
  def plot_hvdc_branch(self, i: int, api_object: HvdcLine):
308
302
  """
@@ -311,63 +305,48 @@ class BaseDiagramWidget(QSplitter):
311
305
  :param api_object: HvdcGraphicItem
312
306
  """
313
307
  fig = plt.figure(figsize=(12, 8))
308
+ fig.suptitle(api_object.name, fontsize=20)
309
+
314
310
  ax_1 = fig.add_subplot(211)
315
- # ax_2 = fig.add_subplot(212, sharex=ax_1)
311
+ ax_1.set_title('Probability x < value', fontsize=14)
312
+ ax_1.set_ylabel('Loading [%]', fontsize=11)
313
+
316
314
  ax_2 = fig.add_subplot(212)
315
+ ax_2.set_title('Power', fontsize=14)
316
+ ax_2.set_ylabel('Power [MW]', fontsize=11)
317
+
318
+ any_plot = False
319
+
320
+ for driver, results in self.gui.session.drivers_results_iter():
321
+
322
+ if results is not None:
323
+
324
+ if isinstance(results, PowerFlowTimeSeriesResults):
325
+
326
+ Sf_table = results.mdl(result_type=ResultTypes.HvdcPowerFrom)
327
+ Sf_table.plot(ax=ax_1, selected_col_idx=[i])
328
+
329
+ loading_table = results.mdl(result_type=ResultTypes.HvdcLoading)
330
+ loading_table.convert_to_cdf()
331
+ loading_table.plot(ax=ax_2, selected_col_idx=[i])
332
+ any_plot = True
333
+
334
+ elif isinstance(results, OptimalPowerFlowTimeSeriesResults):
335
+
336
+ Sf_table = results.mdl(result_type=ResultTypes.HvdcPowerFrom)
337
+ Sf_table.plot(ax=ax_1, selected_col_idx=[i])
338
+
339
+ loading_table = results.mdl(result_type=ResultTypes.HvdcLoading)
340
+ loading_table.convert_to_cdf()
341
+ loading_table.plot(ax=ax_2, selected_col_idx=[i])
342
+ any_plot = True
317
343
 
318
- # set time
319
- x = self.circuit.time_profile
320
- x_cl = x
321
-
322
- if x is not None:
323
- if len(x) > 0:
324
-
325
- p = np.arange(len(x)).astype(float) / len(x)
326
-
327
- # search available results
328
- power_data = dict()
329
- loading_data = dict()
330
-
331
- for key, driver in self.results_dictionary.items():
332
- if hasattr(driver, 'results'):
333
- if driver.results is not None:
334
- if key == SimulationTypes.PowerFlowTimeSeries_run:
335
- power_data[key.value] = driver.results.hvdc_Pf[:, i]
336
- loading_data[key.value] = np.sort(np.abs(driver.results.hvdc_loading[:, i] * 100.0))
337
-
338
- elif key == SimulationTypes.LinearAnalysis_TS_run:
339
- power_data[key.value] = driver.results.hvdc_Pf[:, i]
340
- loading_data[key.value] = np.sort(np.abs(driver.results.hvdc_loading[:, i] * 100.0))
341
-
342
- elif key == SimulationTypes.OPFTimeSeries_run:
343
- power_data[key.value] = driver.results.hvdc_Pf[:, i]
344
- loading_data[key.value] = np.sort(np.abs(driver.results.hvdc_loading[:, i] * 100.0))
345
-
346
- # add the rating
347
- # power_data['Rates+'] = api_object.rate_prof
348
- # power_data['Rates-'] = -api_object.rate_prof
349
-
350
- # loading
351
- if len(loading_data.keys()):
352
- df = pd.DataFrame(data=loading_data, index=p)
353
- ax_1.set_title('Probability x < value', fontsize=14)
354
- ax_1.set_ylabel('Loading [%]', fontsize=11)
355
- df.plot(ax=ax_1)
356
-
357
- # power
358
- if len(power_data.keys()):
359
- df = pd.DataFrame(data=power_data, index=x)
360
- ax_2.set_title('Power', fontsize=14)
361
- ax_2.set_ylabel('Power [MW]', fontsize=11)
362
- df.plot(ax=ax_2)
363
- ax_2.plot(x, api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
364
- ax_2.plot(x, -api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
365
-
366
- plt.legend()
367
- fig.suptitle(api_object.name, fontsize=20)
368
-
369
- # plot the profiles
370
- plt.show()
344
+ if any_plot:
345
+ plt.legend()
346
+ plt.show()
347
+ else:
348
+ info_msg("No time series results to plot, run some time series results. Even partial results are fine",
349
+ f"{api_object.name} results plot")
371
350
 
372
351
  @staticmethod
373
352
  def set_rate_to_profile(api_object: ALL_DEV_TYPES):
@@ -896,7 +896,8 @@ class DiagramsMain(CompiledArraysMain):
896
896
  """
897
897
  diagram = SchematicDiagram(name=name)
898
898
 
899
- diagram_widget = SchematicWidget(circuit=self.circuit,
899
+ diagram_widget = SchematicWidget(gui=self,
900
+ circuit=self.circuit,
900
901
  diagram=diagram,
901
902
  default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
902
903
  time_index=self.get_diagram_slider_index(),
@@ -980,7 +981,8 @@ class DiagramsMain(CompiledArraysMain):
980
981
  text_func=None,
981
982
  name=name)
982
983
 
983
- diagram_widget = SchematicWidget(circuit=self.circuit,
984
+ diagram_widget = SchematicWidget(gui=self,
985
+ circuit=self.circuit,
984
986
  diagram=diagram,
985
987
  default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
986
988
  time_index=self.get_diagram_slider_index(),
@@ -1018,7 +1020,8 @@ class DiagramsMain(CompiledArraysMain):
1018
1020
  if isinstance(diagram_widget, SchematicWidget):
1019
1021
  diagram = diagram_widget.get_selection_diagram()
1020
1022
 
1021
- diagram_widget = SchematicWidget(self.circuit,
1023
+ diagram_widget = SchematicWidget(gui=self,
1024
+ circuit=self.circuit,
1022
1025
  diagram=diagram,
1023
1026
  default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
1024
1027
  time_index=self.get_diagram_slider_index(),
@@ -1097,7 +1100,8 @@ class DiagramsMain(CompiledArraysMain):
1097
1100
  root_bus=root_bus,
1098
1101
  max_level=dlg.value)
1099
1102
 
1100
- diagram_widget = SchematicWidget(self.circuit,
1103
+ diagram_widget = SchematicWidget(gui=self,
1104
+ circuit=self.circuit,
1101
1105
  diagram=diagram,
1102
1106
  default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
1103
1107
  time_index=self.get_diagram_slider_index(),
@@ -1121,7 +1125,8 @@ class DiagramsMain(CompiledArraysMain):
1121
1125
  prog_func=None,
1122
1126
  text_func=None)
1123
1127
 
1124
- diagram_widget = SchematicWidget(self.circuit,
1128
+ diagram_widget = SchematicWidget(gui=self,
1129
+ circuit=self.circuit,
1125
1130
  diagram=diagram,
1126
1131
  default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
1127
1132
  time_index=self.get_diagram_slider_index(),
@@ -1144,7 +1149,8 @@ class DiagramsMain(CompiledArraysMain):
1144
1149
  for diagram in self.circuit.diagrams:
1145
1150
 
1146
1151
  if isinstance(diagram, dev.SchematicDiagram):
1147
- diagram_widget = SchematicWidget(self.circuit,
1152
+ diagram_widget = SchematicWidget(gui=self,
1153
+ circuit=self.circuit,
1148
1154
  diagram=diagram,
1149
1155
  default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
1150
1156
  time_index=self.get_diagram_slider_index(),
@@ -1212,7 +1218,8 @@ class DiagramsMain(CompiledArraysMain):
1212
1218
  tile_source = self.tile_name_dict[self.ui.tile_provider_comboBox.currentText()]
1213
1219
 
1214
1220
  # create the map widget
1215
- map_widget = GridMapWidget(tile_src=tile_source,
1221
+ map_widget = GridMapWidget(gui=self,
1222
+ tile_src=tile_source,
1216
1223
  start_level=diagram.start_level,
1217
1224
  longitude=diagram.longitude,
1218
1225
  latitude=diagram.latitude,
@@ -111,6 +111,7 @@ class SimulationsMain(TimeEventsMain):
111
111
  self.mip_solvers_dict[MIPSolvers.CPLEX.value] = MIPSolvers.CPLEX
112
112
  self.mip_solvers_dict[MIPSolvers.GUROBI.value] = MIPSolvers.GUROBI
113
113
  self.mip_solvers_dict[MIPSolvers.XPRESS.value] = MIPSolvers.XPRESS
114
+ self.mip_solvers_dict[MIPSolvers.PDLP.value] = MIPSolvers.PDLP
114
115
 
115
116
  # opf solvers dictionary
116
117
  self.nodal_capacity_methods_dict = OrderedDict()
@@ -16,6 +16,7 @@
16
16
  # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
  import time
18
18
  import requests
19
+ import asyncio
19
20
  from urllib3 import disable_warnings, exceptions
20
21
  from typing import Callable, Dict, Union, List, Any
21
22
  from PySide6.QtCore import QThread, Signal
@@ -305,9 +306,11 @@ class ServerDriver(QThread):
305
306
  if self.is_running():
306
307
  model_data = gather_model_as_jsons_for_communication(circuit=circuit, instruction=instruction)
307
308
 
308
- response = send_json_data(json_data=model_data,
309
- endpoint_url=websocket_url,
310
- certificate=self._certificate_path)
309
+ response = asyncio.get_event_loop().run_until_complete(
310
+ send_json_data(json_data=model_data,
311
+ endpoint_url=websocket_url,
312
+ certificate=self._certificate_path)
313
+ )
311
314
 
312
315
  self.get_jobs()
313
316
 
@@ -14,10 +14,12 @@
14
14
  # You should have received a copy of the GNU Lesser General Public License
15
15
  # along with this program; if not, write to the Free Software Foundation,
16
16
  # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+ from __future__ import annotations
18
+
17
19
  from uuid import uuid4
18
20
  import pandas as pd
19
21
  from PySide6.QtCore import QThread, Signal
20
- from typing import Dict, Union, List, Tuple, Any
22
+ from typing import Dict, Union, List, Tuple, Any, Generator
21
23
  from collections.abc import Callable
22
24
  from warnings import warn
23
25
 
@@ -211,6 +213,17 @@ class SimulationSession:
211
213
  """
212
214
  return [drv for driver_type, drv in self.drivers.items() if drv is not None]
213
215
 
216
+ def drivers_results_iter(self) -> Generator[Tuple[DRIVER_OBJECTS | None, RESULTS_OBJECTS | None]]:
217
+ """
218
+ Iterator returning driver and result types
219
+ :return: driver, result (both can be None)
220
+ """
221
+ for driver_type, drv in self.drivers.items():
222
+ if hasattr(drv, 'results'):
223
+ yield drv, drv.results
224
+ else:
225
+ yield drv, None
226
+
214
227
  def exists(self, driver_type: SimulationTypes):
215
228
  """
216
229
  Get the results of the driver
@@ -546,7 +559,7 @@ class SimulationSession:
546
559
 
547
560
  @property
548
561
  def net_transfer_capacity_ts(self) -> Tuple[AvailableTransferCapacityTimeSeriesDriver,
549
- AvailableTransferCapacityTimeSeriesResults]:
562
+ AvailableTransferCapacityTimeSeriesResults]:
550
563
  """
551
564
 
552
565
  :return:
@@ -555,7 +568,8 @@ class SimulationSession:
555
568
  return drv, results
556
569
 
557
570
  @property
558
- def optimal_net_transfer_capacity(self) -> Tuple[OptimalNetTransferCapacityDriver, OptimalNetTransferCapacityResults]:
571
+ def optimal_net_transfer_capacity(self) -> Tuple[
572
+ OptimalNetTransferCapacityDriver, OptimalNetTransferCapacityResults]:
559
573
  """
560
574
 
561
575
  :return:
@@ -564,7 +578,8 @@ class SimulationSession:
564
578
  return drv, results
565
579
 
566
580
  @property
567
- def optimal_net_transfer_capacity_ts(self) -> Tuple[OptimalNetTransferCapacityDriver, OptimalNetTransferCapacityResults]:
581
+ def optimal_net_transfer_capacity_ts(self) -> Tuple[
582
+ OptimalNetTransferCapacityDriver, OptimalNetTransferCapacityResults]:
568
583
  """
569
584
 
570
585
  :return:
@@ -16,7 +16,7 @@ import datetime
16
16
  _current_year_ = datetime.datetime.now().year
17
17
 
18
18
  # do not forget to keep a three-number version!!!
19
- __GridCal_VERSION__ = "5.1.41"
19
+ __GridCal_VERSION__ = "5.1.42"
20
20
 
21
21
  url = 'https://github.com/SanPen/GridCal'
22
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: GridCal
3
- Version: 5.1.41
3
+ Version: 5.1.42
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.