Python VTKPlotLib如何移除现有网格

pbgvytdp  于 2023-05-16  发布在  Python
关注(0)|答案(2)|浏览(97)

bounty还有6天到期。回答此问题可获得+100声望奖励。trinityalps希望引起更多关注这个问题。

我遇到了下面代码的问题。当点击按钮时,代码应该抓取下一个模型并显示它,但是,旧的网格仍然存在于图像中并且不会消失。在VTKPlotLib中,如何在不破坏qtfigure和扰乱gui应用程序流程的情况下删除先前的网格?

from PyQt5 import QtWidgets
import vtkplotlib as vpl
from PyQt5.QtWidgets import QLineEdit, QMessageBox
from stl.mesh import Mesh

class Tagger(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        # Go for a vertical stack layout.
        vbox = QtWidgets.QVBoxLayout()
        self.setLayout(vbox)
        self.setWindowTitle("Tagging Engine")

        # Create the figure
        self.figure = vpl.QtFigure2()
        self.figure.add_preset_views()

        # Create a button and attach a callback.
        self.button = QtWidgets.QPushButton("Load Next Model")
        self.button.released.connect(self.button_pressed_cb)

        # Create textbox
        self.textbox = QLineEdit(self)
        self.textbox.move(20, 20)
        self.textbox.resize(280, 40)

        # Create a button and attach a callback.
        self.button2 = QtWidgets.QPushButton("Save Current Data")
        self.button2.released.connect(self.button_pressed_save)

        # QtFigures are QWidgets and are added to layouts with `addWidget`
        vbox.addWidget(self.button)
        vbox.addWidget(self.textbox)
        vbox.addWidget(self.button2)
        vbox.addWidget(self.figure)

    def button_pressed_cb(self):
        self.mesh = Mesh.from_file(r"C:/examplefile.stl")

        vpl.mesh_plot(mesh_data=self.mesh, color="#94b1ff")

        # Reposition the camera to better fit to the model
        vpl.reset_camera(self.figure)

        self.figure.update()
dgtucam1

dgtucam11#

可以使用**remove_all_meshes()**方法。

def button_pressed_cb(self):
    # Remove all existing meshes
    self.figure.remove_all_meshes() # Add this to your code.
    
    mesh = Mesh.from_file(self.modelid)
    vpl.mesh_plot(mesh_data=mesh, color="#94b1ff")
    
    # Reposition the camera to better fit the mesh.
    vpl.reset_camera(self.figure)
    
    # Without this, the figure will not redraw unless you click on it.
    self.figure.update()

从理论上讲,在绘制新网格之前使用self.figure.remove_all_meshes(),应该会在添加新网格之前从图形中删除以前的网格。

zkure5ic

zkure5ic2#

bwoodsend/vtkplotlib问题2确实提到:
有几种方法可以在调用show()之间清理图形或删除以前添加的网格:
您通常需要保留对希望更改的所有内容的引用。
因此,如果您尚未执行此操作,则可能需要将设置更改为如下所示:

fig = vpl.figure() # To create a new figure.
# Or
fig = vpl.gcf() # To get the current one.

mesh = vpl.mesh_plot(...)

一旦你有了这些参考,你就可以使用任何一个:

# To hide it

mesh.visible = False 
# To make it fully transparent (effectively hiding it).
mesh.opacity = 0

或者,如果你不太可能想重新显示该网格,那么你可以将其从图中删除(并保存一些RAM)。

fig.remove_plot(mesh) # also accepts iterables of plots.
# Or by the shorthand:
fig -= mesh

# Optionally, release the `mesh` reference so Python can have its RAM
# back. 
del mesh

图中的内容保持在fig.plots中。
所以如果你感觉很懒,你可以用途:

fig -= fig.plots

这会清除一切(如果下一个网格的大小/位置非常不同,则在添加下一个网格后,可能需要调用fig.reset_camera()。)
由于mesh_plot返回一个vtkplotlib.mesh_plot,你可以记住它,以便在下一次调用时删除它:

class Tagger(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        # ...

        self.mesh_plot = None  # Add this to keep track of the mesh plot

    def button_pressed_cb(self):
        if self.mesh_plot is not None:
            self.figure.remove_plot(self.mesh_plot)  # Remove the previous mesh if it exists

        self.mesh = Mesh.from_file(r"C:/examplefile.stl")
        self.mesh_plot = vpl.mesh_plot(mesh_data=self.mesh, color="#94b1ff")

        vpl.reset_camera(self.figure)
        self.figure.update()

fig.remove_plot(mesh)可用于从图中删除图,前提是您同时具有要删除的图和图的引用。
在您的示例中,self.figure是图形,self.mesh_plot是要删除的图。
如果愿意,也可以使用fig -= mesh作为fig.remove_plot(mesh)的简写。
此外,如果要从图中删除所有图,可以使用fig -= fig.plots。这相当于一个clear_figure函数(如果有的话)。

相关问题