GridCal 5.3.37__tar.gz → 5.3.38__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 (291) hide show
  1. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/line_editor.py +8 -5
  2. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/line_location_graphic_item.py +24 -0
  3. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +1 -16
  4. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +14 -1
  5. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +42 -24
  6. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +58 -39
  7. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +43 -57
  8. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +60 -44
  9. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +63 -75
  10. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +44 -1
  11. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +11 -15
  12. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/build_diff_tree.py +1 -1
  13. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/demo_code2.py +1 -1
  14. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/demo_code3.py +1 -1
  15. gridcal-5.3.38/GridCal/Gui/GridMerge/demo_code4.py +32 -0
  16. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_diff.py +6 -1
  17. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +2 -1
  18. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/profile_dialogue.py +6 -0
  19. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/__version__.py +1 -1
  20. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/update.py +8 -3
  21. {gridcal-5.3.37 → gridcal-5.3.38}/PKG-INFO +1 -1
  22. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ExecuteGridCal.py +0 -0
  23. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  24. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  25. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  26. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  27. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  28. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  29. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/__init__.py +0 -0
  30. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/gui.py +0 -0
  31. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  32. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  33. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  34. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  35. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  36. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  37. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  38. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  39. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  40. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  41. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  42. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  43. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  44. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  45. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  46. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  47. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  48. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/__init__.py +0 -0
  49. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/controllable_shunt_editor.py +0 -0
  50. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/generator_editor.py +0 -0
  51. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/new_line_dialogue.py +0 -0
  52. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/transformer3w_editor.py +0 -0
  53. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/transformer_editor.py +0 -0
  54. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/transformer_taps_editor.py +0 -0
  55. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  56. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  57. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  58. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  59. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  60. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
  61. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  62. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  63. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  64. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  65. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  66. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  67. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  68. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  69. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  70. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  71. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  72. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  73. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  74. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  75. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  76. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
  77. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  78. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  79. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  80. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  81. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  82. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  83. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  84. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  85. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  86. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  87. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  88. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  89. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  90. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  91. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  92. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  93. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  94. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  95. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  96. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  97. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  98. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  99. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  100. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  101. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  102. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  103. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  104. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  105. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  106. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/__init__.py +0 -0
  107. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
  108. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  109. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  110. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  111. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  112. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  113. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/gui.py +0 -0
  114. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  115. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  116. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/__init__.py +0 -0
  117. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/demo_code.py +0 -0
  118. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_diff_gui.py +0 -0
  119. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_merge.py +0 -0
  120. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_merge_gui.py +0 -0
  121. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/update_gui_file.py +0 -0
  122. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  123. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  124. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  125. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  126. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  127. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  128. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  129. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  130. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  131. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  132. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  133. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  134. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/GridCalMain.py +0 -0
  135. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/MainWindow.py +0 -0
  136. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  137. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  138. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
  139. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
  140. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  141. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  142. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  143. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  144. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  145. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  146. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  147. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  148. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
  149. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  150. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
  151. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/io.py +0 -0
  152. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/simulations.py +0 -0
  153. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/__init__.py +0 -0
  154. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/icons_rc.py +0 -0
  155. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/object_select_window.py +0 -0
  156. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/update_gui_file.py +0 -0
  157. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  158. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  159. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  160. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  161. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  162. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  163. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  164. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  165. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  166. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  167. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  168. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  169. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  170. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  171. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  172. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  173. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  174. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  175. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  176. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  177. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  178. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  179. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  180. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  181. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/__init__.py +0 -0
  182. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/substation_designer.py +0 -0
  183. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +0 -0
  184. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/update_gui_file.py +0 -0
  185. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  186. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  187. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  188. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  189. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  190. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  191. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  192. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  193. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  194. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  195. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  196. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  197. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  198. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  199. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/tower_builder.py +0 -0
  200. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  201. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  202. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  203. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  204. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  205. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  206. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Visualization/__init__.py +0 -0
  207. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Visualization/visualization.py +0 -0
  208. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Widgets/__init__.py +0 -0
  209. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  210. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  211. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  212. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  213. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  214. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  215. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  216. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/__init__.py +0 -0
  217. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/associations_model.py +0 -0
  218. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/general_dialogues.py +0 -0
  219. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/gui_functions.py +0 -0
  220. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/messages.py +0 -0
  221. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/object_model.py +0 -0
  222. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/pandas_model.py +0 -0
  223. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/plot_config.py +0 -0
  224. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/profiles_model.py +0 -0
  225. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/python_console.py +0 -0
  226. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/python_highlighter.py +0 -0
  227. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/results_model.py +0 -0
  228. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/table_view_header_wrap.py +0 -0
  229. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/themes.py +0 -0
  230. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/toast_widget.py +0 -0
  231. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/update_gui_all.py +0 -0
  232. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/update_gui_common.py +0 -0
  233. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/wrappable_table_model.py +0 -0
  234. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/LICENSE.txt +0 -0
  235. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/__init__.py +0 -0
  236. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/export_results_driver.py +0 -0
  237. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/file_handler.py +0 -0
  238. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/server_driver.py +0 -0
  239. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/session.py +0 -0
  240. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/synchronization_driver.py +0 -0
  241. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/__init__.py +0 -0
  242. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  243. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  244. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  245. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  246. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  247. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  248. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  249. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  250. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  251. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  252. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  253. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  254. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  255. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  256. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  257. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  258. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  259. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  260. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  261. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  262. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  263. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  264. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  265. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  266. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  267. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  268. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  269. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  270. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  271. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  272. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  273. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  274. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  275. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  276. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  277. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  278. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  279. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  280. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/__init__.py +0 -0
  281. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/GridCal.ico +0 -0
  282. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/GridCal.svg +0 -0
  283. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/__init__.py +0 -0
  284. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/cables.csv +0 -0
  285. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/sequence_lines.csv +0 -0
  286. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/transformers.csv +0 -0
  287. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/wires.csv +0 -0
  288. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/plugins.py +0 -0
  289. {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/templates.py +0 -0
  290. {gridcal-5.3.37 → gridcal-5.3.38}/setup.cfg +0 -0
  291. {gridcal-5.3.37 → gridcal-5.3.38}/setup.py +0 -0
@@ -237,7 +237,10 @@ class LineEditor(QDialog):
237
237
  self.line.disable_auto_updates()
238
238
  self.line.set_length(val=length)
239
239
  self.line.set_circuit_idx(val=int(self.circuit_idx.value()), obj=self.selected_template)
240
- self.line.apply_template(obj=self.selected_template, Sbase=self.Sbase, freq=self.frequency)
240
+ template = self.selected_template
241
+ if isinstance(template, OverheadLineType):
242
+ template.compute()
243
+ self.line.apply_template(obj=template, Sbase=self.Sbase, freq=self.frequency)
241
244
  self.line.enable_auto_updates()
242
245
  self.accept()
243
246
  else:
@@ -292,8 +295,8 @@ class LineEditor(QDialog):
292
295
  self.selected_template = template
293
296
 
294
297
  elif isinstance(template, OverheadLineType):
295
- if self.current_template.check():
296
- R1, X1, Bsh1, I_kA = self.current_template.get_sequence_values(
298
+ if template.check():
299
+ R1, X1, Bsh1, I_kA = template.get_sequence_values(
297
300
  circuit_idx=int(self.circuit_idx.value()),
298
301
  seq=1
299
302
  )
@@ -301,9 +304,9 @@ class LineEditor(QDialog):
301
304
  self.r_spinner.setValue(R1)
302
305
  self.x_spinner.setValue(X1)
303
306
  self.b_spinner.setValue(Bsh1)
304
- self.circuit_idx.setMaximum(self.current_template.n_circuits)
307
+ self.circuit_idx.setMaximum(template.n_circuits)
305
308
  else:
306
- warning_msg(text=f"The template {self.current_template.name} contains errors",
309
+ warning_msg(text=f"The template {template.name} contains errors",
307
310
  title="Load template")
308
311
 
309
312
  self.selected_template = template
@@ -4,6 +4,8 @@
4
4
  # SPDX-License-Identifier: MPL-2.0
5
5
  from __future__ import annotations
6
6
  from typing import Tuple, List, TYPE_CHECKING
7
+
8
+ from GridCalEngine.enumerations import DeviceType
7
9
  from PySide6.QtWidgets import QMenu, QGraphicsSceneContextMenuEvent
8
10
  from GridCal.Gui.gui_functions import add_menu_entry
9
11
  from PySide6 import QtWidgets
@@ -258,6 +260,28 @@ class LineLocationGraphicItem(QtWidgets.QGraphicsEllipseItem, NodeTemplate):
258
260
  icon_path=":/Icons/icons/delete_schematic.svg",
259
261
  function_ptr=self.remove)
260
262
 
263
+ add_menu_entry(menu=menu,
264
+ text="Transform waypoint into substation",
265
+ function_ptr=self.editor.transform_waypoint_to_substation,
266
+ icon_path=":/Icons/icons/divide.svg")
267
+
268
+ menu.addSeparator()
269
+
270
+ has_substation = False
271
+
272
+ for graphic_obj in self.editor._get_selected():
273
+ if hasattr(graphic_obj, 'api_object'):
274
+ if hasattr(graphic_obj.api_object, 'device_type'):
275
+ if graphic_obj.api_object.device_type == DeviceType.SubstationDevice:
276
+ has_substation = True
277
+
278
+ if has_substation:
279
+
280
+ add_menu_entry(menu=menu,
281
+ text="Connect line to selected substation (T-joint) at this waypoint",
282
+ function_ptr=self.editor.create_t_joint_to_substation,
283
+ icon_path=":/Icons/icons/divide.svg")
284
+
261
285
  menu.exec_(event.screenPos())
262
286
 
263
287
  def remove(self):
@@ -272,7 +272,6 @@ class MapLineSegment(QGraphicsLineItem):
272
272
  has_substation = False
273
273
  substation_counter = 0
274
274
  line_counter = 0
275
- lineloc_counter = 0
276
275
 
277
276
  for graphic_obj in self.editor._get_selected():
278
277
  if hasattr(graphic_obj, 'api_object'):
@@ -283,10 +282,8 @@ class MapLineSegment(QGraphicsLineItem):
283
282
  elif graphic_obj.api_object.device_type == DeviceType.LineDevice:
284
283
  line_counter += 1
285
284
 
286
- elif graphic_obj.api_object.device_type == DeviceType.LineLocation:
287
- lineloc_counter += 1
288
-
289
285
  if line_counter > 1:
286
+
290
287
  add_menu_entry(menu=menu,
291
288
  text="Merge selected lines",
292
289
  function_ptr=self.editor.merge_selected_lines,
@@ -294,14 +291,6 @@ class MapLineSegment(QGraphicsLineItem):
294
291
 
295
292
  menu.addSeparator()
296
293
 
297
- if lineloc_counter > 0:
298
- add_menu_entry(menu=menu,
299
- text="Transform waypoint into substation",
300
- function_ptr=self.editor.transform_waypoint_to_substation,
301
- icon_path=":/Icons/icons/divide.svg")
302
-
303
- menu.addSeparator()
304
-
305
294
  # Add the split line to substation option if a substation is selected
306
295
  if has_substation:
307
296
  if substation_counter == 1:
@@ -310,10 +299,6 @@ class MapLineSegment(QGraphicsLineItem):
310
299
  function_ptr=self.editor.split_line_to_substation,
311
300
  icon_path=":/Icons/icons/divide.svg")
312
301
 
313
- add_menu_entry(menu=menu,
314
- text="Connect line to selected substation (T-joint)",
315
- function_ptr=self.editor.create_t_joint_to_substation,
316
- icon_path=":/Icons/icons/divide.svg")
317
302
  elif substation_counter == 2:
318
303
 
319
304
  add_menu_entry(menu=menu,
@@ -626,7 +626,8 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
626
626
  dlg = CheckListDialogue(
627
627
  objects_list=[f'Create schematic diagram for the recipient substation {self.api_object.name}',
628
628
  f'Unify buses and voltage levels with the same nominal voltage in recipient '
629
- f'substation {self.api_object.name}'],
629
+ f'substation {self.api_object.name}. This will reattach the following items to the '
630
+ f'recipient substation: Lines, generators, loads, shunts, controllable shunts'],
630
631
  title=f"Finishing merging proces in substation{self.api_object.name}"
631
632
  )
632
633
  dlg.setModal(True)
@@ -655,6 +656,18 @@ class SubstationGraphicItem(NodeTemplate, QGraphicsRectItem):
655
656
  line.bus_to = recipient_buses[line.bus_to.Vnom]
656
657
  line_graphic = self.editor.graphics_manager.query(elm=line)
657
658
  line_graphic.calculate_total_length()
659
+ for load in self.editor.circuit.loads:
660
+ if load.bus in removed_buses:
661
+ load.bus = recipient_buses[load.bus.Vnom]
662
+ for gen in self.editor.circuit.generators:
663
+ if gen.bus in removed_buses:
664
+ gen.bus = recipient_buses[gen.bus.Vnom]
665
+ for sh in self.editor.circuit.shunts:
666
+ if sh.bus in removed_buses:
667
+ sh.bus = recipient_buses[sh.bus.Vnom]
668
+ for csh in self.editor.circuit.controllable_shunts:
669
+ if csh.bus in removed_buses:
670
+ csh.bus = recipient_buses[csh.bus.Vnom]
658
671
 
659
672
  for bus in removed_buses:
660
673
  self.editor.circuit.delete_bus(obj=bus, delete_associated=False)
@@ -30,35 +30,53 @@ from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles import Tiles
30
30
 
31
31
 
32
32
  class CartoDbTiles(Tiles):
33
- """An object to source server tiles for pySlipQt."""
33
+ """
34
+ An object to source server tiles for pySlipQt.
35
+ """
34
36
 
35
37
  def __init__(self, tiles_dir='open_street_map_tiles',
36
38
  http_proxy=None,
37
39
  tile_servers: List[str] | None = None,
38
- name: str = 'Carto positron'):
40
+ url_path='/{Z}/{X}/{Y}.png',
41
+ name: str = 'Carto positron',
42
+ tile_set_short_name='CartoDb Dark Matter',
43
+ tile_set_version='1.0',
44
+ attribution="© CARTO, © OpenStreetMap contributors",
45
+ min_zoom: int = 0,
46
+ max_zoom: int = 22,
47
+ tile_width=256,
48
+ tile_height=256):
39
49
  """
40
50
  Override the base class for these tiles.
41
-
42
51
  Basically, just fill in the BaseTiles class with values from above
43
52
  and provide the Geo2Tile() and Tile2Geo() methods.
44
- :param tiles_dir:
45
- :param http_proxy:
46
- :param tile_servers:
53
+ :param tiles_dir: Tiles directory
54
+ :param http_proxy: Proxy URL
55
+ :param tile_servers: List of tile servers
56
+ :param url_path: extra path to query the tiles
57
+ :param name: Name of the tile set
58
+ :param tile_set_short_name: Short name of the tile set
59
+ :param tile_set_version: Version of the tile set
60
+ :param attribution: Attribution string of the tile set
61
+ :param min_zoom: Minimal zoom
62
+ :param max_zoom: Maximum zoom (+1)
63
+ :param tile_width: Width of the tile (px)
64
+ :param tile_height: Height of the tile (px)
47
65
  """
48
66
 
49
67
  super().__init__(tile_set_name=name,
50
- tile_set_short_name='CartoDb Dark Matter',
51
- tile_set_version='1.0',
52
- levels=list(range(22)),
53
- tile_width=256,
54
- tile_height=256,
68
+ tile_set_short_name=tile_set_short_name,
69
+ tile_set_version=tile_set_version,
70
+ levels=[z for z in range(min_zoom, max_zoom)],
71
+ tile_width=tile_width,
72
+ tile_height=tile_height,
55
73
  tiles_dir=tiles_dir,
56
74
  servers=["https://basemaps.cartocdn.com/dark_all/"] if tile_servers is None else tile_servers,
57
- url_path='/{Z}/{X}/{Y}.png',
75
+ url_path=url_path,
58
76
  max_server_requests=2,
59
77
  max_lru=10000,
60
78
  http_proxy=http_proxy,
61
- attribution="© CARTO, © OpenStreetMap contributors")
79
+ attribution=attribution)
62
80
 
