GridCal 5.1.41__tar.gz → 5.1.42__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.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +7 -1
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +27 -24
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/base_diagram_widget.py +114 -135
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +14 -7
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/simulations.py +1 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/server_driver.py +6 -3
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/session.py +19 -4
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/__version__.py +1 -1
- {GridCal-5.1.41 → GridCal-5.1.42}/PKG-INFO +1 -1
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ExecuteGridCal.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/gmt_local.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapbox.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapquest.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/open_street_map.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_toner.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_transport.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_watercolor.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/ConsoleLog.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/GridCalMain.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/MainWindow.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/SubClasses/io.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/object_select_window.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Main/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/test_.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Visualization/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Visualization/visualization.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Widgets/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/associations_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/console_widget.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/general_dialogues.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/gui_functions.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/messages.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/object_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/pandas_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/plot_config.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/profiles_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/results_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/table_view_header_wrap.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/themes.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/update_gui_all.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/update_gui_common.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Gui/wrappable_table_model.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/LICENSE.txt +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/export_results_driver.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/file_handler.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/Session/synchronization_driver.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/__init__.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/cables.csv +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/sequence_lines.csv +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/transformers.csv +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/data/wires.csv +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/plugins.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/templates.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/GridCal/update.py +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/setup.cfg +0 -0
- {GridCal-5.1.41 → GridCal-5.1.42}/setup.py +0 -0
@@ -14,8 +14,9 @@
|
|
14
14
|
# You should have received a copy of the GNU Lesser General Public License
|
15
15
|
# along with this program; if not, write to the Free Software Foundation,
|
16
16
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
|
+
from __future__ import annotations
|
17
18
|
import os
|
18
|
-
from typing import Union, List, Tuple, Dict
|
19
|
+
from typing import Union, List, Tuple, Dict, TYPE_CHECKING
|
19
20
|
import json
|
20
21
|
import numpy as np
|
21
22
|
import math
|
@@ -59,6 +60,9 @@ from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles import Tiles
|
|
59
60
|
from GridCal.Gui.Diagrams.base_diagram_widget import BaseDiagramWidget
|
60
61
|
from GridCal.Gui.messages import error_msg
|
61
62
|
|
63
|
+
if TYPE_CHECKING:
|
64
|
+
from GridCal.Gui.Main.GridCalMain import MainGUI
|
65
|
+
|
62
66
|
MAP_BRANCH_GRAPHIC_TYPES = Union[
|
63
67
|
MapAcLine, MapDcLine, MapHvdcLine, MapFluidPathLine
|
64
68
|
]
|
@@ -203,6 +207,7 @@ class GridMapWidget(BaseDiagramWidget):
|
|
203
207
|
"""
|
204
208
|
|
205
209
|
def __init__(self,
|
210
|
+
gui: MainGUI,
|
206
211
|
tile_src: Tiles,
|
207
212
|
start_level: int,
|
208
213
|
longitude: float,
|
@@ -226,6 +231,7 @@ class GridMapWidget(BaseDiagramWidget):
|
|
226
231
|
"""
|
227
232
|
|
228
233
|
BaseDiagramWidget.__init__(self,
|
234
|
+
gui=gui,
|
229
235
|
circuit=circuit,
|
230
236
|
diagram=MapDiagram(name=name,
|
231
237
|
tile_source=tile_src.TilesetName,
|
@@ -14,12 +14,13 @@
|
|
14
14
|
# You should have received a copy of the GNU Lesser General Public License
|
15
15
|
# along with this program; if not, write to the Free Software Foundation,
|
16
16
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
|
+
from __future__ import annotations
|
17
18
|
import sys
|
18
19
|
import os
|
19
20
|
import json
|
20
21
|
import numpy as np
|
21
22
|
import pandas as pd
|
22
|
-
from typing import List, Dict, Union, Tuple
|
23
|
+
from typing import List, Dict, Union, Tuple, TYPE_CHECKING
|
23
24
|
from collections.abc import Callable
|
24
25
|
from warnings import warn
|
25
26
|
import networkx as nx
|
@@ -53,7 +54,8 @@ from GridCalEngine.Devices.Injections.generator import Generator
|
|
53
54
|
from GridCalEngine.Devices.Fluid import FluidNode, FluidPath
|
54
55
|
from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
|
55
56
|
from GridCalEngine.Devices.Diagrams.graphic_location import GraphicLocation
|
56
|
-
from GridCalEngine.
|
57
|
+
from GridCalEngine.Simulations import PowerFlowTimeSeriesResults
|
58
|
+
from GridCalEngine.enumerations import DeviceType, SimulationTypes, ResultTypes
|
57
59
|
from GridCalEngine.basic_structures import Vec, CxVec, IntVec, Logger
|
58
60
|
|
59
61
|
from GridCal.Gui.Diagrams.SchematicWidget.terminal_item import BarTerminalItem, RoundTerminalItem
|
@@ -81,6 +83,9 @@ import GridCal.Gui.Visualization.visualization as viz
|
|
81
83
|
import GridCalEngine.Devices.Diagrams.palettes as palettes
|
82
84
|
from GridCal.Gui.messages import info_msg, error_msg, warning_msg, yes_no_question
|
83
85
|
|
86
|
+
if TYPE_CHECKING:
|
87
|
+
from GridCal.Gui.Main.GridCalMain import MainGUI
|
88
|
+
|
84
89
|
BRANCH_GRAPHICS = Union[
|
85
90
|
LineGraphicItem,
|
86
91
|
WindingGraphicItem,
|
@@ -335,6 +340,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
335
340
|
"""
|
336
341
|
|
337
342
|
def __init__(self,
|
343
|
+
gui: MainGUI,
|
338
344
|
circuit: MultiCircuit,
|
339
345
|
diagram: Union[SchematicDiagram, None],
|
340
346
|
default_bus_voltage: float = 10.0,
|
@@ -351,6 +357,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
351
357
|
"""
|
352
358
|
|
353
359
|
BaseDiagramWidget.__init__(self,
|
360
|
+
gui=gui,
|
354
361
|
circuit=circuit,
|
355
362
|
diagram=diagram,
|
356
363
|
library_model=SchematicLibraryModel(),
|
@@ -3700,15 +3707,21 @@ class SchematicWidget(BaseDiagramWidget):
|
|
3700
3707
|
|
3701
3708
|
return min_x, max_x, min_y, max_y
|
3702
3709
|
|
3703
|
-
def plot_bus(self, i, api_object: Bus):
|
3710
|
+
def plot_bus(self, i: int, api_object: Bus):
|
3704
3711
|
"""
|
3705
3712
|
Plot branch results
|
3706
|
-
:param i:
|
3713
|
+
:param i: bus index
|
3707
3714
|
:param api_object: Bus API object
|
3708
3715
|
:return:
|
3709
3716
|
"""
|
3710
3717
|
fig = plt.figure(figsize=(12, 8))
|
3711
3718
|
ax_1 = fig.add_subplot(211)
|
3719
|
+
ax_1.set_title('Power', fontsize=14)
|
3720
|
+
ax_1.set_ylabel('Injections [MW]', fontsize=11)
|
3721
|
+
|
3722
|
+
ax_2 = fig.add_subplot(212, sharex=ax_1)
|
3723
|
+
ax_2.set_title('Time', fontsize=14)
|
3724
|
+
ax_2.set_ylabel('Voltage [p.u]', fontsize=11)
|
3712
3725
|
|
3713
3726
|
# set time
|
3714
3727
|
x = self.circuit.get_time_array()
|
@@ -3719,18 +3732,16 @@ class SchematicWidget(BaseDiagramWidget):
|
|
3719
3732
|
# Get all devices grouped by bus
|
3720
3733
|
all_data = self.circuit.get_injection_devices_grouped_by_bus()
|
3721
3734
|
|
3722
|
-
#
|
3723
|
-
|
3724
|
-
|
3725
|
-
|
3726
|
-
|
3727
|
-
|
3728
|
-
if hasattr(driver, 'results'):
|
3729
|
-
if driver.results is not None:
|
3730
|
-
if key == SimulationTypes.PowerFlowTimeSeries_run:
|
3731
|
-
voltage[key] = np.abs(driver.results.voltage[:, i])
|
3735
|
+
# search drivers for voltage data
|
3736
|
+
for driver, results in self.gui.session.drivers_results_iter():
|
3737
|
+
if results is not None:
|
3738
|
+
if isinstance(results, PowerFlowTimeSeriesResults):
|
3739
|
+
table = results.mdl(result_type=ResultTypes.BusVoltageModule)
|
3740
|
+
table.plot(ax=ax_2, selected_col_idx=[i])
|
3732
3741
|
|
3733
3742
|
# Injections
|
3743
|
+
# filter injections by bus
|
3744
|
+
bus_devices = all_data.get(api_object, None)
|
3734
3745
|
if bus_devices:
|
3735
3746
|
|
3736
3747
|
power_data = dict()
|
@@ -3752,8 +3763,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
3752
3763
|
raise Exception("Missing shunt device for plotting")
|
3753
3764
|
|
3754
3765
|
df = pd.DataFrame(data=power_data, index=x)
|
3755
|
-
|
3756
|
-
ax_1.set_ylabel('Injections [MW]', fontsize=11)
|
3766
|
+
|
3757
3767
|
try:
|
3758
3768
|
# yt area plots
|
3759
3769
|
df.plot.area(ax=ax_1)
|
@@ -3761,14 +3771,6 @@ class SchematicWidget(BaseDiagramWidget):
|
|
3761
3771
|
# use regular plots
|
3762
3772
|
df.plot(ax=ax_1)
|
3763
3773
|
|
3764
|
-
# voltage
|
3765
|
-
if len(voltage.keys()):
|
3766
|
-
ax_2 = fig.add_subplot(212, sharex=ax_1)
|
3767
|
-
df = pd.DataFrame(data=voltage, index=x)
|
3768
|
-
ax_2.set_title('Time', fontsize=14)
|
3769
|
-
ax_2.set_ylabel('Voltage [p.u]', fontsize=11)
|
3770
|
-
df.plot(ax=ax_2)
|
3771
|
-
|
3772
3774
|
plt.legend()
|
3773
3775
|
fig.suptitle(api_object.name, fontsize=20)
|
3774
3776
|
|
@@ -4115,6 +4117,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
4115
4117
|
logger=self.logger)
|
4116
4118
|
|
4117
4119
|
return SchematicWidget(
|
4120
|
+
gui=self.gui,
|
4118
4121
|
circuit=self.circuit,
|
4119
4122
|
diagram=self.diagram,
|
4120
4123
|
default_bus_voltage=self.default_bus_voltage,
|
@@ -35,21 +35,25 @@ from GridCalEngine.Devices.Branches.transformer import Transformer2W
|
|
35
35
|
from GridCalEngine.Devices.Branches.vsc import VSC
|
36
36
|
from GridCalEngine.Devices.Branches.upfc import UPFC
|
37
37
|
from GridCalEngine.Devices.types import BRANCH_TYPES
|
38
|
+
from GridCalEngine.Simulations import (PowerFlowTimeSeriesResults, LinearAnalysisTimeSeriesResults,
|
39
|
+
ContingencyAnalysisTimeSeriesResults, OptimalPowerFlowTimeSeriesResults,
|
40
|
+
StochasticPowerFlowResults)
|
38
41
|
from GridCalEngine.basic_structures import Vec, CxVec, IntVec
|
39
42
|
from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
|
40
43
|
from GridCalEngine.Devices.Diagrams.map_diagram import MapDiagram
|
41
44
|
from GridCalEngine.Simulations.types import DRIVER_OBJECTS
|
42
45
|
from GridCalEngine.basic_structures import Logger
|
43
|
-
from GridCalEngine.enumerations import SimulationTypes
|
46
|
+
from GridCalEngine.enumerations import SimulationTypes, ResultTypes
|
44
47
|
|
45
48
|
from GridCal.Gui.Diagrams.graphics_manager import GraphicsManager
|
46
49
|
import GridCalEngine.Devices.Diagrams.palettes as palettes
|
47
|
-
from GridCal.Gui.messages import yes_no_question
|
50
|
+
from GridCal.Gui.messages import yes_no_question, info_msg
|
48
51
|
from GridCal.Gui.object_model import ObjectsModel
|
49
52
|
|
50
53
|
if TYPE_CHECKING:
|
51
54
|
from GridCal.Gui.Diagrams.MapWidget.grid_map_widget import MapLibraryModel, GridMapWidget
|
52
55
|
from GridCal.Gui.Diagrams.SchematicWidget.schematic_widget import SchematicLibraryModel, SchematicWidget
|
56
|
+
from GridCal.Gui.Main.GridCalMain import MainGUI
|
53
57
|
|
54
58
|
|
55
59
|
def change_font_size(obj, font_size: int):
|
@@ -71,6 +75,7 @@ class BaseDiagramWidget(QSplitter):
|
|
71
75
|
"""
|
72
76
|
|
73
77
|
def __init__(self,
|
78
|
+
gui: MainGUI,
|
74
79
|
circuit: MultiCircuit,
|
75
80
|
diagram: Union[SchematicDiagram, MapDiagram],
|
76
81
|
library_model: Union[MapLibraryModel, SchematicLibraryModel],
|
@@ -86,6 +91,8 @@ class BaseDiagramWidget(QSplitter):
|
|
86
91
|
"""
|
87
92
|
QSplitter.__init__(self)
|
88
93
|
|
94
|
+
self.gui = gui
|
95
|
+
|
89
96
|
# --------------------------------------------------------------------------------------------------------------
|
90
97
|
# Widget creation
|
91
98
|
# --------------------------------------------------------------------------------------------------------------
|
@@ -120,7 +127,7 @@ class BaseDiagramWidget(QSplitter):
|
|
120
127
|
splitter2 = QSplitter(self)
|
121
128
|
splitter2.addWidget(self.frame1)
|
122
129
|
splitter2.addWidget(self.object_editor_table)
|
123
|
-
splitter2.setOrientation(Qt.Vertical)
|
130
|
+
splitter2.setOrientation(Qt.Orientation.Vertical)
|
124
131
|
self.addWidget(splitter2)
|
125
132
|
# self.addWidget(self.editor_graphics_view)
|
126
133
|
|
@@ -222,87 +229,74 @@ class BaseDiagramWidget(QSplitter):
|
|
222
229
|
:param api_object: API object
|
223
230
|
"""
|
224
231
|
fig = plt.figure(figsize=(12, 8))
|
232
|
+
fig.suptitle(api_object.name, fontsize=20)
|
233
|
+
|
225
234
|
ax_1 = fig.add_subplot(211)
|
235
|
+
ax_1.set_title('Probability x < value', fontsize=14)
|
236
|
+
ax_1.set_ylabel('Loading [%]', fontsize=11)
|
237
|
+
|
226
238
|
ax_2 = fig.add_subplot(212)
|
239
|
+
ax_2.set_title('Power', fontsize=14)
|
240
|
+
ax_2.set_ylabel('Power [MW]', fontsize=11)
|
241
|
+
|
242
|
+
any_plot = False
|
243
|
+
|
244
|
+
for driver, results in self.gui.session.drivers_results_iter():
|
245
|
+
|
246
|
+
if results is not None:
|
247
|
+
|
248
|
+
if isinstance(results, PowerFlowTimeSeriesResults):
|
249
|
+
|
250
|
+
Sf_table = results.mdl(result_type=ResultTypes.BranchActivePowerFrom)
|
251
|
+
Sf_table.plot(ax=ax_1, selected_col_idx=[i])
|
252
|
+
|
253
|
+
loading_table = results.mdl(result_type=ResultTypes.BranchLoading)
|
254
|
+
loading_table.convert_to_cdf()
|
255
|
+
loading_table.plot(ax=ax_2, selected_col_idx=[i])
|
256
|
+
any_plot = True
|
257
|
+
|
258
|
+
elif isinstance(results, LinearAnalysisTimeSeriesResults):
|
259
|
+
|
260
|
+
Sf_table = results.mdl(result_type=ResultTypes.BranchActivePowerFrom)
|
261
|
+
Sf_table.plot(ax=ax_1, selected_col_idx=[i])
|
262
|
+
|
263
|
+
loading_table = results.mdl(result_type=ResultTypes.BranchLoading)
|
264
|
+
loading_table.convert_to_cdf()
|
265
|
+
loading_table.plot(ax=ax_2, selected_col_idx=[i])
|
266
|
+
any_plot = True
|
267
|
+
|
268
|
+
elif isinstance(results, ContingencyAnalysisTimeSeriesResults):
|
269
|
+
|
270
|
+
Sf_table = results.mdl(result_type=ResultTypes.MaxContingencyFlows)
|
271
|
+
Sf_table.plot(ax=ax_1, selected_col_idx=[i])
|
272
|
+
|
273
|
+
loading_table = results.mdl(result_type=ResultTypes.MaxContingencyLoading)
|
274
|
+
loading_table.convert_to_cdf()
|
275
|
+
loading_table.plot(ax=ax_2, selected_col_idx=[i])
|
276
|
+
any_plot = True
|
227
277
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
elif key == SimulationTypes.LinearAnalysis_TS_run:
|
252
|
-
power_data[key.value] = driver.results.Sf.real[:, i]
|
253
|
-
loading_data[key.value] = np.sort(np.abs(driver.results.loading.real[:, i] * 100.0))
|
254
|
-
|
255
|
-
# elif key == SimulationTypes.NetTransferCapacityTS_run:
|
256
|
-
# power_data[key.value] = driver.results.atc[:, i]
|
257
|
-
# atc_perc = driver.results.atc[:, i] / (api_object.rate_prof + 1e-9)
|
258
|
-
# loading_data[key.value] = np.sort(np.abs(atc_perc * 100.0))
|
259
|
-
|
260
|
-
elif key == SimulationTypes.ContingencyAnalysisTS_run:
|
261
|
-
power_data[key.value] = driver.results.max_flows.real[:, i]
|
262
|
-
loading_data[key.value] = np.sort(
|
263
|
-
np.abs(driver.results.max_loading.real[:, i] * 100.0))
|
264
|
-
|
265
|
-
elif key == SimulationTypes.OPFTimeSeries_run:
|
266
|
-
power_data[key.value] = driver.results.Sf.real[:, i]
|
267
|
-
loading_data[key.value] = np.sort(np.abs(driver.results.loading.real[:, i] * 100.0))
|
268
|
-
|
269
|
-
elif key == SimulationTypes.StochasticPowerFlow:
|
270
|
-
loading_st_data = np.sort(np.abs(driver.results.loading_points.real[:, i] * 100.0))
|
271
|
-
|
272
|
-
# add the rating
|
273
|
-
# power_data['Rates+'] = api_object.rate_prof
|
274
|
-
# power_data['Rates-'] = -api_object.rate_prof
|
275
|
-
|
276
|
-
# loading
|
277
|
-
if len(loading_data.keys()):
|
278
|
-
df = pd.DataFrame(data=loading_data, index=p)
|
279
|
-
ax_1.set_title('Probability x < value', fontsize=14)
|
280
|
-
ax_1.set_ylabel('Loading [%]', fontsize=11)
|
281
|
-
df.plot(ax=ax_1)
|
282
|
-
|
283
|
-
if loading_st_data is not None:
|
284
|
-
p_st = np.arange(len(loading_st_data)).astype(float) / len(loading_st_data)
|
285
|
-
df = pd.DataFrame(data=loading_st_data,
|
286
|
-
index=p_st,
|
287
|
-
columns=[SimulationTypes.StochasticPowerFlow.value])
|
288
|
-
ax_1.set_title('Probability x < value', fontsize=14)
|
289
|
-
ax_1.set_ylabel('Loading [%]', fontsize=11)
|
290
|
-
df.plot(ax=ax_1)
|
291
|
-
|
292
|
-
# power
|
293
|
-
if len(power_data.keys()):
|
294
|
-
df = pd.DataFrame(data=power_data, index=x)
|
295
|
-
ax_2.set_title('Power', fontsize=14)
|
296
|
-
ax_2.set_ylabel('Power [MW]', fontsize=11)
|
297
|
-
df.plot(ax=ax_2)
|
298
|
-
ax_2.plot(x, api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
|
299
|
-
ax_2.plot(x, -api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
|
300
|
-
|
301
|
-
plt.legend()
|
302
|
-
fig.suptitle(api_object.name, fontsize=20)
|
303
|
-
|
304
|
-
# plot the profiles
|
305
|
-
plt.show()
|
278
|
+
elif isinstance(results, OptimalPowerFlowTimeSeriesResults):
|
279
|
+
|
280
|
+
Sf_table = results.mdl(result_type=ResultTypes.BranchActivePowerFrom)
|
281
|
+
Sf_table.plot(ax=ax_1, selected_col_idx=[i])
|
282
|
+
|
283
|
+
loading_table = results.mdl(result_type=ResultTypes.BranchLoading)
|
284
|
+
loading_table.convert_to_cdf()
|
285
|
+
loading_table.plot(ax=ax_2, selected_col_idx=[i])
|
286
|
+
any_plot = True
|
287
|
+
|
288
|
+
elif isinstance(results, StochasticPowerFlowResults):
|
289
|
+
loading_table = results.mdl(result_type=ResultTypes.BranchLoadingAverage)
|
290
|
+
loading_table.convert_to_cdf()
|
291
|
+
loading_table.plot(ax=ax_2, selected_col_idx=[i])
|
292
|
+
any_plot = True
|
293
|
+
|
294
|
+
if any_plot:
|
295
|
+
plt.legend()
|
296
|
+
plt.show()
|
297
|
+
else:
|
298
|
+
info_msg("No time series results to plot, run some time series results. Even partial results are fine",
|
299
|
+
f"{api_object.name} results plot")
|
306
300
|
|
307
301
|
def plot_hvdc_branch(self, i: int, api_object: HvdcLine):
|
308
302
|
"""
|
@@ -311,63 +305,48 @@ class BaseDiagramWidget(QSplitter):
|
|
311
305
|
:param api_object: HvdcGraphicItem
|
312
306
|
"""
|
313
307
|
fig = plt.figure(figsize=(12, 8))
|
308
|
+
fig.suptitle(api_object.name, fontsize=20)
|
309
|
+
|
314
310
|
ax_1 = fig.add_subplot(211)
|
315
|
-
|
311
|
+
ax_1.set_title('Probability x < value', fontsize=14)
|
312
|
+
ax_1.set_ylabel('Loading [%]', fontsize=11)
|
313
|
+
|
316
314
|
ax_2 = fig.add_subplot(212)
|
315
|
+
ax_2.set_title('Power', fontsize=14)
|
316
|
+
ax_2.set_ylabel('Power [MW]', fontsize=11)
|
317
|
+
|
318
|
+
any_plot = False
|
319
|
+
|
320
|
+
for driver, results in self.gui.session.drivers_results_iter():
|
321
|
+
|
322
|
+
if results is not None:
|
323
|
+
|
324
|
+
if isinstance(results, PowerFlowTimeSeriesResults):
|
325
|
+
|
326
|
+
Sf_table = results.mdl(result_type=ResultTypes.HvdcPowerFrom)
|
327
|
+
Sf_table.plot(ax=ax_1, selected_col_idx=[i])
|
328
|
+
|
329
|
+
loading_table = results.mdl(result_type=ResultTypes.HvdcLoading)
|
330
|
+
loading_table.convert_to_cdf()
|
331
|
+
loading_table.plot(ax=ax_2, selected_col_idx=[i])
|
332
|
+
any_plot = True
|
333
|
+
|
334
|
+
elif isinstance(results, OptimalPowerFlowTimeSeriesResults):
|
335
|
+
|
336
|
+
Sf_table = results.mdl(result_type=ResultTypes.HvdcPowerFrom)
|
337
|
+
Sf_table.plot(ax=ax_1, selected_col_idx=[i])
|
338
|
+
|
339
|
+
loading_table = results.mdl(result_type=ResultTypes.HvdcLoading)
|
340
|
+
loading_table.convert_to_cdf()
|
341
|
+
loading_table.plot(ax=ax_2, selected_col_idx=[i])
|
342
|
+
any_plot = True
|
317
343
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
p = np.arange(len(x)).astype(float) / len(x)
|
326
|
-
|
327
|
-
# search available results
|
328
|
-
power_data = dict()
|
329
|
-
loading_data = dict()
|
330
|
-
|
331
|
-
for key, driver in self.results_dictionary.items():
|
332
|
-
if hasattr(driver, 'results'):
|
333
|
-
if driver.results is not None:
|
334
|
-
if key == SimulationTypes.PowerFlowTimeSeries_run:
|
335
|
-
power_data[key.value] = driver.results.hvdc_Pf[:, i]
|
336
|
-
loading_data[key.value] = np.sort(np.abs(driver.results.hvdc_loading[:, i] * 100.0))
|
337
|
-
|
338
|
-
elif key == SimulationTypes.LinearAnalysis_TS_run:
|
339
|
-
power_data[key.value] = driver.results.hvdc_Pf[:, i]
|
340
|
-
loading_data[key.value] = np.sort(np.abs(driver.results.hvdc_loading[:, i] * 100.0))
|
341
|
-
|
342
|
-
elif key == SimulationTypes.OPFTimeSeries_run:
|
343
|
-
power_data[key.value] = driver.results.hvdc_Pf[:, i]
|
344
|
-
loading_data[key.value] = np.sort(np.abs(driver.results.hvdc_loading[:, i] * 100.0))
|
345
|
-
|
346
|
-
# add the rating
|
347
|
-
# power_data['Rates+'] = api_object.rate_prof
|
348
|
-
# power_data['Rates-'] = -api_object.rate_prof
|
349
|
-
|
350
|
-
# loading
|
351
|
-
if len(loading_data.keys()):
|
352
|
-
df = pd.DataFrame(data=loading_data, index=p)
|
353
|
-
ax_1.set_title('Probability x < value', fontsize=14)
|
354
|
-
ax_1.set_ylabel('Loading [%]', fontsize=11)
|
355
|
-
df.plot(ax=ax_1)
|
356
|
-
|
357
|
-
# power
|
358
|
-
if len(power_data.keys()):
|
359
|
-
df = pd.DataFrame(data=power_data, index=x)
|
360
|
-
ax_2.set_title('Power', fontsize=14)
|
361
|
-
ax_2.set_ylabel('Power [MW]', fontsize=11)
|
362
|
-
df.plot(ax=ax_2)
|
363
|
-
ax_2.plot(x, api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
|
364
|
-
ax_2.plot(x, -api_object.rate_prof.toarray(), c='gray', linestyle='dashed', linewidth=1)
|
365
|
-
|
366
|
-
plt.legend()
|
367
|
-
fig.suptitle(api_object.name, fontsize=20)
|
368
|
-
|
369
|
-
# plot the profiles
|
370
|
-
plt.show()
|
344
|
+
if any_plot:
|
345
|
+
plt.legend()
|
346
|
+
plt.show()
|
347
|
+
else:
|
348
|
+
info_msg("No time series results to plot, run some time series results. Even partial results are fine",
|
349
|
+
f"{api_object.name} results plot")
|
371
350
|
|
372
351
|
@staticmethod
|
373
352
|
def set_rate_to_profile(api_object: ALL_DEV_TYPES):
|
@@ -896,7 +896,8 @@ class DiagramsMain(CompiledArraysMain):
|
|
896
896
|
"""
|
897
897
|
diagram = SchematicDiagram(name=name)
|
898
898
|
|
899
|
-
diagram_widget = SchematicWidget(
|
899
|
+
diagram_widget = SchematicWidget(gui=self,
|
900
|
+
circuit=self.circuit,
|
900
901
|
diagram=diagram,
|
901
902
|
default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
|
902
903
|
time_index=self.get_diagram_slider_index(),
|
@@ -980,7 +981,8 @@ class DiagramsMain(CompiledArraysMain):
|
|
980
981
|
text_func=None,
|
981
982
|
name=name)
|
982
983
|
|
983
|
-
diagram_widget = SchematicWidget(
|
984
|
+
diagram_widget = SchematicWidget(gui=self,
|
985
|
+
circuit=self.circuit,
|
984
986
|
diagram=diagram,
|
985
987
|
default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
|
986
988
|
time_index=self.get_diagram_slider_index(),
|
@@ -1018,7 +1020,8 @@ class DiagramsMain(CompiledArraysMain):
|
|
1018
1020
|
if isinstance(diagram_widget, SchematicWidget):
|
1019
1021
|
diagram = diagram_widget.get_selection_diagram()
|
1020
1022
|
|
1021
|
-
diagram_widget = SchematicWidget(self
|
1023
|
+
diagram_widget = SchematicWidget(gui=self,
|
1024
|
+
circuit=self.circuit,
|
1022
1025
|
diagram=diagram,
|
1023
1026
|
default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
|
1024
1027
|
time_index=self.get_diagram_slider_index(),
|
@@ -1097,7 +1100,8 @@ class DiagramsMain(CompiledArraysMain):
|
|
1097
1100
|
root_bus=root_bus,
|
1098
1101
|
max_level=dlg.value)
|
1099
1102
|
|
1100
|
-
diagram_widget = SchematicWidget(self
|
1103
|
+
diagram_widget = SchematicWidget(gui=self,
|
1104
|
+
circuit=self.circuit,
|
1101
1105
|
diagram=diagram,
|
1102
1106
|
default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
|
1103
1107
|
time_index=self.get_diagram_slider_index(),
|
@@ -1121,7 +1125,8 @@ class DiagramsMain(CompiledArraysMain):
|
|
1121
1125
|
prog_func=None,
|
1122
1126
|
text_func=None)
|
1123
1127
|
|
1124
|
-
diagram_widget = SchematicWidget(self
|
1128
|
+
diagram_widget = SchematicWidget(gui=self,
|
1129
|
+
circuit=self.circuit,
|
1125
1130
|
diagram=diagram,
|
1126
1131
|
default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
|
1127
1132
|
time_index=self.get_diagram_slider_index(),
|
@@ -1144,7 +1149,8 @@ class DiagramsMain(CompiledArraysMain):
|
|
1144
1149
|
for diagram in self.circuit.diagrams:
|
1145
1150
|
|
1146
1151
|
if isinstance(diagram, dev.SchematicDiagram):
|
1147
|
-
diagram_widget = SchematicWidget(self
|
1152
|
+
diagram_widget = SchematicWidget(gui=self,
|
1153
|
+
circuit=self.circuit,
|
1148
1154
|
diagram=diagram,
|
1149
1155
|
default_bus_voltage=self.ui.defaultBusVoltageSpinBox.value(),
|
1150
1156
|
time_index=self.get_diagram_slider_index(),
|
@@ -1212,7 +1218,8 @@ class DiagramsMain(CompiledArraysMain):
|
|
1212
1218
|
tile_source = self.tile_name_dict[self.ui.tile_provider_comboBox.currentText()]
|
1213
1219
|
|
1214
1220
|
# create the map widget
|
1215
|
-
map_widget = GridMapWidget(
|
1221
|
+
map_widget = GridMapWidget(gui=self,
|
1222
|
+
tile_src=tile_source,
|
1216
1223
|
start_level=diagram.start_level,
|
1217
1224
|
longitude=diagram.longitude,
|
1218
1225
|
latitude=diagram.latitude,
|
@@ -111,6 +111,7 @@ class SimulationsMain(TimeEventsMain):
|
|
111
111
|
self.mip_solvers_dict[MIPSolvers.CPLEX.value] = MIPSolvers.CPLEX
|
112
112
|
self.mip_solvers_dict[MIPSolvers.GUROBI.value] = MIPSolvers.GUROBI
|
113
113
|
self.mip_solvers_dict[MIPSolvers.XPRESS.value] = MIPSolvers.XPRESS
|
114
|
+
self.mip_solvers_dict[MIPSolvers.PDLP.value] = MIPSolvers.PDLP
|
114
115
|
|
115
116
|
# opf solvers dictionary
|
116
117
|
self.nodal_capacity_methods_dict = OrderedDict()
|
@@ -16,6 +16,7 @@
|
|
16
16
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
17
|
import time
|
18
18
|
import requests
|
19
|
+
import asyncio
|
19
20
|
from urllib3 import disable_warnings, exceptions
|
20
21
|
from typing import Callable, Dict, Union, List, Any
|
21
22
|
from PySide6.QtCore import QThread, Signal
|
@@ -305,9 +306,11 @@ class ServerDriver(QThread):
|
|
305
306
|
if self.is_running():
|
306
307
|
model_data = gather_model_as_jsons_for_communication(circuit=circuit, instruction=instruction)
|
307
308
|
|
308
|
-
response =
|
309
|
-
|
310
|
-
|
309
|
+
response = asyncio.get_event_loop().run_until_complete(
|
310
|
+
send_json_data(json_data=model_data,
|
311
|
+
endpoint_url=websocket_url,
|
312
|
+
certificate=self._certificate_path)
|
313
|
+
)
|
311
314
|
|
312
315
|
self.get_jobs()
|
313
316
|
|
@@ -14,10 +14,12 @@
|
|
14
14
|
# You should have received a copy of the GNU Lesser General Public License
|
15
15
|
# along with this program; if not, write to the Free Software Foundation,
|
16
16
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
|
+
from __future__ import annotations
|
18
|
+
|
17
19
|
from uuid import uuid4
|
18
20
|
import pandas as pd
|
19
21
|
from PySide6.QtCore import QThread, Signal
|
20
|
-
from typing import Dict, Union, List, Tuple, Any
|
22
|
+
from typing import Dict, Union, List, Tuple, Any, Generator
|
21
23
|
from collections.abc import Callable
|
22
24
|
from warnings import warn
|
23
25
|
|
@@ -211,6 +213,17 @@ class SimulationSession:
|
|
211
213
|
"""
|
212
214
|
return [drv for driver_type, drv in self.drivers.items() if drv is not None]
|
213
215
|
|
216
|
+
def drivers_results_iter(self) -> Generator[Tuple[DRIVER_OBJECTS | None, RESULTS_OBJECTS | None]]:
|
217
|
+
"""
|
218
|
+
Iterator returning driver and result types
|
219
|
+
:return: driver, result (both can be None)
|
220
|
+
"""
|
221
|
+
for driver_type, drv in self.drivers.items():
|
222
|
+
if hasattr(drv, 'results'):
|
223
|
+
yield drv, drv.results
|
224
|
+
else:
|
225
|
+
yield drv, None
|
226
|
+
|
214
227
|
def exists(self, driver_type: SimulationTypes):
|
215
228
|
"""
|
216
229
|
Get the results of the driver
|
@@ -546,7 +559,7 @@ class SimulationSession:
|
|
546
559
|
|
547
560
|
@property
|
548
561
|
def net_transfer_capacity_ts(self) -> Tuple[AvailableTransferCapacityTimeSeriesDriver,
|
549
|
-
|
562
|
+
AvailableTransferCapacityTimeSeriesResults]:
|
550
563
|
"""
|
551
564
|
|
552
565
|
:return:
|
@@ -555,7 +568,8 @@ class SimulationSession:
|
|
555
568
|
return drv, results
|
556
569
|
|
557
570
|
@property
|
558
|
-
def optimal_net_transfer_capacity(self) -> Tuple[
|
571
|
+
def optimal_net_transfer_capacity(self) -> Tuple[
|
572
|
+
OptimalNetTransferCapacityDriver, OptimalNetTransferCapacityResults]:
|
559
573
|
"""
|
560
574
|
|
561
575
|
:return:
|
@@ -564,7 +578,8 @@ class SimulationSession:
|
|
564
578
|
return drv, results
|
565
579
|
|
566
580
|
@property
|
567
|
-
def optimal_net_transfer_capacity_ts(self) -> Tuple[
|
581
|
+
def optimal_net_transfer_capacity_ts(self) -> Tuple[
|
582
|
+
OptimalNetTransferCapacityDriver, OptimalNetTransferCapacityResults]:
|
568
583
|
"""
|
569
584
|
|
570
585
|
:return:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|