GridCal 5.1.49__tar.gz → 5.1.51__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 (286) hide show
  1. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +45 -13
  2. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +15 -15
  3. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +45 -38
  4. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +2 -2
  5. GridCal-5.1.51/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_editor.py +211 -0
  6. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +48 -17
  7. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +6 -4
  8. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +32 -21
  9. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -1
  10. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/MainWindow.py +367 -268
  11. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +1003 -399
  12. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/objects.py +156 -19
  13. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Results/results.py +6 -1
  14. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +4 -4
  15. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +4 -18
  16. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/base_gui.py +1 -0
  17. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/io.py +33 -6
  18. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/simulations.py +14 -24
  19. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/icons_rc.py +11145 -4012
  20. GridCal-5.1.51/GridCal/Gui/SubstationDesigner/substation_designer.py +178 -0
  21. GridCal-5.1.51/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +122 -0
  22. GridCal-5.1.51/GridCal/Gui/SubstationDesigner/update_gui_file.py +9 -0
  23. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/system_scaler.py +6 -4
  24. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/associations_model.py +7 -4
  25. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/gui_functions.py +19 -11
  26. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/object_model.py +38 -19
  27. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/results_model.py +28 -5
  28. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/table_view_header_wrap.py +19 -2
  29. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/LICENSE.txt +1 -1
  30. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Session/file_handler.py +7 -3
  31. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Session/session.py +1 -1
  32. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/__version__.py +1 -1
  33. GridCal-5.1.51/GridCal/data/__init__.py +0 -0
  34. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/plugins.py +3 -16
  35. {GridCal-5.1.49 → GridCal-5.1.51}/PKG-INFO +1 -1
  36. {GridCal-5.1.49 → GridCal-5.1.51}/setup.py +0 -2
  37. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ExecuteGridCal.py +0 -0
  38. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  39. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  40. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  41. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  42. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  43. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  44. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Analysis/__init__.py +0 -0
  45. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Analysis/gui.py +0 -0
  46. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  47. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  48. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  49. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  50. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  51. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  52. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  53. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  54. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  55. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  56. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  57. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  58. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  59. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  60. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  61. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  62. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  63. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  64. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  65. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  66. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  67. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  68. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
  69. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +0 -0
  70. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  71. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  72. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +0 -0
  73. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  74. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +0 -0
  75. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  76. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  77. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  78. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  79. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/gmt_local.py +0 -0
  80. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapbox.py +0 -0
  81. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapquest.py +0 -0
  82. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/open_street_map.py +0 -0
  83. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_toner.py +0 -0
  84. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_transport.py +0 -0
  85. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_watercolor.py +0 -0
  86. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  87. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  88. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  89. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  90. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  91. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  92. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  93. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  94. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  95. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  96. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  97. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  98. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  99. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  100. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  101. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  102. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  103. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  104. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  105. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  106. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  107. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  108. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  109. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  110. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  111. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  112. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  113. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  114. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  115. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  116. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  117. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  118. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  119. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  120. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  121. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  122. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  123. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  124. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  125. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  126. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  127. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  128. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  129. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  130. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/__init__.py +0 -0
  131. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  132. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  133. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  134. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  135. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  136. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/gui.py +0 -0
  137. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  138. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  139. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  140. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  141. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  142. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  143. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  144. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  145. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  146. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  147. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  148. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  149. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  150. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  151. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/GridCalMain.py +0 -0
  152. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  153. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  154. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  155. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  156. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  157. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  158. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  159. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  160. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  161. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  162. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  163. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/__init__.py +0 -0
  164. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/object_select_window.py +0 -0
  165. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Main/update_gui_file.py +0 -0
  166. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  167. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  168. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  169. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  170. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  171. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  172. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  173. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  174. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  175. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  176. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  177. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  178. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  179. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  180. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  181. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  182. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  183. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  184. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  185. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  186. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  187. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  188. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  189. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  190. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  191. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  192. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  193. {GridCal-5.1.49/GridCal/Gui/SyncDialogue → GridCal-5.1.51/GridCal/Gui/SubstationDesigner}/__init__.py +0 -0
  194. {GridCal-5.1.49/GridCal/Gui/SystemScaler → GridCal-5.1.51/GridCal/Gui/SyncDialogue}/__init__.py +0 -0
  195. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  196. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  197. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  198. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  199. {GridCal-5.1.49/GridCal/Gui/TowerBuilder → GridCal-5.1.51/GridCal/Gui/SystemScaler}/__init__.py +0 -0
  200. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  201. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  202. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  203. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  204. {GridCal-5.1.49/GridCal/Gui/TreeModelViewer → GridCal-5.1.51/GridCal/Gui/TowerBuilder}/__init__.py +0 -0
  205. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  206. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  207. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  208. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  209. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  210. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  211. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  212. {GridCal-5.1.49/GridCal/Gui/Visualization → GridCal-5.1.51/GridCal/Gui/TreeModelViewer}/__init__.py +0 -0
  213. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  214. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  215. {GridCal-5.1.49/GridCal/Gui/Widgets → GridCal-5.1.51/GridCal/Gui/Visualization}/__init__.py +0 -0
  216. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Visualization/visualization.py +0 -0
  217. {GridCal-5.1.49/GridCal/Gui/WindPowerWizard → GridCal-5.1.51/GridCal/Gui/Widgets}/__init__.py +0 -0
  218. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  219. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  220. {GridCal-5.1.49/GridCal/Gui → GridCal-5.1.51/GridCal/Gui/WindPowerWizard}/__init__.py +0 -0
  221. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  222. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  223. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  224. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  225. {GridCal-5.1.49/GridCal/Session → GridCal-5.1.51/GridCal/Gui}/__init__.py +0 -0
  226. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/console_widget.py +0 -0
  227. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/general_dialogues.py +0 -0
  228. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/messages.py +0 -0
  229. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/pandas_model.py +0 -0
  230. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/plot_config.py +0 -0
  231. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/profiles_model.py +0 -0
  232. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/themes.py +0 -0
  233. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/update_gui_all.py +0 -0
  234. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/update_gui_common.py +0 -0
  235. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Gui/wrappable_table_model.py +0 -0
  236. {GridCal-5.1.49/GridCal/ThirdParty → GridCal-5.1.51/GridCal/Session}/__init__.py +0 -0
  237. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Session/export_results_driver.py +0 -0
  238. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Session/server_driver.py +0 -0
  239. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/Session/synchronization_driver.py +0 -0
  240. {GridCal-5.1.49/GridCal/ThirdParty/qdarktheme/_icon → GridCal-5.1.51/GridCal/ThirdParty}/__init__.py +0 -0
  241. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  242. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  243. {GridCal-5.1.49/GridCal/ThirdParty/qdarktheme/_template → GridCal-5.1.51/GridCal/ThirdParty/qdarktheme/_icon}/__init__.py +0 -0
  244. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  245. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  246. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  247. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  248. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  249. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  250. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  251. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  252. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  253. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  254. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  255. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  256. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  257. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  258. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  259. {GridCal-5.1.49/GridCal/data → GridCal-5.1.51/GridCal/ThirdParty/qdarktheme/_template}/__init__.py +0 -0
  260. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  261. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  262. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  263. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  264. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  265. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  266. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  267. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  268. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  269. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  270. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  271. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  272. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  273. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  274. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  275. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  276. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  277. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  278. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  279. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/__init__.py +0 -0
  280. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/data/cables.csv +0 -0
  281. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/data/sequence_lines.csv +0 -0
  282. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/data/transformers.csv +0 -0
  283. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/data/wires.csv +0 -0
  284. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/templates.py +0 -0
  285. {GridCal-5.1.49 → GridCal-5.1.51}/GridCal/update.py +0 -0
  286. {GridCal-5.1.49 → GridCal-5.1.51}/setup.cfg +0 -0
