GridCal 5.1.39__tar.gz → 5.1.41__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_container.py +24 -6
  2. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/map_line_segment.py +75 -14
  3. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/grid_map_widget.py +25 -3
  4. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics_template.py +7 -3
  5. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/schematic_widget.py +2 -1
  6. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Model/time_events.py +19 -12
  7. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/profile_dialogue.py +71 -47
  8. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/object_model.py +7 -1
  9. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Session/server_driver.py +13 -62
  10. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/__version__.py +1 -1
  11. {GridCal-5.1.39 → GridCal-5.1.41}/PKG-INFO +1 -1
  12. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ExecuteGridCal.py +0 -0
  13. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/AboutDialogue/__init__.py +0 -0
  14. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/AboutDialogue/about_dialogue.py +0 -0
  15. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/AboutDialogue/gui.py +0 -0
  16. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/AboutDialogue/icons_rc.py +0 -0
  17. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/AboutDialogue/update_gui_file.py +0 -0
  18. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Analysis/AnalysisDialogue.py +0 -0
  19. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Analysis/__init__.py +0 -0
  20. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Analysis/gui.py +0 -0
  21. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Analysis/icons_rc.py +0 -0
  22. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Analysis/object_plot_analysis.py +0 -0
  23. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Analysis/update_gui_file.py +0 -0
  24. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CascadingSteps/__init__.py +0 -0
  25. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CascadingSteps/cascading_steps.py +0 -0
  26. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CascadingSteps/gui.py +0 -0
  27. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CascadingSteps/update_gui_file.py +0 -0
  28. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ContingencyPlanner/__init__.py +0 -0
  29. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ContingencyPlanner/contingency_planner_dialogue.py +0 -0
  30. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ContingencyPlanner/gui.py +0 -0
  31. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ContingencyPlanner/icons_rc.py +0 -0
  32. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ContingencyPlanner/update_gui_file.py +0 -0
  33. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CoordinatesInput/__init__.py +0 -0
  34. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CoordinatesInput/coordinates_dialogue.py +0 -0
  35. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CoordinatesInput/gui.py +0 -0
  36. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CoordinatesInput/icons_rc.py +0 -0
  37. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/CoordinatesInput/update_gui_file.py +0 -0
  38. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/__init__.py +0 -0
  39. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/map_ac_line.py +0 -0
  40. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/map_dc_line.py +0 -0
  41. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/map_fluid_path.py +0 -0
  42. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/map_hvdc_line.py +0 -0
  43. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Branches/new_line_dialogue.py +0 -0
  44. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Substation/__init__.py +0 -0
  45. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Substation/node_graphic_item.py +0 -0
  46. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Substation/node_template.py +0 -0
  47. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Substation/substation_graphic_item.py +0 -0
  48. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Substation/voltage_level_graphic_item.py +0 -0
  49. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/__init__.py +0 -0
  50. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/blue_marble.py +0 -0
  51. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/cartodb.py +0 -0
  52. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/gmt_local.py +0 -0
  53. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapbox.py +0 -0
  54. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/mapquest.py +0 -0
  55. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/open_street_map.py +0 -0
  56. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_toner.py +0 -0
  57. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_transport.py +0 -0
  58. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/TileProviders/stamen_watercolor.py +0 -0
  59. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/__init__.py +0 -0
  60. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/base_tiles.py +0 -0
  61. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/default_tile_data.py +0 -0
  62. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/pycacheback.py +0 -0
  63. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/tile_worker.py +0 -0
  64. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles.py +0 -0
  65. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/Tiles/tiles_cache.py +0 -0
  66. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/__init__.py +0 -0
  67. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/MapWidget/map_widget.py +0 -0
  68. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/__init__.py +0 -0
  69. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/dc_line_graphics.py +0 -0
  70. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/hvdc_graphics.py +0 -0
  71. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_editor.py +0 -0
  72. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/line_graphics.py +0 -0
  73. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/series_reactance_graphics.py +0 -0
  74. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/switch_graphics.py +0 -0
  75. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer2w_graphics.py +0 -0
  76. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer3w_graphics.py +0 -0
  77. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_editor.py +0 -0
  78. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/transformer_taps_editor.py +0 -0
  79. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/upfc_graphics.py +0 -0
  80. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/vsc_graphics.py +0 -0
  81. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Branches/winding_graphics.py +0 -0
  82. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/__init__.py +0 -0
  83. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_node_graphics.py +0 -0
  84. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_p2x_graphics.py +0 -0
  85. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_path_graphics.py +0 -0
  86. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_pump_graphics.py +0 -0
  87. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Fluid/fluid_turbine_graphics.py +0 -0
  88. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/__init__.py +0 -0
  89. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/battery_graphics.py +0 -0
  90. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_editor.py +0 -0
  91. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/controllable_shunt_graphics.py +0 -0
  92. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/current_injection_graphics.py +0 -0
  93. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/external_grid_graphics.py +0 -0
  94. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_editor.py +0 -0
  95. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/generator_graphics.py +0 -0
  96. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/injections_template_graphics.py +0 -0
  97. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/load_graphics.py +0 -0
  98. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/shunt_graphics.py +0 -0
  99. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Injections/static_generator_graphics.py +0 -0
  100. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Substation/__init__.py +0 -0
  101. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Substation/bus_graphics.py +0 -0
  102. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Substation/busbar_graphics.py +0 -0
  103. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/Substation/cn_graphics.py +0 -0
  104. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/__init__.py +0 -0
  105. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/matplotlibwidget.py +0 -0
  106. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/SchematicWidget/terminal_item.py +0 -0
  107. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/__init__.py +0 -0
  108. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/base_diagram_widget.py +0 -0
  109. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/diagrams_model.py +0 -0
  110. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/generic_graphics.py +0 -0
  111. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Diagrams/graphics_manager.py +0 -0
  112. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/GridGenerator/__init__.py +0 -0
  113. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/GridGenerator/grid_generator_dialogue.py +0 -0
  114. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/GridGenerator/gui.py +0 -0
  115. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/GridGenerator/icons_rc.py +0 -0
  116. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/GridGenerator/update_gui_file.py +0 -0
  117. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadCatalogue/SelectComponents.py +0 -0
  118. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadCatalogue/__init__.py +0 -0
  119. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadCatalogue/catalogue_dialogue.py +0 -0
  120. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadCatalogue/icons_rc.py +0 -0
  121. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadCatalogue/update_gui_file.py +0 -0
  122. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadDesigner/__init__.py +0 -0
  123. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadDesigner/icons_rc.py +0 -0
  124. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadDesigner/load_designer.py +0 -0
  125. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadDesigner/load_designer_ui.py +0 -0
  126. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/LoadDesigner/update_gui_file.py +0 -0
  127. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/ConsoleLog.py +0 -0
  128. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/ConsoleLogController.py +0 -0
  129. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/GridCalMain.py +0 -0
  130. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/MainWindow.py +0 -0
  131. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Model/__init__.py +0 -0
  132. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Model/compiled_arrays.py +0 -0
  133. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Model/diagrams.py +0 -0
  134. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Model/objects.py +0 -0
  135. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/README.txt +0 -0
  136. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Results/__init__.py +0 -0
  137. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Results/results.py +0 -0
  138. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Scripting/__init__.py +0 -0
  139. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Scripting/python_highlighter.py +0 -0
  140. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Scripting/scripting.py +0 -0
  141. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Server/__init__.py +0 -0
  142. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Server/server.py +0 -0
  143. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Settings/__init__.py +0 -0
  144. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/Settings/configuration.py +0 -0
  145. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/__init__.py +0 -0
  146. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/base_gui.py +0 -0
  147. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/io.py +0 -0
  148. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/SubClasses/simulations.py +0 -0
  149. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/__init__.py +0 -0
  150. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/icons_rc.py +0 -0
  151. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/object_select_window.py +0 -0
  152. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Main/update_gui_file.py +0 -0
  153. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/__init__.py +0 -0
  154. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/excel_dialog.py +0 -0
  155. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/excel_sheet_selection.py +0 -0
  156. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/icons_rc.py +0 -0
  157. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/models_dialogue.py +0 -0
  158. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/profiles_from_data.py +0 -0
  159. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/profiles_from_data_gui.py +0 -0
  160. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/profiles_from_models_gui.py +0 -0
  161. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/ProfilesInput/update_gui_file.py +0 -0
  162. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/RosetaExplorer/ConsoleWidget.py +0 -0
  163. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/RosetaExplorer/MainWindow.py +0 -0
  164. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/RosetaExplorer/RosetaExplorer.py +0 -0
  165. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/RosetaExplorer/__init__.py +0 -0
  166. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/RosetaExplorer/icons_rc.py +0 -0
  167. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/RosetaExplorer/roseta_objects_model.py +0 -0
  168. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/RosetaExplorer/update_gui_file.py +0 -0
  169. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SigmaAnalysis/__init__.py +0 -0
  170. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SigmaAnalysis/gui.py +0 -0
  171. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SigmaAnalysis/icons_rc.py +0 -0
  172. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SigmaAnalysis/sigma_analysis_dialogue.py +0 -0
  173. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SigmaAnalysis/update_gui_file.py +0 -0
  174. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SolarPowerWizard/__init__.py +0 -0
  175. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SolarPowerWizard/gui.py +0 -0
  176. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SolarPowerWizard/icons_rc.py +0 -0
  177. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SolarPowerWizard/solar_power_wizzard.py +0 -0
  178. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SolarPowerWizard/update_gui_file.py +0 -0
  179. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SyncDialogue/__init__.py +0 -0
  180. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SyncDialogue/gui.py +0 -0
  181. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SyncDialogue/icons_rc.py +0 -0
  182. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SyncDialogue/sync_dialogue.py +0 -0
  183. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SyncDialogue/update_gui_file.py +0 -0
  184. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SystemScaler/__init__.py +0 -0
  185. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SystemScaler/icons_rc.py +0 -0
  186. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SystemScaler/system_scaler.py +0 -0
  187. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SystemScaler/system_scaler_ui.py +0 -0
  188. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/SystemScaler/update_gui_file.py +0 -0
  189. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TowerBuilder/LineBuilderDialogue.py +0 -0
  190. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TowerBuilder/__init__.py +0 -0
  191. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TowerBuilder/gui.py +0 -0
  192. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TowerBuilder/icons_rc.py +0 -0
  193. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TowerBuilder/table_models.py +0 -0
  194. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TowerBuilder/test_.py +0 -0
  195. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TowerBuilder/update_gui_file.py +0 -0
  196. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TreeModelViewer/MainWindow.py +0 -0
  197. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TreeModelViewer/TreeModelViewer.py +0 -0
  198. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TreeModelViewer/__init__.py +0 -0
  199. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TreeModelViewer/icons_rc.py +0 -0
  200. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/TreeModelViewer/update_gui_file.py +0 -0
  201. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Visualization/__init__.py +0 -0
  202. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Visualization/visualization.py +0 -0
  203. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Widgets/__init__.py +0 -0
  204. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Widgets/custom_qrangeslider.py +0 -0
  205. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/Widgets/matplotlibwidget.py +0 -0
  206. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/WindPowerWizard/__init__.py +0 -0
  207. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/WindPowerWizard/gui.py +0 -0
  208. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/WindPowerWizard/icons_rc.py +0 -0
  209. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/WindPowerWizard/update_gui_file.py +0 -0
  210. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/WindPowerWizard/wind_power_wizzard.py +0 -0
  211. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/__init__.py +0 -0
  212. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/associations_model.py +0 -0
  213. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/console_widget.py +0 -0
  214. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/general_dialogues.py +0 -0
  215. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/gui_functions.py +0 -0
  216. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/messages.py +0 -0
  217. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/pandas_model.py +0 -0
  218. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/plot_config.py +0 -0
  219. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/profiles_model.py +0 -0
  220. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/results_model.py +0 -0
  221. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/table_view_header_wrap.py +0 -0
  222. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/themes.py +0 -0
  223. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/update_gui_all.py +0 -0
  224. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/update_gui_common.py +0 -0
  225. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Gui/wrappable_table_model.py +0 -0
  226. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/LICENSE.txt +0 -0
  227. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Session/__init__.py +0 -0
  228. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Session/export_results_driver.py +0 -0
  229. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Session/file_handler.py +0 -0
  230. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Session/session.py +0 -0
  231. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/Session/synchronization_driver.py +0 -0
  232. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/__init__.py +0 -0
  233. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/__init__.py +0 -0
  234. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_color.py +0 -0
  235. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_icon/__init__.py +0 -0
  236. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_icon/icon_engine.py +0 -0
  237. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_icon/svg.py +0 -0
  238. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_main.py +0 -0
  239. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_os_appearance/__init__.py +0 -0
  240. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/__init__.py +0 -0
  241. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_os_appearance/_accent/_mac_detect.py +0 -0
  242. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_os_appearance/listener.py +0 -0
  243. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_proxy_style.py +0 -0
  244. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_resources/__init__.py +0 -0
  245. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_resources/colors.py +0 -0
  246. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_resources/palette.py +0 -0
  247. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_resources/standard_icons.py +0 -0
  248. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_resources/stylesheets.py +0 -0
  249. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_resources/svg.py +0 -0
  250. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_style_loader.py +0 -0
  251. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_template/__init__.py +0 -0
  252. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_template/engine.py +0 -0
  253. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_template/filter.py +0 -0
  254. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/_util.py +0 -0
  255. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/qtpy/QtCore/__init__.py +0 -0
  256. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/qtpy/QtGui/__init__.py +0 -0
  257. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/qtpy/QtSvg/__init__.py +0 -0
  258. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/qtpy/QtWidgets/__init__.py +0 -0
  259. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/qtpy/__init__.py +0 -0
  260. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/qtpy/qt_compat.py +0 -0
  261. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/qtpy/qt_version.py +0 -0
  262. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/__init__.py +0 -0
  263. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/__main__.py +0 -0
  264. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/__init__.py +0 -0
  265. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/dock_ui.py +0 -0
  266. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/frame_ui.py +0 -0
  267. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/icons_ui.py +0 -0
  268. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/mdi_ui.py +0 -0
  269. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/_ui/widgets_ui.py +0 -0
  270. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/ThirdParty/qdarktheme/widget_gallery/main_window.py +0 -0
  271. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/__init__.py +0 -0
  272. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/data/__init__.py +0 -0
  273. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/data/cables.csv +0 -0
  274. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/data/sequence_lines.csv +0 -0
  275. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/data/transformers.csv +0 -0
  276. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/data/wires.csv +0 -0
  277. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/plugins.py +0 -0
  278. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/templates.py +0 -0
  279. {GridCal-5.1.39 → GridCal-5.1.41}/GridCal/update.py +0 -0
  280. {GridCal-5.1.39 → GridCal-5.1.41}/setup.cfg +0 -0
  281. {GridCal-5.1.39 → GridCal-5.1.41}/setup.py +0 -0
