GridCal 5.1.19__tar.gz → 5.1.21__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.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +33 -94
  2. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +14 -1
  3. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +16 -39
  4. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +45 -11
  5. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +46 -9
  6. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/blue_marble.py +16 -15
  7. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/cartodb.py +5 -2
  8. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +4 -2
  9. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +4 -1
  10. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +81 -40
  11. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +50 -44
  12. GridCal-5.1.21/GridCal/Gui/Diagrams/MapWidget/new_line_dialogue.py +125 -0
  13. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +15 -0
  14. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +8 -4
  15. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +3 -5
  16. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +9 -1
  17. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +9 -1
  18. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +10 -1
  19. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +56 -51
  20. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/base_diagram_widget.py +13 -27
  21. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/diagrams_model.py +9 -8
  22. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/GuiFunctions.py +0 -6
  23. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/SelectComponents.py +134 -0
  24. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +106 -0
  25. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/icons_rc.py +324 -0
  26. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/update_gui_file.py +9 -0
  27. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/MainWindow.py +1001 -1063
  28. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +117 -66
  29. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/objects.py +6 -0
  30. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Results/results.py +4 -1
  31. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +8 -14
  32. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/base_gui.py +23 -15
  33. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/io.py +159 -68
  34. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/simulations.py +2 -2
  35. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/icons_rc.py +541 -254
  36. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +1 -0
  37. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +2 -3
  38. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/associations_model.py +19 -2
  39. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/object_model.py +21 -1
  40. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/pandas_model.py +20 -0
  41. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/profiles_model.py +21 -0
  42. GridCal-5.1.21/GridCal/Gui/table_view_header_wrap.py +84 -0
  43. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Session/file_handler.py +9 -2
  44. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Session/results_model.py +20 -0
  45. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/__version__.py +1 -1
  46. GridCal-5.1.21/GridCal/data/__init__.py +0 -0
  47. GridCal-5.1.21/GridCal/templates.py +87 -0
  48. {GridCal-5.1.19 → GridCal-5.1.21}/PKG-INFO +1 -1
  49. GridCal-5.1.19/GridCal/Gui/Diagrams/MapWidget/logger.py +0 -4
  50. GridCal-5.1.19/GridCal/Gui/Visualization/palettes.py +0 -464
  51. GridCal-5.1.19/GridCal/templates.py +0 -156
  52. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ExecuteGridCal.py +0 -0
  53. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  54. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  55. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  56. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  57. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  58. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  59. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Analysis/__init__.py +0 -0
  60. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Analysis/gui.py +0 -0
  61. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  62. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  63. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  64. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  65. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  66. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  67. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  68. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ConsoleWidget.py +0 -0
  69. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  70. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  71. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  72. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  73. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  74. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  75. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  76. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  77. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  78. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  79. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  80. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  81. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  82. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  83. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  84. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  85. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  86. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/__init__.py +0 -0
  87. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/gmt_local.py +0 -0
  88. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/mapbox.py +0 -0
  89. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/mapquest.py +0 -0
  90. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/open_street_map.py +0 -0
  91. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_toner.py +0 -0
  92. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_transport.py +0 -0
  93. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_watercolor.py +0 -0
  94. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  95. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  96. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  97. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  98. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  99. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  100. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/map_events.py +0 -0
  101. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/node_widget.py +0 -0
  102. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  103. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  104. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  105. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  106. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  107. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  108. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  109. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  110. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  111. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  112. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  113. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  114. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  115. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  116. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  117. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  118. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  119. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  120. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  121. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  122. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  123. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  124. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  125. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  126. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  127. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  128. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  129. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  130. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  131. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  132. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  133. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  134. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  135. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  136. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/__init__.py +0 -0
  137. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  138. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  139. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/GeneralDialogues.py +0 -0
  140. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  141. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  142. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/gui.py +0 -0
  143. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  144. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  145. {GridCal-5.1.19/GridCal/Gui/LoadDesigner → GridCal-5.1.21/GridCal/Gui/LoadCatalogue}/__init__.py +0 -0
  146. {GridCal-5.1.19/GridCal/Gui/Main/SubClasses/Model → GridCal-5.1.21/GridCal/Gui/LoadDesigner}/__init__.py +0 -0
  147. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  148. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  149. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  150. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  151. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  152. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  153. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/GridCalMain.py +0 -0
  154. {GridCal-5.1.19/GridCal/Gui/Main/SubClasses/Results → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Model}/__init__.py +0 -0
  155. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  156. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  157. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  158. {GridCal-5.1.19/GridCal/Gui/Main/SubClasses/Scripting → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Results}/__init__.py +0 -0
  159. {GridCal-5.1.19/GridCal/Gui/Main/SubClasses/Server → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Scripting}/__init__.py +0 -0
  160. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  161. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  162. {GridCal-5.1.19/GridCal/Gui/Main/SubClasses/Settings → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Server}/__init__.py +0 -0
  163. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  164. {GridCal-5.1.19/GridCal/Gui/Main/SubClasses → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Settings}/__init__.py +0 -0
  165. {GridCal-5.1.19/GridCal/Gui/Main → GridCal-5.1.21/GridCal/Gui/Main/SubClasses}/__init__.py +0 -0
  166. {GridCal-5.1.19/GridCal/Gui/ProfilesInput → GridCal-5.1.21/GridCal/Gui/Main}/__init__.py +0 -0
  167. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/object_select_window.py +0 -0
  168. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Main/update_gui_file.py +0 -0
  169. {GridCal-5.1.19/GridCal/Gui/RosetaExplorer → GridCal-5.1.21/GridCal/Gui/ProfilesInput}/__init__.py +0 -0
  170. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  171. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  172. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  173. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  174. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  175. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  176. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  177. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  178. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  179. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  180. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  181. {GridCal-5.1.19/GridCal/Gui/SigmaAnalysis → GridCal-5.1.21/GridCal/Gui/RosetaExplorer}/__init__.py +0 -0
  182. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  183. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  184. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  185. {GridCal-5.1.19/GridCal/Gui/SolarPowerWizard → GridCal-5.1.21/GridCal/Gui/SigmaAnalysis}/__init__.py +0 -0
  186. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  187. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  188. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  189. {GridCal-5.1.19/GridCal/Gui/SyncDialogue → GridCal-5.1.21/GridCal/Gui/SolarPowerWizard}/__init__.py +0 -0
  190. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  191. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  192. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  193. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  194. {GridCal-5.1.19/GridCal/Gui/SystemScaler → GridCal-5.1.21/GridCal/Gui/SyncDialogue}/__init__.py +0 -0
  195. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  196. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  197. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  198. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  199. {GridCal-5.1.19/GridCal/Gui/TowerBuilder → GridCal-5.1.21/GridCal/Gui/SystemScaler}/__init__.py +0 -0
  200. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  201. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  202. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  203. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  204. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  205. {GridCal-5.1.19/GridCal/Gui/TreeModelViewer → GridCal-5.1.21/GridCal/Gui/TowerBuilder}/__init__.py +0 -0
  206. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  207. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  208. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  209. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  210. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  211. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  212. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  213. {GridCal-5.1.19/GridCal/Gui/Visualization → GridCal-5.1.21/GridCal/Gui/TreeModelViewer}/__init__.py +0 -0
  214. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  215. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  216. {GridCal-5.1.19/GridCal/Gui/Widgets → GridCal-5.1.21/GridCal/Gui/Visualization}/__init__.py +0 -0
  217. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Visualization/visualization.py +0 -0
  218. {GridCal-5.1.19/GridCal/Gui/WindPowerWizard → GridCal-5.1.21/GridCal/Gui/Widgets}/__init__.py +0 -0
  219. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  220. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  221. {GridCal-5.1.19/GridCal/Gui → GridCal-5.1.21/GridCal/Gui/WindPowerWizard}/__init__.py +0 -0
  222. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  223. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  224. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  225. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  226. {GridCal-5.1.19/GridCal/Session → GridCal-5.1.21/GridCal/Gui}/__init__.py +0 -0
  227. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/messages.py +0 -0
  228. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/plot_config.py +0 -0
  229. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/themes.py +0 -0
  230. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/update_gui_all.py +0 -0
  231. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Gui/update_gui_common.py +0 -0
  232. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/LICENSE.txt +0 -0
  233. {GridCal-5.1.19/GridCal/ThirdParty → GridCal-5.1.21/GridCal/Session}/__init__.py +0 -0
  234. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Session/export_results_driver.py +0 -0
  235. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Session/server_driver.py +0 -0
  236. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Session/session.py +0 -0
  237. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/Session/synchronization_driver.py +0 -0
  238. {GridCal-5.1.19/GridCal/ThirdParty/qdarktheme/_icon → GridCal-5.1.21/GridCal/ThirdParty}/__init__.py +0 -0
  239. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  240. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  241. {GridCal-5.1.19/GridCal/ThirdParty/qdarktheme/_template → GridCal-5.1.21/GridCal/ThirdParty/qdarktheme/_icon}/__init__.py +0 -0
  242. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  243. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  244. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  245. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  246. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  247. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  248. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  249. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  250. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  251. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  252. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  253. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  254. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  255. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  256. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  257. {GridCal-5.1.19/GridCal/data → GridCal-5.1.21/GridCal/ThirdParty/qdarktheme/_template}/__init__.py +0 -0
  258. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  259. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  260. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  261. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  262. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  263. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  264. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  265. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  266. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  267. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  268. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  269. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  270. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  271. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  272. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  273. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  274. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  275. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  276. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  277. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/__init__.py +0 -0
  278. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/data/cables.csv +0 -0
  279. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/data/sequence_lines.csv +0 -0
  280. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/data/transformers.csv +0 -0
  281. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/data/wires.csv +0 -0
  282. {GridCal-5.1.19 → GridCal-5.1.21}/GridCal/update.py +0 -0
  283. {GridCal-5.1.19 → GridCal-5.1.21}/setup.cfg +0 -0
  284. {GridCal-5.1.19 → GridCal-5.1.21}/setup.py +0 -0
