[docs]classPickingManager:"""Picking Manager helps with picking 3D objects."""@warn_on_args_to_kwargs()def__init__(self,*,vertices=True,faces=True,actors=True,world_coords=True,):"""Initialize Picking Manager. Parameters ---------- vertices : bool If True allows to pick vertex indices. faces : bool If True allows to pick face indices. actors : bool If True allows to pick actor indices. world_coords : bool If True allows to pick xyz position in world coordinates. """self.pickers={}ifvertices:self.pickers["vertices"]=PointPicker()iffaces:self.pickers["faces"]=CellPicker()ifactors:self.pickers["actors"]=PropPicker()ifworld_coords:self.pickers["world_coords"]=WorldPointPicker()
[docs]defpick(self,disp_xy,sc):"""Pick on display coordinates. Parameters ---------- disp_xy : tuple Display coordinates x, y. sc : Scene """x,y=disp_xyz=0info={"vertex":None,"face":None,"actor":None,"xyz":None}keys=self.pickers.keys()if"vertices"inkeys:self.pickers["vertices"].Pick(x,y,z,sc)info["vertex"]=self.pickers["vertices"].GetPointId()if"faces"inkeys:self.pickers["faces"].Pick(x,y,z,sc)info["vertex"]=self.pickers["faces"].GetPointId()info["face"]=self.pickers["faces"].GetCellId()if"actors"inkeys:self.pickers["actors"].Pick(x,y,z,sc)info["actor"]=self.pickers["actors"].GetViewProp()if"world_coords"inkeys:self.pickers["world_coords"].Pick(x,y,z,sc)info["xyz"]=self.pickers["world_coords"].GetPickPosition()returninfo
[docs]defevent_position(self,iren):"""Return event display position from interactor. Parameters ---------- iren : interactor The interactor object can be retrieved for example using providing ShowManager's iren attribute. """returniren.GetEventPosition()
[docs]defpickable_on(self,actors):"""Choose which actors can be picked. Parameters ---------- actors : actor or sequence of actors """ifisinstance(actors,Sequence):forainactors:a.PickableOn()else:actors.PickableOn()
[docs]defpickable_off(self,actors):"""Choose which actors cannot be picked. Parameters ---------- actors : actor or sequence of actors """ifisinstance(actors,Sequence):forainactors:a.PickableOff()else:actors.PickableOff()
[docs]classSelectionManager:"""Selection Manager helps with picking many objects simultaneously."""@warn_on_args_to_kwargs()def__init__(self,*,select="faces"):"""Initialize Selection Manager. Parameters ---------- select : 'faces' Options are 'faces', 'vertices' or 'actors'. Default 'faces'. Methods ------- select() pick() """self.hsel=HardwareSelector()self.update_selection_type(select)
[docs]defupdate_selection_type(self,select):"""Update selection type. Parameters ---------- select : 'faces' Options are 'faces', 'vertices' or 'actors'. Default 'faces'. """self.selected_type=select.lower()ifselect=="faces"orselect=="edges":self.hsel.SetFieldAssociation(DataObject.FIELD_ASSOCIATION_CELLS)elifselect=="points"orselect=="vertices":self.hsel.SetFieldAssociation(DataObject.FIELD_ASSOCIATION_POINTS)elifselect=="actors":self.hsel.SetActorPassOnly(True)else:raiseValueError("Unknown parameter select")
[docs]defpick(self,disp_xy,sc):"""Pick on display coordinates returns a single object. Parameters ---------- disp_xy : tuple Display coordinates x, y. sc : Scene """returnself.select(disp_xy,sc,area=0)[0]
[docs]@warn_on_args_to_kwargs()defselect(self,disp_xy,sc,*,area=0):"""Select multiple objects using display coordinates. Parameters ---------- disp_xy : tuple Display coordinates x, y. sc : Scene area : int or 2d tuple of ints Selection area around x, y coords. """info_plus={}self.hsel.SetRenderer(sc)ifisinstance(area,int):picking_area=area,areaelse:picking_area=areatry:self.hsel.SetArea(disp_xy[0]-picking_area[0],disp_xy[1]-picking_area[1],disp_xy[0]+picking_area[0],disp_xy[1]+picking_area[1],)res=self.hsel.Select()exceptOverflowError:return{0:{"node":None,"vertex":None,"face":None,"actor":None,}}num_nodes=res.GetNumberOfNodes()ifnum_nodes<1:sel_node=Nonereturn{0:{"node":None,"vertex":None,"face":None,"actor":None,}}else:foriinrange(num_nodes):sel_node=res.GetNode(i)info={"node":None,"vertex":None,"face":None,"actor":None,}ifsel_nodeisnotNone:selected_nodes=set(np.floor(numpy_support.vtk_to_numpy(sel_node.GetSelectionList(),)).astype(int))info["node"]=sel_nodeinfo["actor"]=sel_node.GetProperties().Get(sel_node.PROP(),)ifself.selected_type=="faces":info["face"]=list(selected_nodes)ifself.selected_type=="vertex":info["vertex"]=list(selected_nodes)info_plus[i]=inforeturninfo_plus
[docs]defevent_position(self,iren):"""Return event display position from interactor. Parameters ---------- iren : interactor The interactor object can be retrieved for example using ShowManager's iren attribute. """returniren.GetEventPosition()
[docs]defselectable_on(self,actors):"""Choose which actors can be selected. Parameters ---------- actors : actor or sequence of actors """ifisinstance(actors,Sequence):forainactors:a.PickableOn()else:actors.PickableOn()
[docs]defselectable_off(self,actors):"""Choose which actors cannot be selected. Parameters ---------- actors : actor or sequence of actors """ifisinstance(actors,Sequence):forainactors:a.PickableOff()else:actors.PickableOff()