63
81
  # get tile information into instance
64
82
  self.level = min(self.levels)
@@ -67,21 +85,21 @@ class CartoDbTiles(Tiles):
67
85
  def copy(self) -> "CartoDbTiles":
68
86
  """
69
87
  Copy of this object
70
- :return:
88
+ :return: CartoDbTiles
71
89
  """
72
- # cpy = super().copy()
73
- # cpy.__class__ == CartoDbTiles
74
- # cpy: CartoDbTiles = cpy
75
- # cpy.level = self.level
76
- # cpy.num_tiles_x = self.num_tiles_x
77
- # cpy.num_tiles_y = self.num_tiles_y
78
- # cpy.ppd_x = self.ppd_x
79
- # cpy.ppd_y = self.ppd_y
80
-
81
90
  cpy = CartoDbTiles(tiles_dir=self.tiles_dir,
82
91
  http_proxy=self.http_proxy,
83
92
  tile_servers=self.servers.copy(),
84
- name=self.tile_set_name)
93
+ url_path=self.url_path,
94
+ name=self.tile_set_name,
95
+ tile_set_short_name=self.tile_set_short_name,
96
+ tile_set_version=self.tile_set_version,
97
+ attribution=self.attribution_string,
98
+ min_zoom=self.min_level,
99
+ max_zoom=self.max_level,
100
+ tile_width=self.tile_width,
101
+ tile_height=self.tile_height
102
+ )
85
103
 