@@ -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
@@ -78,7 +81,7 @@ class MapLineContainer(GenericDiagramWidget):
78
81
  Remove all segments from the scene
79
82
  """
80
83
  for segment in self.segments_list:
81
- self.editor.remove_from_scene(segment)
84
+ self.editor.remove_only_graphic_element(segment)
82
85
 
83
86
  self.segments_list = list()
84
87
 
@@ -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:
@@ -257,48 +237,16 @@ class MapLineContainer(GenericDiagramWidget):
257
237
  # draw the segment in the scene
258
238
  self.editor.add_to_scene(graphic_object=segment_graphic_object)
259
239
 
260
- # diagram_locations: PointsGroup = self.editor.diagram.data.get(DeviceType.LineLocation.value, None)
261
- #
262
- # for idx, elm in enumerate(self.api_object.locations.data):
263
- #
264
- # if diagram_locations is None:
265
- # # no locations found, use the data from the api object
266
- # # lat = elm.lat
267
- # # lon = elm.long
268
- # pass
269
- # else:
270
- #
271
- # # try to get location from the diagram
272
- # diagram_location = diagram_locations.locations.get(elm.idtag, None)
273
- #
274
- # if diagram_location is None:
275
- # # no particular location found, use the data from the api object
276
- # # lat = elm.lat
277
- # # lon = elm.long
278
- # pass
279
- # else:
280
- # # Draw only what's on the diagram
281
- # # diagram data found, use it
282
- #
283
- # if idx > 0:
284
- # i1 = idx
285
- # i2 = idx - 1
286
- # # Assuming Connector takes (scene, node1, node2) as arguments
287
- # segment_graphic_object = Segment(first=self.nodes_list[i1],
288
- # second=self.nodes_list[i2])
289
- #
290
- # self.nodes_list[i1].needsUpdateFirst = True
291
- # self.nodes_list[i2].needsUpdateSecond = True
292
- # segment_graphic_object.needsUpdate = True
293
- #
294
- # # register the segment in the line
295
- # self.add_segment(segment=segment_graphic_object)
296
- #
297
- # # draw the segment in the scene
298
- # self.editor.add_to_scene(graphic_object=segment_graphic_object)
299
-
300
240
  self.update_connectors()
301
241
 
242
+ self.editor.Update_widths()
243
+
244
+ def substation_to(self):
245
+ return self.editor.graphics_manager.query(elm=self.api_object.get_substation_to())
246
+
247
+ def substation_from(self):
248
+ return self.editor.graphics_manager.query(elm=self.api_object.get_substation_from())
249
+
302
250
  def insert_new_node_at_position(self, index: int):
303
251
  """
304
252
  Creates a new node in the list at the given position
@@ -307,7 +255,7 @@ class MapLineContainer(GenericDiagramWidget):
307
255
  """
308
256
 
309
257
  # Check if the index is valid
310
- if 1 <= index < len(self.api_object.locations.data):
258
+ if 1 <= index < len(self.api_object.locations.data) and len(self.api_object.locations.data) > 1:
311
259
 
312
260
  nd1 = self.nodes_list[index]
313
261
  nd2 = self.nodes_list[index - 1]
@@ -323,7 +271,7 @@ class MapLineContainer(GenericDiagramWidget):
323
271
  z=new_api_node_data.alt,
324
272
  seq=new_api_node_data.seq,
325
273
  name=new_api_node_data.name,
326
- idtag=new_api_node_data.idtag,
274
+ idtag=None, # generates new UUID
327
275
  code=new_api_node_data.code)
328
276
 
329
277
  self.api_object.locations.data.insert(index, new_api_object)
@@ -356,7 +304,7 @@ class MapLineContainer(GenericDiagramWidget):
356
304
  # Return the newly created node
357
305
  return graphic_obj
358
306
 
359
- elif index == 0 and len(self.api_object.locations.data) == 0:
307
+ elif len(self.api_object.locations.data) == 0:
360
308
 
361
309
  substation_from_graphics = self.editor.graphics_manager.query(elm=self.api_object.get_substation_from())
362
310
  substation_to_graphics = self.editor.graphics_manager.query(elm=self.api_object.get_substation_to())
@@ -375,7 +323,7 @@ class MapLineContainer(GenericDiagramWidget):
375
323
  idtag="",
376
324
  code="")
377
325
 
378
- self.api_object.locations.data.insert(index, new_api_object)
326
+ self.api_object.locations.data.insert(0, new_api_object)
379
327
 
380
328
  # Create a new graphical node item
381
329
 
@@ -383,19 +331,10 @@ class MapLineContainer(GenericDiagramWidget):
383
331
  api_object=new_api_object,
384
332
  lat=new_api_object.lat,
385
333
  lon=new_api_object.long,
386
- index=index)
387
-
388
- idx = 0
389
-
390
- for nod in self.nodes_list:
391
-
392
- if idx >= index:
393
- nod.index = nod.index + 1
394
-
395
- idx = idx + 1
334
+ index=0)
396
335
 
397
336
  # Add the node to the nodes list
398
- self.nodes_list.insert(index, graphic_obj)
337
+ self.nodes_list.insert(0, graphic_obj)
399
338
 
400
339
  graphic_obj.updatePosition()
401
340
 
@@ -405,7 +344,7 @@ class MapLineContainer(GenericDiagramWidget):
405
344
  # Return the newly created node
406
345
  return graphic_obj
407
346
 
408
- elif 0 == index or index == len(self.api_object.locations.data):
347
+ elif (0 == index or index >= len(self.api_object.locations.data) - 1):
409
348
 
410
349
  substation_from_graphics = self.editor.graphics_manager.query(elm=self.api_object.get_substation_from())
411
350
  substation_to_graphics = self.editor.graphics_manager.query(elm=self.api_object.get_substation_to())
@@ -417,7 +356,7 @@ class MapLineContainer(GenericDiagramWidget):
417
356
  nd2 = self.nodes_list[0]
418
357
 
419
358
  if index >= len(self.nodes_list):
420
- nd2 = self.nodes_list[len(self.nodes_list) - 1]
359
+ nd1 = self.nodes_list[len(self.nodes_list) - 1]
421
360
 
422
361
  new_lat = ((nd2.lat + nd1.lat) / 2)
423
362
  new_long = ((nd2.lon + nd1.lon) / 2)
@@ -475,11 +414,11 @@ class MapLineContainer(GenericDiagramWidget):
475
414
  if 0 < index < len(self.api_object.locations.data) and len(self.api_object.locations.data) > 3:
476
415
 
477
416
  ln1 = Line()
478
- ln1.copyData(self.api_object)
417
+ ln1.set_data_from(self.api_object)
479
418
  # ln1 = self.api_object.copy()
480
419
 
481
420
  ln2 = Line()
482
- ln2.copyData(self.api_object)
421
+ ln2.set_data_from(self.api_object)
483
422
 
484
423
  first_list = self.api_object.locations.data[:index]
485
424
  second_list = self.api_object.locations.data[index:]
@@ -498,6 +437,9 @@ class MapLineContainer(GenericDiagramWidget):
498
437
  api_obj.long = self.nodes_list[idx].lon
499
438
  idx = idx + 1
500
439
 
440
+ ln1.bus_from = self.api_object.bus_from
441
+ ln2.bus_to = self.api_object.bus_to
442
+
501
443
  l1 = self.editor.add_api_line(ln1, original=False)
502
444
  l2 = self.editor.add_api_line(ln2, original=False)
503
445
 
@@ -506,10 +448,7 @@ class MapLineContainer(GenericDiagramWidget):
506
448
  return first_list, second_list
507
449
  else:
508
450
  # Handle invalid index
509
- raise ValueError("Index out of range or invalid")
510
-
511
- def merge_line(self):
512
- return 0
451
+ error_msg("Index out of range or invalid", "split line")
513
452
 
514
453
  def disable_line(self):
515
454
  """
