簡體   English   中英

Mayavi多場景選擇器

[英]Mayavi multiple scene selector

我需要加載多個場景以進行切換。 圖片上的內容: 圖像方案

對於按鈕“ 1”,類似mlab.points3d(x1, y1, z1, s1, color=blue)

對於按鈕“ 2”,類似mlab.points3d(x2, y2, z2, s2, color=red)

對於按鈕“ 3”,例如mlab.points3d(x3, y3, z3, s3, color=green)

如何在另一個場景中管理繪圖? (我認為應該在選項之間切換場景之前完成mlab.points3d )。 以及如何定義用於方案切換的按鈕?

這是一個如何使用幾個按鈕在pyqt中嵌入mayavi圖的示例。 它基於mayavi網站上的Qt嵌入示例 如果您想編寫一個相對較大的應用程序,我建議您將if main ==“ main ”行下面現在位於底部的代碼移到幾個單獨的類中。

from pyface.qt import QtGui, QtCore
from traits.api import HasTraits, Instance, on_trait_change
from traitsui.api import View, Item
from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \
        SceneEditor


################################################################################
#The actual visualization
class Visualization(HasTraits):
    scene = Instance(MlabSceneModel, ())


    @on_trait_change('scene.activated')
    def update_plot(self):
        # This function is called when the view is opened. We don't
        # populate the scene when the view is not yet open, as some
        # VTK features require a GLContext.

        # We can do normal mlab calls on the embedded scene.
        self.scene.mlab.clf()
        self.scene.mlab.test_points3d()

    def second_plot(self):
        self.scene.mlab.clf()

        from numpy import sin, cos, mgrid, pi, sqrt
        u, v = mgrid[- 0.035:pi:0.01, - 0.035:pi:0.01]

        X = 2 / 3. * (cos(u) * cos(2 * v)
                + sqrt(2) * sin(u) * cos(v)) * cos(u) / (sqrt(2) -
                                                         sin(2 * u) * sin(3 * v))
        Y = 2 / 3. * (cos(u) * sin(2 * v) -
                sqrt(2) * sin(u) * sin(v)) * cos(u) / (sqrt(2)
                - sin(2 * u) * sin(3 * v))
        Z = -sqrt(2) * cos(u) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v))
        S = sin(u)

        self.scene.mlab.mesh(X, Y, Z, scalars=S, colormap='YlGnBu', )

    def third_plot(self):
        self.scene.mlab.clf()
        self.scene.mlab.test_plot3d()

    # the layout of the dialog screated
    view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
                     height=250, width=300, show_label=False),
                resizable=True # We need this to resize with the parent widget
                )


################################################################################
# The QWidget containing the visualization, this is pure PyQt4 code.
class MayaviQWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        layout = QtGui.QVBoxLayout(self)
        layout.setContentsMargins(0,0,0,0)
        layout.setSpacing(0)
        self.visualization = Visualization()

        # The edit_traits call will generate the widget to embed.
        self.ui = self.visualization.edit_traits(parent=self,
                                                 kind='subpanel').control
        layout.addWidget(self.ui)
        self.ui.setParent(self)


if __name__ == "__main__":
    # Don't create a new QApplication, it would unhook the Events
    # set by Traits on the existing QApplication. Simply use the
    # '.instance()' method to retrieve the existing one.
    app = QtGui.QApplication.instance()
    container = QtGui.QWidget()

    mayavi_widget = MayaviQWidget(container)

    container.setWindowTitle("Embedding Mayavi in a PyQt4 Application")
    # define a "complex" layout to test the behaviour
    layout = QtGui.QHBoxLayout(container)

    button_container = QtGui.QWidget()
    button_layout =  QtGui.QVBoxLayout(button_container)

    button1 = QtGui.QPushButton('1')
    button1.clicked.connect(mayavi_widget.visualization.update_plot)
    button_layout.addWidget(button1)

    button2 = QtGui.QPushButton('2')
    button2.clicked.connect(mayavi_widget.visualization.second_plot)
    button_layout.addWidget(button2)

    button3 = QtGui.QPushButton('3')
    button3.clicked.connect(mayavi_widget.visualization.third_plot)
    button_layout.addWidget(button3)

    layout.addWidget(button_container)
    button_container.show()

    layout.addWidget(mayavi_widget)
    container.show()
    window = QtGui.QMainWindow()
    window.setCentralWidget(container)
    window.show()

    # Start the main event loop.
    app.exec_()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM