GridCal 5.1.20__tar.gz → 5.1.22__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 (284) hide show
  1. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ExecuteGridCal.py +12 -10
  2. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +19 -39
  3. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +4 -1
  4. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +16 -39
  5. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +46 -27
  6. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +33 -5
  7. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +4 -2
  8. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +5 -1
  9. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +91 -46
  10. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +35 -21
  11. GridCal-5.1.22/GridCal/Gui/Diagrams/MapWidget/new_line_dialogue.py +125 -0
  12. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +27 -1
  13. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +8 -4
  14. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +29 -1
  15. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +29 -0
  16. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +55 -28
  17. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/diagrams_model.py +9 -8
  18. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/GuiFunctions.py +27 -15
  19. GridCal-5.1.22/GridCal/Gui/LoadCatalogue/SelectComponents.py +134 -0
  20. GridCal-5.1.22/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +106 -0
  21. GridCal-5.1.22/GridCal/Gui/LoadCatalogue/icons_rc.py +324 -0
  22. GridCal-5.1.22/GridCal/Gui/LoadCatalogue/update_gui_file.py +9 -0
  23. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/GridCalMain.py +5 -1
  24. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/MainWindow.py +1673 -1393
  25. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +25 -10
  26. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +68 -30
  27. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Model/objects.py +19 -6
  28. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Results/results.py +4 -1
  29. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +3 -3
  30. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +39 -7
  31. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/base_gui.py +39 -25
  32. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/io.py +181 -82
  33. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/simulations.py +52 -86
  34. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/icons_rc.py +1254 -759
  35. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +1 -0
  36. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/associations_model.py +19 -2
  37. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/object_model.py +21 -1
  38. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/pandas_model.py +20 -0
  39. GridCal-5.1.22/GridCal/Gui/plugins.py +221 -0
  40. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/profiles_model.py +21 -0
  41. GridCal-5.1.22/GridCal/Gui/table_view_header_wrap.py +84 -0
  42. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Session/file_handler.py +9 -2
  43. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Session/results_model.py +20 -0
  44. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Session/server_driver.py +73 -14
  45. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +1 -1
  46. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/__version__.py +1 -1
  47. GridCal-5.1.22/GridCal/data/__init__.py +0 -0
  48. GridCal-5.1.22/GridCal/templates.py +87 -0
  49. {GridCal-5.1.20 → GridCal-5.1.22}/PKG-INFO +1 -1
  50. GridCal-5.1.20/GridCal/Gui/Diagrams/MapWidget/logger.py +0 -4
  51. GridCal-5.1.20/GridCal/templates.py +0 -156
  52. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  53. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  54. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  55. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  56. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  57. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  58. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Analysis/__init__.py +0 -0
  59. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Analysis/gui.py +0 -0
  60. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  61. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  62. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  63. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  64. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  65. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  66. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  67. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ConsoleWidget.py +0 -0
  68. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  69. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  70. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  71. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  72. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  73. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  74. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  75. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  76. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  77. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  78. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  79. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  80. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  81. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  82. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  83. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  84. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  85. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/__init__.py +0 -0
  86. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/blue_marble.py +0 -0
  87. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/cartodb.py +0 -0
  88. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/gmt_local.py +0 -0
  89. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/mapbox.py +0 -0
  90. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/mapquest.py +0 -0
  91. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/open_street_map.py +0 -0
  92. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_toner.py +0 -0
  93. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_transport.py +0 -0
  94. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_watercolor.py +0 -0
  95. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  96. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  97. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  98. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  99. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  100. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  101. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/map_events.py +0 -0
  102. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/MapWidget/node_widget.py +0 -0
  103. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  104. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  105. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  106. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  107. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  108. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  109. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  110. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  111. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  112. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  113. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  114. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  115. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  116. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  117. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  118. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  119. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  120. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  121. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  122. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  123. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  124. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  125. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  126. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  127. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  128. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  129. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  130. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  131. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  132. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  133. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  134. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  135. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  136. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  137. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  138. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  139. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/__init__.py +0 -0
  140. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
  141. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  142. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  143. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/GeneralDialogues.py +0 -0
  144. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  145. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  146. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/GridGenerator/gui.py +0 -0
  147. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  148. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  149. {GridCal-5.1.20/GridCal/Gui/LoadDesigner → GridCal-5.1.22/GridCal/Gui/LoadCatalogue}/__init__.py +0 -0
  150. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Model → GridCal-5.1.22/GridCal/Gui/LoadDesigner}/__init__.py +0 -0
  151. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  152. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  153. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  154. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  155. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  156. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  157. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Results → GridCal-5.1.22/GridCal/Gui/Main/SubClasses/Model}/__init__.py +0 -0
  158. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  159. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  160. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Scripting → GridCal-5.1.22/GridCal/Gui/Main/SubClasses/Results}/__init__.py +0 -0
  161. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Server → GridCal-5.1.22/GridCal/Gui/Main/SubClasses/Scripting}/__init__.py +0 -0
  162. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  163. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Settings → GridCal-5.1.22/GridCal/Gui/Main/SubClasses/Server}/__init__.py +0 -0
  164. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  165. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses → GridCal-5.1.22/GridCal/Gui/Main/SubClasses/Settings}/__init__.py +0 -0
  166. {GridCal-5.1.20/GridCal/Gui/Main → GridCal-5.1.22/GridCal/Gui/Main/SubClasses}/__init__.py +0 -0
  167. {GridCal-5.1.20/GridCal/Gui/ProfilesInput → GridCal-5.1.22/GridCal/Gui/Main}/__init__.py +0 -0
  168. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/object_select_window.py +0 -0
  169. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Main/update_gui_file.py +0 -0
  170. {GridCal-5.1.20/GridCal/Gui/RosetaExplorer → GridCal-5.1.22/GridCal/Gui/ProfilesInput}/__init__.py +0 -0
  171. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  172. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  173. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  174. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  175. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  176. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  177. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  178. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  179. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  180. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  181. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  182. {GridCal-5.1.20/GridCal/Gui/SigmaAnalysis → GridCal-5.1.22/GridCal/Gui/RosetaExplorer}/__init__.py +0 -0
  183. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  184. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  185. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  186. {GridCal-5.1.20/GridCal/Gui/SolarPowerWizard → GridCal-5.1.22/GridCal/Gui/SigmaAnalysis}/__init__.py +0 -0
  187. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  188. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  189. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  190. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  191. {GridCal-5.1.20/GridCal/Gui/SyncDialogue → GridCal-5.1.22/GridCal/Gui/SolarPowerWizard}/__init__.py +0 -0
  192. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  193. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  194. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  195. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  196. {GridCal-5.1.20/GridCal/Gui/SystemScaler → GridCal-5.1.22/GridCal/Gui/SyncDialogue}/__init__.py +0 -0
  197. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  198. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  199. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  200. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  201. {GridCal-5.1.20/GridCal/Gui/TowerBuilder → GridCal-5.1.22/GridCal/Gui/SystemScaler}/__init__.py +0 -0
  202. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  203. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  204. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  205. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  206. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  207. {GridCal-5.1.20/GridCal/Gui/TreeModelViewer → GridCal-5.1.22/GridCal/Gui/TowerBuilder}/__init__.py +0 -0
  208. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  209. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  210. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  211. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  212. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  213. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  214. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  215. {GridCal-5.1.20/GridCal/Gui/Visualization → GridCal-5.1.22/GridCal/Gui/TreeModelViewer}/__init__.py +0 -0
  216. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  217. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  218. {GridCal-5.1.20/GridCal/Gui/Widgets → GridCal-5.1.22/GridCal/Gui/Visualization}/__init__.py +0 -0
  219. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Visualization/visualization.py +0 -0
  220. {GridCal-5.1.20/GridCal/Gui/WindPowerWizard → GridCal-5.1.22/GridCal/Gui/Widgets}/__init__.py +0 -0
  221. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  222. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  223. {GridCal-5.1.20/GridCal/Gui → GridCal-5.1.22/GridCal/Gui/WindPowerWizard}/__init__.py +0 -0
  224. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  225. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  226. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  227. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  228. {GridCal-5.1.20/GridCal/Session → GridCal-5.1.22/GridCal/Gui}/__init__.py +0 -0
  229. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/messages.py +0 -0
  230. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/plot_config.py +0 -0
  231. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/themes.py +0 -0
  232. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/update_gui_all.py +0 -0
  233. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Gui/update_gui_common.py +0 -0
  234. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/LICENSE.txt +0 -0
  235. {GridCal-5.1.20/GridCal/ThirdParty → GridCal-5.1.22/GridCal/Session}/__init__.py +0 -0
  236. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Session/export_results_driver.py +0 -0
  237. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Session/session.py +0 -0
  238. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/Session/synchronization_driver.py +0 -0
  239. {GridCal-5.1.20/GridCal/ThirdParty/qdarktheme/_icon → GridCal-5.1.22/GridCal/ThirdParty}/__init__.py +0 -0
  240. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  241. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  242. {GridCal-5.1.20/GridCal/ThirdParty/qdarktheme/_template → GridCal-5.1.22/GridCal/ThirdParty/qdarktheme/_icon}/__init__.py +0 -0
  243. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  244. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  245. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  246. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  247. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  248. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  249. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  250. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  251. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  252. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  253. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  254. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  255. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  256. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  257. {GridCal-5.1.20/GridCal/data → GridCal-5.1.22/GridCal/ThirdParty/qdarktheme/_template}/__init__.py +0 -0
  258. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  259. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  260. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  261. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  262. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  263. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  264. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  265. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  266. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  267. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  268. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  269. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  270. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  271. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  272. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  273. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  274. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  275. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  276. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  277. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/__init__.py +0 -0
  278. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/data/cables.csv +0 -0
  279. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/data/sequence_lines.csv +0 -0
  280. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/data/transformers.csv +0 -0
  281. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/data/wires.csv +0 -0
  282. {GridCal-5.1.20 → GridCal-5.1.22}/GridCal/update.py +0 -0
  283. {GridCal-5.1.20 → GridCal-5.1.22}/setup.cfg +0 -0
  284. {GridCal-5.1.20 → GridCal-5.1.22}/setup.py +0 -0
@@ -1,17 +1,19 @@
1
- # This file is part of GridCal.
1
+ # GridCal
2
+ # Copyright (C) 2015 - 2024 Santiago Peñate Vera
2
3
  #
3
- # GridCal is free software: you can redistribute it and/or modify
4
- # it under the terms of the GNU General Public License as published by
5
- # the Free Software Foundation, either version 3 of the License, or
6
- # (at your option) any later version.
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.
7
8
  #
8
- # GridCal is distributed in the hope that it will be useful,
9
+ # This program is distributed in the hope that it will be useful,
9
10
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- # GNU General Public License for more details.
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
12
13
  #
13
- # You should have received a copy of the GNU General Public License
14
- # along with GridCal. If not, see <http://www.gnu.org/licenses/>.
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.
15
17
  import os
16
18
  import sys
17
19
  import ctypes
@@ -15,6 +15,8 @@
15
15
  # along with this program; if not, write to the Free Software Foundation,
16
16
  # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
  from __future__ import annotations
18
+
19
+ # import uuid
18
20
  from typing import TYPE_CHECKING, List, Union
19
21
 
20
22
  import logging
@@ -28,6 +30,7 @@ from GridCalEngine.Devices.types import BRANCH_TYPES, FluidPath
28
30
  from GridCalEngine.Devices.Branches.line import Line
29
31
  from GridCalEngine.enumerations import DeviceType
30
32
  from GridCal.Gui.Diagrams.generic_graphics import GenericDiagramWidget
33
+ from GridCal.Gui.messages import error_msg
31
34
 
32
35
  if TYPE_CHECKING:
33
36
  from GridCal.Gui.Diagrams.MapWidget.Substation.node_graphic_item import NodeGraphicItem
@@ -56,12 +59,12 @@ class MapLineContainer(GenericDiagramWidget):
56
59
  editor=editor,
57
60
  draw_labels=draw_labels)
58
61
 
59
- self.editor: GridMapWidget = editor # re assign to make clear the editor type
62
+ self.editor: GridMapWidget = editor # reassign to make clear the editor type
60
63
 
61
64
  self.nodes_list: List[NodeGraphicItem] = list()
62
65
  self.segments_list: List[MapLineSegment] = list()
63
66
  self.enabled = True
64
- self.original = True
67
+ self.original = True # TODO: Que es esto?
65
68
 
66
69
  def setWidthScale(self, val: float):
67
70
  """
@@ -158,39 +161,15 @@ class MapLineContainer(GenericDiagramWidget):
158
161
  """
159
162
  self.clean()
160
163
 
161
- diagram_locations: PointsGroup = self.editor.diagram.data.get(DeviceType.LineLocation.value, None)
162
-
163
164
  # draw line locations
164
165
  for elm in self.api_object.locations.data:
166
+ graphic_obj = self.editor.create_node(line_container=self,
167
+ api_object=elm,
168
+ lat=elm.lat, # 42.0 ...
169
+ lon=elm.long,
170
+ index=self.number_of_nodes()) # 2.7 ...
165
171
 
166
- if diagram_locations is None:
167
- # no locations found, use the data from the api object
168
- # lat = elm.lat
169
- # lon = elm.long
170
- pass
171
- else:
172
-
173
- # try to get location from the diagram
174
- # We will not take the location of the element in the database because we want to keep...
175
- # ... the diagram separated from database
176
- # diagram_location = diagram_locations.locations.get(elm.idtag, None)
177
-
178
- # if diagram_location is None:
179
- # # no particular location found, use the data from the api object
180
- # # lat = elm.lat
181
- # # lon = elm.long
182
- # pass
183
- # else:
184
- # # Draw only what's on the diagram
185
- # # diagram data found, use it
186
-
187
- graphic_obj = self.editor.create_node(line_container=self,
188
- api_object=elm,
189
- lat=elm.lat, # 42.0 ...
190
- lon=elm.long,
191
- index=self.number_of_nodes()) # 2.7 ...
192
-
193
- self.register_new_node(node=graphic_obj)
172
+ self.register_new_node(node=graphic_obj)
194
173
 
195
174
  # second pass: create the segments
196
175
  self.redraw_segments()
@@ -206,6 +185,7 @@ class MapLineContainer(GenericDiagramWidget):
206
185
  self.editor.map.diagram_scene.removeItem(seg)
207
186
 
208
187
  self.nodes_list.remove(node)
188
+ self.api_object.locations.remove(node.api_object)
209
189
 
210
190
  for nod in self.nodes_list:
211
191
  if nod.index > node.index:
@@ -291,7 +271,7 @@ class MapLineContainer(GenericDiagramWidget):
291
271
  z=new_api_node_data.alt,
292
272
  seq=new_api_node_data.seq,
293
273
  name=new_api_node_data.name,
294
- idtag=new_api_node_data.idtag,
274
+ idtag=None, # generates new UUID
295
275
  code=new_api_node_data.code)
296
276
 
297
277
  self.api_object.locations.data.insert(index, new_api_object)
@@ -434,11 +414,11 @@ class MapLineContainer(GenericDiagramWidget):
434
414
  if 0 < index < len(self.api_object.locations.data) and len(self.api_object.locations.data) > 3:
435
415
 
436
416
  ln1 = Line()
437
- ln1.copyData(self.api_object)
417
+ ln1.set_data_from(self.api_object)
438
418
  # ln1 = self.api_object.copy()
439
419
 
440
420
  ln2 = Line()
441
- ln2.copyData(self.api_object)
421
+ ln2.set_data_from(self.api_object)
442
422
 
443
423
  first_list = self.api_object.locations.data[:index]
444
424
  second_list = self.api_object.locations.data[index:]
@@ -457,6 +437,9 @@ class MapLineContainer(GenericDiagramWidget):
457
437
  api_obj.long = self.nodes_list[idx].lon
458
438
  idx = idx + 1
459
439
 
440
+ ln1.bus_from = self.api_object.bus_from
441
+ ln2.bus_to = self.api_object.bus_to
442
+
460
443
  l1 = self.editor.add_api_line(ln1, original=False)
461
444
  l2 = self.editor.add_api_line(ln2, original=False)
462
445
 
@@ -465,10 +448,7 @@ class MapLineContainer(GenericDiagramWidget):
465
448
  return first_list, second_list
466
449
  else:
467
450
  # Handle invalid index
468
- raise ValueError("Index out of range or invalid")
469
-
470
- def merge_line(self):
471
- return 0
451
+ error_msg("Index out of range or invalid", "split line")
472
452
 
473
453
  def disable_line(self):
474
454
  """
@@ -335,7 +335,10 @@ class MapLineSegment(QGraphicsLineItem):
335
335
  elif self.second == self.container.substation_from() or self.first == self.container.substation_from():
336
336
  self.container.insert_new_node_at_position(0)
337
337
  else:
338
- self.container.insert_new_node_at_position(self.first.index)
338
+ if self.first.index > self.second.index:
339
+ self.container.insert_new_node_at_position(self.second.index)
340
+ elif self.first.index < self.second.index:
341
+ self.container.insert_new_node_at_position(self.second.index)
339
342
 
340
343
  # TODO implement
341
344
  # self.editor.split_line(line_graphics=self)
@@ -79,7 +79,7 @@ class NodeGraphicItem(QtWidgets.QGraphicsRectItem, NodeTemplate):
79
79
  # self.api_object: LineLocation = api_object
80
80
  self.index = index
81
81
 
82
- self.resize(r)
82
+ self.resize(r * 10)
83
83
  self.setAcceptHoverEvents(True) # Enable hover events for the item
84
84
  self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsMovable) # Allow moving the node
85
85
  self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsSelectable) # Allow selecting the node
@@ -88,7 +88,6 @@ class NodeGraphicItem(QtWidgets.QGraphicsRectItem, NodeTemplate):
88
88
 
89
89
  self.hovered = False
90
90
  self.enabled = True
91
- self.itemSelected = False
92
91
 
93
92
  # Create a pen with reduced line width
94
93
  self.change_pen_width(0.001)
@@ -173,13 +172,13 @@ class NodeGraphicItem(QtWidgets.QGraphicsRectItem, NodeTemplate):
173
172
  Event handler for mouse press events.
174
173
  """
175
174
  super().mousePressEvent(event)
176
-
175
+ selected_items = self.editor.map.view._scene.selectedItems()
176
+ if len(selected_items) < 2:
177
+ self.setSelected(True)
177
178
  if self.enabled:
178
179
  self.editor.map.view.disableMove = True
179
180
  if event.button() == Qt.RightButton:
180
181
  pass
181
- elif event.button() == Qt.LeftButton:
182
- self.selectItem()
183
182
 
184
183
  def mouseReleaseEvent(self, event):
185
184
  """
@@ -190,11 +189,15 @@ class NodeGraphicItem(QtWidgets.QGraphicsRectItem, NodeTemplate):
190
189
  self.updateDiagram()
191
190
  self.editor.map.view._scene.update()
192
191
 
192
+ selected_items = self.editor.map.view._scene.selectedItems()
193
+ if len(selected_items) < 2:
194
+ self.setSelected(True)
195
+
193
196
  def hoverEnterEvent(self, event: QtWidgets.QGraphicsSceneHoverEvent) -> None:
194
197
  """
195
198
  Event handler for when the mouse enters the item.
196
199
  """
197
- self.editor.inItem = True
200
+ self.editor.map.view.inItem = True
198
201
  self.hovered = True
199
202
  self.setNodeColor(QColor(Qt.red), QColor(Qt.red))
200
203
  QApplication.instance().setOverrideCursor(Qt.PointingHandCursor)
@@ -203,7 +206,7 @@ class NodeGraphicItem(QtWidgets.QGraphicsRectItem, NodeTemplate):
203
206
  """
204
207
  Event handler for when the mouse leaves the item.
205
208
  """
206
- self.editor.inItem = False
209
+ self.editor.map.view.inItem = False
207
210
  self.hovered = False
208
211
  self.setDefaultColor()
209
212
  QApplication.instance().restoreOverrideCursor()
@@ -217,45 +220,22 @@ class NodeGraphicItem(QtWidgets.QGraphicsRectItem, NodeTemplate):
217
220
  menu = QMenu()
218
221
 
219
222
  add_menu_entry(menu=menu,
220
- text="Add",
223
+ text="Merge",
221
224
  icon_path="",
222
- function_ptr=self.AddFunction)
225
+ function_ptr=self.MergeFunction)
223
226
 
224
227
  add_menu_entry(menu=menu,
225
228
  text="Split",
226
- icon_path="",
229
+ icon_path=":/Icons/icons/divide.svg",
227
230
  function_ptr=self.SplitFunction)
228
231
 
229
232
  add_menu_entry(menu=menu,
230
- text="Merge",
231
- icon_path="",
232
- function_ptr=self.MergeFunction)
233
-
234
- add_menu_entry(menu=menu,
235
- text="Remove",
236
- icon_path="",
233
+ text="Delete",
234
+ icon_path=":/Icons/icons/delete.svg",
237
235
  function_ptr=self.RemoveFunction)
238
236
 
239
237
  menu.exec_(event.screenPos())
240
238
 
241
- def selectItem(self):
242
- """
243
-
244
- :return:
245
- """
246
- if not self.itemSelected:
247
- self.editor.map.view.selectedItems.append(self)
248
- self.setNodeColor(QColor(Qt.yellow), QColor(Qt.yellow))
249
- self.itemSelected = True
250
-
251
- def deSelectItem(self):
252
- """
253
-
254
- :return:
255
- """
256
- self.itemSelected = False
257
- self.setDefaultColor()
258
-
259
239
  def AddFunction(self):
260
240
  """
261
241
 
@@ -312,10 +292,7 @@ class NodeGraphicItem(QtWidgets.QGraphicsRectItem, NodeTemplate):
312
292
  :return:
313
293
  """
314
294
  # Example: color assignment
315
- if self.itemSelected:
316
- self.setNodeColor(QColor(Qt.yellow), QColor(Qt.yellow))
317
- else:
318
- self.setNodeColor(self.colorInner, self.colorBorder)
295
+ self.setNodeColor(self.colorInner, self.colorBorder)
319
296
 
320
297
  def getPos(self) -> QPointF:
321
298
  """
@@ -18,13 +18,15 @@ from __future__ import annotations
18
18
  from typing import List, TYPE_CHECKING, Tuple
19
19
  from PySide6 import QtWidgets
20
20
  from PySide6.QtWidgets import (QApplication, QMenu, QGraphicsSceneContextMenuEvent, QGraphicsSceneMouseEvent,
21
- QGraphicsRectItem, QGraphicsEllipseItem)
22
- from PySide6.QtCore import Qt, QPointF, QPoint
21
+ QGraphicsRectItem)
22
+ from PySide6.QtCore import Qt, QPointF
23
23
  from PySide6.QtGui import QBrush, QColor, QCursor
24
24
  from GridCal.Gui.Diagrams.MapWidget.Substation.node_template import NodeTemplate
25
25
  from GridCal.Gui.GuiFunctions import add_menu_entry
26
26
  from GridCal.Gui.messages import yes_no_question
27
27
  from GridCal.Gui.GeneralDialogues import InputNumberDialogue
28
+
29
+ from GridCalEngine.Devices.Substation.bus import Bus
28
30
  from GridCalEngine.Devices import VoltageLevel
29
31
  from GridCalEngine.Devices.Substation.substation import Substation
30
32
  from GridCalEngine.enumerations import DeviceType
@@ -69,7 +71,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
69
71
  lon=lon)
70
72
 
71
73
  self.line_container = None
72
- self.editor: GridMapWidget = editor # re assign for the types to be clear
74
+ self.editor: GridMapWidget = editor # reassign for the types to be clear
73
75
  self.api_object: Substation = api_object
74
76
 
75
77
  self.lat = lat
@@ -86,7 +88,9 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
86
88
  # self.resize(r)
87
89
  self.setAcceptHoverEvents(True) # Enable hover events for the item
88
90
  # self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsMovable) # Allow moving the node
89
- self.setFlag(self.GraphicsItemFlag.ItemIsSelectable) # Allow selecting the node
91
+ self.setFlag(
92
+ self.GraphicsItemFlag.ItemIsSelectable | QGraphicsRectItem.ItemIsMovable) # Allow selecting the node
93
+
90
94
  self.setCursor(QCursor(Qt.PointingHandCursor))
91
95
 
92
96
  # Create a pen with reduced line width
@@ -134,25 +138,15 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
134
138
  for i, vl_graphics in enumerate(sorted_objects):
135
139
  vl_graphics.setZValue(i)
136
140
 
137
- def updatePosition(self) -> None:
138
- """
139
-
140
- :return:
141
- """
142
- real_position = self.pos()
143
- center_point = self.getPos()
144
- # self.x = center_point.x() + real_position.x()
145
- # self.y = center_point.y() + real_position.y()
146
- self.needsUpdate = True
147
-
148
- def updateDiagram(self):
141
+ def update_diagram(self):
149
142
  """
150
-
143
+ Updates the element position in the diagram (to save)
151
144
  :return:
152
145
  """
153
146
  lat, long = self.editor.to_lat_lon(self.rect().x(), self.rect().y())
154
147
 
155
- # print(f'Updating SE position id:{self.api_object.idtag}, lat:{lat}, lon:{long}')
148
+ self.lat = lat
149
+ self.lon = long
156
150
 
157
151
  self.editor.update_diagram_element(device=self.api_object,
158
152
  latitude=lat,
@@ -161,8 +155,8 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
161
155
 
162
156
  def get_center_pos(self) -> QPointF:
163
157
  """
164
-
165
- :return:
158
+ Get the center position
159
+ :return: QPointF
166
160
  """
167
161
  x = self.rect().x() + self.rect().width() / 2
168
162
  y = self.rect().y() + self.rect().height() / 2
@@ -184,17 +178,20 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
184
178
  for vl_graphics in self.voltage_level_graphics:
185
179
  vl_graphics.center_on_substation()
186
180
 
187
- self.updateDiagram() # always update
181
+ self.update_diagram() # always update
188
182
 
189
183
  def mousePressEvent(self, event: QGraphicsSceneMouseEvent):
190
184
  """
191
185
  Event handler for mouse press events.
192
186
  """
193
187
  super().mousePressEvent(event)
188
+ # selected_items = self.editor.map.view.selected_items()
189
+ # if len(selected_items) < 2:
190
+ self.setSelected(True)
191
+
194
192
  event.setAccepted(True)
195
193
  self.editor.map.view.disableMove = True
196
194
 
197
- print("SE mouse press")
198
195
  if self.api_object is not None:
199
196
  self.editor.set_editor_model(api_object=self.api_object,
200
197
  dictionary_of_lists={
@@ -212,13 +209,14 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
212
209
  """
213
210
  # super().mouseReleaseEvent(event)
214
211
  self.editor.disableMove = True
215
- self.updateDiagram() # always update
212
+ self.update_diagram() # always update
216
213
  print("SE mouse release")
217
214
 
218
215
  def hoverEnterEvent(self, event: QtWidgets.QGraphicsSceneHoverEvent) -> None:
219
216
  """
220
217
  Event handler for when the mouse enters the item.
221
218
  """
219
+ self.editor.map.view.inItem = True
222
220
  self.setNodeColor(QColor(Qt.red), QColor(Qt.red))
223
221
  self.hovered = True
224
222
  QApplication.instance().setOverrideCursor(Qt.PointingHandCursor)
@@ -227,6 +225,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
227
225
  """
228
226
  Event handler for when the mouse leaves the item.
229
227
  """
228
+ self.editor.map.view.inItem = False
230
229
  self.hovered = False
231
230
  self.setDefaultColor()
232
231
  QApplication.instance().restoreOverrideCursor()
@@ -243,6 +242,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
243
242
  icon_path="",
244
243
  function_ptr=self.add_voltage_level)
245
244
 
245
+ add_menu_entry(menu=menu,
246
+ text="Create line from here",
247
+ icon_path="",
248
+ function_ptr=self.create_new_line)
249
+
246
250
  add_menu_entry(menu=menu,
247
251
  text="Move to API coordinates",
248
252
  icon_path="",
@@ -265,6 +269,12 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
265
269
 
266
270
  menu.exec_(event.screenPos())
267
271
 
272
+ def create_new_line(self):
273
+ """
274
+ Create a new line in the map wizard
275
+ """
276
+ self.editor.create_new_line_wizard()
277
+
268
278
  def add_function(self):
269
279
  """
270
280
 
@@ -281,9 +291,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
281
291
 
282
292
  for idtag, graphic_object in dev_dict.items():
283
293
  substation_from_graphics = self.editor.graphics_manager.query(
284
- elm=graphic_object.api_object.get_substation_from())
294
+ elm=graphic_object.api_object.get_substation_from()
295
+ )
285
296
  substation_to_graphics = self.editor.graphics_manager.query(
286
- elm=graphic_object.api_object.get_substation_to())
297
+ elm=graphic_object.api_object.get_substation_to()
298
+ )
287
299
  lines_info.append((idtag, graphic_object, substation_from_graphics, substation_to_graphics))
288
300
 
289
301
  # Now, iterate over the collected information
@@ -296,7 +308,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
296
308
 
297
309
  pass
298
310
 
299
- def remove_function(self):
311
+ def remove_function(self) -> None:
300
312
  """
301
313
  Function to be called when Action 1 is selected.
302
314
  """
@@ -333,7 +345,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
333
345
  inpt = InputNumberDialogue(
334
346
  min_value=1.0,
335
347
  max_value=100000.0,
336
- default_value=1.0,
348
+ default_value=self.editor.diagram.default_bus_voltage,
337
349
  title="Add voltage level",
338
350
  text="Voltage (kV)",
339
351
  )
@@ -346,7 +358,14 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
346
358
  Vnom=kv,
347
359
  substation=self.api_object)
348
360
 
361
+ bus = Bus(name=f"Bus {self.api_object.name}",
362
+ Vnom=kv,
363
+ substation=self.api_object,
364
+ voltage_level=vl)
365
+
349
366
  self.editor.circuit.add_voltage_level(vl)
367
+ self.editor.circuit.add_bus(obj=bus)
368
+
350
369
  self.editor.add_api_voltage_level(substation_graphics=self,
351
370
  api_object=vl)
352
371
 
@@ -19,10 +19,13 @@ from typing import TYPE_CHECKING
19
19
  from PySide6 import QtWidgets
20
20
  from PySide6.QtCore import Qt, QPointF
21
21
  from PySide6.QtGui import QBrush, QColor
22
- from PySide6.QtWidgets import QGraphicsSceneMouseEvent, QGraphicsEllipseItem
22
+ from PySide6.QtWidgets import (QMenu, QGraphicsSceneContextMenuEvent, QGraphicsSceneMouseEvent, QGraphicsEllipseItem)
23
+
23
24
  from GridCal.Gui.Diagrams.generic_graphics import GenericDiagramWidget
25
+ from GridCal.Gui.GuiFunctions import add_menu_entry
24
26
 
25
27
  from GridCalEngine.Devices.Substation.voltage_level import VoltageLevel