@@ -30,6 +30,7 @@ from PySide6.QtCore import (Qt, QSize, QRect, QMimeData, QIODevice, QByteArray,
30
30
  from PySide6.QtGui import (QIcon, QPixmap, QImage, QPainter, QStandardItemModel, QStandardItem, QColor,
31
31
  QDropEvent, QWheelEvent)
32
32
 
33
+ from GridCal.Gui.SubstationDesigner.substation_designer import SubstationDesigner
33
34
  from GridCalEngine.Devices.Diagrams.map_location import MapLocation
34
35
  from GridCalEngine.Devices.Substation import Bus
35
36
  from GridCalEngine.Devices.Branches.line import Line
@@ -857,15 +858,46 @@ class GridMapWidget(BaseDiagramWidget):
857
858
  y0 = point0.y()
858
859
  lat, lon = self.to_lat_lon(x=x0, y=y0)
859
860
 
860
- # print(f"Dropped at x:{x0}, y:{y0}, lat:{lat}, lon:{lon}")
861
-
862
861
  if obj_type == self.library_model.get_substation_mime_data():
863
- api_object = Substation(name=f"Substation {self.circuit.get_substation_number()}",
864
- latitude=lat,
865
- longitude=lon)
866
- self.circuit.add_substation(obj=api_object)
867
- substation_graphics = self.add_api_substation(api_object=api_object, lat=lat, lon=lon)
868
- substation_graphics.add_voltage_level()
862
+ self.create_substation_with_dialogue(lat=lat, lon=lon)
863
+
864
+ def create_substation_with_dialogue(self, lat, lon):
865
+ """
866
+ Create a substation using the dialogue
867
+ :param lat:
868
+ :param lon:
869
+ :return:
870
+ """
871
+ kv = self.gui.get_default_voltage()
872
+ dlg = SubstationDesigner(grid=self.circuit, default_voltage=kv)
873
+ dlg.exec()
874
+ if dlg.was_ok():
875
+
876
+ # create the SE
877
+ se_object = Substation(name=dlg.get_name(), latitude=lat, longitude=lon)
878
+
879
+ self.circuit.add_substation(obj=se_object)
880
+ substation_graphics = self.add_api_substation(api_object=se_object, lat=lat, lon=lon)
881
+
882
+ for vl_template in dlg.get_voltage_levels():
883
+
884
+ # substation_graphics.add_voltage_level()
885
+ vl = VoltageLevel(name=f"{se_object.name} @{kv}KV VL",
886
+ Vnom=vl_template.voltage,
887
+ substation=se_object)
888
+ self.circuit.add_voltage_level(vl)
889
+
890
+ bus = Bus(name=f"{se_object.name} @{kv}KV bus",
891
+ Vnom=vl_template.voltage,
892
+ substation=se_object,
893
+ voltage_level=vl)
894
+ self.circuit.add_bus(obj=bus)
895
+
896
+ # add the vl graphics
897
+ self.add_api_voltage_level(substation_graphics=substation_graphics, api_object=vl)
898
+
899
+ # sort voltage levels
900
+ substation_graphics.sort_voltage_levels()
869
901
 
870
902
  def wheelEvent(self, event: QWheelEvent):
871
903
  """
@@ -874,12 +906,12 @@ class GridMapWidget(BaseDiagramWidget):
874
906
  :return:
875
907
  """
876
908
 
877
- # SANTIAGO: NO TOCAR ESTO ES EL COMPORTAMIENTO DESEADO
909
+ # SANTIAGO: DO NOT TOUCH, THIS IS THE DESIRED BEHAVIOUR
878
910
  self.update_device_sizes()
879
911
 
880
- def get_branch_width(self):
912
+ def get_branch_width(self) -> float:
881
913
  """
882
-
914
+ Get the desired branch width
883
915
  :return:
884
916
  """
885
917
  max_zoom = self.map.max_level
@@ -888,9 +920,9 @@ class GridMapWidget(BaseDiagramWidget):
888
920
  scale = self.diagram.min_branch_width + (zoom - min_zoom) / (max_zoom - min_zoom)
889
921
  return scale
890
922
 
891
- def update_device_sizes(self):
923
+ def update_device_sizes(self) -> None:
892
924
  """
893
-
925
+ Updat ethe devices' sizes
894
926
  :return:
895
927
  """
896
928
 
@@ -469,12 +469,12 @@ class MapWidget(QWidget):
469
469
  self.view_tlat = 0
470
470
 
471
471
  # some cursors
472
- self.standard_cursor = QCursor(Qt.ArrowCursor)
473
- self.box_select_cursor = QCursor(Qt.CrossCursor)
474
- self.wait_cursor = QCursor(Qt.WaitCursor)
475
- self.drag_cursor = QCursor(Qt.OpenHandCursor)
472
+ self.standard_cursor = QCursor(Qt.CursorShape.ArrowCursor)
473
+ self.box_select_cursor = QCursor(Qt.CursorShape.CrossCursor)
474
+ self.wait_cursor = QCursor(Qt.CursorShape.WaitCursor)
475
+ self.drag_cursor = QCursor(Qt.CursorShape.OpenHandCursor)
476
476
 
477
- self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
477
+ self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
478
478
  self.setMinimumSize(self.tile_width, self.tile_height)
479
479
 
480
480
  self.setMouseTracking(True)
@@ -672,9 +672,9 @@ class MapWidget(QWidget):
672
672
  self.setCursor(self.default_cursor)
673
673
 
674
674
  b = event.button()
675
- if b == Qt.NoButton:
675
+ if b == Qt.MouseButton.NoButton:
676
676
  pass
677
- elif b == Qt.LeftButton:
677
+ elif b == Qt.MouseButton.LeftButton:
678
678
  self.left_mbutton_down = False
679
679
 
680
680
  if self.start_drag_x is None:
@@ -688,10 +688,10 @@ class MapWidget(QWidget):
688
688
  longitude, latitude = self.view_to_geo(x, y)
689
689
  self.position_callback(latitude, longitude, x, y)
690
690
 
691
- elif b == Qt.MidButton:
691
+ elif b == Qt.MouseButton.MiddleButton:
692
692
  self.mid_mbutton_down = False
693
693
 
694
- elif b == Qt.RightButton:
694
+ elif b == Qt.MouseButton.RightButton:
695
695
  self.right_mbutton_down = False
696
696
 
697
697
  else:
@@ -705,13 +705,13 @@ class MapWidget(QWidget):
705
705
  :return:
706
706
  """
707
707
  b = event.button()
708
- if b == Qt.NoButton:
708
+ if b == Qt.MouseButton.NoButton:
709
709
  pass
710
- elif b == Qt.LeftButton:
710
+ elif b == Qt.MouseButton.LeftButton:
711
711
  pass
712
- elif b == Qt.MidButton:
712
+ elif b == Qt.MouseButton.MiddleButton:
713
713
  pass
714
- elif b == Qt.RightButton:
714
+ elif b == Qt.MouseButton.RightButton:
715
715
  pass
716
716
  else:
717
717
  pass
@@ -781,7 +781,7 @@ class MapWidget(QWidget):
781
781
  def keyPressEvent(self, event: QKeyEvent):
782
782
  """Capture a key press."""
783
783
 
784
- if event.key() == Qt.Key_Shift:
784
+ if event.key() == Qt.Key.Key_Shift:
785
785
  self.shift_down = True
786
786
  self.default_cursor = self.box_select_cursor
787
787
  self.setCursor(self.default_cursor)
@@ -792,7 +792,7 @@ class MapWidget(QWidget):
792
792
  """Capture a key release."""
793
793
 
794
794
  key = event.key()
795
- if event.key() == Qt.Key_Shift:
795
+ if event.key() == Qt.Key.Key_Shift:
796
796
  self.shift_down = False
797
797
  self.default_cursor = self.standard_cursor
798
798
  self.setCursor(self.default_cursor)
@@ -58,7 +58,7 @@ class LineEditor(QDialog):
58
58
 
59
59
  self.setObjectName("self")
60
60
 
61
- self.setContextMenuPolicy(Qt.NoContextMenu)
61
+ self.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)
62
62
 
63
63
  self.layout = QVBoxLayout(self)
64
64
 
@@ -84,10 +84,10 @@ class LineEditor(QDialog):
84
84
  if length == 0:
85
85
  length = 1.0
86
86
 
87
- R = self.line.R * Zbase / length
88
- X = self.line.X * Zbase / length
89
- B = self.line.B * Ybase / length
90
- I = np.round(self.line.rate / (Vf * 1.73205080757), 6) # current in KA
87
+ r_ohm = self.line.R * Zbase / length
88
+ x_ohm = self.line.X * Zbase / length
89
+ b_us = self.line.B * Ybase / length * 1e6
90
+ I_KA = np.round(self.line.rate / (Vf * 1.73205080757), 6) # current in KA
91
91
 
92
92
  # ------------------------------------------------------------------------------------------
93
93
 
@@ -103,22 +103,22 @@ class LineEditor(QDialog):
103
103
  self.catalogue_combo.setCurrentIndex(idx)
104
104
 
105
105
  if isinstance(self.current_template, SequenceLineType):
106
- I = self.current_template.Imax
107
- R = self.current_template.R
108
- X = self.current_template.X
109
- B = self.current_template.B
106
+ I_KA = self.current_template.Imax
107
+ r_ohm = self.current_template.R
108
+ x_ohm = self.current_template.X
109
+ b_us = self.current_template.B
110
110
 
111
111
  if isinstance(self.current_template, UndergroundLineType):
112
- I = self.current_template.Imax
113
- R = self.current_template.R
114
- X = self.current_template.X
115
- B = self.current_template.B
112
+ I_KA = self.current_template.Imax
113
+ r_ohm = self.current_template.R
114
+ x_ohm = self.current_template.X
115
+ b_us = self.current_template.B
116
116
 
117
117
  elif isinstance(self.current_template, OverheadLineType):
118
- I = self.current_template.Imax
119
- R = self.current_template.R1
120
- X = self.current_template.X1
121
- B = self.current_template.Bsh1
118
+ I_KA = self.current_template.Imax
119
+ r_ohm = self.current_template.R1
120
+ x_ohm = self.current_template.X1
121
+ b_us = self.current_template.Bsh1
122
122
 
123
123
  except:
124
124
  pass
@@ -141,7 +141,7 @@ class LineEditor(QDialog):
141
141
  self.i_spinner.setMinimum(0)
142
142
  self.i_spinner.setMaximum(9999999)
143
143
  self.i_spinner.setDecimals(2)
144
- self.i_spinner.setValue(I)
144
+ self.i_spinner.setValue(I_KA)
145
145
  self.i_spinner.setSuffix(' KA')
146
146
 
147
147
  # R
@@ -149,7 +149,7 @@ class LineEditor(QDialog):
149
149
  self.r_spinner.setMinimum(0)
150
150
  self.r_spinner.setMaximum(9999999)
151
151
  self.r_spinner.setDecimals(6)
152
- self.r_spinner.setValue(R)
152
+ self.r_spinner.setValue(r_ohm)
153
153
  self.r_spinner.setSuffix(' Ω/Km')
154
154
 
155
155
  # X
@@ -157,7 +157,7 @@ class LineEditor(QDialog):
157
157
  self.x_spinner.setMinimum(0)
158
158
  self.x_spinner.setMaximum(9999999)
159
159
  self.x_spinner.setDecimals(6)
160
- self.x_spinner.setValue(X)
160
+ self.x_spinner.setValue(x_ohm)
161
161
  self.x_spinner.setSuffix(' Ω/Km')
162
162
 
163
163
  # B
@@ -165,7 +165,7 @@ class LineEditor(QDialog):
165
165
  self.b_spinner.setMinimum(0)
166
166
  self.b_spinner.setMaximum(9999999)
167
167
  self.b_spinner.setDecimals(6)
168
- self.b_spinner.setValue(B)
168
+ self.b_spinner.setValue(b_us)
169
169
  self.b_spinner.setSuffix(" uS/Km")
170
170
 
171
171
  # apply to profile
@@ -209,29 +209,36 @@ class LineEditor(QDialog):
209
209
 
210
210
  self.setWindowTitle('Line editor')
211
211
 
212
- def accept_click(self):
212
+ def accept_click(self) -> None:
213
213
  """
214
214
  Set the values
215
215
  :return:
216
216
  """
217
217
 
218
- if self.selected_template is not None:
219
- self.line.length = self.l_spinner.value()
220
- self.line.apply_template(self.selected_template, Sbase=self.Sbase)
218
+ length = self.l_spinner.value()
219
+
220
+ if length != 0.0:
221
+
222
+ if self.selected_template is not None:
223
+ self.line.set_length(val=length, update_electrical_values=False)
224
+ self.line.apply_template(obj=self.selected_template, Sbase=self.Sbase)
225
+
226
+ else:
227
+ wf = 2 * np.pi * self.frequency
228
+ self.line.fill_design_properties(
229
+ r_ohm=self.r_spinner.value(), # ohm / km
230
+ x_ohm=self.x_spinner.value(), # ohm / km
231
+ c_nf=self.b_spinner.value() * 1e3 / wf, # nF / km
232
+ length=length, # km
233
+ Imax=self.i_spinner.value(), # KA
234
+ freq=self.frequency, # Hz
235
+ Sbase=self.Sbase, # MVA
236
+ apply_to_profile=self.apply_to_profile.isChecked()
237
+ )
238
+
239
+ self.accept()
221
240
  else:
222
- wf = 2 * np.pi * self.frequency
223
- self.line.fill_design_properties(
224
- r_ohm=self.r_spinner.value(), # ohm / km
225
- x_ohm=self.x_spinner.value(), # ohm / km
226
- c_nf=self.b_spinner.value() * 1e3 / wf, # nF / km
227
- length=self.l_spinner.value(), # km
228
- Imax=self.i_spinner.value(), # KA
229
- freq=self.frequency, # Hz
230
- Sbase=self.Sbase, # MVA
231
- apply_to_profile=self.apply_to_profile.isChecked()
232
- )
233
-
234
- self.accept()
241
+ error_msg(text="The length cannot be 0!", title="Accept line design values")
235
242
 
236
243
  def load_template(self, template: Union[SequenceLineType, OverheadLineType, UndergroundLineType]):
237
244
  """
@@ -181,7 +181,7 @@ class TransformerGraphicItem(LineGraphicTemplateItem):
181
181
  modify_on_accept=True,
182
182
  templates=templates,
183
183
  current_template=current_template)
