GridCal 5.1.42__tar.gz → 5.1.43__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.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +14 -17
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +9 -10
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/base_diagram_widget.py +117 -20
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +130 -26
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/io.py +7 -3
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/profiles_model.py +8 -7
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/table_view_header_wrap.py +3 -1
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/session.py +29 -16
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/__version__.py +1 -1
- {GridCal-5.1.42 → GridCal-5.1.43}/PKG-INFO +1 -1
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ExecuteGridCal.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/gmt_local.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapbox.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapquest.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/open_street_map.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_toner.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_transport.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_watercolor.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/ConsoleLog.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/GridCalMain.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/MainWindow.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Model/time_events.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/SubClasses/simulations.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/object_select_window.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Main/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profile_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/test_.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Visualization/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Visualization/visualization.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Widgets/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/associations_model.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/console_widget.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/general_dialogues.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/gui_functions.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/messages.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/object_model.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/pandas_model.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/plot_config.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/results_model.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/themes.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/update_gui_all.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/update_gui_common.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Gui/wrappable_table_model.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/LICENSE.txt +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/export_results_driver.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/file_handler.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/server_driver.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/Session/synchronization_driver.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/__init__.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/cables.csv +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/sequence_lines.csv +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/transformers.csv +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/data/wires.csv +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/plugins.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/templates.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/GridCal/update.py +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/setup.cfg +0 -0
- {GridCal-5.1.42 → GridCal-5.1.43}/setup.py +0 -0
@@ -57,11 +57,11 @@ import GridCal.Gui.Visualization.visualization as viz
|
|
57
57
|
import GridCalEngine.Devices.Diagrams.palettes as palettes
|
58
58
|
from GridCal.Gui.Diagrams.graphics_manager import ALL_MAP_GRAPHICS
|
59
59
|
from GridCal.Gui.Diagrams.MapWidget.Tiles.tiles import Tiles
|
60
|
-
from GridCal.Gui.Diagrams.base_diagram_widget import BaseDiagramWidget
|
60
|
+
from GridCal.Gui.Diagrams.base_diagram_widget import BaseDiagramWidget, qimage_to_cv
|
61
61
|
from GridCal.Gui.messages import error_msg
|
62
62
|
|
63
63
|
if TYPE_CHECKING:
|
64
|
-
from GridCal.Gui.Main.
|
64
|
+
from GridCal.Gui.Main.SubClasses.Model.diagrams import DiagramsMain
|
65
65
|
|
66
66
|
MAP_BRANCH_GRAPHIC_TYPES = Union[
|
67
67
|
MapAcLine, MapDcLine, MapHvdcLine, MapFluidPathLine
|
@@ -207,7 +207,7 @@ class GridMapWidget(BaseDiagramWidget):
|
|
207
207
|
"""
|
208
208
|
|
209
209
|
def __init__(self,
|
210
|
-
gui:
|
210
|
+
gui: DiagramsMain,
|
211
211
|
tile_src: Tiles,
|
212
212
|
start_level: int,
|
213
213
|
longitude: float,
|
@@ -1147,25 +1147,14 @@ class GridMapWidget(BaseDiagramWidget):
|
|
1147
1147
|
|
1148
1148
|
graphic_object.set_colour(color=color, w=weight, style=style, tool_tip=tooltip)
|
1149
1149
|
|
1150
|
-
def get_image(self, transparent: bool = False) ->
|
1150
|
+
def get_image(self, transparent: bool = False) -> QImage:
|
1151
1151
|
"""
|
1152
1152
|
get the current picture
|
1153
1153
|
:return: QImage, width, height
|
1154
1154
|
"""
|
1155
|
-
w = self.width()
|
1156
|
-
h = self.height()
|
1157
|
-
|
1158
|
-
# image = QImage(w, h, QImage.Format_RGB32)
|
1159
|
-
# image.fill(Qt.white)
|
1160
|
-
#
|
1161
|
-
# painter = QPainter(image)
|
1162
|
-
# painter.setRenderHint(QPainter.Antialiasing)
|
1163
|
-
# self.map.view.render(painter) # self.view stores the grid widgets
|
1164
|
-
# # self.render(painter)
|
1165
|
-
# painter.end()
|
1166
1155
|
image = self.map.grab().toImage()
|
1167
1156
|
|
1168
|
-
return image
|
1157
|
+
return image
|
1169
1158
|
|
1170
1159
|
def take_picture(self, filename: str):
|
1171
1160
|
"""
|
@@ -1174,7 +1163,7 @@ class GridMapWidget(BaseDiagramWidget):
|
|
1174
1163
|
name, extension = os.path.splitext(filename.lower())
|
1175
1164
|
|
1176
1165
|
if extension == '.png':
|
1177
|
-
image
|
1166
|
+
image = self.get_image()
|
1178
1167
|
image.save(filename)
|
1179
1168
|
|
1180
1169
|
elif extension == '.svg':
|
@@ -1193,6 +1182,14 @@ class GridMapWidget(BaseDiagramWidget):
|
|
1193
1182
|
else:
|
1194
1183
|
raise Exception('Extension ' + str(extension) + ' not supported :(')
|
1195
1184
|
|
1185
|
+
# def capture_video_frame(self):
|
1186
|
+
# """
|
1187
|
+
# Save video frame
|
1188
|
+
# """
|
1189
|
+
# image, w, h = self.get_image()
|
1190
|
+
# cv2_image = qimage_to_cv(image)
|
1191
|
+
# self._video.write(cv2_image)
|
1192
|
+
|
1196
1193
|
def new_substation_diagram(self, substation: Substation):
|
1197
1194
|
"""
|
1198
1195
|
|
@@ -35,7 +35,6 @@ from PySide6.QtGui import (QIcon, QPixmap, QImage, QPainter, QStandardItemModel,
|
|
35
35
|
from PySide6.QtWidgets import (QGraphicsView, QMessageBox, QGraphicsScene, QGraphicsSceneMouseEvent, QGraphicsItem)
|
36
36
|
from PySide6.QtSvg import QSvgGenerator
|
37
37
|
|
38
|
-
from GridCal.Gui.Diagrams.graphics_manager import ALL_GRAPHICS
|
39
38
|
from GridCalEngine.Devices.types import ALL_DEV_TYPES, INJECTION_DEVICE_TYPES, FLUID_TYPES, BRANCH_TYPES
|
40
39
|
from GridCalEngine.Devices.multi_circuit import MultiCircuit
|
41
40
|
from GridCalEngine.Devices.Substation.bus import Bus
|
@@ -55,7 +54,7 @@ from GridCalEngine.Devices.Fluid import FluidNode, FluidPath
|
|
55
54
|
from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
|
56
55
|
from GridCalEngine.Devices.Diagrams.graphic_location import GraphicLocation
|
57
56
|
from GridCalEngine.Simulations import PowerFlowTimeSeriesResults
|
58
|
-
from GridCalEngine.enumerations import DeviceType,
|
57
|
+
from GridCalEngine.enumerations import DeviceType, ResultTypes
|
59
58
|
from GridCalEngine.basic_structures import Vec, CxVec, IntVec, Logger
|
60
59
|
|
61
60
|
from GridCal.Gui.Diagrams.SchematicWidget.terminal_item import BarTerminalItem, RoundTerminalItem
|
@@ -84,7 +83,7 @@ import GridCalEngine.Devices.Diagrams.palettes as palettes
|
|
84
83
|
from GridCal.Gui.messages import info_msg, error_msg, warning_msg, yes_no_question
|
85
84
|
|
86
85
|
if TYPE_CHECKING:
|
87
|
-
from GridCal.Gui.Main.
|
86
|
+
from GridCal.Gui.Main.SubClasses.Model.diagrams import DiagramsMain
|
88
87
|
|
89
88
|
BRANCH_GRAPHICS = Union[
|
90
89
|
LineGraphicItem,
|
@@ -218,7 +217,7 @@ class SchematicLibraryModel(QStandardItemModel):
|
|
218
217
|
:param index:
|
219
218
|
:return:
|
220
219
|
"""
|
221
|
-
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemFlag.ItemIsDragEnabled
|
220
|
+
return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsDragEnabled
|
222
221
|
|
223
222
|
|
224
223
|
class SchematicScene(QGraphicsScene):
|
@@ -298,7 +297,7 @@ class CustomGraphicsView(QGraphicsView):
|
|
298
297
|
"""
|
299
298
|
|
300
299
|
# By pressing ctrl while dragging, we can move the grid
|
301
|
-
if event.modifiers() & Qt.ControlModifier:
|
300
|
+
if event.modifiers() & Qt.KeyboardModifier.ControlModifier:
|
302
301
|
self.drag_mode = QGraphicsView.DragMode.ScrollHandDrag
|
303
302
|
else:
|
304
303
|
self.drag_mode = QGraphicsView.DragMode.RubberBandDrag
|
@@ -340,7 +339,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
340
339
|
"""
|
341
340
|
|
342
341
|
def __init__(self,
|
343
|
-
gui:
|
342
|
+
gui: DiagramsMain,
|
344
343
|
circuit: MultiCircuit,
|
345
344
|
diagram: Union[SchematicDiagram, None],
|
346
345
|
default_bus_voltage: float = 10.0,
|
@@ -441,7 +440,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
441
440
|
if event.mimeData().hasFormat('component/name'):
|
442
441
|
obj_type = event.mimeData().data('component/name')
|
443
442
|
|
444
|
-
point0 = self.editor_graphics_view.mapToScene(event.position().x(), event.position().y())
|
443
|
+
point0 = self.editor_graphics_view.mapToScene(int(event.position().x()), int(event.position().y()))
|
445
444
|
x0 = point0.x()
|
446
445
|
y0 = point0.y()
|
447
446
|
|
@@ -1945,7 +1944,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
1945
1944
|
bus.y = y[i]
|
1946
1945
|
i += 1
|
1947
1946
|
|
1948
|
-
def get_image(self, transparent: bool = False) ->
|
1947
|
+
def get_image(self, transparent: bool = False) -> QImage:
|
1949
1948
|
"""
|
1950
1949
|
get the current picture
|
1951
1950
|
:param transparent: Set a transparent background
|
@@ -1967,7 +1966,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
1967
1966
|
painter.end()
|
1968
1967
|
# image = self.editor_graphics_view.grab().toImage()
|
1969
1968
|
|
1970
|
-
return image
|
1969
|
+
return image
|
1971
1970
|
|
1972
1971
|
def take_picture(self, filename: str):
|
1973
1972
|
"""
|
@@ -1976,7 +1975,7 @@ class SchematicWidget(BaseDiagramWidget):
|
|
1976
1975
|
name, extension = os.path.splitext(filename.lower())
|
1977
1976
|
|
1978
1977
|
if extension == '.png':
|
1979
|
-
image
|
1978
|
+
image = self.get_image(transparent=False)
|
1980
1979
|
image.save(filename)
|
1981
1980
|
|
1982
1981
|
elif extension == '.svg':
|
@@ -17,7 +17,6 @@
|
|
17
17
|
from __future__ import annotations
|
18
18
|
from typing import List, Dict, Union, Tuple, Callable, TYPE_CHECKING
|
19
19
|
import numpy as np
|
20
|
-
import pandas as pd
|
21
20
|
import cv2
|
22
21
|
from matplotlib import pyplot as plt
|
23
22
|
|
@@ -42,18 +41,18 @@ from GridCalEngine.basic_structures import Vec, CxVec, IntVec
|
|
42
41
|
from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
|
43
42
|
from GridCalEngine.Devices.Diagrams.map_diagram import MapDiagram
|
44
43
|
from GridCalEngine.Simulations.types import DRIVER_OBJECTS
|
45
|
-
from GridCalEngine.basic_structures import Logger
|
44
|
+
from GridCalEngine.basic_structures import Logger, Mat
|
46
45
|
from GridCalEngine.enumerations import SimulationTypes, ResultTypes
|
46
|
+
import GridCalEngine.Devices.Diagrams.palettes as palettes
|
47
47
|
|
48
48
|
from GridCal.Gui.Diagrams.graphics_manager import GraphicsManager
|
49
|
-
import GridCalEngine.Devices.Diagrams.palettes as palettes
|
50
49
|
from GridCal.Gui.messages import yes_no_question, info_msg
|
51
50
|
from GridCal.Gui.object_model import ObjectsModel
|
52
51
|
|
53
52
|
if TYPE_CHECKING:
|
54
53
|
from GridCal.Gui.Diagrams.MapWidget.grid_map_widget import MapLibraryModel, GridMapWidget
|
55
54
|
from GridCal.Gui.Diagrams.SchematicWidget.schematic_widget import SchematicLibraryModel, SchematicWidget
|
56
|
-
from GridCal.Gui.Main.
|
55
|
+
from GridCal.Gui.Main.SubClasses.Model.diagrams import DiagramsMain
|
57
56
|
|
58
57
|
|
59
58
|
def change_font_size(obj, font_size: int):
|
@@ -68,6 +67,84 @@ def change_font_size(obj, font_size: int):
|
|
68
67
|
obj.setFont(font1)
|
69
68
|
|
70
69
|
|
70
|
+
def qimage_tocv2_by_disk(qimage: QImage, logger: Logger, file_path):
|
71
|
+
"""
|
72
|
+
|
73
|
+
:param qimage: Qimage
|
74
|
+
:param logger: Logger
|
75
|
+
:param file_path: temp file path
|
76
|
+
:return:
|
77
|
+
"""
|
78
|
+
# Convert QImage to PNG format and save
|
79
|
+
if not qimage.save(file_path, "PNG"):
|
80
|
+
logger.add_error(msg=f"Error: Could not save QImage to {file_path}")
|
81
|
+
return None
|
82
|
+
|
83
|
+
# Use OpenCV to read the saved image
|
84
|
+
opencv_image = cv2.imread(file_path)
|
85
|
+
if opencv_image is None:
|
86
|
+
logger.add_error(msg=f"Error: Could not save QImage to {file_path}")
|
87
|
+
return None
|
88
|
+
|
89
|
+
return opencv_image
|
90
|
+
|
91
|
+
|
92
|
+
def qimage_to_cv(qimage: QImage, logger: Logger, force_disk=False) -> np.ndarray:
|
93
|
+
"""
|
94
|
+
Convert a image from Qt to an OpenCV image
|
95
|
+
:param qimage: Qimage
|
96
|
+
:param logger: Logger
|
97
|
+
:param force_disk: if true, the image is converted by saving to disk and loading again with opencv
|
98
|
+
:return: OpenCv matrix
|
99
|
+
"""
|
100
|
+
width = qimage.width()
|
101
|
+
height = qimage.height()
|
102
|
+
|
103
|
+
if force_disk:
|
104
|
+
opencv_image = qimage_tocv2_by_disk(qimage, logger, file_path="__img__.png")
|
105
|
+
|
106
|
+
return opencv_image
|
107
|
+
else:
|
108
|
+
try:
|
109
|
+
# convert picture using the memory
|
110
|
+
# we need to remove the alpha channel, otherwise the video frame is not saved
|
111
|
+
cv_mat = np.array(qimage.constBits()).reshape(height, width, 4).astype(np.uint8)[:, :, :3]
|
112
|
+
|
113
|
+
return cv_mat
|
114
|
+
|
115
|
+
except ValueError as e:
|
116
|
+
|
117
|
+
logger.add_error(msg=f"Could not convert frame: {e}, failed over to second image conversion method.")
|
118
|
+
|
119
|
+
try:
|
120
|
+
# Convert the QImage to RGB format if it is not already in that format
|
121
|
+
qimage = qimage.convertToFormat(QImage.Format.Format_RGB888)
|
122
|
+
|
123
|
+
# Get the pointer to the data and stride (bytes per line)
|
124
|
+
ptr = qimage.bits()
|
125
|
+
# ptr.itemsize = qimage.sizeInBytes() # Set the size of the memoryview
|
126
|
+
stride = qimage.bytesPerLine() # Get the number of bytes per line (width * channels + padding)
|
127
|
+
|
128
|
+
# Create a numpy array with the correct shape based on the stride
|
129
|
+
arr = np.array(ptr).reshape((height, stride // 3, 3)).astype(np.uint8) # Adjust for stride
|
130
|
+
|
131
|
+
# Crop the width to the actual image width (in case stride > width * channels)
|
132
|
+
arr = arr[:, :width, :]
|
133
|
+
|
134
|
+
# Convert RGB to BGR for OpenCV
|
135
|
+
cv_mat = cv2.cvtColor(arr, cv2.COLOR_RGB2BGR)
|
136
|
+
|
137
|
+
return cv_mat
|
138
|
+
except ValueError as e2:
|
139
|
+
logger.add_error(msg=f"Could not convert frame: {e2}, failed over to disk converison method")
|
140
|
+
|
141
|
+
# try the last method, saving to disk and reading again
|
142
|
+
|
143
|
+
opencv_image = qimage_tocv2_by_disk(qimage, logger, file_path="__img__.png")
|
144
|
+
|
145
|
+
return opencv_image
|
146
|
+
|
147
|
+
|
71
148
|
class BaseDiagramWidget(QSplitter):
|
72
149
|
"""
|
73
150
|
Common diagram widget to host common functions
|
@@ -75,7 +152,7 @@ class BaseDiagramWidget(QSplitter):
|
|
75
152
|
"""
|
76
153
|
|
77
154
|
def __init__(self,
|
78
|
-
gui:
|
155
|
+
gui: DiagramsMain,
|
79
156
|
circuit: MultiCircuit,
|
80
157
|
diagram: Union[SchematicDiagram, MapDiagram],
|
81
158
|
library_model: Union[MapLibraryModel, SchematicLibraryModel],
|
@@ -508,7 +585,7 @@ class BaseDiagramWidget(QSplitter):
|
|
508
585
|
"""
|
509
586
|
return 0
|
510
587
|
|
511
|
-
def get_image(self, transparent: bool = False) ->
|
588
|
+
def get_image(self, transparent: bool = False) -> QImage:
|
512
589
|
"""
|
513
590
|
get the current picture
|
514
591
|
:param transparent: Set a transparent background
|
@@ -523,41 +600,61 @@ class BaseDiagramWidget(QSplitter):
|
|
523
600
|
"""
|
524
601
|
pass
|
525
602
|
|
526
|
-
def start_video_recording(self, fname: str, fps: int = 30) -> Tuple[int, int]:
|
603
|
+
def start_video_recording(self, fname: str, fps: int = 30, logger: Logger = Logger()) -> Tuple[int, int]:
|
527
604
|
"""
|
528
605
|
Save video
|
529
606
|
:param fname: file name
|
530
607
|
:param fps: frames per second
|
608
|
+
:param logger: LOgger
|
531
609
|
:returns width, height
|
532
610
|
"""
|
533
611
|
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
612
|
+
image = self.get_image()
|
613
|
+
w = image.width()
|
614
|
+
h = image.height()
|
615
|
+
cv2_image = qimage_to_cv(image, logger)
|
616
|
+
w2, h2, _ = cv2_image.shape
|
617
|
+
|
618
|
+
if fname.endswith('.mp4'):
|
619
|
+
self._video = cv2.VideoWriter(filename=fname,
|
620
|
+
fourcc=cv2.VideoWriter_fourcc(*'mp4v'),
|
621
|
+
fps=fps,
|
622
|
+
frameSize=(w, h))
|
623
|
+
elif fname.endswith('.avi'):
|
624
|
+
self._video = cv2.VideoWriter(filename=fname + '.avi',
|
625
|
+
fourcc=cv2.VideoWriter_fourcc(*'XVID'),
|
626
|
+
fps=fps,
|
627
|
+
frameSize=(w, h))
|
628
|
+
else:
|
629
|
+
raise Exception(f"File format not recognized {fname}")
|
541
630
|
|
542
631
|
return w, h
|
543
632
|
|
544
|
-
def capture_video_frame(self):
|
633
|
+
def capture_video_frame(self, w: int, h: int, logger: Logger):
|
545
634
|
"""
|
546
635
|
Save video frame
|
547
636
|
"""
|
637
|
+
image = self.get_image()
|
638
|
+
w2 = image.width()
|
639
|
+
h2 = image.height()
|
640
|
+
|
641
|
+
if w != w2:
|
642
|
+
logger.add_error(f"Width {w2} different from expected width {w}")
|
643
|
+
|
644
|
+
if h != h2:
|
645
|
+
logger.add_error(f"Height {h2} different from expected width {h}")
|
548
646
|
|
549
|
-
|
647
|
+
cv2_image = qimage_to_cv(image, logger)
|
550
648
|
|
551
|
-
|
552
|
-
|
553
|
-
frame = np.array(image.constBits()).reshape(h, w, 4).astype(np.uint8)[:, :, :3]
|
554
|
-
self._video.write(frame)
|
649
|
+
if cv2_image is not None:
|
650
|
+
self._video.write(cv2_image)
|
555
651
|
|
556
652
|
def end_video_recording(self):
|
557
653
|
"""
|
558
654
|
Finalize video recording
|
559
655
|
"""
|
560
656
|
self._video.release()
|
657
|
+
print("Video released")
|
561
658
|
|
562
659
|
def update_label_drwaing_status(self, device: ALL_DEV_TYPES, draw_labels: bool) -> None:
|
563
660
|
"""
|
@@ -14,6 +14,8 @@
|
|
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
|
import os
|
18
20
|
from typing import List, Tuple, Union
|
19
21
|
|
@@ -26,8 +28,10 @@ from pandas.plotting import register_matplotlib_converters
|
|
26
28
|
import GridCalEngine.Devices.Diagrams.palettes as palettes
|
27
29
|
from GridCalEngine.IO.file_system import get_create_gridcal_folder
|
28
30
|
from GridCal.Gui.general_dialogues import (CheckListDialogue, StartEndSelectionDialogue, InputSearchDialogue,
|
29
|
-
InputNumberDialogue)
|
31
|
+
InputNumberDialogue, LogsDialogue)
|
30
32
|
from GridCalEngine.Devices.types import ALL_DEV_TYPES
|
33
|
+
from GridCalEngine.Utils.progress_bar import print_progress_bar
|
34
|
+
from GridCalEngine.basic_structures import Logger
|
31
35
|
from GridCalEngine.enumerations import SimulationTypes
|
32
36
|
from GridCalEngine.Devices.Diagrams.schematic_diagram import SchematicDiagram
|
33
37
|
|
@@ -52,6 +56,69 @@ ALL_EDITORS = Union[SchematicWidget, GridMapWidget]
|
|
52
56
|
ALL_EDITORS_NONE = Union[None, SchematicWidget, GridMapWidget]
|
53
57
|
|
54
58
|
|
59
|
+
class VideoExportWorker(QtCore.QThread):
|
60
|
+
"""
|
61
|
+
VideoExportWorker
|
62
|
+
"""
|
63
|
+
progress_signal = QtCore.Signal(float)
|
64
|
+
progress_text = QtCore.Signal(str)
|
65
|
+
done_signal = QtCore.Signal()
|
66
|
+
|
67
|
+
def __init__(self, filename, diagram: SchematicWidget | GridMapWidget,
|
68
|
+
fps: int, start_idx: int, end_idx: int, current_study: str,
|
69
|
+
grid_colour_function):
|
70
|
+
"""
|
71
|
+
|
72
|
+
:param filename:
|
73
|
+
:param diagram:
|
74
|
+
:param fps:
|
75
|
+
:param start_idx:
|
76
|
+
:param end_idx:
|
77
|
+
:param current_study:
|
78
|
+
:param grid_colour_function:
|
79
|
+
"""
|
80
|
+
QtCore.QThread.__init__(self)
|
81
|
+
|
82
|
+
self.filename = filename
|
83
|
+
self.diagram = diagram
|
84
|
+
self.fps = fps
|
85
|
+
self.start_idx = start_idx
|
86
|
+
self.end_idx = end_idx
|
87
|
+
self.current_study = current_study
|
88
|
+
self.grid_colour_function = grid_colour_function
|
89
|
+
|
90
|
+
self.logger = Logger()
|
91
|
+
|
92
|
+
def run(self):
|
93
|
+
"""
|
94
|
+
Run function
|
95
|
+
:return:
|
96
|
+
"""
|
97
|
+
# start recording...
|
98
|
+
w, h = self.diagram.start_video_recording(fname=self.filename, fps=self.fps, logger=self.logger)
|
99
|
+
|
100
|
+
# paint and capture
|
101
|
+
for t_idx in range(self.start_idx, self.end_idx):
|
102
|
+
self.grid_colour_function(diagram=self.diagram,
|
103
|
+
current_study=self.current_study,
|
104
|
+
t_idx=t_idx,
|
105
|
+
allow_popups=False)
|
106
|
+
|
107
|
+
self.diagram.capture_video_frame(w=w, h=h, logger=self.logger)
|
108
|
+
|
109
|
+
self.progress_text.emit(f"Saving frame {t_idx} / {self.end_idx}")
|
110
|
+
self.progress_signal.emit(t_idx / self.end_idx)
|
111
|
+
|
112
|
+
print_progress_bar(t_idx + 1, self.end_idx)
|
113
|
+
|
114
|
+
# finalize
|
115
|
+
self.diagram.end_video_recording()
|
116
|
+
|
117
|
+
self.logger.add_info(f"Video saved to {self.filename}")
|
118
|
+
|
119
|
+
self.done_signal.emit()
|
120
|
+
|
121
|
+
|
55
122
|
class DiagramsMain(CompiledArraysMain):
|
56
123
|
"""
|
57
124
|
Diagrams Main
|
@@ -156,6 +223,9 @@ class DiagramsMain(CompiledArraysMain):
|
|
156
223
|
# configure matplotlib for pandas time series
|
157
224
|
register_matplotlib_converters()
|
158
225
|
|
226
|
+
# task watcher for video export
|
227
|
+
self.video_thread: VideoExportWorker | None = None
|
228
|
+
|
159
229
|
# --------------------------------------------------------------------------------------------------------------
|
160
230
|
self.ui.actionTakePicture.triggered.connect(self.take_picture)
|
161
231
|
self.ui.actionRecord_video.triggered.connect(self.record_video)
|
@@ -1167,6 +1237,7 @@ class DiagramsMain(CompiledArraysMain):
|
|
1167
1237
|
|
1168
1238
|
# create the map widget
|
1169
1239
|
map_widget = GridMapWidget(
|
1240
|
+
gui=self,
|
1170
1241
|
tile_src=tile_source,
|
1171
1242
|
start_level=diagram.start_level,
|
1172
1243
|
longitude=diagram.longitude,
|
@@ -1454,7 +1525,7 @@ class DiagramsMain(CompiledArraysMain):
|
|
1454
1525
|
if isinstance(diagram, (SchematicWidget, GridMapWidget)):
|
1455
1526
|
|
1456
1527
|
# declare the allowed file types
|
1457
|
-
files_types = "MP4 (*.mp4);;"
|
1528
|
+
files_types = "MP4 (*.mp4);;AVI (*.avi);;"
|
1458
1529
|
|
1459
1530
|
f_name = str(os.path.join(self.project_directory, self.ui.grid_name_line_edit.text()))
|
1460
1531
|
|
@@ -1463,38 +1534,71 @@ class DiagramsMain(CompiledArraysMain):
|
|
1463
1534
|
f_name, files_types)
|
1464
1535
|
|
1465
1536
|
if filename != "":
|
1466
|
-
if not filename.endswith('.mp4'):
|
1537
|
+
if type_selected == "MP4 (*.mp4)" and not filename.endswith('.mp4'):
|
1467
1538
|
filename += ".mp4"
|
1468
1539
|
|
1469
|
-
|
1470
|
-
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
1474
|
-
|
1475
|
-
|
1476
|
-
|
1477
|
-
|
1478
|
-
|
1479
|
-
self.
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1485
|
-
|
1486
|
-
print(f"Saving frame {t_idx} / {end_idx}")
|
1487
|
-
|
1488
|
-
# finalize
|
1489
|
-
diagram.end_video_recording()
|
1490
|
-
print(f"Recording saved to {filename}")
|
1491
|
-
|
1540
|
+
if type_selected == "AVI (*.avi)" and not filename.endswith('.avi'):
|
1541
|
+
filename += ".avi"
|
1542
|
+
|
1543
|
+
# self.thread_pool.start(lambda: self.record_video_now(filename, diagram))
|
1544
|
+
self.video_thread = VideoExportWorker(
|
1545
|
+
filename=filename,
|
1546
|
+
diagram=diagram,
|
1547
|
+
fps=self.ui.fps_spinBox.value(),
|
1548
|
+
start_idx=self.get_simulation_start(),
|
1549
|
+
end_idx=self.get_simulation_end(),
|
1550
|
+
current_study=self.ui.available_results_to_color_comboBox.currentText(),
|
1551
|
+
grid_colour_function=self.grid_colour_function
|
1552
|
+
)
|
1553
|
+
self.video_thread.progress_signal.connect(self.ui.progressBar.setValue)
|
1554
|
+
self.video_thread.progress_text.connect(self.ui.progress_label.setText)
|
1555
|
+
self.video_thread.done_signal.connect(self.post_video_export)
|
1556
|
+
self.video_thread.run() # we cannot run another thread accesing the main thread objects...
|
1492
1557
|
else:
|
1493
1558
|
info_msg("There is not diagram selected", "Record video")
|
1494
1559
|
|
1495
1560
|
else:
|
1496
1561
|
info_msg("There are no time series", "Record video")
|
1497
1562
|
|
1563
|
+
def post_video_export(self):
|
1564
|
+
"""
|
1565
|
+
|
1566
|
+
:return:
|
1567
|
+
"""
|
1568
|
+
if self.video_thread.logger.has_logs():
|
1569
|
+
dlg = LogsDialogue("Video export", self.video_thread.logger, True)
|
1570
|
+
dlg.exec_()
|
1571
|
+
|
1572
|
+
# def record_video_now(self, filename, diagram: SchematicWidget | GridMapWidget):
|
1573
|
+
# """
|
1574
|
+
#
|
1575
|
+
# :param filename:
|
1576
|
+
# :param diagram:
|
1577
|
+
# :return:
|
1578
|
+
# """
|
1579
|
+
# fps = self.ui.fps_spinBox.value()
|
1580
|
+
# start_idx = self.get_simulation_start()
|
1581
|
+
# end_idx = self.get_simulation_end()
|
1582
|
+
# current_study = self.ui.available_results_to_color_comboBox.currentText()
|
1583
|
+
#
|
1584
|
+
# # start recording...
|
1585
|
+
# diagram.start_video_recording(fname=filename, fps=fps)
|
1586
|
+
#
|
1587
|
+
# # paint and capture
|
1588
|
+
# for t_idx in range(start_idx, end_idx):
|
1589
|
+
# self.grid_colour_function(diagram=diagram,
|
1590
|
+
# current_study=current_study,
|
1591
|
+
# t_idx=t_idx,
|
1592
|
+
# allow_popups=False)
|
1593
|
+
#
|
1594
|
+
# diagram.capture_video_frame()
|
1595
|
+
#
|
1596
|
+
# print(f"Saving frame {t_idx} / {end_idx}")
|
1597
|
+
#
|
1598
|
+
# # finalize
|
1599
|
+
# diagram.end_video_recording()
|
1600
|
+
# print(f"Recording saved to {filename}")
|
1601
|
+
|
1498
1602
|
def set_xy_from_lat_lon(self):
|
1499
1603
|
"""
|
1500
1604
|
Get the x, y coordinates of the buses from their latitude and longitude
|
@@ -936,9 +936,13 @@ class IoMain(ConfigurationMain):
|
|
936
936
|
data_dict = self.last_file_driver.load_session_objects(session_name=session_name,
|
937
937
|
study_name=study_name)
|
938
938
|
|
939
|
-
self.session.register_driver_from_disk_data(grid=self.circuit,
|
940
|
-
|
941
|
-
|
939
|
+
logger = self.session.register_driver_from_disk_data(grid=self.circuit,
|
940
|
+
study_name=study_name,
|
941
|
+
data_dict=data_dict)
|
942
|
+
|
943
|
+
if logger.has_logs():
|
944
|
+
dlg = LogsDialogue(name="Results parsing", logger=logger, expand_all=True)
|
945
|
+
dlg.exec()
|
942
946
|
|
943
947
|
self.update_available_results()
|
944
948
|
else:
|
@@ -263,14 +263,15 @@ class ProfilesModel(WrappableTableModel):
|
|
263
263
|
return None
|
264
264
|
|
265
265
|
if role == QtCore.Qt.ItemDataRole.DisplayRole:
|
266
|
-
|
267
|
-
|
266
|
+
|
267
|
+
if orientation == QtCore.Qt.Orientation.Horizontal:
|
268
|
+
if section < len(self.elements):
|
268
269
|
return str(self.elements[section].name)
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
270
|
+
elif orientation == QtCore.Qt.Orientation.Vertical:
|
271
|
+
if self.time_array is None:
|
272
|
+
return str(section)
|
273
|
+
else:
|
274
|
+
return pd.to_datetime(self.time_array[section]).strftime('%d-%m-%Y %H:%M:%S')
|
274
275
|
|
275
276
|
return None
|
276
277
|
|
@@ -51,7 +51,9 @@ class HeaderViewWithWordWrap(QtWidgets.QHeaderView):
|
|
51
51
|
"""
|
52
52
|
mdl: WrappableTableModel = self.model()
|
53
53
|
if mdl:
|
54
|
-
headerText = mdl.headerData(logicalIndex,
|
54
|
+
headerText = mdl.headerData(section=logicalIndex,
|
55
|
+
orientation=self.orientation(),
|
56
|
+
role=QtCore.Qt.ItemDataRole.DisplayRole)
|
55
57
|
option = QtWidgets.QStyleOptionHeader()
|
56
58
|
self.initStyleOption(option)
|
57
59
|
option.section = logicalIndex
|