28
+ from GridCalEngine.Devices.Substation.bus import Bus
26
29
  from GridCalEngine.enumerations import DeviceType
27
30
 
28
31
  if TYPE_CHECKING: # Only imports the below statements during type checking
@@ -61,19 +64,21 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
61
64
  api_object=api_object,
62
65
  editor=editor,
63
66
  draw_labels=draw_labels)
64
- QGraphicsEllipseItem.__init__(self, parent_center.x(), parent_center.y(), r * api_object.Vnom, r * api_object.Vnom, parent)
67
+ QGraphicsEllipseItem.__init__(self, parent_center.x(), parent_center.y(), r * api_object.Vnom * 0.01,
68
+ r * api_object.Vnom * 0.01, parent)
65
69
 
66
70
  parent.register_voltage_level(vl=self)
67
71
 
68
72
  self.editor: GridMapWidget = editor # to reinforce the type
69
73
  self.api_object: VoltageLevel = api_object # to reinforce the type
70
74
 
71
- self.radius = r * api_object.Vnom
72
- print(f"VL created at x:{parent_center.x()}, y:{parent_center.y()}")
75
+ self.radius = r * api_object.Vnom * 0.01
76
+ # print(f"VL created at x:{parent_center.x()}, y:{parent_center.y()}")
73
77
 
74
78
  self.setAcceptHoverEvents(True) # Enable hover events for the item
75
79
  # self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsMovable) # Allow moving the node
76
- self.setFlag(self.GraphicsItemFlag.ItemIsSelectable | self.GraphicsItemFlag.ItemIsMovable) # Allow selecting the node
80
+ self.setFlag(
81
+ self.GraphicsItemFlag.ItemIsSelectable | self.GraphicsItemFlag.ItemIsMovable) # Allow selecting the node
77
82
 
78
83
  # Create a pen with reduced line width
79
84
  self.change_pen_width(0.5)
@@ -169,6 +174,18 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
169
174
  self.hovered = False
170
175
  self.setNodeColor(self.colorInner, self.colorBorder)
171
176
 
177
+ def contextMenuEvent(self, event: QGraphicsSceneContextMenuEvent):
178
+ """
179
+
180
+ :param event:
181
+ """
182
+ menu = QMenu()
183
+
184
+ add_menu_entry(menu=menu,
185
+ text="Add bus",
186
+ icon_path="",
187
+ function_ptr=self.add_bus)
188
+
172
189
  def setNodeColor(self, inner_color: QColor = None, border_color: QColor = None) -> None:
173
190
  """
174
191
 
@@ -206,3 +223,14 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
206
223
  pen = self.pen()
207
224
  pen.setWidth(width)
208
225
  self.setPen(pen)
226
+
227
+ def add_bus(self):
228
+ """
229
+ Add bus
230
+ """
231
+ bus = Bus(name=f"Bus {self.api_object.name}",
232
+ Vnom=self.api_object.Vnom,
233
+ substation=self.parent.api_object,
234
+ voltage_level=self.api_object)
235
+
236
+ self.editor.circuit.add_bus(obj=bus)
@@ -10,14 +10,16 @@ from urllib import request
10
10
  from collections.abc import Callable
11
11
  from PySide6.QtGui import QPixmap
12
12
  from PySide6.QtCore import QThread
13
- from GridCal.Gui.Diagrams.MapWidget.logger import log
14
-
15
13
 
16
14
  # SSL magic to solve the certificates hell
17
15
  # https://stackoverflow.com/questions/68275857/urllib-error-urlerror-urlopen-error-ssl-certificate-verify-failed-certifica
18
16
  ssl._create_default_https_context = ssl._create_stdlib_context
19
17
 
20
18
 
19
+ def log(val: str):
20
+ print(val)
21
+
22
+
21
23
  class TileWorker(QThread):
22
24
  """Thread class that gets request from queue, loads tile, calls callback."""
23
25
 
@@ -18,7 +18,11 @@ from typing import List, Union
18
18
  from collections.abc import Callable
19
19
  from GridCal.Gui.Diagrams.MapWidget.Tiles.base_tiles import BaseTiles
20
20
  from GridCal.Gui.Diagrams.MapWidget.Tiles.tile_worker import TileWorker
21
- from GridCal.Gui.Diagrams.MapWidget.logger import log
21
+
22
+
23
+ def log(val: str):
24
+ print(val)
25
+
22
26
 
23
27
  # # set how old disk-cache tiles can be before we re-request them from the
24
28
  # # server. this is the number of days old a tile is before we re-request.