184
- if dlg.exec_():
184
+ if dlg.exec():
185
185
  pass
186
186
 
187
187
  def edit_tap_changer(self):
@@ -191,7 +191,7 @@ class TransformerGraphicItem(LineGraphicTemplateItem):
191
191
  """
192
192
 
193
193
  dlg = TransformerTapsEditor(api_object=self.api_object.tap_changer)
194
- if dlg.exec_():
194
+ if dlg.exec():
195
195
  pass
196
196
 
197
197
  def show_transformer_editor(self):
@@ -0,0 +1,211 @@
1
+ # GridCal
2
+ # Copyright (C) 2015 - 2024 Santiago Peñate Vera
3
+ #
4
+ # This program is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 3 of the License, or (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public License
15
+ # along with this program; if not, write to the Free Software Foundation,
16
+ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+
18
+ from PySide6.QtCore import Qt
19
+ from PySide6.QtWidgets import QPushButton, QVBoxLayout, QHBoxLayout, QDialog, QLabel, QFrame
20
+ from GridCal.Gui.gui_functions import create_spinbox
21
+ from GridCal.ThirdParty.qdarktheme.qtpy.QtWidgets import QApplication
22
+ from GridCalEngine.Devices.Branches.transformer3w import Transformer3W
23
+ from GridCalEngine.Devices.Substation.bus import Bus
24
+
25
+
26
+ class WindingWidget(QFrame):
27
+ """
28
+ Widget to package the winding editor logic
29
+ """
30
+
31
+ def __init__(self, i: int, V: float, Sn: float, Pcu: float, Vsc: float, bus_to: Bus, Sbase: float):
32
+ """
33
+
34
+ :param i:
35
+ :param V:
36
+ :param Sn:
37
+ :param Pcu:
38
+ :param Vsc:
39
+ :param bus_to:
40
+ :param Sbase:
41
+ """
42
+ QFrame.__init__(self)
43
+
44
+ self.i = i
45
+
46
+ self.Sbase = Sbase
47
+
48
+ self.layout = QVBoxLayout(self)
49
+
50
+ # Vn
51
+ self.vn_spinner = create_spinbox(value=V, minimum=0, maximum=999999, decimals=6)
52
+
53
+ # Sn
54
+ self.sn_spinner = create_spinbox(value=Sn, minimum=0, maximum=999999, decimals=6)
55
+
56
+ # Pcu
57
+ self.pcu_spinner = create_spinbox(value=Pcu, minimum=0, maximum=999999, decimals=6)
58
+
59
+ # Vsc
60
+ self.vsc_spinner = create_spinbox(value=Vsc, minimum=0, maximum=999999, decimals=6)
61
+
62
+ # add all to the GUI
63
+ self.layout.addWidget(QLabel(f"Winding {self.i}"))
64
+
65
+ v_str = f"{bus_to.Vnom} KV" if bus_to is not None else 'Not connected'
66
+ self.layout.addWidget(QLabel(f"Bus voltage: {v_str}"))
67
+
68
+ if i == 1:
69
+ wstr = "1-2"
70
+ elif i == 2:
71
+ wstr = "2-3"
72
+ elif i == 3:
73
+ wstr = "3-1"
74
+ else:
75
+ wstr = ""
76
+
77
+ # spacer
78
+ self.layout.addWidget(QLabel(""))
79
+
80
+ self.layout.addWidget(QLabel(f"V{i}: Nominal voltage [KV]"))
81
+ self.layout.addWidget(self.vn_spinner)
82
+
83
+ self.layout.addWidget(QLabel(f"Sn{i}: Nominal power [MVA]"))
84
+ self.layout.addWidget(self.sn_spinner)
85
+
86
+ self.layout.addWidget(QLabel(f"Pcu {wstr}: Copper losses [kW]"))
87
+ self.layout.addWidget(self.pcu_spinner)
88
+
89
+ self.layout.addWidget(QLabel(f"Vsc {wstr}: Short circuit voltage [%]"))
90
+ self.layout.addWidget(self.vsc_spinner)
91
+
92
+
93
+ class Transformer3WEditor(QDialog):
94
+ """
95
+ TransformerEditor
96
+ """
97
+
98
+ def __init__(self, tr3: Transformer3W, Sbase: float = 100.0, modify_on_accept=True):
99
+ """
100
+ Transformer
101
+ :param tr3:
102
+ :param Sbase:
103
+ """
104
+ super(Transformer3WEditor, self).__init__()
105
+
106
+ # keep pointer to the line object
107
+ self.transformer_obj = tr3
108
+
109
+ self.Sbase = Sbase
110
+
111
+ self.modify_on_accept = modify_on_accept
112
+
113
+ self.selected_template = None
114
+
115
+ self.setObjectName("self")
116
+
117
+ self.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)
118
+
119
+ # main vertical layout
120
+ self.layout = QVBoxLayout(self)
121
+
122
+ # windings horizontal layout
123
+ self.h_layout = QHBoxLayout(self)
124
+ self.w_frame = QFrame(self)
125
+ self.w_frame.setLayout(self.h_layout)
126
+
127
+ # create the windings frames
128
+ self.w1 = WindingWidget(1, V=tr3.V1, Sn=tr3.rate1, Pcu=tr3.Pcu12, Vsc=tr3.Vsc12,
129
+ bus_to=tr3.bus1, Sbase=self.Sbase)
130
+
131
+ self.w2 = WindingWidget(2, V=tr3.V2, Sn=tr3.rate2, Pcu=tr3.Pcu23, Vsc=tr3.Vsc23,
132
+ bus_to=tr3.bus2, Sbase=self.Sbase)
133
+
134
+ self.w3 = WindingWidget(3, V=tr3.V3, Sn=tr3.rate3, Pcu=tr3.Pcu31, Vsc=tr3.Vsc31,
135
+ bus_to=tr3.bus3, Sbase=self.Sbase)
136
+
137
+ self.h_layout.addWidget(self.w1)
138
+ self.h_layout.addWidget(self.w2)
139
+ self.h_layout.addWidget(self.w3)
140
+
141
+ # Pfe
142
+ self.pfe_spinner = create_spinbox(value=0.0, minimum=0, maximum=999999, decimals=6)
143
+
144
+ # I0
145
+ self.I0_spinner = create_spinbox(value=0.0, minimum=0, maximum=999999, decimals=6)
146
+
147
+ # ------------------------------------------------------------------------------------------
148
+ # Set the object values
149
+ # ------------------------------------------------------------------------------------------
150
+
151
+ # accept button
152
+ self.accept_btn = QPushButton()
153
+ self.accept_btn.setText('Accept')
154
+ self.accept_btn.clicked.connect(self.accept_click)
155
+
156
+ self.layout.addWidget(QLabel(f"Name: {tr3.name}"))
157
+ self.layout.addWidget(QLabel(f""))
158
+
159
+ self.layout.addWidget(QLabel("Pfe: Iron losses [kW]"))
160
+ self.layout.addWidget(self.pfe_spinner)
161
+
162
+ self.layout.addWidget(QLabel("I0: No load current [%]"))
163
+ self.layout.addWidget(self.I0_spinner)
164
+
165
+ # compose main layout
166
+ self.layout.addWidget(self.w_frame)
167
+
168
+ self.layout.addWidget(self.accept_btn)
169
+
170
+ self.setLayout(self.layout)
171
+
172
+ self.setWindowTitle('Transformer editor')
173
+
174
+ def accept_click(self):
175
+ """
176
+ Create transformer type and get the impedances
177
+ :return:
178
+ """
179
+
180
+ if self.modify_on_accept:
181
+ self.transformer_obj.fill_from_design_values(V1=self.w1.vn_spinner.value(),
182
+ V2=self.w2.vn_spinner.value(),
183
+ V3=self.w3.vn_spinner.value(),
184
+ Sn1=self.w1.sn_spinner.value(),
185
+ Sn2=self.w2.sn_spinner.value(),
186
+ Sn3=self.w3.sn_spinner.value(),
187
+ Pcu12=self.w1.pcu_spinner.value(),
188
+ Pcu23=self.w2.pcu_spinner.value(),
189
+ Pcu31=self.w3.pcu_spinner.value(),
190
+ Vsc12=self.w1.vsc_spinner.value(),
191
+ Vsc23=self.w2.vsc_spinner.value(),
192
+ Vsc31=self.w3.vsc_spinner.value(),
193
+ Pfe=self.pfe_spinner.value(),
194
+ I0=self.I0_spinner.value(),
195
+ Sbase=self.Sbase)
196
+
197
+ self.accept()
198
+
199
+
200
+ if __name__ == '__main__':
201
+ import sys
202
+ from GridCalEngine.Devices.Substation.bus import Bus
203
+
204
+ app = QApplication(sys.argv)
205
+
206
+ b1 = Bus()
207
+ b2 = Bus()
208
+ b3 = Bus()
209
+ tr3 = Transformer3W(bus1=b1, bus2=b2, bus3=b3)
210
+ editor = Transformer3WEditor(tr3, 100.0)
211
+ editor.exec()
@@ -21,13 +21,17 @@ from PySide6.QtCore import Qt, QPoint
21
21
  from PySide6.QtGui import QPen, QCursor, QColor, QIcon, QPixmap
22
22
  from PySide6.QtWidgets import QGraphicsItem, QGraphicsEllipseItem, QGraphicsRectItem, QMenu, QGraphicsSceneMouseEvent
23
23
 
24
- from GridCalEngine.Devices.Branches.transformer3w import Transformer3W
24
+ from GridCal.Gui.Diagrams.SchematicWidget.Branches.transformer3w_editor import Transformer3WEditor
25
25
  from GridCal.Gui.Diagrams.generic_graphics import ACTIVE, DEACTIVATED
26
26
  from GridCal.Gui.Diagrams.SchematicWidget.terminal_item import RoundTerminalItem
27
27
  from GridCal.Gui.Diagrams.SchematicWidget.Branches.winding_graphics import WindingGraphicItem
28
28
  from GridCal.Gui.messages import yes_no_question
29
+ from GridCalEngine.Devices.Branches.transformer3w import Transformer3W
30
+ from GridCalEngine.enumerations import DeviceType
31
+ from GridCal.Gui.gui_functions import add_menu_entry
29
32
 
30
- if TYPE_CHECKING: # Only imports the below statements during type checking
33
+ if TYPE_CHECKING:
34
+ # Only imports the below statements during type checking
31
35
  from GridCal.Gui.Diagrams.SchematicWidget.schematic_widget import SchematicWidget
32
36
 
33
37
 
@@ -84,11 +88,11 @@ class Transformer3WGraphicItem(QGraphicsRectItem):
84
88
  self.color = ACTIVE['color']
85
89
  self.style = ACTIVE['style']
86
90
 
87
- self.setPen(QPen(Qt.transparent, self.pen_width, self.style))
88
- self.setBrush(Qt.transparent)
91
+ self.setPen(QPen(Qt.GlobalColor.transparent, self.pen_width, self.style))
92
+ self.setBrush(Qt.GlobalColor.transparent)
89
93
  self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable)
90
94
  self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable)
91
- self.setCursor(QCursor(Qt.PointingHandCursor))
95
+ self.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
92
96
 
93
97
  # index
94
98
  self.index = index
@@ -159,9 +163,11 @@ class Transformer3WGraphicItem(QGraphicsRectItem):
159
163
  for i in range(self.n_windings):
160
164
  self.winding_circles[i].setPen(pen)
161
165
  self.terminals[i].setPen(pen)
162
- self.connection_lines[i].recolour_mode()
163
166
 
164
- def set_winding_tool_tips(self):
167
+ if self.connection_lines[i] is not None:
168
+ self.connection_lines[i].recolour_mode()
169
+
170
+ def set_winding_tool_tips(self) -> None:
165
171
  """