@@ -72,9 +72,9 @@ class MapLineContainer(GenericDiagramWidget):
72
72
  :param val:
73
73
  """
74
74
  for segment in self.segments_list:
75
- pen = segment.pen() # get the current pen
76
- pen.setWidthF(val * segment.width) # Set the fractional thickness of the line
77
- segment.setPen(pen) # Assign the pen to the line item
75
+ # pen = segment.pen() # get the current pen
76
+ # pen.setWidthF(val * segment.width) # Set the fractional thickness of the line
77
+ segment.set_width(val * segment.width) # Assign the pen to the line item
78
78
 
79
79
  def clean_segments(self) -> None:
80
80
  """
@@ -132,10 +132,8 @@ class MapLineContainer(GenericDiagramWidget):
132
132
  :return:
133
133
  """
134
134
  for segment in self.segments_list:
135
- segment.setPen(QPen(color, w, style))
136
135
  segment.setToolTip(tool_tip)
137
- # segment.setPen(Qt.NoPen)
138
- # segment.setBrush(color)
136
+ segment.set_colour(color=color, w=w, style=style)
139
137
 
140
138
  def update_connectors(self) -> None:
141
139
  """
@@ -463,3 +461,23 @@ class MapLineContainer(GenericDiagramWidget):
463
461
 
