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.
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/line_editor.py +8 -5
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/line_location_graphic_item.py +24 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +1 -16
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +14 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +42 -24
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +58 -39
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +43 -57
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +60 -44
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +63 -75
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +44 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +11 -15
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/build_diff_tree.py +1 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/demo_code2.py +1 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/demo_code3.py +1 -1
- gridcal-5.3.38/GridCal/Gui/GridMerge/demo_code4.py +32 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_diff.py +6 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +2 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/profile_dialogue.py +6 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/__version__.py +1 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/update.py +8 -3
- {gridcal-5.3.37 → gridcal-5.3.38}/PKG-INFO +1 -1
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ExecuteGridCal.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/controllable_shunt_editor.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/generator_editor.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/new_line_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/transformer3w_editor.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/transformer_editor.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/Editors/transformer_taps_editor.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/demo_code.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_diff_gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_merge.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/grid_merge_gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/GridMerge/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/ConsoleLog.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/GridCalMain.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/MainWindow.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/io.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/SubClasses/simulations.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/object_select_window.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Main/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/substation_designer.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/substation_designer_gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SubstationDesigner/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/tower_builder.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Visualization/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Visualization/visualization.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Widgets/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/associations_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/general_dialogues.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/gui_functions.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/messages.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/object_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/pandas_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/plot_config.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/profiles_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/python_console.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/python_highlighter.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/results_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/table_view_header_wrap.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/themes.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/toast_widget.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/update_gui_all.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/update_gui_common.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/wrappable_table_model.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/LICENSE.txt +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/export_results_driver.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/file_handler.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/server_driver.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/session.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Session/synchronization_driver.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/GridCal.ico +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/GridCal.svg +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/__init__.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/cables.csv +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/sequence_lines.csv +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/transformers.csv +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/data/wires.csv +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/plugins.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/GridCal/templates.py +0 -0
- {gridcal-5.3.37 → gridcal-5.3.38}/setup.cfg +0 -0
- {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
|
-
|
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
|
296
|
-
R1, X1, Bsh1, I_kA =
|
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(
|
307
|
+
self.circuit_idx.setMaximum(template.n_circuits)
|
305
308
|
else:
|
306
|
-
warning_msg(text=f"The template {
|
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):
|
{gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py
RENAMED
@@ -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)
|
{gridcal-5.3.37 → gridcal-5.3.38}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py
RENAMED
@@ -30,35 +30,53 @@ from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles import Tiles
|
|
30
30
|
|
31
31
|
|
32
32
|
class CartoDbTiles(Tiles):
|
33
|
-
"""
|
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
|
-
|
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=
|
51
|
-
tile_set_version=
|
52
|
-
levels=
|
53
|
-
tile_width=
|
54
|
-
tile_height=
|
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=
|
75
|
+
url_path=url_path,
|
58
76
|
max_server_requests=2,
|
59
77
|
max_lru=10000,
|
60
78
|
http_proxy=http_proxy,
|
61
|
-
attribution=
|
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
|
-
|
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
|
-
"""
|
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
|
-
#
|
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
|
180
|
-
"""
|
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
|
189
|
-
return False
|
198
|
+
if self.level_in_range(level):
|
190
199
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
200
|
+
# get tile info
|
201
|
+
info = self.GetInfo(level)
|
202
|
+
if info is None:
|
203
|
+
return False
|
195
204
|
|
196
|
-
|
197
|
-
|
198
|
-
|
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
|
-
|
210
|
+
else:
|
211
|
+
return False
|
201
212
|
|
202
213
|
def GetTile(self, x: float, y: float) -> QPixmap:
|
203
|
-
"""
|
214
|
+
"""
|
215
|
+
Get bitmap for tile at tile coords (x, y) and current level.
|
204
216
|
|
205
|
-
x
|
206
|
-
y
|
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
|
-
"""
|
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
|
239
|
-
return None
|
250
|
+
if self.level_in_range(level):
|
240
251
|
|
241
|
-
|
242
|
-
|
243
|
-
|
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
|
-
|
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
|
-
"""
|
249
|
-
|
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(
|
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(
|
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
|
-
|
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
|
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
|
255
|
-
return False
|
234
|
+
if self.level_in_range(level):
|
256
235
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
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
|
-
|
263
|
-
|
264
|
-
|
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
|
-
|
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
|
-
|
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
|
321
|
-
return None
|
303
|
+
if self.level_in_range(level):
|
322
304
|
|
323
|
-
|
324
|
-
|
325
|
-
|
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
|
-
|
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
|
-
"""
|
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
|
389
|
+
Set the tile re-fetch threshold time.
|
404
390
|
|
405
|
-
num_days number of days before
|
391
|
+
num_days number of days before re-fetching tiles
|
406
392
|
|
407
|
-
If 'num_days' is 0
|
393
|
+
If 'num_days' is 0 re-fetching is inhibited.
|
408
394
|
"""
|
409
395
|
|
410
396
|
# update the global in case we instantiate again
|