GridCal 5.3.16__tar.gz → 5.3.18__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 (280) hide show
  1. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +16 -11
  2. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +24 -14
  3. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +68 -21
  4. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +13 -14
  5. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +1 -6
  6. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +4 -2
  7. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +6 -7
  8. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +1 -2
  9. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +10 -6
  10. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +7 -4
  11. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +276 -35
  12. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +4 -3
  13. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +11 -8
  14. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +27 -38
  15. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/base_diagram_widget.py +1 -0
  16. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +20 -21
  17. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Model/objects.py +100 -3
  18. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Server/server.py +1 -1
  19. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Session/server_driver.py +36 -30
  20. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/__version__.py +1 -1
  21. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/data/cables.csv +15 -0
  22. gridcal-5.3.18/GridCal/data/wires.csv +145 -0
  23. {gridcal-5.3.16 → gridcal-5.3.18}/PKG-INFO +1 -1
  24. gridcal-5.3.16/GridCal/data/wires.csv +0 -100
  25. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ExecuteGridCal.py +0 -0
  26. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  27. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  28. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  29. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  30. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  31. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  32. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Analysis/__init__.py +0 -0
  33. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Analysis/gui.py +0 -0
  34. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  35. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  36. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  37. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  38. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  39. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  40. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  41. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  42. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  43. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  44. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  45. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  46. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  47. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  48. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  49. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  50. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  51. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  52. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/line_location_graphic_item.py +0 -0
  53. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  54. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  55. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  56. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  57. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  58. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  59. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  60. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  61. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  62. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  63. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  64. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  65. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  66. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  67. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  68. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  69. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  70. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  71. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  72. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  73. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_editor.py +0 -0
  74. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
  75. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  76. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  77. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  78. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  79. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  80. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  81. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  82. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  83. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  84. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  85. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  86. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  87. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  88. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  89. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  90. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  91. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  92. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  93. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  94. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  95. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  96. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  97. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  98. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  99. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  100. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  101. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  102. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  103. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  104. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  105. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/__init__.py +0 -0
  106. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  107. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  108. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  109. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  110. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  111. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/GridGenerator/gui.py +0 -0
  112. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  113. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  114. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  115. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  116. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  117. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  118. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  119. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  120. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  121. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  122. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  123. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  124. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  125. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  126. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/GridCalMain.py +0 -0
  127. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/MainWindow.py +0 -0
  128. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  129. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  130. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  131. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  132. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  133. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  134. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  135. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  136. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  137. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  138. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
  139. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  140. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
  141. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/io.py +0 -0
  142. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/SubClasses/simulations.py +0 -0
  143. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/__init__.py +0 -0
  144. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/icons_rc.py +0 -0
  145. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/object_select_window.py +0 -0
  146. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Main/update_gui_file.py +0 -0
  147. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  148. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  149. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  150. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  151. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  152. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
  153. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  154. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  155. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  156. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  157. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  158. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  159. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  160. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  161. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  162. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  163. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  164. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  165. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  166. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  167. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  168. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  169. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  170. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  171. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  172. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  173. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SubstationDesigner/__init__.py +0 -0
  174. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SubstationDesigner/substation_designer.py +0 -0
  175. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +0 -0
  176. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SubstationDesigner/update_gui_file.py +0 -0
  177. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  178. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  179. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  180. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  181. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  182. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  183. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  184. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  185. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  186. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  187. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  188. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  189. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  190. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  191. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  192. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  193. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  194. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  195. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  196. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  197. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  198. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Visualization/__init__.py +0 -0
  199. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Visualization/visualization.py +0 -0
  200. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Widgets/__init__.py +0 -0
  201. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  202. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  203. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  204. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  205. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  206. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  207. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  208. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/__init__.py +0 -0
  209. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/associations_model.py +0 -0
  210. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/general_dialogues.py +0 -0
  211. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/gui_functions.py +0 -0
  212. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/messages.py +0 -0
  213. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/object_model.py +0 -0
  214. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/pandas_model.py +0 -0
  215. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/plot_config.py +0 -0
  216. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/profiles_model.py +0 -0
  217. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/python_console.py +0 -0
  218. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/python_highlighter.py +0 -0
  219. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/results_model.py +0 -0
  220. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/table_view_header_wrap.py +0 -0
  221. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/themes.py +0 -0
  222. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/update_gui_all.py +0 -0
  223. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/update_gui_common.py +0 -0
  224. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Gui/wrappable_table_model.py +0 -0
  225. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/LICENSE.txt +0 -0
  226. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Session/__init__.py +0 -0
  227. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Session/export_results_driver.py +0 -0
  228. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Session/file_handler.py +0 -0
  229. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Session/session.py +0 -0
  230. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/Session/synchronization_driver.py +0 -0
  231. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/__init__.py +0 -0
  232. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  233. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  234. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  235. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  236. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  237. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  238. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  239. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  240. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  241. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  242. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  243. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  244. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  245. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  246. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  247. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  248. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  249. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  250. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  251. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  252. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  253. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  254. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  255. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  256. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  257. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  258. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  259. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  260. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  261. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  262. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  263. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  264. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  265. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  266. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  267. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  268. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  269. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  270. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/__init__.py +0 -0
  271. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/data/GridCal.ico +0 -0
  272. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/data/GridCal.svg +0 -0
  273. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/data/__init__.py +0 -0
  274. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/data/sequence_lines.csv +0 -0
  275. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/data/transformers.csv +0 -0
  276. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/plugins.py +0 -0
  277. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/templates.py +0 -0
  278. {gridcal-5.3.16 → gridcal-5.3.18}/GridCal/update.py +0 -0
  279. {gridcal-5.3.16 → gridcal-5.3.18}/setup.cfg +0 -0
  280. {gridcal-5.3.16 → gridcal-5.3.18}/setup.py +0 -0