464
462
  for line in self.segments_list:
465
463
  line.set_enable(val=False)
464
+
465
+ def set_arrows_with_power(self, Sf: complex, St: complex) -> None:
466
+ """
467
+
468
+ :param Sf:
469
+ :param St:
470
+ :return:
471
+ """
472
+ for segment in self.segments_list:
473
+ segment.set_arrows_with_power(Sf=Sf, St=St)
474
+
475
+ def set_arrows_with_hvdc_power(self, Pf: float, Pt: float) -> None:
476
+ """
477
+
478
+ :param Pf:
479
+ :param Pt:
480
+ :return:
481
+ """
482
+ for segment in self.segments_list:
483
+ segment.set_arrows_with_hvdc_power(Pf=Pf, Pt=Pt)
@@ -21,6 +21,7 @@ from PySide6.QtGui import QPen, QColor, QCursor
21
21
  from PySide6.QtWidgets import QMenu, QGraphicsSceneContextMenuEvent
22
22
  from PySide6.QtWidgets import QGraphicsLineItem, QGraphicsSceneMouseEvent
23
23
 
24
+ from GridCal.Gui.Diagrams.SchematicWidget.Branches.line_graphics_template import ArrowHead
24
25
  from GridCal.Gui.gui_functions import add_menu_entry
25
26
  from GridCal.Gui.messages import yes_no_question
26
27
  from GridCal.Gui.Diagrams.generic_graphics import ACTIVE, DEACTIVATED, OTHER
@@ -59,6 +60,19 @@ class MapLineSegment(QGraphicsLineItem):
59
60
  self.pos1: QPointF = self.first.get_center_pos()
60
61
  self.pos2: QPointF = self.second.get_center_pos()
61
62
 
63
+ # arrows
64
+ self.view_arrows = True
65
+ self._arrow_size = self.width * 1.5
66
+ self.arrow_p_from = ArrowHead(parent=self, arrow_size=self._arrow_size, position=0.2, under=False,
67
+ text_scale=0.01, show_text=False)
68
+ self.arrow_q_from = ArrowHead(parent=self, arrow_size=self._arrow_size, position=0.2, under=True,
69
+ text_scale=0.01, show_text=False)
70
+ self.arrow_p_to = ArrowHead(parent=self, arrow_size=self._arrow_size, position=0.8, under=False,
71
+ text_scale=0.01, show_text=False)
72
+ self.arrow_q_to = ArrowHead(parent=self, arrow_size=self._arrow_size, position=0.8, under=True,
73
+ text_scale=0.01, show_text=False)
74
+
75
+ # set callbacks
62
76
  self.first.add_position_change_callback(self.set_from_side_coordinates)
63
77
  self.second.add_position_change_callback(self.set_to_side_coordinates)
64
78
 
@@ -68,7 +82,7 @@ class MapLineSegment(QGraphicsLineItem):
68
82
  self.setZValue(0)
69
83
 
70
84
  self.setFlag(self.GraphicsItemFlag.ItemIsSelectable, True)
71
- self.setCursor(QCursor(Qt.PointingHandCursor))
85
+ self.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
72
86
 
73
87
  @property
74
88
  def api_object(self) -> BRANCH_TYPES:
@@ -86,6 +100,21 @@ class MapLineSegment(QGraphicsLineItem):
86
100
  """
87
101
  return self.container.editor
88
102
 
103
+ def set_width(self, width: float):
104
+ """
105
+
106
+ :param width:
107
+ :return:
108
+ """
109
+ pen = self.pen()
110
+ pen.setWidthF(width)
111
+ self.setPen(pen)
112
+
113
+ self.arrow_p_from.label.setScale(width)
114
+ self.arrow_q_from.label.setScale(width)
115
+ self.arrow_p_to.label.setScale(width)
116
+ self.arrow_q_to.label.setScale(width)
117
+
89
118
  def set_colour(self, color: QColor, w: float, style: Qt.PenStyle):
90
119
  """
91
120
  Set color and style
@@ -95,10 +124,14 @@ class MapLineSegment(QGraphicsLineItem):
95
124
  :return:
96
125
  """
97
126
 
98
- pen = QPen(color, w, style, Qt.RoundCap, Qt.RoundJoin)
127
+ pen = QPen(color, w, style, Qt.PenCapStyle.RoundCap, Qt.PenJoinStyle.RoundJoin)
99
128
  pen.setWidthF(w)
100
129
 
101
130
  self.setPen(pen)
131
+ self.arrow_p_from.set_colour(color, w, style)
132
+ self.arrow_q_from.set_colour(color, w, style)
133
+ self.arrow_p_to.set_colour(color, w, style)
134
+ self.arrow_q_to.set_colour(color, w, style)
102
135
 
103
136
  def set_from_side_coordinates(self, x: float, y: float):
104
137
  """
@@ -125,13 +158,15 @@ class MapLineSegment(QGraphicsLineItem):
125
158
  Update the endings of this segment
126
159
  """
127
160
  self.setLine(QLineF(self.pos1, self.pos2))
128
- # Get the positions of the first and second objects
129
- # if self.first.needsUpdate or self.second.needsUpdate or force:
130
- # # Set the line's starting and ending points
131
- # self.setLine(self.first.rect().x(),
132
- # self.first.rect().y(),
133
- # self.second.rect().x(),
134
- # self.second.rect().y())
161
+
162
+ if self.api_object is not None:
163
+
164
+ # arrows
165
+ if self.view_arrows:
166
+ self.arrow_p_from.redraw()
167
+ self.arrow_q_from.redraw()
168
+ self.arrow_p_to.redraw()
169
+ self.arrow_q_to.redraw()
135
170
 
136
171
  def end_update(self) -> None:
137
172
  """