@@ -324,8 +324,21 @@ class MapLineSegment(QGraphicsLineItem):
324
324
 
325
325
  if len(self.container.nodes_list) == 0:
326
326
  self.container.insert_new_node_at_position(0)
327
+ elif len(self.container.nodes_list) == 1:
328
+ if self.second == self.container.substation_to() or self.first == self.container.substation_to():
329
+ self.container.insert_new_node_at_position(1)
330
+ else:
331
+ self.container.insert_new_node_at_position(0)
327
332
  else:
328
- self.container.insert_new_node_at_position(self.second.index)
333
+ if self.second == self.container.substation_to() or self.first == self.container.substation_to():
334
+ self.container.insert_new_node_at_position(len(self.container.nodes_list))
335
+ elif self.second == self.container.substation_from() or self.first == self.container.substation_from():
336
+ self.container.insert_new_node_at_position(0)
337
+ else:
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)
329
342
 
330
343
  # TODO implement
331
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
  """
@@ -25,6 +25,8 @@ 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
@@ -101,16 +103,21 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
101
103
  # self.setZValue(1)
102
104
  self.voltage_level_graphics: List[VoltageLevelGraphicItem] = list()
103
105
 
104
- def move_to(self, lat: float, lon: float):
106
+ def move_to(self, lat: float, lon: float) -> Tuple[float, float]:
105
107
  """