@@ -6,6 +6,7 @@ from __future__ import annotations
6
6
 
7
7
  from typing import TYPE_CHECKING, List, Union
8
8
 
9
+ from PySide6.QtWidgets import QGraphicsItemGroup
9
10
  from PySide6.QtCore import Qt
10
11
  from PySide6.QtGui import QColor
11
12
  from GridCal.Gui.Diagrams.MapWidget.Branches.map_line_segment import MapLineSegment
@@ -22,7 +23,7 @@ if TYPE_CHECKING:
22
23
  from GridCal.Gui.Diagrams.MapWidget.grid_map_widget import GridMapWidget
23
24
 
24
25
 
25
- class MapLineContainer(GenericDiagramWidget):
26
+ class MapLineContainer(GenericDiagramWidget, QGraphicsItemGroup):
26
27
  """
27
28
  Represents a polyline in the map
28
29
  """
@@ -41,6 +42,7 @@ class MapLineContainer(GenericDiagramWidget):
41
42
  api_object=api_object,
42
43
  editor=editor,
43
44
  draw_labels=draw_labels)
45
+ QGraphicsItemGroup.__init__(self)
44
46
 
45
47
  self.editor: GridMapWidget = editor # reassign to make clear the editor type
46
48
 
@@ -48,17 +50,18 @@ class MapLineContainer(GenericDiagramWidget):
48
50
  self.segments_list: List[MapLineSegment] = list()
49
51
  self.enabled = True
50
52
 
51
- def set_width_scale(self, branch_scale: float, arrow_scale: float):
53
+ def set_width_scale(self, width: float, arrow_width: float):
52
54
  """
53
55
  Set the width scale of the line
54
- :param branch_scale:
55
- :param arrow_scale:
56
+ :param width:
57
+ :param arrow_width:
56
58
  """
57
59
  for segment in self.segments_list:
58
60
  # pen = segment.pen() # get the current pen
59
61
  # pen.setWidthF(val * segment.width) # Set the fractional thickness of the line
