GridCal 5.1.42__tar.gz → 5.1.43__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.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +14 -17
  2. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +9 -10
  3. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/base_diagram_widget.py +117 -20
  4. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +130 -26
  5. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/io.py +7 -3
  6. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/profiles_model.py +8 -7
  7. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/table_view_header_wrap.py +3 -1
  8. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/session.py +29 -16
  9. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/__version__.py +1 -1
  10. {GridCal-5.1.42 → GridCal-5.1.43}/PKG-INFO +1 -1
  11. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ExecuteGridCal.py +0 -0
  12. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  13. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  14. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  15. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  16. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  17. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  18. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/__init__.py +0 -0
  19. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/gui.py +0 -0
  20. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  21. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  22. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  23. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  24. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  25. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  26. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  27. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  28. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  29. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  30. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  31. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  32. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  33. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  34. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  35. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  36. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  37. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  38. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  39. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  40. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  41. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  42. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
  43. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +0 -0
  44. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  45. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  46. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +0 -0
  47. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  48. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +0 -0
  49. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  50. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  51. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  52. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  53. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/gmt_local.py +0 -0
  54. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapbox.py +0 -0
  55. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapquest.py +0 -0
  56. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/open_street_map.py +0 -0
  57. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_toner.py +0 -0
  58. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_transport.py +0 -0
  59. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_watercolor.py +0 -0
  60. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  61. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  62. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  63. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  64. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  65. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  66. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  67. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  68. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
  69. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  70. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  71. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  72. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  73. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  74. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  75. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  76. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  77. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  78. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
  79. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  80. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  81. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  82. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  83. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  84. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  85. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  86. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  87. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  88. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  89. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  90. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  91. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  92. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  93. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  94. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  95. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  96. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  97. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  98. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  99. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  100. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  101. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  102. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  103. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  104. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  105. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  106. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  107. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  108. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  109. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/__init__.py +0 -0
  110. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  111. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  112. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  113. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  114. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  115. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/gui.py +0 -0
  116. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  117. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  118. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  119. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  120. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  121. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  122. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  123. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  124. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  125. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  126. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  127. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  128. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  129. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  130. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/GridCalMain.py +0 -0
  131. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/MainWindow.py +0 -0
  132. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  133. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  134. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
  135. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  136. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  137. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  138. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  139. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  140. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  141. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  142. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  143. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  144. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  145. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
  146. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  147. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
  148. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/simulations.py +0 -0
  149. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/__init__.py +0 -0
  150. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/icons_rc.py +0 -0
  151. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/object_select_window.py +0 -0
  152. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/update_gui_file.py +0 -0
  153. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  154. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  155. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  156. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  157. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  158. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  159. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  160. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  161. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  162. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  163. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  164. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  165. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  166. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  167. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  168. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  169. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  170. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  171. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  172. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  173. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  174. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  175. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  176. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  177. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  178. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  179. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  180. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  181. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  182. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  183. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  184. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  185. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  186. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  187. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  188. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  189. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  190. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  191. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  192. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  193. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  194. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  195. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  196. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  197. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  198. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  199. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  200. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  201. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  202. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Visualization/__init__.py +0 -0
  203. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Visualization/visualization.py +0 -0
  204. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Widgets/__init__.py +0 -0
  205. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  206. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  207. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  208. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  209. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  210. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  211. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  212. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/__init__.py +0 -0
  213. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/associations_model.py +0 -0
  214. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/console_widget.py +0 -0
  215. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/general_dialogues.py +0 -0
  216. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/gui_functions.py +0 -0
  217. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/messages.py +0 -0
  218. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/object_model.py +0 -0
  219. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/pandas_model.py +0 -0
  220. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/plot_config.py +0 -0
  221. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/results_model.py +0 -0
  222. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/themes.py +0 -0
  223. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/update_gui_all.py +0 -0
  224. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/update_gui_common.py +0 -0
  225. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/wrappable_table_model.py +0 -0
  226. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/LICENSE.txt +0 -0
  227. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/__init__.py +0 -0
  228. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/export_results_driver.py +0 -0
  229. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/file_handler.py +0 -0
  230. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/server_driver.py +0 -0
  231. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/synchronization_driver.py +0 -0
  232. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/__init__.py +0 -0
  233. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  234. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  235. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  236. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  237. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  238. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  239. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  240. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  241. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  242. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  243. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  244. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  245. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  246. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  247. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  248. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  249. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  250. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  251. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  252. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  253. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  254. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  255. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  256. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  257. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  258. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  259. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  260. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  261. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  262. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  263. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  264. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  265. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  266. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  267. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  268. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  269. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  270. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  271. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/__init__.py +0 -0
  272. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/__init__.py +0 -0
  273. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/cables.csv +0 -0
  274. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/sequence_lines.csv +0 -0
  275. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/transformers.csv +0 -0
  276. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/wires.csv +0 -0
  277. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/plugins.py +0 -0
  278. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/templates.py +0 -0
  279. {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/update.py +0 -0
  280. {GridCal-5.1.42 → GridCal-5.1.43}/setup.cfg +0 -0
  281. {GridCal-5.1.42 → GridCal-5.1.43}/setup.py +0 -0
@@ -57,11 +57,11 @@ import GridCal.Gui.Visualization.visualization as viz
57
57
  import GridCalEngine.Devices.Diagrams.palettes as palettes
58
58
  from GridCal.Gui.Diagrams.graphics_manager import ALL_MAP_GRAPHICS
59
59
  from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles import Tiles
60
- from GridCal.Gui.Diagrams.base_diagram_widget import BaseDiagramWidget
60
+ from GridCal.Gui.Diagrams.base_diagram_widget import BaseDiagramWidget, qimage_to_cv
61
61
  from GridCal.Gui.messages import error_msg
62
62
 
63
63
  if TYPE_CHECKING:
64
- from GridCal.Gui.Main.GridCalMain import MainGUI
64
+ from GridCal.Gui.Main.SubClasses.Model.diagrams import DiagramsMain
65
65
 
66
66
  MAP_BRANCH_GRAPHIC_TYPES = Union[
67
67
  MapAcLine, MapDcLine, MapHvdcLine, MapFluidPathLine
@@ -207,7 +207,7 @@ class GridMapWidget(BaseDiagramWidget):
207
207
  """
208
208
 
209
209
  def __init__(self,
210
- gui: MainGUI,
210
+ gui: DiagramsMain,
211
211
  tile_src: Tiles,
212
212
  start_level: int,
213
213
  longitude: float,
@@ -1147,25 +1147,14 @@ class GridMapWidget(BaseDiagramWidget):
1147
1147
 
1148
1148
  graphic_object.set_colour(color=color, w=weight, style=style, tool_tip=tooltip)
1149
1149
 
1150
- def get_image(self, transparent: bool = False) -> Tuple[QImage, int, int]:
1150
+ def get_image(self, transparent: bool = False) -> QImage:
1151
1151
  """
1152
1152
  get the current picture
1153
1153
  :return: QImage, width, height
1154
1154
  """
1155
- w = self.width()
1156
- h = self.height()
1157
-
1158
- # image = QImage(w, h, QImage.Format_RGB32)
1159
- # image.fill(Qt.white)
1160
- #
1161
- # painter = QPainter(image)
1162
- # painter.setRenderHint(QPainter.Antialiasing)
1163
- # self.map.view.render(painter) # self.view stores the grid widgets
1164
- # # self.render(painter)
1165
- # painter.end()
1166
1155
  image = self.map.grab().toImage()
1167
1156
 
1168
- return image, w, h
1157
+ return image
1169
1158
 
1170
1159
  def take_picture(self, filename: str):
1171
1160
  """
@@ -1174,7 +1163,7 @@ class GridMapWidget(BaseDiagramWidget):
1174
1163
  name, extension = os.path.splitext(filename.lower())
1175
1164
 
1176
1165
  if extension == '.png':
1177
- image, _, _ = self.get_image()
1166
+ image = self.get_image()
1178
1167
  image.save(filename)
1179
1168
 
1180
1169
  elif extension == '.svg':
@@ -1193,6 +1182,14 @@ class GridMapWidget(BaseDiagramWidget):
1193
1182
  else:
1194
1183
  raise Exception('Extension ' + str(extension) + ' not supported :(')
1195
1184
 
1185
+ # def capture_video_frame(self):
1186
+ # """
1187
+ # Save video frame
1188
+ # """
1189
+ # image, w, h = self.get_image()
1190
+ # cv2_image = qimage_to_cv(image)
1191
+ # self._video.write(cv2_image)
1192
+
1196
1193
  def new_substation_diagram(self, substation: Substation):
1197
1194
  """
1198
1195
 
@@ -35,7 +35,6 @@ from PySide6.QtGui import (QIcon, QPixmap, QImage, QPainter, QStandardItemModel,
35
35
  from PySide6.QtWidgets import (QGraphicsView, QMessageBox, QGraphicsScene, QGraphicsSceneMouseEvent, QGraphicsItem)
36
36
  from PySide6.QtSvg import QSvgGenerator
37
37
 
38
- from GridCal.Gui.Diagrams.graphics_manager import ALL_GRAPHICS
39
38
  from GridCalEngine.Devices.types import ALL_DEV_TYPES, INJECTION_DEVICE_TYPES, FLUID_TYPES, BRANCH_TYPES
40
39
  from GridCalEngine.Devices.multi_circuit import MultiCircuit
41
40
  from GridCalEngine.Devices.Substation.bus import Bus
@@ -55,7 +54,7 @@ from GridCalEngine.Devices.Fluid import FluidNode, FluidPath
55
54
  from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
56
55
  from GridCalEngine.Devices.Diagrams.graphic_location import GraphicLocation
57
56
  from GridCalEngine.Simulations import PowerFlowTimeSeriesResults
58
- from GridCalEngine.enumerations import DeviceType, SimulationTypes, ResultTypes
57
+ from GridCalEngine.enumerations import DeviceType, ResultTypes
59
58
  from GridCalEngine.basic_structures import Vec, CxVec, IntVec, Logger
60
59
 
61
60
  from GridCal.Gui.Diagrams.SchematicWidget.terminal_item import BarTerminalItem, RoundTerminalItem
@@ -84,7 +83,7 @@ import GridCalEngine.Devices.Diagrams.palettes as palettes
84
83
  from GridCal.Gui.messages import info_msg, error_msg, warning_msg, yes_no_question
85
84
 
86
85
  if TYPE_CHECKING:
87
- from GridCal.Gui.Main.GridCalMain import MainGUI
86
+ from GridCal.Gui.Main.SubClasses.Model.diagrams import DiagramsMain
88
87
 
89
88
  BRANCH_GRAPHICS = Union[
90
89
  LineGraphicItem,
@@ -218,7 +217,7 @@ class SchematicLibraryModel(QStandardItemModel):
218
217
  :param index:
219
218
  :return:
220
219
  """
221
- return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemFlag.ItemIsDragEnabled
220
+ return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsDragEnabled
222
221
 
223
222
 
224
223
  class SchematicScene(QGraphicsScene):
@@ -298,7 +297,7 @@ class CustomGraphicsView(QGraphicsView):
298
297
  """
299
298
 
300
299
  # By pressing ctrl while dragging, we can move the grid
301
- if event.modifiers() & Qt.ControlModifier:
300
+ if event.modifiers() & Qt.KeyboardModifier.ControlModifier:
302
301
  self.drag_mode = QGraphicsView.DragMode.ScrollHandDrag
303
302
  else:
304
303
  self.drag_mode = QGraphicsView.DragMode.RubberBandDrag
@@ -340,7 +339,7 @@ class SchematicWidget(BaseDiagramWidget):
340
339
  """
341
340
 
342
341
  def __init__(self,
343
- gui: MainGUI,
342
+ gui: DiagramsMain,
344
343
  circuit: MultiCircuit,
345
344
  diagram: Union[SchematicDiagram, None],
346
345
  default_bus_voltage: float = 10.0,
@@ -441,7 +440,7 @@ class SchematicWidget(BaseDiagramWidget):
441
440
  if event.mimeData().hasFormat('component/name'):
442
441
  obj_type = event.mimeData().data('component/name')
443
442
 
444
- point0 = self.editor_graphics_view.mapToScene(event.position().x(), event.position().y())
443
+ point0 = self.editor_graphics_view.mapToScene(int(event.position().x()), int(event.position().y()))
445
444
  x0 = point0.x()
446
445
  y0 = point0.y()
447
446
 
@@ -1945,7 +1944,7 @@ class SchematicWidget(BaseDiagramWidget):
1945
1944
  bus.y = y[i]
1946
1945
  i += 1
1947
1946
 
1948
- def get_image(self, transparent: bool = False) -> Tuple[QImage, int, int]:
1947
+ def get_image(self, transparent: bool = False) -> QImage:
1949
1948
  """
1950
1949
  get the current picture
1951
1950
  :param transparent: Set a transparent background
@@ -1967,7 +1966,7 @@ class SchematicWidget(BaseDiagramWidget):
1967
1966
  painter.end()
1968
1967
  # image = self.editor_graphics_view.grab().toImage()
1969
1968
 
1970
- return image, w, h
1969
+ return image
1971
1970
 
1972
1971
  def take_picture(self, filename: str):
1973
1972
  """
@@ -1976,7 +1975,7 @@ class SchematicWidget(BaseDiagramWidget):
1976
1975
  name, extension = os.path.splitext(filename.lower())
1977
1976
 
1978
1977
  if extension == '.png':
1979
- image, _, _ = self.get_image(transparent=False)
1978
+ image = self.get_image(transparent=False)
1980
1979
  image.save(filename)
1981
1980
 
1982
1981
  elif extension == '.svg':
@@ -17,7 +17,6 @@
17
17
  from __future__ import annotations
18
18
  from typing import List, Dict, Union, Tuple, Callable, TYPE_CHECKING
19
19
  import numpy as np
20
- import pandas as pd
21
20
  import cv2
22
21
  from matplotlib import pyplot as plt
23
22
 
@@ -42,18 +41,18 @@ from GridCalEngine.basic_structures import Vec, CxVec, IntVec
42
41
  from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
43
42
  from GridCalEngine.Devices.Diagrams.map_diagram import MapDiagram
44
43
  from GridCalEngine.Simulations.types import DRIVER_OBJECTS
45
- from GridCalEngine.basic_structures import Logger
44
+ from GridCalEngine.basic_structures import Logger, Mat
46
45
  from GridCalEngine.enumerations import SimulationTypes, ResultTypes
46
+ import GridCalEngine.Devices.Diagrams.palettes as palettes
47
47
 
48
48
  from GridCal.Gui.Diagrams.graphics_manager import GraphicsManager
49
- import GridCalEngine.Devices.Diagrams.palettes as palettes
50
49
  from GridCal.Gui.messages import yes_no_question, info_msg
51
50
  from GridCal.Gui.object_model import ObjectsModel
52
51
 
53
52
  if TYPE_CHECKING:
54
53
  from GridCal.Gui.Diagrams.MapWidget.grid_map_widget import MapLibraryModel, GridMapWidget
55
54
  from GridCal.Gui.Diagrams.SchematicWidget.schematic_widget import SchematicLibraryModel, SchematicWidget
56
- from GridCal.Gui.Main.GridCalMain import MainGUI
55
+ from GridCal.Gui.Main.SubClasses.Model.diagrams import DiagramsMain
57
56
 
58
57
 
59
58
  def change_font_size(obj, font_size: int):
@@ -68,6 +67,84 @@ def change_font_size(obj, font_size: int):
68
67
  obj.setFont(font1)
69
68
 
70
69
 
70
+ def qimage_tocv2_by_disk(qimage: QImage, logger: Logger, file_path):
71
+ """
72
+
73
+ :param qimage: Qimage
74
+ :param logger: Logger
75
+ :param file_path: temp file path
76
+ :return:
77
+ """
78
+ # Convert QImage to PNG format and save
79
+ if not qimage.save(file_path, "PNG"):
80
+ logger.add_error(msg=f"Error: Could not save QImage to {file_path}")
81
+ return None
82
+
83
+ # Use OpenCV to read the saved image
84
+ opencv_image = cv2.imread(file_path)
85
+ if opencv_image is None:
86
+ logger.add_error(msg=f"Error: Could not save QImage to {file_path}")
87
+ return None
88
+
89
+ return opencv_image
90
+
91
+
92
+ def qimage_to_cv(qimage: QImage, logger: Logger, force_disk=False) -> np.ndarray:
93
+ """
94
+ Convert a image from Qt to an OpenCV image
95
+ :param qimage: Qimage
96
+ :param logger: Logger
97
+ :param force_disk: if true, the image is converted by saving to disk and loading again with opencv
98
+ :return: OpenCv matrix
99
+ """
100
+ width = qimage.width()
101
+ height = qimage.height()
102
+
103
+ if force_disk:
104
+ opencv_image = qimage_tocv2_by_disk(qimage, logger, file_path="__img__.png")
105
+
106
+ return opencv_image
107
+ else:
108
+ try:
109
+ # convert picture using the memory
110
+ # we need to remove the alpha channel, otherwise the video frame is not saved
111
+ cv_mat = np.array(qimage.constBits()).reshape(height, width, 4).astype(np.uint8)[:, :, :3]
112
+
113
+ return cv_mat
114
+
115
+ except ValueError as e:
116
+
117
+ logger.add_error(msg=f"Could not convert frame: {e}, failed over to second image conversion method.")
118
+
119
+ try:
120
+ # Convert the QImage to RGB format if it is not already in that format
121
+ qimage = qimage.convertToFormat(QImage.Format.Format_RGB888)
122
+
123
+ # Get the pointer to the data and stride (bytes per line)
124
+ ptr = qimage.bits()
125
+ # ptr.itemsize = qimage.sizeInBytes() # Set the size of the memoryview
126
+ stride = qimage.bytesPerLine() # Get the number of bytes per line (width * channels + padding)
127
+
128
+ # Create a numpy array with the correct shape based on the stride
129
+ arr = np.array(ptr).reshape((height, stride // 3, 3)).astype(np.uint8) # Adjust for stride
130
+
131
+ # Crop the width to the actual image width (in case stride > width * channels)
132
+ arr = arr[:, :width, :]
133
+
134
+ # Convert RGB to BGR for OpenCV
135
+ cv_mat = cv2.cvtColor(arr, cv2.COLOR_RGB2BGR)
136
+
137
+ return cv_mat
138
+ except ValueError as e2:
139
+ logger.add_error(msg=f"Could not convert frame: {e2}, failed over to disk converison method")
140
+
141
+ # try the last method, saving to disk and reading again
142
+
143
+ opencv_image = qimage_tocv2_by_disk(qimage, logger, file_path="__img__.png")
144
+
145
+ return opencv_image
146
+
147
+
71
148
  class BaseDiagramWidget(QSplitter):
72
149
  """
73
150
  Common diagram widget to host common functions
@@ -75,7 +152,7 @@ class BaseDiagramWidget(QSplitter):
75
152
  """
76
153
 
77
154
  def __init__(self,
78
- gui: MainGUI,
155
+ gui: DiagramsMain,
79
156
  circuit: MultiCircuit,
80
157
  diagram: Union[SchematicDiagram, MapDiagram],
81
158
  library_model: Union[MapLibraryModel, SchematicLibraryModel],
@@ -508,7 +585,7 @@ class BaseDiagramWidget(QSplitter):
508
585
  """
509
586
  return 0
510
587
 
511
- def get_image(self, transparent: bool = False) -> Tuple[QImage, int, int]:
588
+ def get_image(self, transparent: bool = False) -> QImage:
512
589
  """
513
590
  get the current picture
514
591
  :param transparent: Set a transparent background
@@ -523,41 +600,61 @@ class BaseDiagramWidget(QSplitter):
523
600
  """
524
601
  pass
525
602
 
526
- def start_video_recording(self, fname: str, fps: int = 30) -> Tuple[int, int]:
603
+ def start_video_recording(self, fname: str, fps: int = 30, logger: Logger = Logger()) -> Tuple[int, int]:
527
604
  """
528
605
  Save video
529
606
  :param fname: file name
530
607
  :param fps: frames per second
608
+ :param logger: LOgger
531
609
  :returns width, height
532
610
  """
533
611
 
534
- w = self.get_picture_width()
535
- h = self.get_picture_height()
536
-
537
- self._video = cv2.VideoWriter(filename=fname,
538
- fourcc=cv2.VideoWriter_fourcc(*'mp4v'),
539
- fps=fps,
540
- frameSize=(w, h))
612
+ image = self.get_image()
613
+ w = image.width()
614
+ h = image.height()
615
+ cv2_image = qimage_to_cv(image, logger)
616
+ w2, h2, _ = cv2_image.shape
617
+
618
+ if fname.endswith('.mp4'):
619
+ self._video = cv2.VideoWriter(filename=fname,
620
+ fourcc=cv2.VideoWriter_fourcc(*'mp4v'),
621
+ fps=fps,
622
+ frameSize=(w, h))
623
+ elif fname.endswith('.avi'):
624
+ self._video = cv2.VideoWriter(filename=fname + '.avi',
625
+ fourcc=cv2.VideoWriter_fourcc(*'XVID'),
626
+ fps=fps,
627
+ frameSize=(w, h))
628
+ else:
629
+ raise Exception(f"File format not recognized {fname}")
541
630
 
542
631
  return w, h
543
632
 
544
- def capture_video_frame(self):
633
+ def capture_video_frame(self, w: int, h: int, logger: Logger):
545
634
  """
546
635
  Save video frame
547
636
  """
637
+ image = self.get_image()
638
+ w2 = image.width()
639
+ h2 = image.height()
640
+
641
+ if w != w2:
642
+ logger.add_error(f"Width {w2} different from expected width {w}")
643
+
644
+ if h != h2:
645
+ logger.add_error(f"Height {h2} different from expected width {h}")
548
646
 
549
- image, w, h = self.get_image()
647
+ cv2_image = qimage_to_cv(image, logger)
550
648
 
551
- # convert picture using the memory
552
- # we need to remove the alpha channel, otherwise the video frame is not saved
553
- frame = np.array(image.constBits()).reshape(h, w, 4).astype(np.uint8)[:, :, :3]
554
- self._video.write(frame)
649
+ if cv2_image is not None:
650
+ self._video.write(cv2_image)
555
651
 
556
652
  def end_video_recording(self):
557
653
  """
558
654
  Finalize video recording
559
655
  """
560
656
  self._video.release()
657
+ print("Video released")
561
658
 
562
659
  def update_label_drwaing_status(self, device: ALL_DEV_TYPES, draw_labels: bool) -> None:
563
660
  """
@@ -14,6 +14,8 @@
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
  import os
18
20
  from typing import List, Tuple, Union
19
21
 
@@ -26,8 +28,10 @@ from pandas.plotting import register_matplotlib_converters
26
28
  import GridCalEngine.Devices.Diagrams.palettes as palettes
27
29
  from GridCalEngine.IO.file_system import get_create_gridcal_folder
28
30
  from GridCal.Gui.general_dialogues import (CheckListDialogue, StartEndSelectionDialogue, InputSearchDialogue,
29
- InputNumberDialogue)
31
+ InputNumberDialogue, LogsDialogue)
30
32
  from GridCalEngine.Devices.types import ALL_DEV_TYPES
33
+ from GridCalEngine.Utils.progress_bar import print_progress_bar
34
+ from GridCalEngine.basic_structures import Logger
31
35
  from GridCalEngine.enumerations import SimulationTypes
32
36
  from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
33
37
 
@@ -52,6 +56,69 @@ ALL_EDITORS = Union[SchematicWidget, GridMapWidget]
52
56
  ALL_EDITORS_NONE = Union[None, SchematicWidget, GridMapWidget]
53
57
 
54
58
 
59
+ class VideoExportWorker(QtCore.QThread):
60
+ """
61
+ VideoExportWorker
62
+ """
63
+ progress_signal = QtCore.Signal(float)
64
+ progress_text = QtCore.Signal(str)
65
+ done_signal = QtCore.Signal()
66
+
67
+ def __init__(self, filename, diagram: SchematicWidget | GridMapWidget,
68
+ fps: int, start_idx: int, end_idx: int, current_study: str,
69
+ grid_colour_function):
70
+ """
71
+
72
+ :param filename:
73
+ :param diagram:
74
+ :param fps:
75
+ :param start_idx:
76
+ :param end_idx:
77
+ :param current_study:
78
+ :param grid_colour_function:
79
+ """
80
+ QtCore.QThread.__init__(self)
81
+
82
+ self.filename = filename
83
+ self.diagram = diagram
84
+ self.fps = fps
85
+ self.start_idx = start_idx
86
+ self.end_idx = end_idx
87
+ self.current_study = current_study
88
+ self.grid_colour_function = grid_colour_function
89
+
90
+ self.logger = Logger()
91
+
92
+ def run(self):
93
+ """
94
+ Run function
95
+ :return:
96
+ """
97
+ # start recording...
98
+ w, h = self.diagram.start_video_recording(fname=self.filename, fps=self.fps, logger=self.logger)
99
+
100
+ # paint and capture
101
+ for t_idx in range(self.start_idx, self.end_idx):
102
+ self.grid_colour_function(diagram=self.diagram,
103
+ current_study=self.current_study,
104
+ t_idx=t_idx,
105
+ allow_popups=False)
106
+
107
+ self.diagram.capture_video_frame(w=w, h=h, logger=self.logger)
108
+
109
+ self.progress_text.emit(f"Saving frame {t_idx} / {self.end_idx}")
110
+ self.progress_signal.emit(t_idx / self.end_idx)
111
+
112
+ print_progress_bar(t_idx + 1, self.end_idx)
113
+
114
+ # finalize
115
+ self.diagram.end_video_recording()
116
+
117
+ self.logger.add_info(f"Video saved to {self.filename}")
118
+
119
+ self.done_signal.emit()
120
+
121
+
55
122
  class DiagramsMain(CompiledArraysMain):
56
123
  """
57
124
  Diagrams Main
@@ -156,6 +223,9 @@ class DiagramsMain(CompiledArraysMain):
156
223
  # configure matplotlib for pandas time series
157
224
  register_matplotlib_converters()
158
225
 
226
+ # task watcher for video export
227
+ self.video_thread: VideoExportWorker | None = None
228
+
159
229
  # --------------------------------------------------------------------------------------------------------------
160
230
  self.ui.actionTakePicture.triggered.connect(self.take_picture)
161
231
  self.ui.actionRecord_video.triggered.connect(self.record_video)
@@ -1167,6 +1237,7 @@ class DiagramsMain(CompiledArraysMain):
1167
1237
 
1168
1238
  # create the map widget
1169
1239
  map_widget = GridMapWidget(
1240
+ gui=self,
1170
1241
  tile_src=tile_source,
1171
1242
  start_level=diagram.start_level,
1172
1243
  longitude=diagram.longitude,
@@ -1454,7 +1525,7 @@ class DiagramsMain(CompiledArraysMain):
1454
1525
  if isinstance(diagram, (SchematicWidget, GridMapWidget)):
1455
1526
 
1456
1527
  # declare the allowed file types
1457
- files_types = "MP4 (*.mp4);;"
1528
+ files_types = "MP4 (*.mp4);;AVI (*.avi);;"
1458
1529
 
1459
1530
  f_name = str(os.path.join(self.project_directory, self.ui.grid_name_line_edit.text()))
1460
1531
 
@@ -1463,38 +1534,71 @@ class DiagramsMain(CompiledArraysMain):
1463
1534
  f_name, files_types)
1464
1535
 
1465
1536
  if filename != "":
1466
- if not filename.endswith('.mp4'):
1537
+ if type_selected == "MP4 (*.mp4)" and not filename.endswith('.mp4'):
1467
1538
  filename += ".mp4"
1468
1539
 
1469
- fps = self.ui.fps_spinBox.value()
1470
- start_idx = self.get_simulation_start()
1471
- end_idx = self.get_simulation_end()
1472
- current_study = self.ui.available_results_to_color_comboBox.currentText()
1473
-
1474
- # start recording...
1475
- diagram.start_video_recording(fname=filename, fps=fps)
1476
-
1477
- # paint and capture
1478
- for t_idx in range(start_idx, end_idx):
1479
- self.grid_colour_function(diagram=diagram,
1480
- current_study=current_study,
1481
- t_idx=t_idx,
1482
- allow_popups=False)
1483
-
1484
- diagram.capture_video_frame()
1485
-
1486
- print(f"Saving frame {t_idx} / {end_idx}")
1487
-
1488
- # finalize
1489
- diagram.end_video_recording()
1490
- print(f"Recording saved to {filename}")
1491
-
1540
+ if type_selected == "AVI (*.avi)" and not filename.endswith('.avi'):
1541
+ filename += ".avi"
1542
+
1543
+ # self.thread_pool.start(lambda: self.record_video_now(filename, diagram))
1544
+ self.video_thread = VideoExportWorker(
1545
+ filename=filename,
1546
+ diagram=diagram,
1547
+ fps=self.ui.fps_spinBox.value(),
1548
+ start_idx=self.get_simulation_start(),
1549
+ end_idx=self.get_simulation_end(),
1550
+ current_study=self.ui.available_results_to_color_comboBox.currentText(),
1551
+ grid_colour_function=self.grid_colour_function
1552
+ )
1553
+ self.video_thread.progress_signal.connect(self.ui.progressBar.setValue)
1554
+ self.video_thread.progress_text.connect(self.ui.progress_label.setText)
1555
+ self.video_thread.done_signal.connect(self.post_video_export)
1556
+ self.video_thread.run() # we cannot run another thread accesing the main thread objects...
1492
1557
  else:
1493
1558
  info_msg("There is not diagram selected", "Record video")
1494
1559
 
1495
1560
  else:
1496
1561
  info_msg("There are no time series", "Record video")
1497
1562
 
1563
+ def post_video_export(self):
1564
+ """
1565
+
1566
+ :return:
1567
+ """
1568
+ if self.video_thread.logger.has_logs():
1569
+ dlg = LogsDialogue("Video export", self.video_thread.logger, True)
1570
+ dlg.exec_()
1571
+
1572
+ # def record_video_now(self, filename, diagram: SchematicWidget | GridMapWidget):
1573
+ # """
1574
+ #
1575
+ # :param filename:
1576
+ # :param diagram:
1577
+ # :return:
1578
+ # """
1579
+ # fps = self.ui.fps_spinBox.value()
1580
+ # start_idx = self.get_simulation_start()
1581
+ # end_idx = self.get_simulation_end()
1582
+ # current_study = self.ui.available_results_to_color_comboBox.currentText()
1583
+ #
1584
+ # # start recording...
1585
+ # diagram.start_video_recording(fname=filename, fps=fps)
1586
+ #
1587
+ # # paint and capture
1588
+ # for t_idx in range(start_idx, end_idx):
1589
+ # self.grid_colour_function(diagram=diagram,
1590
+ # current_study=current_study,
1591
+ # t_idx=t_idx,
1592
+ # allow_popups=False)
1593
+ #
1594
+ # diagram.capture_video_frame()
1595
+ #
1596
+ # print(f"Saving frame {t_idx} / {end_idx}")
1597
+ #
1598
+ # # finalize
1599
+ # diagram.end_video_recording()
1600
+ # print(f"Recording saved to {filename}")
1601
+
1498
1602
  def set_xy_from_lat_lon(self):
1499
1603
  """
1500
1604
  Get the x, y coordinates of the buses from their latitude and longitude
@@ -936,9 +936,13 @@ class IoMain(ConfigurationMain):
936
936
  data_dict = self.last_file_driver.load_session_objects(session_name=session_name,
937
937
  study_name=study_name)
938
938
 
939
- self.session.register_driver_from_disk_data(grid=self.circuit,
940
- study_name=study_name,
941
- data_dict=data_dict)
939
+ logger = self.session.register_driver_from_disk_data(grid=self.circuit,
940
+ study_name=study_name,
941
+ data_dict=data_dict)
942
+
943
+ if logger.has_logs():
944
+ dlg = LogsDialogue(name="Results parsing", logger=logger, expand_all=True)
945
+ dlg.exec()
942
946
 
943
947
  self.update_available_results()
944
948
  else:
@@ -263,14 +263,15 @@ class ProfilesModel(WrappableTableModel):
263
263
  return None
264
264
 
265
265
  if role == QtCore.Qt.ItemDataRole.DisplayRole:
266
- if len(self.elements):
267
- if orientation == QtCore.Qt.Orientation.Horizontal:
266
+
267
+ if orientation == QtCore.Qt.Orientation.Horizontal:
268
+ if section < len(self.elements):
268
269
  return str(self.elements[section].name)
269
- elif orientation == QtCore.Qt.Orientation.Vertical:
270
- if self.time_array is None:
271
- return str(section)
272
- else:
273
- return pd.to_datetime(self.time_array[section]).strftime('%d-%m-%Y %H:%M:%S')
270
+ elif orientation == QtCore.Qt.Orientation.Vertical:
271
+ if self.time_array is None:
272
+ return str(section)
273
+ else:
274
+ return pd.to_datetime(self.time_array[section]).strftime('%d-%m-%Y %H:%M:%S')
274
275
 
275
276
  return None
276
277
 
@@ -51,7 +51,9 @@ class HeaderViewWithWordWrap(QtWidgets.QHeaderView):
51
51
  """
52
52
  mdl: WrappableTableModel = self.model()
53
53
  if mdl:
54
- headerText = mdl.headerData(logicalIndex, self.orientation(), QtCore.Qt.ItemDataRole.DisplayRole)
54
+ headerText = mdl.headerData(section=logicalIndex,
55
+ orientation=self.orientation(),
56
+ role=QtCore.Qt.ItemDataRole.DisplayRole)
55
57
  option = QtWidgets.QStyleOptionHeader()
56
58
  self.initStyleOption(option)
57
59
  option.section = logicalIndex