106
108
 
107
109
  :param lat:
108
110
  :param lon:
109
- :return:
111
+ :return: x, y
110
112
  """
111
113
  x, y = self.editor.to_x_y(lat=lat, lon=lon)
112
114
  self.setRect(x, y, self.rect().width(), self.rect().height())
113
115
 
116
+ for vl in self.voltage_level_graphics:
117
+ vl.center_on_substation()
118
+
119
+ return x, y
120
+
114
121
  def register_voltage_level(self, vl: VoltageLevelGraphicItem):
115
122
  """
116
123
 
@@ -179,7 +186,6 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
179
186
  for vl_graphics in self.voltage_level_graphics:
180
187
  vl_graphics.center_on_substation()
181
188
 
182
- self.editor.update_connectors()
183
189
  self.updateDiagram() # always update
184
190
 
185
191
  def mousePressEvent(self, event: QGraphicsSceneMouseEvent):
@@ -187,10 +193,13 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
187
193
  Event handler for mouse press events.
188
194
  """
189
195
  super().mousePressEvent(event)
196
+ selected_items = self.editor.map.view._scene.selectedItems()
197
+ if len(selected_items) < 2:
198
+ self.setSelected(True)
199
+
190
200
  event.setAccepted(True)
191
201
  self.editor.map.view.disableMove = True
192
202
 
193
- print("SE mouse press")
194
203
  if self.api_object is not None:
195
204
  self.editor.set_editor_model(api_object=self.api_object,
196
205
  dictionary_of_lists={
@@ -202,6 +211,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
202
211
  DeviceType.ZoneDevice: self.editor.circuit.get_zones(),
203
212
  })
204
213
 
214
+
205
215
  def mouseReleaseEvent(self, event: QGraphicsSceneMouseEvent):
206
216
  """