166
172
  Set
167
173
  :return:
@@ -170,7 +176,6 @@ class Transformer3WGraphicItem(QGraphicsRectItem):
170
176
  self.winding_circles[0].setToolTip("Winding 1: {0} KV".format(self.api_object.V1))
171
177
  self.winding_circles[1].setToolTip("Winding 2: {0} KV".format(self.api_object.V2))
172
178
  self.winding_circles[2].setToolTip("Winding 3: {0} KV".format(self.api_object.V3))
173
- pass
174
179
 
175
180
  def set_label(self, val: str):
176
181
  """
@@ -208,6 +213,18 @@ class Transformer3WGraphicItem(QGraphicsRectItem):
208
213
  if self.api_object is not None:
209
214
  self.editor.set_editor_model(api_object=self.api_object)
210
215
 
216
+ def mouseDoubleClickEvent(self, event):
217
+ """
218
+ On double click, edit
219
+ :param event:
220
+ :return:
221
+ """
222
+
223
+ if self.api_object is not None:
224
+ if self.api_object.device_type in [DeviceType.Transformer3WDevice]:
225
+ # trigger the editor
226
+ self.edit()
227
+
211
228
  def contextMenuEvent(self, event):
212
229
  """
213
230
  Show context menu
@@ -220,17 +237,21 @@ class Transformer3WGraphicItem(QGraphicsRectItem):
220
237
 