@@ -158,11 +193,6 @@ class MapLineSegment(QGraphicsLineItem):
158
193
  """
159
194
  menu = QMenu()
160
195
 
161
- # add_menu_entry(menu=menu,
162
- # text="Remove",
163
- # icon_path="",
164
- # function_ptr=self.RemoveFunction)
165
-
166
196
  menu.addSection("Line")
167
197
 
168
198
  add_menu_entry(menu=menu,
@@ -360,3 +390,34 @@ class MapLineSegment(QGraphicsLineItem):
360
390
  if ok:
361
391
  self.editor.circuit.delete_branch(obj=self.api_object)
362
392
  self.editor.delete_diagram_element(device=self.api_object)
393
+
394
+ def set_arrows_with_power(self, Sf: complex, St: complex) -> None:
395
+ """
396
+ Set the arrow directions
397
+ :param Sf: Complex power from
398
+ :param St: Complex power to
399
+ """
400
+
401
+ if Sf is not None:
402
+ if St is None:
403
+ St = -Sf
404
+
405
+ Pf = Sf.real
406
+ Qf = Sf.imag
407
+ Pt = St.real
408
+ Qt_ = St.imag
409
+ self.arrow_p_from.set_value(Pf, True, Pf < 0, name="Pf", units="MW", draw_label=self.draw_labels)
410
+ self.arrow_q_from.set_value(Qf, True, Qf < 0, name="Qf", units="MVAr", draw_label=self.draw_labels)
411
+ self.arrow_p_to.set_value(Pt, True, Pt > 0, name="Pt", units="MW", draw_label=self.draw_labels)
412
+ self.arrow_q_to.set_value(Qt_, True, Qt_ > 0, name="Qt", units="MVAr", draw_label=self.draw_labels)
413
+
414
+ def set_arrows_with_hvdc_power(self, Pf: float, Pt: float) -> None:
415
+ """
416
+ Set the arrow directions
417
+ :param Pf: Complex power from
418
+ :param Pt: Complex power to
419
+ """
420
+ self.arrow_p_from.set_value(Pf, True, Pf < 0, name="Pf", units="MW", draw_label=self.draw_labels)
421
+ self.arrow_q_from.set_value(Pf, True, Pf < 0, name="Pf", units="MW", draw_label=self.draw_labels)
422
+ self.arrow_p_to.set_value(Pt, True, Pt > 0, name="Pt", units="MW", draw_label=self.draw_labels)
423
+ self.arrow_q_to.set_value(Pt, True, Pt > 0, name="Pt", units="MW", draw_label=self.draw_labels)
@@ -245,7 +245,7 @@ class GridMapWidget(BaseDiagramWidget):
245
245
  position_callback=self.position_callback)
246
246
 
247
247
  # Any representation on the map must be done after this Goto Function
248
- self.map.GotoLevelAndPosition(level=6, longitude=0, latitude=40)
248
+ self.map.GotoLevelAndPosition(level=6, longitude=longitude, latitude=latitude)
249
249
 
250
250
  self.map.startLev = 6
251
251
  self.map.startLat = 0
@@ -1059,7 +1059,7 @@ class GridMapWidget(BaseDiagramWidget):
1059
1059
  a *= 255
1060
1060
 
1061
1061
  color = QColor(r, g, b, a)
1062
- style = Qt.SolidLine
1062
+ style = Qt.PenStyle.SolidLine
1063
1063
  if use_flow_based_width:
1064
1064
  weight = int(
1065
1065
  np.floor(min_branch_width + Sfnorm[i] * (max_branch_width - min_branch_width) * 0.1))
@@ -1068,6 +1068,15 @@ class GridMapWidget(BaseDiagramWidget):
1068
1068
 
1069
1069
  graphic_object.set_colour(color=color, w=weight, style=style, tool_tip=tooltip)
1070
1070
 
1071
+ if hasattr(graphic_object, 'set_arrows_with_power'):
1072
+ graphic_object.set_arrows_with_power(
1073
+ Sf=Sf[i] if Sf is not None else None,
1074
+ St=St[i] if St is not None else None
1075
+ )
1076
+ else:
1077
+ # the graphic object is None
1078
+ pass
1079
+
1071
1080
  # try colouring the HVDC lines
1072
1081
  if len(hvdc_lines) > 0:
1073
1082
 
@@ -1110,13 +1119,26 @@ class GridMapWidget(BaseDiagramWidget):
1110
1119
  a *= 255
1111
1120
 
1112
1121
  color = QColor(r, g, b, a)
1113
- style = Qt.SolidLine
1122
+ style = Qt.PenStyle.SolidLine
1114
1123
  if use_flow_based_width:
1115
1124
  weight = int(
1116
1125
  np.floor(min_branch_width + Sfnorm[i] * (max_branch_width - min_branch_width) * 0.1))
1117
1126
  else:
1118
1127
  weight = 0.5
1119
1128
 
1129
+ tooltip = str(i) + ': ' + graphic_object.api_object.name
1130
+ tooltip += '\n' + loading_label + ': ' + "{:10.4f}".format(
1131
+ abs(hvdc_loading[i]) * 100) + ' [%]'
1132
+
1133
+ tooltip += '\nPower (from):\t' + "{:10.4f}".format(hvdc_Pf[i]) + ' [MW]'
1134
+
1135
+ if hvdc_losses is not None:
1136
+ tooltip += '\nPower (to):\t' + "{:10.4f}".format(hvdc_Pt[i]) + ' [MW]'
1137
+ tooltip += '\nLosses: \t\t' + "{:10.4f}".format(hvdc_losses[i]) + ' [MW]'
1138
+ graphic_object.set_arrows_with_hvdc_power(Pf=hvdc_Pf[i], Pt=hvdc_Pt[i])
1139
+ else:
1140
+ graphic_object.set_arrows_with_hvdc_power(Pf=hvdc_Pf[i], Pt=-hvdc_Pf[i])
1141
+
1120
1142
  graphic_object.set_colour(color=color, w=weight, style=style, tool_tip=tooltip)
1121
1143
 
1122
1144
  def get_image(self, transparent: bool = False) -> Tuple[QImage, int, int]:
@@ -329,12 +329,13 @@ class ArrowHead(QGraphicsPolygonItem):
329
329
 
330
330
  def __init__(self,
331
331
  parent: QGraphicsLineItem,
332
- arrow_size: int,
332
+ arrow_size: float,
333
333
  position: float = 0.9,
334
334
  under: bool = False,
335
335
  backwards: bool = False,
336
336
  separation: int = 5,
337
- show_text: bool = True):
337
+ show_text: bool = True,
338
+ text_scale: float = 1.0):
338
339
  """
339
340
  Constructor
340
341
  :param parent: Parent line
@@ -344,11 +345,12 @@ class ArrowHead(QGraphicsPolygonItem):
344
345
  :param backwards: Is it backwards?
