2026-05-26 18:49:56 +02:00
|
|
|
import sys
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
sys.path.insert(1, os.path.join(sys.path[0], "../../"))
|
|
|
|
|
import rips
|
|
|
|
|
|
|
|
|
|
import dataroot
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _create_summary_multi_plot(rips_instance):
|
|
|
|
|
"""Import a summary case and create one summary plot, returning the
|
|
|
|
|
newly created RimSummaryMultiPlot wrapper."""
|
|
|
|
|
case_path = dataroot.PATH + "/flow_diagnostics_test/SIMPLE_SUMMARY2.SMSPEC"
|
|
|
|
|
summary_case = rips_instance.project.import_summary_case(case_path)
|
|
|
|
|
assert summary_case.id == 1
|
|
|
|
|
|
|
|
|
|
collection = rips_instance.project.descendants(rips.SummaryPlotCollection)[0]
|
|
|
|
|
collection.new_summary_plot(summary_cases=[summary_case], address="FOPT")
|
|
|
|
|
|
|
|
|
|
multi_plots = rips_instance.project.descendants(rips.MultiSummaryPlot)
|
|
|
|
|
assert len(multi_plots) >= 1
|
|
|
|
|
return multi_plots[-1]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_summary_multi_plot_layout_is_scriptable(rips_instance, initialize_test):
|
|
|
|
|
"""The column/row count fields on a summary multi-plot are exposed over
|
|
|
|
|
gRPC and round-trip through update()."""
|
|
|
|
|
multi_plot = _create_summary_multi_plot(rips_instance)
|
|
|
|
|
|
|
|
|
|
# Fields are readable (default seeded from the Multi Plot Defaults
|
|
|
|
|
# preference; the exact default is environment dependent).
|
|
|
|
|
assert multi_plot.number_of_columns in (1, 2, 3, 4)
|
|
|
|
|
assert multi_plot.rows_per_page in (1, 2, 3, 4)
|
|
|
|
|
|
|
|
|
|
# Set, update, and verify the new values are persisted server-side.
|
|
|
|
|
multi_plot.number_of_columns = 3
|
|
|
|
|
multi_plot.rows_per_page = 2
|
|
|
|
|
multi_plot.update()
|
|
|
|
|
|
|
|
|
|
refetched = rips_instance.project.descendants(rips.MultiSummaryPlot)[-1]
|
|
|
|
|
assert refetched.number_of_columns == 3
|
|
|
|
|
assert refetched.rows_per_page == 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_summary_multi_plot_layout_override(rips_instance, initialize_test):
|
|
|
|
|
"""Forcing a 1x1 layout works regardless of the preference default —
|
|
|
|
|
this is what a headless export uses to get deterministic output."""
|
|
|
|
|
multi_plot = _create_summary_multi_plot(rips_instance)
|
|
|
|
|
|
|
|
|
|
multi_plot.number_of_columns = 1
|
|
|
|
|
multi_plot.rows_per_page = 1
|
|
|
|
|
multi_plot.update()
|
|
|
|
|
|
|
|
|
|
refetched = rips_instance.project.descendants(rips.MultiSummaryPlot)[-1]
|
|
|
|
|
assert refetched.number_of_columns == 1
|
|
|
|
|
assert refetched.rows_per_page == 1
|
2026-09-07 11:43:41 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_delete_summary_plot_in_multi_plot(rips_instance, initialize_test):
|
|
|
|
|
"""Deleting a single summary plot that lives inside a multi-plot must
|
|
|
|
|
remove the plot without crashing ResInsight (regression: the multi-plot
|
|
|
|
|
recreated its plot widgets through a null viewer in console mode)."""
|
|
|
|
|
case_path = dataroot.PATH + "/flow_diagnostics_test/SIMPLE_SUMMARY2.SMSPEC"
|
|
|
|
|
summary_case = rips_instance.project.import_summary_case(case_path)
|
|
|
|
|
|
|
|
|
|
collection = rips_instance.project.descendants(rips.SummaryPlotCollection)[0]
|
|
|
|
|
collection.new_summary_plot(summary_cases=[summary_case], address="FOPT")
|
|
|
|
|
collection.new_summary_plot(summary_cases=[summary_case], address="FWPT")
|
|
|
|
|
|
|
|
|
|
summary_plots = rips_instance.project.descendants(rips.SummaryPlot)
|
|
|
|
|
multi_plots = rips_instance.project.descendants(rips.MultiSummaryPlot)
|
|
|
|
|
assert len(summary_plots) == 2
|
|
|
|
|
assert len(multi_plots) == 2
|
|
|
|
|
|
|
|
|
|
summary_plots[0].delete()
|
|
|
|
|
|
|
|
|
|
remaining = rips_instance.project.descendants(rips.SummaryPlot)
|
|
|
|
|
assert len(remaining) == 1
|
|
|
|
|
assert remaining[0].id == summary_plots[1].id
|
|
|
|
|
# The multi-plot that owned the deleted sub-plot still exists.
|
|
|
|
|
assert len(rips_instance.project.descendants(rips.MultiSummaryPlot)) == 2
|
|
|
|
|
|
|
|
|
|
# Deleting the second plot must work as well.
|
|
|
|
|
remaining[0].delete()
|
|
|
|
|
assert len(rips_instance.project.descendants(rips.SummaryPlot)) == 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_delete_multi_summary_plot(rips_instance, initialize_test):
|
|
|
|
|
"""Deleting a whole multi-plot removes it and its sub-plots."""
|
|
|
|
|
case_path = dataroot.PATH + "/flow_diagnostics_test/SIMPLE_SUMMARY2.SMSPEC"
|
|
|
|
|
summary_case = rips_instance.project.import_summary_case(case_path)
|
|
|
|
|
|
|
|
|
|
collection = rips_instance.project.descendants(rips.SummaryPlotCollection)[0]
|
|
|
|
|
collection.new_summary_plot(summary_cases=[summary_case], address="FOPT")
|
|
|
|
|
collection.new_summary_plot(summary_cases=[summary_case], address="FWPT")
|
|
|
|
|
assert len(rips_instance.project.descendants(rips.MultiSummaryPlot)) == 2
|
|
|
|
|
|
|
|
|
|
rips_instance.project.descendants(rips.MultiSummaryPlot)[0].delete()
|
|
|
|
|
|
|
|
|
|
assert len(rips_instance.project.descendants(rips.MultiSummaryPlot)) == 1
|
|
|
|
|
assert len(rips_instance.project.descendants(rips.SummaryPlot)) == 1
|