86
104
  return cpy
87
105
 
@@ -37,7 +37,9 @@ from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles_cache import TilesCache
37
37
 
38
38
 
39
39
  class BaseTiles:
40
- """A base tile object to source local tiles for pySlip."""
40
+ """
41
+ A base tile object to source local tiles for pySlip.
42
+ """
41
43
 
42
44
  def __init__(self,
43
45
  levels: List[int],
@@ -71,11 +73,10 @@ class BaseTiles:
71
73
  self.ppd_x = 0
72
74
  self.ppd_y = 0
73
75
 
74
- # TODO: implement map wrap-around
75
76
  self.wrap_x = False
76
77
  self.wrap_y = False
77
78
 
78
- # setup the tile cache
79
+ # set up the tile cache
79
80
  self.cache = TilesCache(tiles_dir=tiles_dir, max_lru=max_lru)
80
81
 
81
82
  #####
@@ -91,10 +92,9 @@ class BaseTiles:
91
92
  msg = ("%s doesn't appear to be a tile cache directory" % tiles_dir)
92
93
  raise Exception(msg) from None
93
94
 
94
- msg = "The tiles directory %s doesn't exist." % tiles_dir
95
- print(msg)
96
95
  # raise Exception(msg) from None
97
96
  os.makedirs(tiles_dir)
97
+ print(f"The tiles directory {tiles_dir} has been created")
98
98
 
99
99
  @property
100
100
  def max_level(self):
@@ -112,6 +112,15 @@ class BaseTiles:
112
112
  """
113
113
  return self._min_level
114
114
 
115
+ def level_in_range(self, level) -> bool:
116
+ """
117
+ Check if the level is in range
118
+ :param level: level value
119
+ :return: in range?
120
+ """
121
+ # first, CAN we zoom to this level?
122
+ return self.min_level <= level <= self.max_level
123
+
115
124
  @property
116
125
  def tile_width(self):
117
126
  """
@@ -176,34 +185,37 @@ class BaseTiles:
176
185
  """
177
186
  return self.extent[3]
178
187
 
179
- def UseLevel(self, level):
180
- """Prepare to serve tiles from the required level.
188
+ def set_level(self, level: int):
189
+ """
190
+ Prepare to serve tiles from the required level.
181
191
 
182
- level the required level
192
+ :param level: the required level
183
193
 
184
194
  Return True if level change occurred, else False if not possible.
185
195
  """
186
196
 
187
197
  # first, CAN we zoom to this level?
188
- if level not in self.levels:
189
- return False
198
+ if self.level_in_range(level):
190
199
 
191
- # get tile info
192
- info = self.GetInfo(level)
193
- if info is None:
194
- return False
200
+ # get tile info
201
+ info = self.GetInfo(level)
202
+ if info is None:
203
+ return False
195
204
 
196
- # OK, save new level
197
- self.level = level
198
- self.num_tiles_x, self.num_tiles_y, self.ppd_x, self.ppd_y = info
205
+ # OK, save new level
206
+ self.level = level
207
+ self.num_tiles_x, self.num_tiles_y, self.ppd_x, self.ppd_y = info
208
+ return True
199
209
 
200
- return True
210
+ else:
211
+ return False
201
212
 
202
213
  def GetTile(self, x: float, y: float) -> QPixmap:
203
- """Get bitmap for tile at tile coords (x, y) and current level.
214
+ """
215
+ Get bitmap for tile at tile coords (x, y) and current level.
204
216
 
205
- x X coord of tile required (tile coordinates)
206
- y Y coord of tile required (tile coordinates)
217
+ :param x: X coord of tile required (tile coordinates)
218
+ :param y: Y coord of tile required (tile coordinates)
207
219
 
208
220
  Returns bitmap object for the tile image.
209
221
  Tile coordinates are measured from map top-left.
@@ -212,21 +224,21 @@ class BaseTiles:
212
224
  # if we are wrapping X or Y, get wrapped tile coords
213
225
  if self.wrap_x:
214
226
  x = (x + self.num_tiles_x * self.tile_size_x) % self.num_tiles_x
227
+
215
228
  if self.wrap_y:
216
229
  y = (y + self.num_tiles_y * self.tile_size_y) % self.num_tiles_y
217
230
 
218
- # retrieve the tile
219
231
  try:
220
232
  # get tile from cache
221
233
  return self.cache[(self.level, x, y)]
234
+
222
235
  except KeyError as e:
223
236
  raise KeyError("Can't find tile for key '%s'" % str((self.level, x, y))) from None
224
237
 
225
238
  def GetInfo(self, level: int) -> Union[Tuple[float, float, None, None], None]:
226
- """Get tile info for a particular level.
227
-
228
- level the level to get tile info for
229
-
239
+ """
240
+ Get tile info for a particular level.
241
+ :param level: the level to get tile info for
230
242
  Returns (num_tiles_x, num_tiles_y, ppd_x, ppd_y) or None if 'level'
231
243
  doesn't exist.
232
244
 
@@ -235,18 +247,22 @@ class BaseTiles:
235
247
  """
236
248
 
237
249
  # is required level available?
238
- if level not in self.levels:
239
- return None
250
+ if self.level_in_range(level):
240
251
 
241
- # otherwise get the information
242
- self.num_tiles_x = int(math.pow(2, level))
243
- self.num_tiles_y = int(math.pow(2, level))
252
+ # otherwise get the information
253
+ self.num_tiles_x = int(math.pow(2, level))
254
+ self.num_tiles_y = int(math.pow(2, level))
244
255
 
245
- return self.num_tiles_x, self.num_tiles_y, None, None
256
+ return self.num_tiles_x, self.num_tiles_y, None, None
257
+
258
+ else:
259
+ return None
246
260
 
247
261
  def GetExtent(self):
248
- """Get geo limits of the map tiles.
249
- (min_lon, max_lon, min_lat, max_lat)
262
+ """
263
+ Get geo limits of the map tiles.
264
+ (min_lon, max_lon, min_lat, max_lat)
265
+
250
266
  Returns a tuple: (min_geo_x, max_geo_x, min_geo_y, max_geo_y)
251
267
  """
252
268
 
@@ -255,6 +271,9 @@ class BaseTiles:
255
271
  def tile_on_disk(self, level: int, x: float, y: float):
256
272
  """
257
273
  Return True if tile at (level, x, y) is on-disk.
274
+ :param level: Map level
275
+ :param x: map x coordinate
276
+ :param y: map y coordinate
258
277
  """
259
278
  raise Exception('You must override BaseTiles.tile_on_disk(level, x, y))')
260
279
 
@@ -268,13 +287,13 @@ class BaseTiles:
268
287
  def Geo2Tile(self, longitude: float, latitude: float) -> Tuple[int, int]:
269
288
  """
270
289
  Convert geo to tile fractional coordinates for level in use.
271
- xgeo geo longitude in degrees
272
- ygeo geo latitude in degrees
273
-
274
290
  Note that we assume the point *is* on the map!
291
+ :param longitude: geo longitude in degrees
292
+ :param latitude: geo latitude in degrees
293
+ :return x_tile, y_tile (tile fractional X, Y coordinate)
275
294
  """
276
295
 
277
- raise Exception('You must override BaseTiles.Geo2Tile(xgeo, ygeo)')
296
+ raise Exception('You must override BaseTiles.Geo2Tile(longitude, latitude)')
278
297
 
279
298
  def Tile2Geo(self, x_tile: float, y_tile: float) -> Tuple[float, float]:
280
299
  """
@@ -286,4 +305,4 @@ class BaseTiles:
286
305
  Note that we assume the point *is* on the map!
287
306
  """
288
307
 
289
- raise Exception('You must override BaseTiles.Tile2Geo(xtile, ytile)')
308
+ raise Exception('You must override BaseTiles.Tile2Geo(x_tile, y_tile)')
@@ -134,6 +134,9 @@ class Tiles(BaseTiles):
134
134
  tile_extension = os.path.splitext(url_path)[1][1:]
135
135
  tile_extension_lower = tile_extension.lower() # ensure lower case
136
136
 
137
+ if tile_extension_lower == "":
138
+ tile_extension_lower = 'jpg'
139
+
137
140
  # determine the file bitmap type
138
141
  try:
139
142
  self.filetype = self.AllowedFileTypes[tile_extension_lower]
@@ -221,61 +224,41 @@ class Tiles(BaseTiles):
221
224
  self.workers.append(worker)
222
225
  worker.start()
223
226
 
224
- # def copy(self) -> "Tiles":
225
- # """
226
- # Perform a copy of the Tiles object.
227
- # :return:
228
- # """
229
- # return Tiles(tile_set_name=self.tile_set_name,
230
- # tile_set_short_name=self.tile_set_short_name,
231
- # tile_set_version=self.tile_set_version,
232
- # levels=self.levels.copy(),
233
- # tile_width=self.tile_width,
234
- # tile_height=self.tile_height,
235
- # tiles_dir=self.tiles_dir,
236
- # max_lru=self.max_lru,
237
- # servers=self.servers.copy(),
238
- # url_path=self.url_path,
239
- # max_server_requests=self.max_requests,
240
- # http_proxy=self.http_proxy,
241
- # re_fetch_days=self.refresh_tiles_after_days,
242
- # attribution=self.attribution_string)
243
-
244
- def UseLevel(self, level):
227
+ def set_level(self, level: int):
245
228
  """
246
229
  Prepare to serve tiles from the required level.
247
-
248
- level the required level
249
-
250
- Return True if level change occurred, else False if not possible.
230
+ :param level: the required level
231
+ :return: True if level change occurred, else False if not possible.
251
232
  """
252
-
253
233
  # first, CAN we zoom to this level?
254
- if level not in self.levels:
255
- return False
234
+ if self.level_in_range(level):
256
235
 
257
- # get tile info
258
- info = self.GetInfo(level)
259
- if info is None:
260
- return False
236
+ # get tile info
237
+ info = self.GetInfo(level)
238
+ if info is None:
239
+ return False
240
+
241
+ # OK, save new level
242
+ self.level = level
243
+ self.num_tiles_x, self.num_tiles_y, self.ppd_x, self.ppd_y = info
261
244
 
262
- # OK, save new level
263
- self.level = level
264
- self.num_tiles_x, self.num_tiles_y, self.ppd_x, self.ppd_y = info
245
+ # flush any outstanding requests.
246
+ # we do this to speed up multiple-level zooms so the user doesn't
247
+ # sit waiting for tiles to arrive that won't be shown.
248
+ self.FlushRequests()
265
249
 
266
- # flush any outstanding requests.
267
- # we do this to speed up multiple-level zooms so the user doesn't
268
- # sit waiting for tiles to arrive that won't be shown.
269
- self.FlushRequests()
250
+ return True
270
251
 
271
- return True
252
+ else:
253
+ # the zoom is out of bounds...
254
+ return False
272
255
 
273
- def GetTile(self, x, y) -> QPixmap:
256
+ def GetTile(self, x: float, y: float) -> QPixmap:
274
257
  """
275
258
  Get bitmap for tile at tile coords (x, y) and current level.
276
259
 
277
- x X coord of tile required (tile coordinates)
278
- y Y coord of tile required (tile coordinates)
260
+ :param x: X coord of tile required (tile coordinates)
261
+ :param y: Y coord of tile required (tile coordinates)
279
262
 
280
263
  Returns bitmap object for the tile image.
281
264
  Tile coordinates are measured from map top-left.
@@ -290,18 +273,18 @@ class Tiles(BaseTiles):
290
273
  try:
291
274
  # get tile from cache
292
275
  tile = self.cache[(self.level, x, y)]
293
- if self.tile_on_disk(self.level, x, y):
276
+ if self.tile_on_disk(level=self.level, x=x, y=y):
294
277
  tile_date = self.cache.tile_date((self.level, x, y))
295
278
  if self.re_request_age and (tile_date < self.re_request_age):
296
- self.get_server_tile(self.level, x, y)
279
+ self.get_server_tile(level=self.level, x=x, y=y)
297
280
  except KeyError:
298
281
  # not cached, start process of getting tile from 'net, return 'pending' image
299
- self.get_server_tile(self.level, x, y)
282
+ self.get_server_tile(level=self.level, x=x, y=y)
300
283
  tile = self.pending_tile
301
284
 
302
285
  return tile
303
286
 
304
- def GetInfo(self, level):
287
+ def GetInfo(self, level: int):
305
288
  """
306
289
  Get tile info for a particular level.
307
290
 
@@ -317,14 +300,15 @@ class Tiles(BaseTiles):
317
300
  """
318
301
 
319
302
  # is required level available?
320
- if level not in self.levels:
321
- return None
303
+ if self.level_in_range(level):
322
304
 
323
- # otherwise get the information
324
- self.num_tiles_x = int(math.pow(2, level))
325
- self.num_tiles_y = int(math.pow(2, level))
305
+ # otherwise get the information
306
+ self.num_tiles_x = int(math.pow(2, level))
307
+ self.num_tiles_y = int(math.pow(2, level))
326
308
 
327
- return self.num_tiles_x, self.num_tiles_y, None, None
309
+ return self.num_tiles_x, self.num_tiles_y, None, None
310
+ else:
311
+ return None
328
312
 
329
313
  def FlushRequests(self):
330
314
  """
@@ -355,7 +339,9 @@ class Tiles(BaseTiles):
355
339
  self.queued_requests[tile_key] = True
356
340
 
357
341
  def tile_on_disk(self, level: int, x: float, y: float):
358
- """Return True if tile at (level, x, y) is on-disk."""
342
+ """
343
+ Return True if tile at (level, x, y) is on-disk.
344
+ """
359
345
 
360
346
  tile_path = self.cache.tile_path((level, x, y))
361
347
  return os.path.exists(tile_path)
@@ -400,11 +386,11 @@ class Tiles(BaseTiles):
400
386
 
401
387
  def SetAgeThresholdDays(self, num_days):
402
388
  """
403
- Set the tile refetch threshold time.
389
+ Set the tile re-fetch threshold time.
404
390
 
405
- num_days number of days before refetching tiles
391
+ num_days number of days before re-fetching tiles
406
392
 
407
- If 'num_days' is 0 refetching is inhibited.
393
+ If 'num_days' is 0 re-fetching is inhibited.
408
394
  """
409
395
 
410
396
  # update the global in case we instantiate again