GridCal 5.1.20__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 (283) hide show
  1. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +17 -37
  2. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +4 -1
  3. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +16 -39
  4. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +35 -5
  5. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +33 -5
  6. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +4 -2
  7. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +4 -1
  8. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +51 -12
  9. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +17 -14
  10. GridCal-5.1.21/GridCal/Gui/Diagrams/MapWidget/new_line_dialogue.py +125 -0
  11. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +8 -4
  12. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +55 -28
  13. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/diagrams_model.py +9 -8
  14. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/GuiFunctions.py +0 -6
  15. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/SelectComponents.py +134 -0
  16. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +106 -0
  17. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/icons_rc.py +324 -0
  18. GridCal-5.1.21/GridCal/Gui/LoadCatalogue/update_gui_file.py +9 -0
  19. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/MainWindow.py +221 -209
  20. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +34 -10
  21. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/objects.py +6 -0
  22. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Results/results.py +4 -1
  23. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +1 -3
  24. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/base_gui.py +23 -15
  25. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/io.py +157 -66
  26. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/simulations.py +1 -0
  27. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/icons_rc.py +541 -254
  28. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +1 -0
  29. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/associations_model.py +19 -2
  30. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/object_model.py +21 -1
  31. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/pandas_model.py +20 -0
  32. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/profiles_model.py +21 -0
  33. GridCal-5.1.21/GridCal/Gui/table_view_header_wrap.py +84 -0
  34. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Session/file_handler.py +9 -2
  35. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Session/results_model.py +20 -0
  36. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/__version__.py +1 -1
  37. GridCal-5.1.21/GridCal/data/__init__.py +0 -0
  38. GridCal-5.1.21/GridCal/templates.py +87 -0
  39. {GridCal-5.1.20 → GridCal-5.1.21}/PKG-INFO +1 -1
  40. GridCal-5.1.20/GridCal/Gui/Diagrams/MapWidget/logger.py +0 -4
  41. GridCal-5.1.20/GridCal/templates.py +0 -156
  42. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ExecuteGridCal.py +0 -0
  43. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  44. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  45. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  46. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  47. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  48. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  49. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Analysis/__init__.py +0 -0
  50. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Analysis/gui.py +0 -0
  51. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  52. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  53. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  54. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  55. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  56. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  57. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  58. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ConsoleWidget.py +0 -0
  59. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  60. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  61. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  62. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  63. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  64. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  65. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  66. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  67. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  68. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  69. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  70. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  71. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  72. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  73. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  74. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  75. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  76. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/__init__.py +0 -0
  77. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/blue_marble.py +0 -0
  78. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/cartodb.py +0 -0
  79. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/gmt_local.py +0 -0
  80. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/mapbox.py +0 -0
  81. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/mapquest.py +0 -0
  82. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/open_street_map.py +0 -0
  83. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_toner.py +0 -0
  84. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_transport.py +0 -0
  85. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/TileProviders/stamen_watercolor.py +0 -0
  86. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  87. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  88. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  89. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  90. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  91. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  92. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/map_events.py +0 -0
  93. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/MapWidget/node_widget.py +0 -0
  94. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  95. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  96. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  97. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  98. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  99. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  100. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  101. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  102. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  103. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  104. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  105. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  106. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  107. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  108. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  109. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  110. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  111. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  112. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  113. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  114. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  115. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  116. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  117. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  118. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  119. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  120. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  121. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  122. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  123. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  124. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  125. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  126. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  127. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  128. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  129. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  130. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  131. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  132. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  133. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/__init__.py +0 -0
  134. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
  135. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  136. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  137. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/GeneralDialogues.py +0 -0
  138. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  139. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  140. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/gui.py +0 -0
  141. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  142. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  143. {GridCal-5.1.20/GridCal/Gui/LoadDesigner → GridCal-5.1.21/GridCal/Gui/LoadCatalogue}/__init__.py +0 -0
  144. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Model → GridCal-5.1.21/GridCal/Gui/LoadDesigner}/__init__.py +0 -0
  145. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  146. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  147. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  148. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  149. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  150. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  151. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/GridCalMain.py +0 -0
  152. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Results → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Model}/__init__.py +0 -0
  153. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  154. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  155. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  156. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Scripting → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Results}/__init__.py +0 -0
  157. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Server → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Scripting}/__init__.py +0 -0
  158. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  159. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  160. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses/Settings → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Server}/__init__.py +0 -0
  161. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  162. {GridCal-5.1.20/GridCal/Gui/Main/SubClasses → GridCal-5.1.21/GridCal/Gui/Main/SubClasses/Settings}/__init__.py +0 -0
  163. {GridCal-5.1.20/GridCal/Gui/Main → GridCal-5.1.21/GridCal/Gui/Main/SubClasses}/__init__.py +0 -0
  164. {GridCal-5.1.20/GridCal/Gui/ProfilesInput → GridCal-5.1.21/GridCal/Gui/Main}/__init__.py +0 -0
  165. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/object_select_window.py +0 -0
  166. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Main/update_gui_file.py +0 -0
  167. {GridCal-5.1.20/GridCal/Gui/RosetaExplorer → GridCal-5.1.21/GridCal/Gui/ProfilesInput}/__init__.py +0 -0
  168. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  169. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  170. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  171. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  172. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  173. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  174. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  175. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  176. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  177. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  178. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  179. {GridCal-5.1.20/GridCal/Gui/SigmaAnalysis → GridCal-5.1.21/GridCal/Gui/RosetaExplorer}/__init__.py +0 -0
  180. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  181. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  182. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  183. {GridCal-5.1.20/GridCal/Gui/SolarPowerWizard → GridCal-5.1.21/GridCal/Gui/SigmaAnalysis}/__init__.py +0 -0
  184. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  185. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  186. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  187. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  188. {GridCal-5.1.20/GridCal/Gui/SyncDialogue → GridCal-5.1.21/GridCal/Gui/SolarPowerWizard}/__init__.py +0 -0
  189. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  190. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  191. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  192. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  193. {GridCal-5.1.20/GridCal/Gui/SystemScaler → GridCal-5.1.21/GridCal/Gui/SyncDialogue}/__init__.py +0 -0
  194. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  195. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  196. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  197. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  198. {GridCal-5.1.20/GridCal/Gui/TowerBuilder → GridCal-5.1.21/GridCal/Gui/SystemScaler}/__init__.py +0 -0
  199. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  200. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  201. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  202. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  203. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  204. {GridCal-5.1.20/GridCal/Gui/TreeModelViewer → GridCal-5.1.21/GridCal/Gui/TowerBuilder}/__init__.py +0 -0
  205. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  206. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  207. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  208. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  209. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  210. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  211. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  212. {GridCal-5.1.20/GridCal/Gui/Visualization → GridCal-5.1.21/GridCal/Gui/TreeModelViewer}/__init__.py +0 -0
  213. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  214. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  215. {GridCal-5.1.20/GridCal/Gui/Widgets → GridCal-5.1.21/GridCal/Gui/Visualization}/__init__.py +0 -0
  216. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Visualization/visualization.py +0 -0
  217. {GridCal-5.1.20/GridCal/Gui/WindPowerWizard → GridCal-5.1.21/GridCal/Gui/Widgets}/__init__.py +0 -0
  218. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  219. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  220. {GridCal-5.1.20/GridCal/Gui → GridCal-5.1.21/GridCal/Gui/WindPowerWizard}/__init__.py +0 -0
  221. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  222. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  223. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  224. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  225. {GridCal-5.1.20/GridCal/Session → GridCal-5.1.21/GridCal/Gui}/__init__.py +0 -0
  226. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/messages.py +0 -0
  227. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/plot_config.py +0 -0
  228. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/themes.py +0 -0
  229. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/update_gui_all.py +0 -0
  230. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Gui/update_gui_common.py +0 -0
  231. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/LICENSE.txt +0 -0
  232. {GridCal-5.1.20/GridCal/ThirdParty → GridCal-5.1.21/GridCal/Session}/__init__.py +0 -0
  233. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Session/export_results_driver.py +0 -0
  234. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Session/server_driver.py +0 -0
  235. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Session/session.py +0 -0
  236. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/Session/synchronization_driver.py +0 -0
  237. {GridCal-5.1.20/GridCal/ThirdParty/qdarktheme/_icon → GridCal-5.1.21/GridCal/ThirdParty}/__init__.py +0 -0
  238. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  239. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  240. {GridCal-5.1.20/GridCal/ThirdParty/qdarktheme/_template → GridCal-5.1.21/GridCal/ThirdParty/qdarktheme/_icon}/__init__.py +0 -0
  241. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  242. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  243. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  244. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  245. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  246. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  247. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  248. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  249. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  250. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  251. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  252. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  253. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  254. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  255. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  256. {GridCal-5.1.20/GridCal/data → GridCal-5.1.21/GridCal/ThirdParty/qdarktheme/_template}/__init__.py +0 -0
  257. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  258. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  259. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  260. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  261. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  262. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  263. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  264. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  265. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  266. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  267. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  268. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  269. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  270. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  271. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  272. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  273. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  274. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  275. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  276. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/__init__.py +0 -0
  277. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/data/cables.csv +0 -0
  278. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/data/sequence_lines.csv +0 -0
  279. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/data/transformers.csv +0 -0
  280. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/data/wires.csv +0 -0
  281. {GridCal-5.1.20 → GridCal-5.1.21}/GridCal/update.py +0 -0
  282. {GridCal-5.1.20 → GridCal-5.1.21}/setup.cfg +0 -0
  283. {GridCal-5.1.20 → 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
@@ -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
  """
@@ -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
@@ -191,10 +193,13 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
191
193
  Event handler for mouse press events.
192
194
  """
193
195
  super().mousePressEvent(event)
196
+ selected_items = self.editor.map.view._scene.selectedItems()
197
+ if len(selected_items) < 2:
198
+ self.setSelected(True)
199
+
194
200
  event.setAccepted(True)
195
201
  self.editor.map.view.disableMove = True
196
202
 
197
- print("SE mouse press")
198
203
  if self.api_object is not None:
199
204
  self.editor.set_editor_model(api_object=self.api_object,
200
205
  dictionary_of_lists={
@@ -206,6 +211,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
206
211
  DeviceType.ZoneDevice: self.editor.circuit.get_zones(),
207
212
  })
208
213
 
214
+
209
215
  def mouseReleaseEvent(self, event: QGraphicsSceneMouseEvent):
210
216
  """
211
217
  Event handler for mouse release events.
@@ -219,6 +225,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
219
225
  """
220
226
  Event handler for when the mouse enters the item.
221
227
  """
228
+ self.editor.map.view.inItem = True
222
229
  self.setNodeColor(QColor(Qt.red), QColor(Qt.red))
223
230
  self.hovered = True
224
231
  QApplication.instance().setOverrideCursor(Qt.PointingHandCursor)
@@ -227,6 +234,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
227
234
  """
228
235
  Event handler for when the mouse leaves the item.
229
236
  """
237
+ self.editor.map.view.inItem = False
230
238
  self.hovered = False
231
239
  self.setDefaultColor()
232
240
  QApplication.instance().restoreOverrideCursor()
@@ -243,6 +251,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
243
251
  icon_path="",
244
252
  function_ptr=self.add_voltage_level)
245
253
 
254
+ add_menu_entry(menu=menu,
255
+ text="Create line",
256
+ icon_path="",
257
+ function_ptr=self.create_new_line)
258
+
246
259
  add_menu_entry(menu=menu,
247
260
  text="Move to API coordinates",
248
261
  icon_path="",
@@ -263,8 +276,16 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
263
276
  icon_path="",
264
277
  function_ptr=self.new_substation_diagram)
265
278
 
279
+
280
+
266
281
  menu.exec_(event.screenPos())
267
282
 
283
+ def create_new_line(self):
284
+ """
285
+ Create a new line in the map wizard
286
+ """
287
+ self.editor.createNewLineWizard()
288
+
268
289
  def add_function(self):
269
290
  """
270
291
 
@@ -281,9 +302,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
281
302
 
282
303
  for idtag, graphic_object in dev_dict.items():
283
304
  substation_from_graphics = self.editor.graphics_manager.query(
284
- elm=graphic_object.api_object.get_substation_from())
305
+ elm=graphic_object.api_object.get_substation_from()
306
+ )
285
307
  substation_to_graphics = self.editor.graphics_manager.query(
286
- elm=graphic_object.api_object.get_substation_to())
308
+ elm=graphic_object.api_object.get_substation_to()
309
+ )
287
310
  lines_info.append((idtag, graphic_object, substation_from_graphics, substation_to_graphics))
288
311
 
289
312
  # Now, iterate over the collected information
@@ -333,7 +356,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
333
356
  inpt = InputNumberDialogue(
334
357
  min_value=1.0,
335
358
  max_value=100000.0,
336
- default_value=1.0,
359
+ default_value=self.editor.diagram.default_bus_voltage,
337
360
  title="Add voltage level",
338
361
  text="Voltage (kV)",
339
362
  )
@@ -346,7 +369,14 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
346
369
  Vnom=kv,
347
370
  substation=self.api_object)
348
371
 
372
+ bus = Bus(name=f"Bus {self.api_object.name}",
373
+ Vnom=kv,
374
+ substation=self.api_object,
375
+ voltage_level=vl)
376
+
349
377
  self.editor.circuit.add_voltage_level(vl)
378
+ self.editor.circuit.add_bus(obj=bus)
379
+
350
380
  self.editor.add_api_voltage_level(substation_graphics=self,
351
381
  api_object=vl)
352
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 * 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,10 @@ 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)
22
25
 
23
26
  # # set how old disk-cache tiles can be before we re-request them from the
24
27
  # # server. this is the number of days old a tile is before we re-request.
@@ -50,6 +50,7 @@ from GridCal.Gui.Diagrams.MapWidget.Substation.node_graphic_item import NodeGrap
50
50
  from GridCal.Gui.Diagrams.MapWidget.Substation.substation_graphic_item import SubstationGraphicItem
51
51
  from GridCal.Gui.Diagrams.MapWidget.Substation.voltage_level_graphic_item import VoltageLevelGraphicItem
52
52
  from GridCal.Gui.Diagrams.MapWidget.map_widget import MapWidget
53
+ from GridCal.Gui.Diagrams.MapWidget.new_line_dialogue import NewMapLineDialogue
53
54
  import GridCal.Gui.Visualization.visualization as viz
54
55
  import GridCalEngine.Devices.Diagrams.palettes as palettes
55
56
  from GridCal.Gui.Diagrams.graphics_manager import ALL_MAP_GRAPHICS
@@ -79,7 +80,7 @@ def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> fl
79
80
  return R * c
80
81
 
81
82
 
82
- def compare_options(it1: NodeGraphicItem, it2: NodeGraphicItem) -> Tuple[NodeGraphicItem, NodeGraphicItem]:
83
+ def compare_options(it1: NodeGraphicItem, it2: NodeGraphicItem):
83
84
  """
84
85
 
85
86
  :param it1:
@@ -105,9 +106,9 @@ def compare_options(it1: NodeGraphicItem, it2: NodeGraphicItem) -> Tuple[NodeGra
105
106
  first_first_lat, first_first_long)
106
107
 
107
108
  if distance_1_to_2 <= distance_2_to_1:
108
- return it1, it2
109
+ return it1, it2, it1.line_container.api_object.bus_from, it2.line_container.api_object.bus_to
109
110
  else:
110
- return it2, it1
111
+ return it2, it1, it2.line_container.api_object.bus_from, it1.line_container.api_object.bus_to
111
112
 
112
113
 
113
114
  class MapLibraryModel(QStandardItemModel):
@@ -441,26 +442,35 @@ class GridMapWidget(BaseDiagramWidget):
441
442
 
442
443
  :return:
443
444
  """
444
- if len(self.map.view.selectedItems) < 2:
445
+
446
+ selected_items = self.map.view._scene.selectedItems()
447
+ selectedItems = []
448
+ for item in selected_items:
449
+ selectedItems.append(item)
450
+
451
+ if len(selectedItems) < 2:
445
452
  return 0
446
453
 
447
- it1 = self.map.view.selectedItems[0]
448
- it2 = self.map.view.selectedItems[1]
454
+ it1 = selectedItems[0]
455
+ it2 = selectedItems[1]
449
456
 
450
457
  if it1 == it2:
451
458
  return 0
452
459
 
453
460
  newline = Line()
454
- newline.copyData(it1.line_container.api_object)
461
+ newline.set_data_from(it1.line_container.api_object)
455
462
  # ln1 = self.api_object.copy()
456
463
 
457
- better_first, better_second = compare_options(it1, it2)
464
+ better_first, better_second, busfrom, busto = compare_options(it1, it2)
458
465
 
459
466
  first_list = better_first.line_container.api_object.locations.data
460
467
  second_list = better_second.line_container.api_object.locations.data
461
468
 
462
469
  newline.locations.data = first_list + second_list
463
470
 
471
+ newline.bus_from = busfrom
472
+ newline.bus_to = busto
473
+
464
474
  idx = 0
465
475
  for nod in better_first.line_container.nodes_list:
466
476
  newline.locations.data[idx].lat = nod.lat
@@ -477,6 +487,34 @@ class GridMapWidget(BaseDiagramWidget):
477
487
  better_first.line_container.disable_line()
478
488
  better_second.line_container.disable_line()
479
489
 
490
+ def createNewLineWizard(self):
491
+ """
492
+ Create a new line in the map with dialogues
493
+ """
494
+
495
+ selected_items = self.map.view._scene.selectedItems()
496
+ selectedItems = []
497
+ for item in selected_items:
498
+ selectedItems.append(item)
499
+
500
+ if len(selectedItems) < 2:
501
+ return 0
502
+
503
+ it1: SubstationGraphicItem = selectedItems[0]
504
+ it2: SubstationGraphicItem = selectedItems[1]
505
+
506
+ if it1 == it2:
507
+ return None
508
+
509
+ dialog = NewMapLineDialogue(grid=self.circuit, se_from=it1.api_object, se_to=it2.api_object)
510
+ dialog.exec()
511
+ if dialog.is_valid():
512
+ bus1 = dialog.bus_from()
513
+ bus2 = dialog.bus_to()
514
+ if bus1 is not None and bus2 is not None:
515
+ newline = Line(bus_from=bus1, bus_to=bus2)
516
+ self.add_api_line(newline, original=True)
517
+
480
518
  def removeNode(self, node: NodeGraphicItem):
481
519
  """
482
520
  Removes node from diagram and scene
@@ -801,15 +839,16 @@ class GridMapWidget(BaseDiagramWidget):
801
839
  y0 = point0.y()
802
840
  lat, lon = self.to_lat_lon(x=x0, y=y0)
803
841
 
804
- print(f"Droped at x:{x0}, y:{y0}, lat:{lat}, lon:{lon}")
842
+ # print(f"Dropped at x:{x0}, y:{y0}, lat:{lat}, lon:{lon}")
805
843
 
806
844
  if obj_type == self.library_model.get_substation_mime_data():
807
- print("Create substation...")
845
+
808
846
  api_object = Substation(name=f"Substation {self.circuit.get_substation_number()}",
809
847
  latitude=lat,
810
848
  longitude=lon)
811
849
  self.circuit.add_substation(obj=api_object)
812
- self.add_api_substation(api_object=api_object, lat=lat, lon=lon)
850
+ substation_graphics = self.add_api_substation(api_object=api_object, lat=lat, lon=lon)
851
+ substation_graphics.add_voltage_level()
813
852
 
814
853
  def wheelEvent(self, event: QWheelEvent):
815
854
  """
@@ -911,7 +950,7 @@ class GridMapWidget(BaseDiagramWidget):
911
950
 
912
951
  voltage_cmap = viz.get_voltage_color_map()
913
952
  loading_cmap = viz.get_loading_color_map()
914
- bus_types = ['', 'PQ', 'PV', 'Slack', 'None', 'Storage']
953
+ bus_types = ['', 'PQ', 'PV', 'Slack', 'PQV', 'P']
915
954
 
916
955
  vmin = 0
917
956
  vmax = 1.2