345
346
  :param separation: Separation
346
347
  :param show_text: Show the label?
348
+ :param text_scale: Text scale
347
349
  """
348
350
  QGraphicsPolygonItem.__init__(self, parent=parent)
349
351
 
350
352
  self.parent: QGraphicsLineItem = parent
351
- self.arrow_size: int = arrow_size
353
+ self.arrow_size: float = arrow_size
352
354
  self.position: float = position
353
355
  self.under: bool = under
354
356
  self.backwards: float = backwards
@@ -356,6 +358,7 @@ class ArrowHead(QGraphicsPolygonItem):
356
358
 
357
359
  self.label = QGraphicsTextItem(self)
358
360
  self.label.setPlainText("")
361
+ # self.label.setScale(text_scale)
359
362
  self.show_text = show_text
360
363
 
361
364
  self.w = arrow_size
@@ -373,6 +376,7 @@ class ArrowHead(QGraphicsPolygonItem):
373
376
  """
374
377
  self.setBrush(color)
375
378
  self.label.setDefaultTextColor(color)
379
+ # self.label.setScale(w)
376
380
 
377
381
  def set_value(self, value: float, redraw=True, backwards=False, name="", units="", format_str="{:10.2f}",
378
382
  draw_label: bool = True, visibility_filter_value=1e-4):
@@ -3469,7 +3469,8 @@ class SchematicWidget(BaseDiagramWidget):
3469
3469
  if hasattr(graphic_object, 'set_arrows_with_power'):
3470
3470
  graphic_object.set_arrows_with_power(
3471
3471
  Sf=Sf[i] if Sf is not None else None,
3472
- St=St[i] if St is not None else None)
3472
+ St=St[i] if St is not None else None
3473
+ )
3473
3474
  else:
3474
3475
  w = graphic_object.pen_width
3475
3476
  style = Qt.PenStyle.DashLine
@@ -27,7 +27,7 @@ from GridCal.Gui.general_dialogues import NewProfilesStructureDialogue, TimeReIn
27
27
  from GridCal.Gui.messages import yes_no_question, warning_msg, info_msg
28
28
  from GridCal.Gui.Main.SubClasses.Model.objects import ObjectsTableMain
29
29
  from GridCal.Gui.ProfilesInput.models_dialogue import ModelsInputGUI
30
- from GridCal.Gui.ProfilesInput.profile_dialogue import ProfileInputGUI
30
+ from GridCal.Gui.ProfilesInput.profile_dialogue import ProfileInputGUI, GeneratorsProfileOptionsDialogue
31
31
  from GridCal.Gui.profiles_model import ProfilesModel
32
32
 
33
33
 
@@ -85,7 +85,6 @@ class TimeEventsMain(ObjectsTableMain):
85
85
  """
86
86
  dlg = NewProfilesStructureDialogue()
87
87
  if dlg.exec_():
88
-
89
88
  steps, step_length, step_unit, time_base = dlg.get_values()
90
89
 
91
90
  self.ui.profiles_tableView.setModel(None)
@@ -180,18 +179,26 @@ class TimeEventsMain(ObjectsTableMain):
180
179
  if len(objects) > 0:
181
180
  if magnitude == 'P':
182
181
  if objects[0].device_type == DeviceType.GeneratorDevice:
183
- ok = yes_no_question(
184
- "Do you want to correct the generators active "
185
- "profile based on the active power profile?",
186
- "Match")
187
- if ok:
182
+
183
+ dlg = GeneratorsProfileOptionsDialogue()
184
+ dlg.exec()
185
+
186
+ if dlg.correct_active_profile.isChecked():
188
187
  self.fix_generators_active_based_on_the_power(ask_before=False)
188
+
189
+ if dlg.set_non_dispatchable.isChecked():
190
+ for i, elm in enumerate(objects):
191
+ if self.profile_input_dialogue.has_profile(i):
192
+ # if there was a profile, we want the generator not dispatchable
193
+ elm.enabled_dispatch = False
194
+ else:
195
+ elm.enabled_dispatch = True
196
+
189
197
  elif objects[0].device_type == DeviceType.LoadDevice:
190
- ok = yes_no_question(
191
- "Do you want to correct the loads active profile "
192
- "based on the active power profile?",
193
- "Match")
194
- if ok:
198
+ ok1 = yes_no_question("Do you want to correct the loads active profile "
199
+ "based on the active power profile?",
200
+ "Match")
201
+ if ok1:
195
202
  self.fix_loads_active_based_on_the_power(ask_before=False)
196
203
 
197
204
  else:
@@ -19,14 +19,13 @@ from __future__ import annotations
19
19
  import os
20
20
  import string
21
21
  import sys
22
- from typing import Union
22
+ from typing import Tuple, List
23
23
  from random import randint
24
24
  from enum import Enum
25
25
  from difflib import SequenceMatcher
26
26
  import numpy as np
27
27
  import pandas as pd
28
28
  from PySide6 import QtWidgets, QtCore
29
- from typing import List
30
29
  from GridCal.Gui.pandas_model import PandasModel
31
30
  from GridCal.Gui.gui_functions import get_list_model
32
31
  from GridCal.Gui.ProfilesInput.profiles_from_data_gui import Ui_Dialog
@@ -34,6 +33,7 @@ from GridCal.Gui.ProfilesInput.excel_dialog import ExcelDialog
34
33
  from GridCal.Gui.messages import error_msg
35
34
  from GridCalEngine.Devices.types import ALL_DEV_TYPES
36
35
  from GridCalEngine.Devices.Parents.editable_device import uuid2idtag
36
+ from GridCalEngine.basic_structures import Mat, BoolVec
37
37
 
38
38
 
39
39
  class MultiplierType(Enum):
@@ -127,16 +127,16 @@ class ProfileAssociations(QtCore.QAbstractTableModel):
127
127
  """
128
128
  self.__values.append(val)
129
129
 
130
- def set_profile_at(self, idx, value):
130
+ def set_profile_at(self, idx: int, profile_name: str) -> None:
131
131
  """
132
132
 
133
133
  :param idx:
134
- :param value:
134
+ :param profile_name:
135
135
  :return:
136
136
  """
137
- self.__values[idx].profile_name = value
137
+ self.__values[idx].profile_name = profile_name
138
138
 
139
- def set_scale_at(self, idx, value):
139
+ def set_scale_at(self, idx: int, value: float) -> None:
140
140
  """
141
141
 
142
142
  :param idx:
@@ -145,7 +145,7 @@ class ProfileAssociations(QtCore.QAbstractTableModel):
145
145
  """
146
146
  self.__values[idx].scale = value
147
147
 
148
- def set_multiplier_at(self, idx, value):
148
+ def set_multiplier_at(self, idx: int, value: float) -> None:
149
149
  """
150
150
 
151
151
  :param idx:
@@ -154,7 +154,7 @@ class ProfileAssociations(QtCore.QAbstractTableModel):
154
154
  """
155
155
  self.__values[idx].multiplier = value
156
156
 
157
- def get_profile_at(self, idx):
157
+ def get_profile_at(self, idx: int) -> str:
158
158
  """
159
159
 
160
160
  :param idx:
@@ -162,7 +162,7 @@ class ProfileAssociations(QtCore.QAbstractTableModel):
162
162
  """
163
163
  return self.__values[idx].profile_name
164
164
 
165
- def get_scale_at(self, idx):
165
+ def get_scale_at(self, idx: int) -> float:
166
166
  """
167
167
 
168
168
  :param idx:
@@ -170,7 +170,7 @@ class ProfileAssociations(QtCore.QAbstractTableModel):
170
170
  """
171
171
  return self.__values[idx].scale
172
172
 
173
- def get_multiplier_at(self, idx):
173
+ def get_multiplier_at(self, idx: int) -> float:
174
174
  """
175
175
 
176
176
  :param idx:
@@ -188,7 +188,7 @@ class ProfileAssociations(QtCore.QAbstractTableModel):
188
188
  self.__values[idx].scale = 1
189
189
  self.__values[idx].multiplier = 1
190
190
 
191
- def rowCount(self, parent=None):
191
+ def rowCount(self, parent: QtCore.QModelIndex = None) -> int:
192
192
  """
193
193
 
194
194
  :param parent:
@@ -292,20 +292,36 @@ def check_similarity(name_to_search: str,
292
292
  return None
293
293
 
294
294
 
295
- # def msg(text: str, title="Warning"):
296
- # """
297
- # Message box
298
- # :param text: Text to display
299
- # :param title: Name of the window
300
- # """
301
- # msg = QtWidgets.QMessageBox()
302
- # msg.setIcon(QtWidgets.QMessageBox.Icon.Information)
303
- # msg.setText(text)
304
- # # msg.setInformativeText("This is additional information")
305
- # msg.setWindowTitle(title)
306
- # # msg.setDetailedText("The details are as follows:")
307
- # msg.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
308
- # retval = msg.exec_()
295
+ class GeneratorsProfileOptionsDialogue(QtWidgets.QDialog):
296
+ """
297
+ Dialogue to show after profile import
298
+ """
299
+
300
+ def __init__(self):
301
+ super().__init__()
302
+
303
+ self.setWindowTitle("Generator active power options")
304
+ self.setModal(True) # Make the dialog modal
305
+
306
+ # Create checkboxes
307
+ self.correct_active_profile = QtWidgets.QCheckBox("Correct active profile")
308
+ self.correct_active_profile.setToolTip("The generators active will be set to False if the power is zero")
309
+
310
+ self.set_non_dispatchable = QtWidgets.QCheckBox("Set to non-dispatchable")
311
+ self.set_non_dispatchable.setToolTip("Teh generators matched will be set set to non dispatchable. "
312
+ "This is usefull to specify renewable generation")
313
+
314
+ # Create layout and add checkboxes
315
+ layout = QtWidgets.QVBoxLayout()
316
+ layout.addWidget(self.correct_active_profile)
317
+ layout.addWidget(self.set_non_dispatchable)
318
+
319
+ # Create OK button to close the dialog
320
+ ok_button = QtWidgets.QPushButton("OK")
321
+ ok_button.clicked.connect(self.accept) # Close modal on button click
322
+ layout.addWidget(ok_button)
323
+
324
+ self.setLayout(layout)
309
325
 
310
326
 
311
327
  class ProfileInputGUI(QtWidgets.QDialog):
@@ -332,15 +348,15 @@ class ProfileInputGUI(QtWidgets.QDialog):
332
348
  self.ui.setupUi(self)
333
349
  self.setWindowTitle('Profiles import dialogue')
334
350
 
335
- self.project_directory = None
351
+ self.project_directory: str | None = None
336
352
 
337
353
  self.magnitudes = magnitudes
338
354
 
339
355
  # results
340
- self.data = None
341
- self.time = None
342
- self.zeroed = None
343
- self.normalized = False
356
+ self.data: Mat | None = None
357
+ self.time: pd.DatetimeIndex | None = None
358
+ self.zeroed: BoolVec = None # array to know which profiles are only zeros
359
+ self.normalized: bool = False
344
360
 
345
361
  # units
346
362
  self.units = dict()
@@ -394,13 +410,13 @@ class ProfileInputGUI(QtWidgets.QDialog):
394
410
  }
395
411
  self.ui.nameTransformationComboBox.setModel(get_list_model(list(self.transformations.keys())))
396
412
 
397
- self.original_data_frame = None
413
+ self.original_data_frame: pd.DataFrame | None = None
398
414
 
399
415
  self.ui.autolink_slider.setValue(100) # Set slider to max value
