GridCal 5.1.50__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.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +45 -38
  2. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +2 -2
  3. GridCal-5.1.51/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_editor.py +211 -0
  4. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +48 -17
  5. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +6 -4
  6. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +32 -21
  7. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/MainWindow.py +213 -176
  8. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +996 -399
  9. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/objects.py +156 -19
  10. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Results/results.py +6 -1
  11. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +4 -4
  12. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +4 -18
  13. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/base_gui.py +1 -0
  14. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/io.py +18 -5
  15. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/simulations.py +13 -23
  16. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/icons_rc.py +11145 -4012
  17. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/system_scaler.py +6 -4
  18. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/associations_model.py +7 -4
  19. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/gui_functions.py +19 -11
  20. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/object_model.py +37 -19
  21. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/results_model.py +28 -5
  22. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/table_view_header_wrap.py +19 -2
  23. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/LICENSE.txt +1 -1
  24. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Session/file_handler.py +7 -3
  25. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Session/session.py +1 -1
  26. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/__version__.py +1 -1
  27. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/plugins.py +3 -16
  28. {GridCal-5.1.50 → GridCal-5.1.51}/PKG-INFO +1 -1
  29. {GridCal-5.1.50 → GridCal-5.1.51}/setup.py +0 -2
  30. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ExecuteGridCal.py +0 -0
  31. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  32. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  33. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  34. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  35. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  36. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  37. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Analysis/__init__.py +0 -0
  38. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Analysis/gui.py +0 -0
  39. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  40. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  41. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  42. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  43. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  44. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  45. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  46. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  47. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  48. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  49. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  50. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  51. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  52. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  53. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  54. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  55. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  56. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  57. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  58. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  59. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  60. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  61. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
  62. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +0 -0
  63. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  64. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  65. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +0 -0
  66. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  67. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +0 -0
  68. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  69. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  70. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  71. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  72. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/gmt_local.py +0 -0
  73. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapbox.py +0 -0
  74. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapquest.py +0 -0
  75. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/open_street_map.py +0 -0
  76. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_toner.py +0 -0
  77. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_transport.py +0 -0
  78. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_watercolor.py +0 -0
  79. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  80. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  81. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  82. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  83. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  84. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  85. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  86. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  87. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +0 -0
  88. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
  89. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  90. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  91. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  92. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  93. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  94. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  95. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  96. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  97. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  98. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  99. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  100. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  101. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  102. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  103. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  104. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  105. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  106. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  107. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  108. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  109. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  110. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  111. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  112. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  113. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  114. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  115. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  116. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  117. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  118. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  119. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  120. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  121. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  122. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  123. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  124. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  125. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/__init__.py +0 -0
  126. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
  127. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  128. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  129. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  130. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  131. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  132. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/gui.py +0 -0
  133. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  134. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  135. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  136. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  137. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  138. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  139. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  140. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  141. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  142. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  143. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  144. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  145. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  146. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  147. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/GridCalMain.py +0 -0
  148. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  149. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  150. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  151. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  152. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  153. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  154. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  155. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  156. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  157. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  158. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  159. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/__init__.py +0 -0
  160. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/object_select_window.py +0 -0
  161. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Main/update_gui_file.py +0 -0
  162. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  163. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  164. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  165. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  166. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  167. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  168. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  169. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  170. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  171. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  172. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  173. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  174. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  175. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  176. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  177. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  178. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  179. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  180. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  181. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  182. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  183. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  184. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  185. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  186. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  187. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  188. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  189. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SubstationDesigner/__init__.py +0 -0
  190. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SubstationDesigner/substation_designer.py +0 -0
  191. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +0 -0
  192. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SubstationDesigner/update_gui_file.py +0 -0
  193. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  194. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  195. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  196. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  197. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  198. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  199. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  200. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  201. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  202. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  203. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  204. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  205. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  206. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  207. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  208. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  209. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  210. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  211. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  212. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  213. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  214. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Visualization/__init__.py +0 -0
  215. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Visualization/visualization.py +0 -0
  216. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Widgets/__init__.py +0 -0
  217. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  218. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  219. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  220. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  221. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  222. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  223. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  224. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/__init__.py +0 -0
  225. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/console_widget.py +0 -0
  226. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/general_dialogues.py +0 -0
  227. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/messages.py +0 -0
  228. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/pandas_model.py +0 -0
  229. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/plot_config.py +0 -0
  230. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/profiles_model.py +0 -0
  231. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/themes.py +0 -0
  232. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/update_gui_all.py +0 -0
  233. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/update_gui_common.py +0 -0
  234. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Gui/wrappable_table_model.py +0 -0
  235. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Session/__init__.py +0 -0
  236. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Session/export_results_driver.py +0 -0
  237. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Session/server_driver.py +0 -0
  238. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/Session/synchronization_driver.py +0 -0
  239. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/__init__.py +0 -0
  240. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  241. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  242. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  243. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  244. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  245. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  246. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  247. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  248. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  249. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  250. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  251. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  252. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  253. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  254. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  255. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  256. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  257. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  258. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  259. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  260. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  261. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  262. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  263. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  264. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  265. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  266. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  267. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  268. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  269. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  270. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  271. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  272. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  273. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  274. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  275. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  276. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  277. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  278. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/__init__.py +0 -0
  279. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/data/__init__.py +0 -0
  280. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/data/cables.csv +0 -0
  281. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/data/sequence_lines.csv +0 -0
  282. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/data/transformers.csv +0 -0
  283. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/data/wires.csv +0 -0
  284. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/templates.py +0 -0
  285. {GridCal-5.1.50 → GridCal-5.1.51}/GridCal/update.py +0 -0
  286. {GridCal-5.1.50 → GridCal-5.1.51}/setup.cfg +0 -0
@@ -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
@@ -51,7 +51,7 @@ class TransformerEditor(QDialog):
51
51
 
52
52
  self.setObjectName("self")
53
53
 
54
- self.setContextMenuPolicy(Qt.NoContextMenu)
54
+ self.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)
55
55
 
56
56
  self.layout = QVBoxLayout(self)
57
57
 
@@ -250,7 +250,9 @@ class TransformerEditor(QDialog):
250
250
  if self.templates is not None:
251
251
 
252
252
  idx = self.catalogue_combo.currentIndex()
253
- template = self.templates[idx]
254
253
 
255
- if isinstance(template, TransformerType):
256
- self.load_template(template)
254
+ if -1 < idx < len(self.templates):
255
+ template = self.templates[idx]
256
+
257
+ if isinstance(template, TransformerType):
258
+ self.load_template(template)
@@ -677,37 +677,39 @@ class SchematicWidget(BaseDiagramWidget):
677
677
  self.add_to_scene(graphic_object=graphic_object)
678
678
 
679
679
  bus_1_graphic = self.graphics_manager.query(elm.bus1)
680
- bus_2_graphic = self.graphics_manager.query(elm.bus2)
681
- bus_3_graphic = self.graphics_manager.query(elm.bus3)
682
680
 
683
- conn1 = WindingGraphicItem(from_port=graphic_object.terminals[0],
684
- to_port=bus_1_graphic.get_terminal(),
685
- editor=self)
681
+ if bus_1_graphic is not None:
682
+ conn1 = WindingGraphicItem(from_port=graphic_object.terminals[0],
683
+ to_port=bus_1_graphic.get_terminal(),
684
+ editor=self)
686
685
 
687
- graphic_object.set_connection(i=0, bus=elm.bus1, conn=conn1, set_voltage=False)
686
+ graphic_object.set_connection(i=0, bus=elm.bus1, conn=conn1, set_voltage=False)
687
+ self.add_to_scene(graphic_object=conn1)
688
+ self.graphics_manager.add_device(elm=elm.winding1, graphic=conn1)
688
689
 