60
- segment.set_width(branch_scale * segment.width) # Assign the pen to the line item
61
- segment.set_arrow_scale(arrow_scale)
62
+ segment.set_width(width) # Assign the pen to the line item
63
+ segment.set_arrow_sizes(arrow_width)
64
+ # self.setScale(branch_scale)
62
65
 
63
66
  def clean_segments(self) -> None:
64
67
  """
@@ -105,6 +108,7 @@ class MapLineContainer(GenericDiagramWidget):
105
108
  :param segment: Connector
106
109
  """
107
110
  self.segments_list.append(segment)
111
+ self.addToGroup(segment)
108
112
 
109
113
  def set_colour(self, color: QColor, style: Qt.PenStyle, tool_tip: str = '') -> None:
110
114
  """
@@ -132,8 +136,8 @@ class MapLineContainer(GenericDiagramWidget):
132
136
  :return:
133
137
  """
134
138
 
135
- for conector in self.segments_list:
136
- conector.end_update()
139
+ for segment in self.segments_list:
140
+ segment.end_update()
137
141
 
138
142
  def draw_all(self) -> None:
139
143
  """
@@ -220,13 +224,14 @@ class MapLineContainer(GenericDiagramWidget):
220
224
  # Assuming Connector takes (scene, node1, node2) as arguments
221
225
  segment_graphic_object = MapLineSegment(first=elm1,
222
226
  second=elm2,
223
- container=self)
227
+ container=self,
228
+ width=self.editor.diagram.min_branch_width)
224
229
 
225
230
  elm2.needsUpdate = True
226
231
  segment_graphic_object.needsUpdate = True
227
232
 
228
- segment_graphic_object.set_width(br_scale * segment_graphic_object.width) # Assign the pen to the line item
229
- segment_graphic_object.set_arrow_scale(arrow_scale)
233
+ # segment_graphic_object.set_width(br_scale * segment_graphic_object.width) # Assign the pen to the line item
234
+ # segment_graphic_object.set_arrow_sizes(arrow_scale)
230
235
 
231
236
  # register the segment in the line
232
237
  self.add_segment(segment=segment_graphic_object)
@@ -28,11 +28,16 @@ class MapLineSegment(QGraphicsLineItem):
28
28
  Segment joining two NodeGraphicItem
29
29
  """
30
30
 
31
- def __init__(self, first: LineLocationGraphicItem, second: LineLocationGraphicItem, container: MapLineContainer):
31
+ def __init__(self,
32
+ first: LineLocationGraphicItem,
33
+ second: LineLocationGraphicItem,
34
+ container: MapLineContainer,
35
+ width: float):
32
36
  """
33
37
  Segment constructor
34
- :param first: NodeGraphicItem
35
- :param second: NodeGraphicItem
38
+ :param first: LineLocationGraphicItem
39
+ :param second: LineLocationGraphicItem
40
+ :param container: MapLineContainer
36
41
  """
37
42
  QGraphicsLineItem.__init__(self)
38
43
  self.first: LineLocationGraphicItem = first
@@ -48,7 +53,7 @@ class MapLineSegment(QGraphicsLineItem):
48
53
  self.hoover_color = QColor(self.api_object.color)
49
54
  self.hoover_color.setAlpha(180)
50
55
 
51
- self.width = 0.1
56
+ self.width = width
52
57
 
53
58
  self.pos1: QPointF = self.first.get_center_pos()
54
59
  self.pos2: QPointF = self.second.get_center_pos()
@@ -70,6 +75,7 @@ class MapLineSegment(QGraphicsLineItem):
70
75
  self.second.add_position_change_callback(self.set_to_side_coordinates)
71
76
 
72
77
  self._pen = self.set_colour(self.color, self.style)
78
+ # self._pen.setCosmetic(True)
73
79
  self.update_endings()
74
80
  self.needsUpdate = True
75
81
  self.setZValue(0)
@@ -99,20 +105,24 @@ class MapLineSegment(QGraphicsLineItem):
99
105
  :param width:
100
106
  :return:
101
107
  """
102
- if self._pen.widthF() != width: # Only update if width changes
108
+
109
+ # self.setScale(width / self.width) # Faster since it avoids repainting each QPen
110
+
111
+ if self.width != width: # Only update if width changes
103
112
  self._pen.setWidthF(width)
104
113
  self.setPen(self._pen)
114
+ self.width = width
105
115
 
106
- def set_arrow_scale(self, width: float):
116
+ def set_arrow_sizes(self, width: float):
107
117
  """
108
118
 
109
119
  :param width:
110
120
  :return:
111
121
  """
112
- self.arrow_p_from.setScale(width)
113
- self.arrow_q_from.setScale(width)
114
- self.arrow_p_to.setScale(width)
115
- self.arrow_q_to.setScale(width)
122
+ self.arrow_p_from.set_size(width)
123
+ self.arrow_q_from.set_size(width)
124
+ self.arrow_p_to.set_size(width)
125
+ self.arrow_q_to.set_size(width)
116
126
 
117
127
  def set_colour(self, color: QColor, style: Qt.PenStyle):
118
128
  """
@@ -125,10 +135,10 @@ class MapLineSegment(QGraphicsLineItem):
125
135
  pen = QPen(color, self.width, style, Qt.PenCapStyle.RoundCap, Qt.PenJoinStyle.RoundJoin)
126
136
 
127
137
  self.setPen(pen)
128
- self.arrow_p_from.set_colour(color, self.arrow_p_from.w, style)
129
- self.arrow_q_from.set_colour(color, self.arrow_q_from.w, style)
130
- self.arrow_p_to.set_colour(color, self.arrow_p_to.w, style)
131
- self.arrow_q_to.set_colour(color, self.arrow_q_to.w, style)
138
+ self.arrow_p_from.set_colour(color)
139
+ self.arrow_q_from.set_colour(color)
140
+ self.arrow_p_to.set_colour(color)
141
+ self.arrow_q_to.set_colour(color)
132
142
 
133
143
  return pen
134
144
 
@@ -3,6 +3,7 @@
3
3
  # file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  # SPDX-License-Identifier: MPL-2.0
5
5
  from __future__ import annotations
6
+ import webbrowser
6
7
  from typing import List, TYPE_CHECKING, Tuple
7
8
  from PySide6 import QtWidgets
8
9
  from PySide6.QtWidgets import QMenu, QGraphicsSceneContextMenuEvent, QGraphicsSceneMouseEvent, QGraphicsRectItem
@@ -23,7 +24,7 @@ if TYPE_CHECKING: # Only imports the below statements during type checking
23
24
  from GridCal.Gui.Diagrams.MapWidget.Substation.voltage_level_graphic_item import VoltageLevelGraphicItem
24
25
 
25
26
 
26
- class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
27
+ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
27
28
  """
28
29
  Represents a block in the diagram
29
30
  Has an x and y and width and height
@@ -39,7 +40,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
39
40
  api_object: Substation,
40
41
  lat: float,
41
42
  lon: float,
42
- r: float = 0.8,
43
+ size: float = 0.8,
43
44
  draw_labels: bool = True):
44
45
  """
45
46
 
@@ -47,28 +48,33 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
47
48
  :param api_object:
48
49
  :param lat:
49
50
  :param lon:
50
- :param r:
51
+ :param size:
51
52
  """
53
+ # Correct way to call multiple inheritance
54
+ super().__init__()
55
+
56
+ # Explicitly call QGraphicsRectItem initialization
52
57
  QGraphicsRectItem.__init__(self)
53
- NodeTemplate.__init__(self,
54
- api_object=api_object,
58
+
59
+ # Explicitly call NodeTemplate initialization
60
+ NodeTemplate.__init__(self, api_object=api_object,
55
61
  editor=editor,
56
62
  draw_labels=draw_labels,
57
63
  lat=lat,
58
64
  lon=lon)
59
65
 
66
+ self.size = size
60
67
  self.line_container = None
61
68
  self.editor: GridMapWidget = editor # reassign for the types to be clear
62
69
  self.api_object: Substation = api_object # reassign for the types to be clear
63
70
 
64
- self.radius = r
65
- r2 = r / 2
66
- x, y = self.editor.to_x_y(lat=lat, lon=lon) # upper left corner
71
+ r2 = size / 2
72
+ x, y = editor.to_x_y(lat=lat, lon=lon) # upper left corner
67
73
  self.setRect(
68
74
  x - r2,
69
75
  y - r2,
70
- self.radius,
71
- self.radius
76
+ self.size,
77
+ self.size
72
78
  )
73
79
 
74
80
  # Enable hover events for the item
@@ -80,7 +86,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
80
86
  self.setCursor(Qt.CursorShape.PointingHandCursor)
81
87
 
82
88
  # Create a pen with reduced line width
83
- self.change_pen_width(0.5)
89
+ self.change_pen_width(0.05 * size)
90
+ # self.setPen(Qt.PenStyle.NoPen)
91
+ # self.setFlag(self.GraphicsItemFlag.ItemIgnoresTransformations, True)
92
+ # self.setFlag(self.GraphicsItemFlag.ItemIsSelectable, True)
93
+ # self.setFlag(self.GraphicsItemFlag.ItemIsMovable, True)
84
94
 
85
95
  # Create a pen with reduced line width
86
96
  self.color = QColor(self.api_object.color)
@@ -90,27 +100,28 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
90
100
  self.border_color = QColor(self.api_object.color) # No Alpha
91
101
 
92
102
  self.set_default_color()
103
+ # self.pen().setCosmetic(True)
93
104
 
94
105
  # list of voltage levels graphics
95
106
  self.voltage_level_graphics: List[VoltageLevelGraphicItem] = list()
96
107
 
97
- def re_scale(self, r: float):
108
+ def set_size(self, r: float):
98
109
  """
99
110
 
100
111
  :param r: radius in pixels
101
112
  :return:
102
113
  """
103
- if r != self.radius:
114
+ if r != self.size:
104
115
  rect = self.rect()
105
116
  rect.setWidth(r)
106
117
  rect.setHeight(r)
107
118
 
108
119
  # change the width and height while keeping the same center
109
- r2 = (self.radius - r) / 2
120
+ r2 = (self.size - r) / 2
110
121
  new_x = rect.x() + r2
111
122
  new_y = rect.y() + r2
112
123
 
113
- self.radius = r
124
+ self.size = r
114
125
 
115
126
  # Set the new rectangle with the updated dimensions
116
127
  self.setRect(new_x, new_y, r, r)
@@ -124,6 +135,8 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
124
135
  for vl_graphics in self.voltage_level_graphics:
125
136
  vl_graphics.center_on_substation()
126
137
 
138
+ self.change_pen_width(0.05 * self.size)
139
+
127
140
  self.update_position_at_the_diagram()
128
141
 
129
142
  self.resize_voltage_levels()
@@ -140,7 +153,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
140
153
  for vl_graphics in self.voltage_level_graphics:
141
154
  # radius here is the width, therefore we need to send W/2
142
155
  scale = vl_graphics.api_object.Vnom / max_vl * 0.5
143
- vl_graphics.set_size(r=self.radius * scale)
156
+ vl_graphics.set_size(r=self.size * scale)
144
157
  vl_graphics.center_on_substation()
145
158
 
146
159
  def set_api_object_color(self) -> None:
@@ -149,9 +162,12 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
149
162
  """
150
163
  self.color = QColor(self.api_object.color)
151
164
  self.color.setAlpha(128)
165
+
152
166
  self.hoover_color = QColor(self.api_object.color)
153
167
  self.hoover_color.setAlpha(180)