207
217
  Event handler for mouse release events.
@@ -215,6 +225,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
215
225
  """
216
226
  Event handler for when the mouse enters the item.
217
227
  """
228
+ self.editor.map.view.inItem = True
218
229
  self.setNodeColor(QColor(Qt.red), QColor(Qt.red))
219
230
  self.hovered = True
220
231
  QApplication.instance().setOverrideCursor(Qt.PointingHandCursor)
@@ -223,6 +234,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
223
234
  """
224
235
  Event handler for when the mouse leaves the item.
225
236
  """
237
+ self.editor.map.view.inItem = False
226
238
  self.hovered = False
227
239
  self.setDefaultColor()
228
240
  QApplication.instance().restoreOverrideCursor()
@@ -239,6 +251,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
239
251
  icon_path="",
240
252
  function_ptr=self.add_voltage_level)
241
253
 
254
+ add_menu_entry(menu=menu,
255
+ text="Create line",
256
+ icon_path="",
257
+ function_ptr=self.create_new_line)
258
+
242
259
  add_menu_entry(menu=menu,
243
260
  text="Move to API coordinates",
244
261
  icon_path="",
@@ -251,7 +268,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
251
268
 
252
269
  add_menu_entry(menu=menu,
253
270
  text="ADD node",
254
- icon_path="",
271
+ icon_path=":/Icons/icons/divide.svg",
255
272
  function_ptr=self.add_function)
256
273
 
257
274
  add_menu_entry(menu=menu,
@@ -259,8 +276,16 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
259
276
  icon_path="",
260
277
  function_ptr=self.new_substation_diagram)
261
278
 
279
+
280
+
262
281
  menu.exec_(event.screenPos())
263
282
 
283
+ def create_new_line(self):
284
+ """
285
+ Create a new line in the map wizard
286
+ """
287
+ self.editor.createNewLineWizard()
288
+
264
289
  def add_function(self):
265
290
  """
266
291
 
@@ -277,9 +302,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
277
302
 
278
303
  for idtag, graphic_object in dev_dict.items():
279
304
  substation_from_graphics = self.editor.graphics_manager.query(
280
- elm=graphic_object.api_object.get_substation_from())
305
+ elm=graphic_object.api_object.get_substation_from()
306
+ )
281
307
  substation_to_graphics = self.editor.graphics_manager.query(
282
- elm=graphic_object.api_object.get_substation_to())
308
+ elm=graphic_object.api_object.get_substation_to()
309
+ )
283
310
  lines_info.append((idtag, graphic_object, substation_from_graphics, substation_to_graphics))
284
311
 
285
312
  # Now, iterate over the collected information
@@ -311,8 +338,8 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
311
338
  "Move substation graphics")
312
339
 
313
340
  if ok:
314
- self.move_to(lat=self.api_object.latitude, lon=self.api_object.longitude)
315
- self.editor.update_connectors()
341
+ x, y = self.move_to(lat=self.api_object.latitude, lon=self.api_object.longitude) # this moves the vl too
342
+ self.set_callabacks(x, y)
316
343
 
317
344
  def new_substation_diagram(self):
318
345
  """
@@ -329,7 +356,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
329
356
  inpt = InputNumberDialogue(
330
357
  min_value=1.0,
331
358
  max_value=100000.0,
332
- default_value=1.0,
359
+ default_value=self.editor.diagram.default_bus_voltage,
333
360
  title="Add voltage level",
334
361
  text="Voltage (kV)",
335
362
  )
@@ -342,7 +369,14 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
342
369
  Vnom=kv,
343
370
  substation=self.api_object)