689
- conn2 = WindingGraphicItem(from_port=graphic_object.terminals[1],
690
- to_port=bus_2_graphic.get_terminal(),
691
- editor=self)
692
- graphic_object.set_connection(i=1, bus=elm.bus2, conn=conn2, set_voltage=False)
690
+ bus_2_graphic = self.graphics_manager.query(elm.bus2)
691
+ if bus_2_graphic is not None:
692
+ conn2 = WindingGraphicItem(from_port=graphic_object.terminals[1],
693
+ to_port=bus_2_graphic.get_terminal(),
694
+ editor=self)
695
+ graphic_object.set_connection(i=1, bus=elm.bus2, conn=conn2, set_voltage=False)
696
+ self.add_to_scene(graphic_object=conn2)
697
+ self.graphics_manager.add_device(elm=elm.winding2, graphic=conn2)
693
698
 
694
- conn3 = WindingGraphicItem(from_port=graphic_object.terminals[2],
695
- to_port=bus_3_graphic.get_terminal(),
696
- editor=self)
697
- graphic_object.set_connection(i=2, bus=elm.bus3, conn=conn3, set_voltage=False)
699
+ bus_3_graphic = self.graphics_manager.query(elm.bus3)
700
+ if bus_3_graphic is not None:
701
+ conn3 = WindingGraphicItem(from_port=graphic_object.terminals[2],
702
+ to_port=bus_3_graphic.get_terminal(),
703
+ editor=self)
704
+ graphic_object.set_connection(i=2, bus=elm.bus3, conn=conn3, set_voltage=False)
705
+ self.add_to_scene(graphic_object=conn3)
706
+ self.graphics_manager.add_device(elm=elm.winding3, graphic=conn3)
698
707
 
699
708
  graphic_object.set_position(x=location.x, y=location.y)
700
709
  graphic_object.change_size(h=location.h, w=location.w)
701
710
 
702
- self.add_to_scene(graphic_object=conn1)
703
- self.add_to_scene(graphic_object=conn2)
704
- self.add_to_scene(graphic_object=conn3)
705
-
706
711
  graphic_object.update_conn()
707
712
  self.graphics_manager.add_device(elm=elm, graphic=graphic_object)
708
- self.graphics_manager.add_device(elm=elm.winding1, graphic=conn1)
709
- self.graphics_manager.add_device(elm=elm.winding2, graphic=conn2)
710
- self.graphics_manager.add_device(elm=elm.winding3, graphic=conn3)
711
713
 
712
714
  # register the windings for the branches pass
713
715
  # windings_dict[elm.winding1.idtag] = conn1
@@ -1476,12 +1478,16 @@ class SchematicWidget(BaseDiagramWidget):
1476
1478
 
1477
1479
  if tr3_graphic_object.connection_lines[i] is None:
1478
1480
  winding = tr3_graphic_object.api_object.get_winding(i)
1481
+
1479
1482
  winding_graphics = self.create_winding(
1480
1483
  from_port=self.started_branch.get_terminal_from(),
1481
1484
  to_port=self.started_branch.get_terminal_to(),
1482
1485
  api_object=winding
1483
1486
  )
1484
1487
 
1488
+ if winding not in self.circuit.windings:
1489
+ self.circuit.add_winding(winding)
1490
+
1485
1491
  tr3_graphic_object.set_connection(i=i,
1486
1492
  bus=bus,
1487
1493
  conn=winding_graphics,
@@ -1504,12 +1510,17 @@ class SchematicWidget(BaseDiagramWidget):
1504
1510
  )
1505
1511
 
1506
1512
  if tr3_graphic_object.connection_lines[i] is None:
1513
+
1507
1514
  winding = tr3_graphic_object.api_object.get_winding(i)
1515
+
1508
1516
  winding_graphics = self.create_winding(
1509
1517
  from_port=self.started_branch.get_terminal_from(),
1510
1518
  to_port=self.started_branch.get_terminal_to(),
1511
1519
  api_object=winding)
1512
1520
 
1521
+ if winding not in self.circuit.windings:
1522
+ self.circuit.add_winding(winding)
1523
+
1513
1524
  tr3_graphic_object.set_connection(i=i,
1514
1525
  bus=bus,
1515
1526
  conn=winding_graphics,