168
+
154
169
  self.border_color = QColor(self.api_object.color) # No Alpha
170
+
155
171
  self.set_default_color()
156
172
 
157
173
  def move_to(self, lat: float, lon: float) -> Tuple[float, float]:
@@ -194,7 +210,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
194
210
 
195
211
  for vl_graphics in self.voltage_level_graphics:
196
212
  scale = vl_graphics.api_object.Vnom / max_vl * 0.8
197
- vl_graphics.set_size(r=self.radius * scale)
213
+ vl_graphics.set_size(r=self.size * scale)
198
214
  vl_graphics.center_on_substation()
199
215
 
200
216
  sorted_objects = sorted(self.voltage_level_graphics, key=lambda x: -x.api_object.Vnom)
@@ -315,7 +331,12 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
315
331
  add_menu_entry(menu=menu,
316
332
  text="Remove from schematic",
317
333
  icon_path=":/Icons/icons/delete_schematic.svg",
318
- function_ptr=self.remove_function)
334
+ function_ptr=self.remove_function_from_schematic)
335
+
336
+ add_menu_entry(menu=menu,
337
+ text="Remove from schematic and database",
338
+ icon_path=":/Icons/icons/delete_db.svg",
339
+ function_ptr=self.remove_function_from_schematic_and_db)
319
340
 
320
341
  add_menu_entry(menu=menu,
321
342
  text="Show diagram",
@@ -327,6 +348,11 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
327
348
  icon_path=":/Icons/icons/plot.svg",
328
349
  function_ptr=self.plot)
329
350
 
351
+ add_menu_entry(menu=menu,
352
+ text="Open in street view",
353
+ icon_path=":/Icons/icons/map.svg",
354
+ function_ptr=self.open_street_view)
355
+
330
356
  menu.exec_(event.screenPos())
331
357
 
332
358
  def create_new_line(self):
@@ -368,7 +394,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
368
394
 
369
395
  pass
370
396
 
371
- def remove_function(self) -> None:
397
+ def remove_function_from_schematic(self) -> None:
372
398
  """
373
399
  Function to be called when Action 1 is selected.
374
400
  """
@@ -376,7 +402,19 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
376
402
  "Remove substation graphics")
377
403
 
378
404
  if ok:
379
- self.editor.remove_substation(substation=self)
405
+ self.editor.remove_substation(substation=self, delete_from_db=False)
406
+
407
+ def remove_function_from_schematic_and_db(self) -> None:
408
+ """
409
+
410
+ :return:
411
+ """
412
+
413
+ ok = yes_no_question(f"Remove substation {self.api_object.name} from the map and the database?",
414
+ "Remove substation graphics and database item")
415
+
416
+ if ok:
417
+ self.editor.remove_substation(substation=self, delete_from_db=True)
380
418
 
381
419
  def move_to_api_coordinates(self):
382
420
  """
@@ -454,7 +492,7 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
454
492
  :param width: New pen width.
455
493
  """
456
494
  pen = self.pen()
457
- pen.setWidth(width)
495
+ pen.setWidthF(width)
458
496
  self.setPen(pen)
459
497
 
460
498
  def set_color(self, inner_color: QColor = None, border_color: QColor = None) -> None:
@@ -480,3 +518,12 @@ class SubstationGraphicItem(QGraphicsRectItem, NodeTemplate):
480
518
  """
481
519
  # Example: color assignment
482
520
  self.set_color(self.color, self.border_color)
521
+
522
+ def open_street_view(self):
523
+ """
524
+ Call open street maps
525
+ :return:
526
+ """
527
+ # https://maps.google.com/?q=<lat>,<lng>
528
+ url = f"https://www.google.com/maps/?q={self.lat},{self.lon}"
529
+ webbrowser.open(url)
@@ -44,20 +44,19 @@ class BlueMarbleTiles(Tiles):
44
44
  :param http_proxy:
45
45
  """
46
46
 
