123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- # Same as warp4b.py but using the applications.MorphPlotter class
- from vedo import Mesh, settings, dataurl
- from vedo.applications import MorphPlotter
- ####################################################################################
- # THIS IS IMPLEMENTED IN vedo.applications.MorphPlotter, shown here for reference
- ####################################################################################
- # from vedo import Plotter, Points, Text2D, Axes
- # class MorphPlotter(Plotter):
- #
- # def __init__(self, source, target, **kwargs):
- # kwargs.update(dict(N=3, sharecam=0))
- # super().__init__(**kwargs)
- #
- # self.source = source.pickable(True)
- # self.target = target.pickable(False)
- # self.clicked = []
- # self.sources = []
- # self.targets = []
- # self.msg0 = Text2D("Pick a point on the surface",
- # pos="bottom-center", c='white', bg="blue4", alpha=1)
- # self.msg1 = Text2D(pos="bottom-center", c='white', bg="blue4", alpha=1)
- # instructions = (
- # "Morphological alignment of 3D surfaces.\n"
- # "Pick a point on the source surface, then\n"
- # "pick the corresponding point on the target surface\n"
- # "Pick at least 4 point pairs. Press:\n"
- # "- c to clear the selection.\n"
- # "- d to delete the last selection.\n"
- # "- q to quit."
- # )
- # self.instructions = Text2D(instructions, s=0.7, bg="blue4", alpha=0.1)
- # self.at(0).add(source, self.msg0, self.instructions).reset_camera()
- # self.at(1).add(f"Reference {target.filename}", self.msg1, target)
- # cam1 = self.camera # save camera at 1
- # self.at(2).add("Morphing Output", target).background("k9")
- # self.camera = cam1 # use the same camera of renderer1
- #
- # self.callid1 = self.add_callback("on key press", self.on_keypress)
- # self.callid2 = self.add_callback("on click", self.on_click)
- # self._interactive = True
- #
- # def update(self):
- # source_pts = Points(self.sources).color("purple5").ps(12)
- # target_pts = Points(self.targets).color("purple5").ps(12)
- # source_pts.name = "source_pts"
- # target_pts.name = "target_pts"
- # slabels = self.source_pts.labels2d("id", c="purple3")
- # tlabels = self.target_pts.labels2d("id", c="purple3")
- # slabels.name = "source_pts"
- # tlabels.name = "target_pts"
- # self.at(0).remove("source_pts").add(source_pts, slabels)
- # self.at(1).remove("target_pts").add(target_pts, tlabels)
- # self.render()
- #
- # if len(self.sources) == len(self.targets) and len(self.sources) > 3:
- # warped = self.source.clone().warp(self.sources, self.targets)
- # warped.name = "warped"
- # self.at(2).remove("warped").add(warped)
- # self.render()
- #
- # def on_click(self, evt):
- # if evt.object == source:
- # self.sources.append(evt.picked3d)
- # self.source.pickable(False)
- # self.target.pickable(True)
- # self.msg0.text("--->")
- # self.msg1.text("now pick a target point")
- # elif evt.object == self.target:
- # self.targets.append(evt.picked3d)
- # self.source.pickable(True)
- # self.target.pickable(False)
- # self.msg0.text("now pick a source point")
- # self.msg1.text("<---")
- # self.update()
- #
- # def on_keypress(self, evt):
- # if evt.keypress == "c":
- # self.sources.clear()
- # self.targets.clear()
- # self.at(0).remove("source_pts")
- # self.at(1).remove("target_pts")
- # self.at(2).remove("warped")
- # self.msg0.text("CLEARED! Pick a point here")
- # self.msg1.text("")
- # self.source.pickable(True)
- # self.target.pickable(False)
- # self.update()
- # elif evt.keypress == "d":
- # n = min(len(self.sources), len(self.targets))
- # self.sources = self.sources[:n-1]
- # self.targets = self.targets[:n-1]
- # self.msg0.text("Last point deleted! Pick a point here")
- # self.msg1.text("")
- # self.source.pickable(True)
- # self.target.pickable(False)
- # self.update()
- ################################################################################
- settings.default_font = "Calco"
- source = Mesh(dataurl+"limb_surface.vtk").color("k5")
- source.rotate_y(90).rotate_z(-60).rotate_x(40)
- target = Mesh(dataurl+"290.vtk").color("yellow5")
- target.rotate_y(-40)
- plt = MorphPlotter(source, target, size=(2400, 850), axes=14)
- plt.cmap_name = "RdYlBu_r"
- plt.show()
- plt.close()
|