344
371
 
372
+ bus = Bus(name=f"Bus {self.api_object.name}",
373
+ Vnom=kv,
374
+ substation=self.api_object,
375
+ voltage_level=vl)
376
+
345
377
  self.editor.circuit.add_voltage_level(vl)
378
+ self.editor.circuit.add_bus(obj=bus)
379
+
346
380
  self.editor.add_api_voltage_level(substation_graphics=self,
347
381
  api_object=vl)
348
382
 
@@ -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, r, 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
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(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsSelectable) # 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)
@@ -90,7 +95,7 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
90
95
  self.needsUpdate = False
91
96
  self.setZValue(0)
92
97
 
93
- def center_on_substation(self):
98
+ def center_on_substation(self) -> None:
94
99
  """
95
100
  Centers the graphic item on the substation
96
101
  """
@@ -99,6 +104,16 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
99
104
  yc = parent_center.y() - self.rect().height() / 2
100
105
  self.setRect(xc, yc, self.rect().width(), self.rect().height())
101
106
 
107
+ def move_to_xy(self, x: float, y: float):
108
+ """
109
+
110
+ :param x:
111
+ :param y:
112
+ :return:
113
+ """
114
+ self.setRect(x, y, self.rect().width(), self.rect().height())
115
+ return x, y
116
+
102
117
  def updateDiagram(self) -> None:
103
118
  """
104
119
 
@@ -120,10 +135,9 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
120
135
  """
121
136
  Event handler for mouse move events.
122
137
  """
123
- super().mouseMoveEvent(event)
138
+ # super().mouseMoveEvent(event)
124
139
  if self.hovered:
125
- # self.updatePosition()
126
- self.editor.update_connectors()
140
+ self.parent.mouseMoveEvent(event)
127
141
 
128
142
  def mousePressEvent(self, event: QGraphicsSceneMouseEvent):
129
143
  """
@@ -160,6 +174,18 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
160
174
  self.hovered = False
161
175
  self.setNodeColor(self.colorInner, self.colorBorder)
162
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
+
163
189
  def setNodeColor(self, inner_color: QColor = None, border_color: QColor = None) -> None:
164
190
  """
165
191
 
@@ -197,3 +223,14 @@ class VoltageLevelGraphicItem(GenericDiagramWidget, QGraphicsEllipseItem):
197
223
  pen = self.pen()
198
224
  pen.setWidth(width)
199
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)