47
- Tiles.__init__(self,
48
- tile_set_name=name,
49
- tile_set_short_name='BM Tiles',
50
- tile_set_version='1.0',
51
- levels=list(range(10)),
52
- tile_width=256,
53
- tile_height=256,
54
- tiles_dir=tiles_dir,
55
- max_lru=10000,
56
- servers=['https://s3.amazonaws.com', ],
57
- url_path='/com.modestmaps.bluemarble/{Z}-r{Y}-c{X}.jpg',
58
- max_server_requests=2,
59
- http_proxy=http_proxy,
60
- attribution="© NASA Blue Marble, © OpenStreetMap contributors")
47
+ super().__init__(tile_set_name=name,
48
+ tile_set_short_name='BM Tiles',
49
+ tile_set_version='1.0',
50
+ levels=list(range(10)),
51
+ tile_width=256,
52
+ tile_height=256,
53
+ tiles_dir=tiles_dir,
54
+ max_lru=10000,
55
+ servers=['https://s3.amazonaws.com', ],
56
+ url_path='/com.modestmaps.bluemarble/{Z}-r{Y}-c{X}.jpg',
57
+ max_server_requests=2,
58
+ http_proxy=http_proxy,
59
+ attribution="© NASA Blue Marble, © OpenStreetMap contributors")
61
60
 
62
61
  def Geo2Tile(self, longitude: float, latitude: float) -> Tuple[float, float]:
63
62
  """Convert geo to tile fractional coordinates for level in use.
@@ -52,17 +52,12 @@ class CartoDbTiles(Tiles):
52
52
  tile_width=256,
53
53
  tile_height=256,
54
54
  tiles_dir=tiles_dir,
55
- servers=[
56
- "https://basemaps.cartocdn.com/dark_all/"
57
- ] if tile_servers is None else tile_servers,
55
+ servers=["https://basemaps.cartocdn.com/dark_all/"] if tile_servers is None else tile_servers,
58
56
  url_path='/{Z}/{X}/{Y}.png',
59
57
  max_server_requests=2,
60
58
  max_lru=10000,
61
59
  http_proxy=http_proxy,
62
60
  attribution="© CARTO, © OpenStreetMap contributors")
63
- # TODO: implement map wrap-around
64
- # self.wrap_x = True
65
- # self.wrap_y = False
66
61
 
67
62
  # get tile information into instance
68
63
  self.level = min(self.levels)
@@ -36,7 +36,7 @@ from PySide6.QtGui import QPixmap
36
36
  from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles_cache import TilesCache
37
37
 
38
38
 
39
- class BaseTiles(object):
39
+ class BaseTiles:
40
40
  """A base tile object to source local tiles for pySlip."""
41
41
 
42
42
  def __init__(self,
@@ -92,7 +92,9 @@ class BaseTiles(object):
92
92
  raise Exception(msg) from None
93
93
 
94
94
  msg = "The tiles directory %s doesn't exist." % tiles_dir
95
- raise Exception(msg) from None
95
+ print(msg)
96
+ # raise Exception(msg) from None
97
+ os.makedirs(tiles_dir)
96
98
 
97
99
  @property
98
100
  def max_level(self):
@@ -31,17 +31,17 @@ https://github.com/rzzzwilson/pyCacheBack
31
31
  class PyCacheBack(dict):
32
32
  """An LRU limited in-memory store fronting an unlimited on-disk store."""
33
33
 
34
- # default maximum number of key/value pairs for pyCacheBack
35
- DefaultMaxLRU = 1000
34
+ def __init__(self, *args, **kwargs):
35
+ super().__init__(*args, **kwargs)
36
+ # default maximum number of key/value pairs for pyCacheBack
37
+ self.DefaultMaxLRU = 1000
36
38
 
37
- # default path to tiles directory
38
- DefaultTilesDir = 'tiles'
39
+ # default path to tiles directory
40
+ self.DefaultTilesDir = 'tiles'
39
41
 
40
- def __init__(self, *args, **kwargs):
41
42
  self._lru_list = []
42
43
  self._max_lru = kwargs.pop('max_lru', self.DefaultMaxLRU)
43
44
  self._tiles_dir = kwargs.pop('tiles_dir', self.DefaultTilesDir)
44
- super().__init__(*args, **kwargs)
45
45
 
46
46
  def __getitem__(self, key):
47
47
  if key in self:
@@ -134,4 +134,3 @@ class PyCacheBack(dict):
134
134
  """