400
416
 
401
417
  self.profile_names = list()
402
418
 
403
- self.excel_dialogue: Union[ExcelDialog, None] = None
419
+ self.excel_dialogue: ExcelDialog | None = None
404
420
 
405
421
  # click
406
422
  self.ui.open_button.clicked.connect(self.import_profile)
@@ -418,7 +434,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
418
434
  self.ui.assignation_table.doubleClicked.connect(self.assignation_table_double_click)
419
435
  self.ui.tableView.doubleClicked.connect(self.print_profile)
420
436
 
421
- def get_multiplier(self):
437
+ def get_multiplier(self) -> float:
422
438
  """
423
439
  Gets the necessary multiplier to pass the profile units to Mega
424
440
  Remember that the power units in GridCal are the MVA
@@ -426,7 +442,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
426
442
  unit = self.ui.units_combobox.currentText()
427
443
  return self.units[unit] / self.units['M']
428
444
 
429
- def import_profile(self):
445
+ def import_profile(self) -> None:
430
446
  """
431
447
  Select a file to be loaded
432
448
  """
@@ -525,7 +541,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
525
541
  self.original_data_frame[col_name].plot(ax=self.ui.plotwidget.canvas.ax)
526
542
  self.ui.plotwidget.canvas.draw()
527
543
 
528
- def display_associations(self):
544
+ def display_associations(self) -> None:
529
545
  """
530
546
 
531
547
  @return:
@@ -533,7 +549,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
533
549
  self.ui.assignation_table.setModel(self.associations)
534
550
  self.ui.assignation_table.repaint()
535
551
 
536
- def display_profiles(self):
552
+ def display_profiles(self) -> None:
537
553
  """
538
554
 
539
555
  :return:
@@ -556,7 +572,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
556
572
  self.original_data_frame[name].plot(ax=self.ui.plotwidget.canvas.ax)
557
573
  self.ui.plotwidget.canvas.draw()
558
574
 
559
- def make_association(self, source_idx, obj_idx, scale=None, mult=None, col_idx=None):
575
+ def make_association(self, source_idx: int, obj_idx: int, scale: float = 1.0, mult: float = 1.0) -> None:
560
576
  """
561
577
  Makes an association in the associations table
562
578
  """
@@ -579,7 +595,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
579
595
  idx_o = self.ui.assignation_table.selectedIndexes()[0].row()
580
596
  col = self.ui.assignation_table.selectedIndexes()[0].column()
581
597
 
582
- self.make_association(idx_s, idx_o, mult=None, col_idx=col)
598
+ self.make_association(idx_s, idx_o, mult=1.0)
583
599
 
584
600
  def set_multiplier(self, tpe):
585
601
  """
@@ -623,7 +639,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
623
639
  # assign the string with the closest match profile
624
640
  if idx is not None:
625
641
  # make the association
626
- self.make_association(idx, idx_o, mult)
642
+ self.make_association(idx, idx_o, 1.0, mult)
627
643
 
628
644
  self.display_associations()
629
645
 
@@ -705,7 +721,7 @@ class ProfileInputGUI(QtWidgets.QDialog):
705
721
 
706
722
  self.display_associations()
707
723
 
708
- def get_profile(self, parent=None, labels=None, alsoQ=None):
724
+ def get_profiles_data(self) -> Tuple[Mat | None, pd.DatetimeIndex | None, BoolVec | None]:
709
725
  """
710
726
  Return ths assigned profiles
711
727
  @return:
@@ -795,13 +811,21 @@ class ProfileInputGUI(QtWidgets.QDialog):
795
811
  self.original_data_frame.columns = self.profile_names
796
812
  self.display_profiles()
797
813
 
798
- def do_it(self):
814
+ def has_profile(self, i: int) -> bool:
815
+ """
816
+ Return if an object index has an associated profile
817
+ :param i:
818
+ :return:
819
+ """
820
+ return self.associations.get_profile_at(i) != ""
821
+
822
+ def do_it(self) -> None:
799
823
  """
800
824
  Close. The data has to be queried later to the object by the parent by calling get_association_data
801
825
  """
802
826
 
803
827
  # Generate profiles
804
- self.data, self.time, self.zeroed = self.get_profile()
828
+ self.data, self.time, self.zeroed = self.get_profiles_data()
805
829
  self.normalized = self.ui.normalized_checkBox.isChecked()
806
830
 
807
831
  if self.normalized:
@@ -814,13 +838,13 @@ class ProfileInputGUI(QtWidgets.QDialog):
814
838
  self.close()
815
839
 
816
840
 
817
- class TestObj:
818
- def __init__(self, name, code):
819
- self.name = name
820
- self.code = code
841
+ if __name__ == "__main__":
842
+ class TestObj:
843
+ def __init__(self, name, code):
844
+ self.name = name
845
+ self.code = code
821
846
 
822
847
 
823
- if __name__ == "__main__":
824
848
  app = QtWidgets.QApplication(sys.argv)
825
849
  window = ProfileInputGUI(list_of_objects=[TestObj('Test object', 'code')] * 10)
826
850
  window.resize(1.61 * 700.0, 600.0) # golden ratio
@@ -270,7 +270,13 @@ class ObjectsModel(WrappableTableModel):
270
270
  if role == QtCore.Qt.ItemDataRole.DisplayRole:
271
271
  return str(self.data_with_type(index))
272
272
  elif role == QtCore.Qt.ItemDataRole.BackgroundRole:
273
- if 'color' in self.attributes[index.column()]:
273
+
274
+ if self.transposed:
275
+ attr_idx = index.row()
276
+ else:
277
+ attr_idx = index.column()
278
+
279
+ if 'color' in self.attributes[attr_idx]:
274
280
  return QtGui.QColor(str(self.data_with_type(index)))
275
281
 
276
282
  return None