@@ -123,15 +123,23 @@ class PlotWorker(QObject):
123123 def generate_maps (self , work_item : PlotWorkItem ):
124124 try :
125125 params = work_item .view_params
126- view_param = ViewParam (params ["origin" ], params ["width" ],
127- params ["height" ], params ["h_res" ])
128- view_param .h_res = params ["h_res" ]
129- view_param .v_res = params ["v_res" ]
130- view_param .basis = params ["basis" ]
131- view_param .level = params ["level" ]
132- view_param .color_overlaps = params ["color_overlaps" ]
133- ids_map = openmc .lib .id_map (view_param )
134- properties = openmc .lib .property_map (view_param )
126+
127+ # Determine if we need filter bins for MeshMaterialFilter tally
128+ filter_cpp = None
129+ if params .get ("filter_id" ) is not None :
130+ filter_cpp = openmc .lib .filters [params ["filter_id" ]]
131+
132+ # Single call replaces id_map + property_map + get_plot_bins
133+ ids_map , properties = openmc .lib .raster_plot (
134+ origin = params ["origin" ],
135+ width = (params ["width" ], params ["height" ]),
136+ basis = params ["basis" ],
137+ pixels = (params ["h_res" ], params ["v_res" ]),
138+ color_overlaps = params ["color_overlaps" ],
139+ level = params ["level" ],
140+ filter = filter_cpp ,
141+ )
142+
135143 self .finished .emit (work_item .view_params , ids_map , properties )
136144 except Exception as exc :
137145 self .error .emit (str (exc ))
@@ -474,8 +482,22 @@ def view_params_payload(self, view: "PlotView"):
474482 "basis" : str (vp .basis ),
475483 "level" : int (vp .level ),
476484 "color_overlaps" : bool (vp .color_overlaps ),
485+ "filter_id" : self .get_active_mesh_material_filter_id (view ),
477486 }
478487
488+ def get_active_mesh_material_filter_id (self , view : "PlotView" ) -> Optional [int ]:
489+ """Return the filter ID if displaying a MeshMaterialFilter tally, else None."""
490+ if self ._statepoint is None :
491+ return None
492+ if not view .tallyDataVisible or view .selectedTally is None :
493+ return None
494+
495+ tally = self ._statepoint .tallies [view .selectedTally ]
496+ if tally .contains_filter (openmc .MeshMaterialFilter ):
497+ filter = tally .find_filter (openmc .MeshMaterialFilter )
498+ return filter .id
499+ return None
500+
479501 def can_reuse_maps (self , view : "PlotView" ):
480502 if self .ids_map is None or self .properties is None :
481503 return False
@@ -496,8 +518,21 @@ def makePlot(self, view: Optional["PlotView"] = None,
496518 if ids_map is None or properties is None :
497519 if (self .currentView .view_params != view .view_params ) or \
498520 (self .ids_map is None ) or (self .properties is None ):
499- self .ids_map = openmc .lib .id_map (view .view_params )
500- self .properties = openmc .lib .property_map (view .view_params )
521+ # Determine if we need filter bins for MeshMaterialFilter tally
522+ filter_cpp = None
523+ filter_id = self .get_active_mesh_material_filter_id (view )
524+ if filter_id is not None :
525+ filter_cpp = openmc .lib .filters [filter_id ]
526+
527+ self .ids_map , self .properties = openmc .lib .raster_plot (
528+ origin = view .origin ,
529+ width = (view .width , view .height ),
530+ basis = view .basis ,
531+ pixels = (view .h_res , view .v_res ),
532+ color_overlaps = view .color_overlaps ,
533+ level = view .level ,
534+ filter = filter_cpp ,
535+ )
501536 self .map_view_params = self .view_params_payload (view )
502537 else :
503538 self .ids_map = ids_map
@@ -1008,19 +1043,14 @@ def _do_op(array, tally_value, ax=0):
10081043 selected_scores .append (idx )
10091044 data = _do_op (data [np .array (selected_scores )], tally_value )
10101045
1011- # Get mesh bins from openmc.lib
1012- filter = tally .find_filter (filter_class )
1013- filter_cpp = openmc .lib .filters [filter .id ]
1014-
1015- if view is None :
1016- view = self .currentView
1017-
1018- bins = filter_cpp .get_plot_bins (
1019- origin = view .origin ,
1020- width = (view .width , view .height ),
1021- basis = view .basis ,
1022- pixels = (view .h_res , view .v_res ),
1023- )
1046+ # Extract filter bins from ids_map (computed during raster_plot call)
1047+ # ids_map has shape (v_res, h_res, 4) when filter was included
1048+ if self .ids_map .shape [2 ] < 4 :
1049+ raise RuntimeError (
1050+ "Filter bins not available. Ensure raster_plot was called with "
1051+ "the appropriate filter for MeshMaterialFilter tallies."
1052+ )
1053+ bins = self .ids_map [:, :, 3 ]
10241054
10251055 # set image data
10261056 image_data = np .full_like (self .ids , np .nan , dtype = float )
0 commit comments