135
135
 
136
136
  raise KeyError
137
-
@@ -70,8 +70,7 @@ class TileWorker(QThread):
70
70
  :param error_image: the image to return on some error
71
71
  :param refresh_tiles_after_days:
72
72
  """
73
-
74
- QThread.__init__(self)
73
+ super().__init__()
75
74
 
76
75
  self.id_num = id_num
77
76
  self.server = server
@@ -55,11 +55,7 @@ class Tiles(BaseTiles):
55
55
  A tile object to source server tiles for the widget.
56
56
  """
57
57
 
58
- # allowed file types and associated values
59
- AllowedFileTypes = {'png': 'PNG', 'jpg': 'JPG'}
60
58
 
61
- # the number of seconds in a day
62
- SecondsInADay = 60 * 60 * 24
63
59
 
64
60
  def __init__(self,
65
61
  tile_set_name: str,
@@ -92,6 +88,15 @@ class Tiles(BaseTiles):
92
88
  :param http_proxy: proxy to use if required
93
89
  :param re_fetch_days: fetch new server tile if older than this in days (0 means don't ever update tiles)
94
90
  """
91
+ # perform the base class initialization
92
+ super().__init__(levels, tile_width, tile_height, tiles_dir, max_lru)
93
+
94
+ # allowed file types and associated values
95
+ self.AllowedFileTypes = {'png': 'PNG', 'jpg': 'JPG'}
96
+
97
+ # the number of seconds in a day
98
+ self.SecondsInADay = 60 * 60 * 24
99
+
95
100
  self.tile_set_name = tile_set_name
96
101
  self.tile_set_short_name = tile_set_short_name
97
102
  self.tile_set_version = tile_set_version
@@ -105,8 +110,7 @@ class Tiles(BaseTiles):
105
110
  if not os.path.isdir(level_dir):
106
111
  os.makedirs(level_dir)
107
112
 
108
- # perform the base class initialization
109
- super().__init__(levels, tile_width, tile_height, tiles_dir, max_lru)
113
+
110
114
 
111
115
  # save params not saved in super()
112
116
  self.servers = servers
@@ -41,8 +41,11 @@ class TilesCache(pycacheback.PyCacheBack):
41
41
  self._tiles_dir path to the on-disk cache directory
42
42
  """
43
43
 
44
- PicExtension = 'png'
45
- TilePath = '{Z}/{X}/{Y}.%s' % PicExtension
44
+ def __init__(self, *args, **kwargs):
45
+ super().__init__(*args, **kwargs)
46
+
47
+ self.PicExtension = 'png'
48
+ self.TilePath = '{Z}/{X}/{Y}.%s' % self.PicExtension
46
49
 
47
50
  def tile_date(self, key: Tuple[int, float, float]):
48
51
  """Return the creation date of a tile given its key."""
@@ -94,10 +97,10 @@ class TilesCache(pycacheback.PyCacheBack):
94
97
  try:
95
98
  os.makedirs(dir_path)
96
99
  except OSError:
97
- # we assume it's a "directory exists' error, which we ignore
100
+ # we assume it's a 'directory exists' error, which we ignore
98
101
  pass
99
102
 
100
- image.save(tile_path, TilesCache.PicExtension)
103
+ image.save(tile_path, self.PicExtension)
101
104
 
102
105
  def add(self, key: Tuple[int, float, float], image: QPixmap):
103
106
  """