221
238
  # menu.addSeparator()
222
239
 
223
- ra2 = menu.addAction('Delete')
224
- del_icon = QIcon()
225
- del_icon.addPixmap(QPixmap(":/Icons/icons/delete3.svg"))
226
- ra2.setIcon(del_icon)
227
- ra2.triggered.connect(self.remove)
240
+ add_menu_entry(menu=menu,
241
+ text="Edit",
242
+ function_ptr=self.edit,
243
+ icon_path=":/Icons/icons/edit.svg")
244
+
245
+ add_menu_entry(menu=menu,
246
+ text="Delete",
247
+ function_ptr=self.remove,
248
+ icon_path=":/Icons/icons/delete3.svg")
228
249
 
229
250
  menu.exec_(event.screenPos())
230
251
  else:
231
252
  pass
232
253
 
233
- def add_big_marker(self, color=Qt.red, tool_tip_text=""):
254
+ def add_big_marker(self, color=Qt.GlobalColor.red, tool_tip_text=""):
234
255
  """
235
256
  Add a big marker to the bus
236
257
  :param color: Qt Color ot the marker
@@ -350,21 +371,21 @@ class Transformer3WGraphicItem(QGraphicsRectItem):
350
371
  self.api_object.bus1 = None
351
372
  self.api_object.V1 = 0
352
373
  self.connection_lines[0] = None
353
- self.api_object.winding1 = None
374
+ self.api_object.winding1.bus_to = None
354
375
  self.terminals[0].setZValue(-1)
355
376
 
356
377
  elif i == 1:
357
378
  self.api_object.bus2 = None
358
379
  self.api_object.V2 = 0
359
380
  self.connection_lines[1] = None
360
- self.api_object.winding2 = None
381
+ self.api_object.winding2.bus_to = None
361
382
  self.terminals[1].setZValue(-1)
362
383
 
363
384
  elif i == 2:
364
385
  self.api_object.bus3 = None
365
386
  self.api_object.V3 = 0
366
387
  self.connection_lines[2] = None
367
- self.api_object.winding3 = None
388
+ self.api_object.winding3.bus_to = None
368
389
  self.terminals[2].setZValue(-1)
369
390
  else:
370
391
  raise Exception('Unsupported winding index {}'.format(i))
@@ -417,3 +438,13 @@ class Transformer3WGraphicItem(QGraphicsRectItem):
417
438
  if ok:
418
439
  self.delete_all_connections()
419
440
  self.editor.remove_element(device=self.api_object, graphic_object=self)
441
+
442
+ def edit(self):
443
+ """
444
+ Open the appropriate editor dialogue
445
+ :return:
446
+ """
447
+ Sbase = self.editor.circuit.Sbase
448
+ dlg = Transformer3WEditor(self.api_object, Sbase, modify_on_accept=True)
449
+ if dlg.exec():
450
+ pass