def setupUi(self): self.objectTree = QtGui.QTreeWidget() self.propertiesPanel = PythonQt.dd.ddPropertiesPanel() sidePanel = QtGui.QSplitter(QtCore.Qt.Vertical) sidePanel.addWidget(self.objectTree) sidePanel.addWidget(self.propertiesPanel) sidePanel.setSizes([6, 4]) om.init(self.objectTree, self.propertiesPanel) self.view = PythonQt.dd.ddQVTKWidgetView() lcmgl.init(self.view) self.view.backgroundRenderer().SetBackground(1,1,1) self.view.backgroundRenderer().SetBackground2(1,1,1) def setTextProperty(caption): prop = caption.GetCaptionTextProperty() prop.ShadowOff() prop.BoldOn() prop.ItalicOff() prop.SetColor(0,0,0) axesActor = self.view.orientationMarkerWidget().GetOrientationMarker() setTextProperty(axesActor.GetXAxisCaptionActor2D()) setTextProperty(axesActor.GetYAxisCaptionActor2D()) setTextProperty(axesActor.GetZAxisCaptionActor2D()) w = QtGui.QWidget() l = QtGui.QHBoxLayout(w) self.slider = QtGui.QSlider(QtCore.Qt.Horizontal) self.clearButton = QtGui.QPushButton('clear') self.zeroButton = QtGui.QPushButton('zero') l.addWidget(self.clearButton) l.addWidget(self.zeroButton) l.addWidget(self.slider) self.slider.connect(self.slider, 'valueChanged(int)', self.onSlider) self.slider.connect(self.zeroButton, 'clicked()', self.onZeroButtonClicked) self.slider.connect(self.clearButton, 'clicked()', self.onClearButtonClicked) ww = QtGui.QWidget() ll = QtGui.QVBoxLayout(ww) ll.addWidget(self.view) #ll.addWidget(w) ll.setMargin(0) splitter = QtGui.QSplitter() splitter.addWidget(sidePanel) splitter.addWidget(ww) splitter.setSizes([0, 1]) splitter.show() splitter.resize(800, 600) self.widget = splitter self.widget.setWindowTitle('Drake Viewer')
def __init__(self): om.init() self.view = PythonQt.dd.ddQVTKWidgetView() # init grid self.gridObj = vis.showGrid(self.view, parent='scene') self.gridObj.setProperty('Surface Mode', 'Surface with edges') self.gridObj.setProperty('Color', [0,0,0]) self.gridObj.setProperty('Alpha', 0.1) # init view options self.viewOptions = vis.ViewOptionsItem(self.view) om.addToObjectModel(self.viewOptions, parentObj=om.findObjectByName('scene')) self.viewOptions.setProperty('Background color', [0.3, 0.3, 0.35]) self.viewOptions.setProperty('Background color 2', [0.95,0.95,1]) # setup camera applogic.setCameraTerrainModeEnabled(self.view, True) applogic.resetCamera(viewDirection=[-1, 0, -0.3], view=self.view) # add view behaviors viewBehaviors = viewbehaviors.ViewBehaviors(self.view) applogic._defaultRenderView = self.view self.mainWindow = QtGui.QMainWindow() self.mainWindow.setCentralWidget(self.view) self.mainWindow.resize(768 * (16/9.0), 768) self.mainWindow.setWindowTitle('Drake Visualizer') self.mainWindow.setWindowIcon(QtGui.QIcon(':/images/drake_logo.png')) self.mainWindow.show() self.drakeVisualizer = DrakeVisualizer(self.view) self.lcmglManager = lcmgl.LCMGLManager(self.view) if lcmgl.LCMGL_AVAILABLE else None self.screenGrabberPanel = ScreenGrabberPanel(self.view) self.screenGrabberDock = self.addWidgetToDock(self.screenGrabberPanel.widget, QtCore.Qt.RightDockWidgetArea) self.screenGrabberDock.setVisible(False) self.cameraBookmarksPanel = camerabookmarks.CameraBookmarkWidget(self.view) self.cameraBookmarksDock = self.addWidgetToDock(self.cameraBookmarksPanel.widget, QtCore.Qt.RightDockWidgetArea) self.cameraBookmarksDock.setVisible(False) model = om.getDefaultObjectModel() model.getTreeWidget().setWindowTitle('Scene Browser') model.getPropertiesPanel().setWindowTitle('Properties Panel') model.setActiveObject(self.viewOptions) self.sceneBrowserDock = self.addWidgetToDock(model.getTreeWidget(), QtCore.Qt.LeftDockWidgetArea) self.propertiesDock = self.addWidgetToDock(self.wrapScrollArea(model.getPropertiesPanel()), QtCore.Qt.LeftDockWidgetArea) self.sceneBrowserDock.setVisible(False) self.propertiesDock.setVisible(False) applogic.addShortcut(self.mainWindow, 'Ctrl+Q', self.applicationInstance().quit) applogic.addShortcut(self.mainWindow, 'F1', self._toggleObjectModel) applogic.addShortcut(self.mainWindow, 'F2', self._toggleScreenGrabber) applogic.addShortcut(self.mainWindow, 'F3', self._toggleCameraBookmarks) applogic.addShortcut(self.mainWindow, 'F8', applogic.showPythonConsole)
def main(): objectTree = QtGui.QTreeWidget() propertiesPanel = PythonQt.dd.ddPropertiesPanel() om.init(objectTree, propertiesPanel) p = om.ObjectModelItem("test parent item") p.addProperty("foo", 1) p.addProperty("Visible", True) om.addToObjectModel(p) c = om.ObjectModelItem("test child item") om.addToObjectModel(c, p) assert om.findObjectByName("test parent item") == p assert om.findObjectByName("test child item") == c assert p.children()[0] == c assert c.children() == [] objectTree.show() propertiesPanel.show() objectTree2 = QtGui.QTreeWidget() propertiesPanel2 = PythonQt.dd.ddPropertiesPanel() tree = om.ObjectModelTree() tree.init(objectTree2, propertiesPanel2) p2 = om.ObjectModelItem("test parent item 2") p2.addProperty("foo2", 1) p2.addProperty("Visible", True) tree.addToObjectModel(p2) c2 = om.ObjectModelItem("test child item 2") tree.addToObjectModel(c2, p2) assert tree.findObjectByName("test parent item 2") == p2 assert tree.findObjectByName("test child item 2") == c2 assert p2.children()[0] == c2 assert c2.children() == [] objectTree2.show() propertiesPanel2.show() startApplication(enableQuitTimer=True)
def main(): objectTree = QtGui.QTreeWidget() propertiesPanel = PythonQt.dd.ddPropertiesPanel() om.init(objectTree, propertiesPanel) p = om.ObjectModelItem('test parent item') p.addProperty('foo', 1) p.addProperty('Visible', True) om.addToObjectModel(p) c = om.ObjectModelItem('test child item') om.addToObjectModel(c, p) assert om.findObjectByName('test parent item') == p assert om.findObjectByName('test child item') == c assert p.children()[0] == c assert c.children() == [] objectTree.show() propertiesPanel.show() objectTree2 = QtGui.QTreeWidget() propertiesPanel2 = PythonQt.dd.ddPropertiesPanel() tree = om.ObjectModelTree() tree.init(objectTree2, propertiesPanel2) p2 = om.ObjectModelItem('test parent item 2') p2.addProperty('foo2', 1) p2.addProperty('Visible', True) tree.addToObjectModel(p2) c2 = om.ObjectModelItem('test child item 2') tree.addToObjectModel(c2, p2) assert tree.findObjectByName('test parent item 2') == p2 assert tree.findObjectByName('test child item 2') == c2 assert p2.children()[0] == c2 assert c2.children() == [] objectTree2.show() propertiesPanel2.show() startApplication(enableQuitTimer=True)
def __init__(self): self.applicationInstance().setOrganizationName('RobotLocomotionGroup') self.applicationInstance().setApplicationName('drake-visualizer') om.init() self.view = PythonQt.dd.ddQVTKWidgetView() # init grid self.gridObj = vis.showGrid(self.view, parent='scene') self.gridObj.setProperty('Surface Mode', 'Surface with edges') self.gridObj.setProperty('Color', [0, 0, 0]) self.gridObj.setProperty('Alpha', 0.1) # init view options self.viewOptions = vis.ViewOptionsItem(self.view) om.addToObjectModel(self.viewOptions, parentObj=om.findObjectByName('scene')) self.viewOptions.setProperty('Background color', [0.3, 0.3, 0.35]) self.viewOptions.setProperty('Background color 2', [0.95, 0.95, 1]) # setup camera applogic.setCameraTerrainModeEnabled(self.view, True) applogic.resetCamera(viewDirection=[-1, 0, -0.3], view=self.view) # This setting improves the near plane clipping resolution. # Drake often draws a very large ground plane which is detrimental to # the near clipping for up close objects. The trade-off is Z buffer # resolution but in practice things look good with this setting. self.view.renderer().SetNearClippingPlaneTolerance(0.0005) # add view behaviors self.viewBehaviors = viewbehaviors.ViewBehaviors(self.view) applogic._defaultRenderView = self.view self.mainWindow = QtGui.QMainWindow() self.mainWindow.setCentralWidget(self.view) self.mainWindow.resize(768 * (16 / 9.0), 768) self.mainWindow.setWindowTitle('Drake Visualizer') self.mainWindow.setWindowIcon(QtGui.QIcon(':/images/drake_logo.png')) self.settings = QtCore.QSettings() self.fileMenu = self.mainWindow.menuBar().addMenu('&File') self.viewMenu = self.mainWindow.menuBar().addMenu('&View') self.viewMenuManager = PythonQt.dd.ddViewMenu(self.viewMenu) self.drakeVisualizer = DrakeVisualizer(self.view) self.lcmglManager = lcmgl.LCMGLManager( self.view) if lcmgl.LCMGL_AVAILABLE else None model = om.getDefaultObjectModel() model.getTreeWidget().setWindowTitle('Scene Browser') model.getPropertiesPanel().setWindowTitle('Properties Panel') self.sceneBrowserDock = self.addWidgetToDock( model.getTreeWidget(), QtCore.Qt.LeftDockWidgetArea, visible=False) self.propertiesDock = self.addWidgetToDock( self.wrapScrollArea(model.getPropertiesPanel()), QtCore.Qt.LeftDockWidgetArea, visible=False) self.addViewMenuSeparator() self.screenGrabberPanel = ScreenGrabberPanel(self.view) self.screenGrabberDock = self.addWidgetToDock( self.screenGrabberPanel.widget, QtCore.Qt.RightDockWidgetArea, visible=False) self.cameraBookmarksPanel = camerabookmarks.CameraBookmarkWidget( self.view) self.cameraBookmarksDock = self.addWidgetToDock( self.cameraBookmarksPanel.widget, QtCore.Qt.RightDockWidgetArea, visible=False) self.cameraControlPanel = cameracontrolpanel.CameraControlPanel( self.view) self.cameraControlDock = self.addWidgetToDock( self.cameraControlPanel.widget, QtCore.Qt.RightDockWidgetArea, visible=False) act = self.fileMenu.addAction('&Quit') act.setShortcut(QtGui.QKeySequence('Ctrl+Q')) act.connect('triggered()', self.applicationInstance().quit) self.fileMenu.addSeparator() act = self.fileMenu.addAction('&Open Data...') act.setShortcut(QtGui.QKeySequence('Ctrl+O')) act.connect('triggered()', self._onOpenDataFile) applogic.addShortcut(self.mainWindow, 'F1', self._toggleObjectModel) applogic.addShortcut(self.mainWindow, 'F8', applogic.showPythonConsole) self.applicationInstance().connect('aboutToQuit()', self._onAboutToQuit) for obj in om.getObjects(): obj.setProperty('Deletable', False) self.mainWindow.show() self._saveWindowState('MainWindowDefault') self._restoreWindowState('MainWindowCustom')
def initObjectModel(self, fields): om.init() objectModel = om.getDefaultObjectModel() objectModel.getTreeWidget().setWindowTitle('Scene Browser') objectModel.getPropertiesPanel().setWindowTitle('Properties Panel') return FieldContainer(objectModel=objectModel)
def main(): om.init(QtGui.QTreeWidget(), PythonQt.dd.ddPropertiesPanel()) # create a frame t1 = vtk.vtkTransform() f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) # test object model lookup assert om.findObjectByName('frame 1') assert om.findObjectByName('frame 2') is None # test reference cleanup f1Ref = weakref.ref(f1) assert f1Ref() is f1 om.removeFromObjectModel(f1) del f1 assert f1Ref() is None # add frame again f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) # create second frame t2 = vtk.vtkTransform() f2 = vis.FrameItem('frame 2', t2, view=None) om.addToObjectModel(f2) # test transform reference is input transform assert f2.transform is t2 # test frame sync frameSync = vis.FrameSync() frameSync.addFrame(f1) frameSync.addFrame(f2) t1.Translate(10, 0, 0) t1.Modified() assert t2.GetPosition() == (10.0, 0.0, 0.0) # test frame sync cleanup f1Ref = weakref.ref(f1) assert f1Ref() is f1 assert len(frameSync.frames) == 2 om.removeFromObjectModel(f1) del f1 assert f1Ref() is None assert len(frameSync.frames) == 2 t2.Translate(10, 0, 0) t2.Modified() assert t2.GetPosition() == (20.0, 0.0, 0.0) assert len(frameSync.frames) == 1 # add frame again f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) frameSync.addFrame(f1) t1.Translate(0, 5, 0) t1.Modified() assert t1.GetPosition() == (10.0, 5.0, 0.0) assert t2.GetPosition() == (20.0, 5.0, 0.0) frameSync.removeFrame(f1) t1.Translate(0, 5, 0) t1.Modified() assert t1.GetPosition() == (10.0, 10.0, 0.0) assert t2.GetPosition() == (20.0, 5.0, 0.0) # this has to be wrapped in a function, otherwise the exception # handling holds a reference to the FrameSync object which breaks # the delete test at the end def testException(fs): try: fs.removeFrame('test') except KeyError: pass else: assert False testException(frameSync) # test cleanup f1Ref = weakref.ref(f1) om.removeFromObjectModel(f1) del f1 assert f1Ref() is None t1Ref = weakref.ref(t1) del t1 assert t1Ref() is None # add frame again t1 = vtk.vtkTransform() f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) frameSync.addFrame(f1) t1.Translate(0, 0, 10) t1.Modified() assert t2.GetPosition() == (20.0, 5.0, 10.0) # verify FrameSync object can be deleted frameSyncRef = weakref.ref(frameSync) del frameSync assert frameSyncRef() is None # verify frames are no longer synced after FrameSync is deleted t1.Translate(0, 0, 10) t1.Modified() assert t2.GetPosition() == (20.0, 5.0, 10.0) sys.exit(0)
def __init__(self): om.init() self.objectModelWidget = None
def __init__(self): self.applicationInstance().setOrganizationName("RobotLocomotionGroup") self.applicationInstance().setApplicationName("drake-visualizer") om.init() self.view = PythonQt.dd.ddQVTKWidgetView() # init grid self.gridObj = vis.showGrid(self.view, parent="scene") self.gridObj.setProperty("Surface Mode", "Surface with edges") self.gridObj.setProperty("Color", [0, 0, 0]) self.gridObj.setProperty("Alpha", 0.1) # init view options self.viewOptions = vis.ViewOptionsItem(self.view) om.addToObjectModel(self.viewOptions, parentObj=om.findObjectByName("scene")) self.viewOptions.setProperty("Background color", [0.3, 0.3, 0.35]) self.viewOptions.setProperty("Background color 2", [0.95, 0.95, 1]) # setup camera applogic.setCameraTerrainModeEnabled(self.view, True) applogic.resetCamera(viewDirection=[-1, 0, -0.3], view=self.view) # This setting improves the near plane clipping resolution. # Drake often draws a very large ground plane which is detrimental to # the near clipping for up close objects. The trade-off is Z buffer # resolution but in practice things look good with this setting. self.view.renderer().SetNearClippingPlaneTolerance(0.0005) # add view behaviors self.viewBehaviors = viewbehaviors.ViewBehaviors(self.view) applogic._defaultRenderView = self.view self.mainWindow = QtGui.QMainWindow() self.mainWindow.setCentralWidget(self.view) self.mainWindow.resize(768 * (16 / 9.0), 768) self.mainWindow.setWindowTitle("Drake Visualizer") self.mainWindow.setWindowIcon(QtGui.QIcon(":/images/drake_logo.png")) self.settings = QtCore.QSettings() self.fileMenu = self.mainWindow.menuBar().addMenu("&File") self.viewMenu = self.mainWindow.menuBar().addMenu("&View") self.viewMenuManager = PythonQt.dd.ddViewMenu(self.viewMenu) self.drakeVisualizer = DrakeVisualizer(self.view) self.lcmglManager = lcmgl.LCMGLManager(self.view) if lcmgl.LCMGL_AVAILABLE else None model = om.getDefaultObjectModel() model.getTreeWidget().setWindowTitle("Scene Browser") model.getPropertiesPanel().setWindowTitle("Properties Panel") self.sceneBrowserDock = self.addWidgetToDock(model.getTreeWidget(), QtCore.Qt.LeftDockWidgetArea, visible=False) self.propertiesDock = self.addWidgetToDock( self.wrapScrollArea(model.getPropertiesPanel()), QtCore.Qt.LeftDockWidgetArea, visible=False ) self.addViewMenuSeparator() self.screenGrabberPanel = ScreenGrabberPanel(self.view) self.screenGrabberDock = self.addWidgetToDock( self.screenGrabberPanel.widget, QtCore.Qt.RightDockWidgetArea, visible=False ) self.cameraBookmarksPanel = camerabookmarks.CameraBookmarkWidget(self.view) self.cameraBookmarksDock = self.addWidgetToDock( self.cameraBookmarksPanel.widget, QtCore.Qt.RightDockWidgetArea, visible=False ) self.cameraControlPanel = cameracontrolpanel.CameraControlPanel(self.view) self.cameraControlDock = self.addWidgetToDock( self.cameraControlPanel.widget, QtCore.Qt.RightDockWidgetArea, visible=False ) act = self.fileMenu.addAction("&Quit") act.setShortcut(QtGui.QKeySequence("Ctrl+Q")) act.connect("triggered()", self.applicationInstance().quit) self.fileMenu.addSeparator() act = self.fileMenu.addAction("&Open Data...") act.setShortcut(QtGui.QKeySequence("Ctrl+O")) act.connect("triggered()", self._onOpenDataFile) applogic.addShortcut(self.mainWindow, "F1", self._toggleObjectModel) applogic.addShortcut(self.mainWindow, "F8", applogic.showPythonConsole) self.applicationInstance().connect("aboutToQuit()", self._onAboutToQuit) for obj in om.getObjects(): obj.setProperty("Deletable", False) self.mainWindow.show() self._saveWindowState("MainWindowDefault") self._restoreWindowState("MainWindowCustom")
import bot_core as lcmbotcore import maps as lcmmaps import atlas from collections import OrderedDict import functools import math import numpy as np from director.debugVis import DebugData from director import ioUtils as io drcargs.requireStrict() drcargs.args() app.startup(globals()) om.init(app.getMainWindow().objectTree(), app.getMainWindow().propertiesPanel()) actionhandlers.init() quit = app.quit exit = quit view = app.getDRCView() camera = view.camera() tree = app.getMainWindow().objectTree() orbit = cameracontrol.OrbitController(view) showPolyData = segmentation.showPolyData updatePolyData = segmentation.updatePolyData ###############################################################################
import bot_core as lcmbotcore import maps as lcmmaps import atlas from collections import OrderedDict import functools import math import numpy as np from director.debugVis import DebugData from director import ioUtils as io drcargs.requireStrict() drcargs.args() app.startup(globals()) om.init(app.getMainWindow().objectTree(), app.getMainWindow().propertiesPanel()) actionhandlers.init() quit = app.quit exit = quit view = app.getDRCView() camera = view.camera() tree = app.getMainWindow().objectTree() orbit = cameracontrol.OrbitController(view) showPolyData = segmentation.showPolyData updatePolyData = segmentation.updatePolyData ############################################################################### robotSystem = robotsystem.create(view) globals().update(dict(robotSystem))
def setupUi(self): self.objectTree = QtGui.QTreeWidget() self.propertiesPanel = PythonQt.dd.ddPropertiesPanel() sidePanel = QtGui.QSplitter(QtCore.Qt.Vertical) sidePanel.addWidget(self.objectTree) sidePanel.addWidget(self.propertiesPanel) sidePanel.setSizes([6, 4]) om.init(self.objectTree, self.propertiesPanel) self.view = PythonQt.dd.ddQVTKWidgetView() lcmgl.init(self.view) self.view.backgroundRenderer().SetBackground(1, 1, 1) self.view.backgroundRenderer().SetBackground2(1, 1, 1) def setTextProperty(caption): prop = caption.GetCaptionTextProperty() prop.ShadowOff() prop.BoldOn() prop.ItalicOff() prop.SetColor(0, 0, 0) axesActor = self.view.orientationMarkerWidget().GetOrientationMarker() setTextProperty(axesActor.GetXAxisCaptionActor2D()) setTextProperty(axesActor.GetYAxisCaptionActor2D()) setTextProperty(axesActor.GetZAxisCaptionActor2D()) w = QtGui.QWidget() l = QtGui.QHBoxLayout(w) self.slider = QtGui.QSlider(QtCore.Qt.Horizontal) self.clearButton = QtGui.QPushButton('clear') self.zeroButton = QtGui.QPushButton('zero') l.addWidget(self.clearButton) l.addWidget(self.zeroButton) l.addWidget(self.slider) self.slider.connect(self.slider, 'valueChanged(int)', self.onSlider) self.slider.connect(self.zeroButton, 'clicked()', self.onZeroButtonClicked) self.slider.connect(self.clearButton, 'clicked()', self.onClearButtonClicked) ww = QtGui.QWidget() ll = QtGui.QVBoxLayout(ww) ll.addWidget(self.view) #ll.addWidget(w) ll.setMargin(0) splitter = QtGui.QSplitter() splitter.addWidget(sidePanel) splitter.addWidget(ww) splitter.setSizes([0, 1]) splitter.show() splitter.resize(800, 600) self.widget = splitter self.widget.setWindowTitle('Drake Viewer')
def main(): om.init(QtGui.QTreeWidget(), PythonQt.dd.ddPropertiesPanel()) # create a frame t1 = vtk.vtkTransform() f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) # test object model lookup assert om.findObjectByName('frame 1') assert om.findObjectByName('frame 2') is None # test reference cleanup f1Ref = weakref.ref(f1) assert f1Ref() is f1 om.removeFromObjectModel(f1) del f1 assert f1Ref() is None # add frame again f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) # create second frame t2 = vtk.vtkTransform() f2 = vis.FrameItem('frame 2', t2, view=None) om.addToObjectModel(f2) # test transform reference is input transform assert f2.transform is t2 # test frame sync frameSync = vis.FrameSync() frameSync.addFrame(f1) frameSync.addFrame(f2) t1.Translate(10,0,0) t1.Modified() assert t2.GetPosition() == (10.0, 0.0, 0.0) # test frame sync cleanup f1Ref = weakref.ref(f1) assert f1Ref() is f1 assert len(frameSync.frames) == 2 om.removeFromObjectModel(f1) del f1 assert f1Ref() is None assert len(frameSync.frames) == 2 t2.Translate(10,0,0) t2.Modified() assert t2.GetPosition() == (20.0, 0.0, 0.0) assert len(frameSync.frames) == 1 # add frame again f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) frameSync.addFrame(f1) t1.Translate(0,5,0) t1.Modified() assert t1.GetPosition() == (10.0, 5.0, 0.0) assert t2.GetPosition() == (20.0, 5.0, 0.0) frameSync.removeFrame(f1) t1.Translate(0,5,0) t1.Modified() assert t1.GetPosition() == (10.0, 10.0, 0.0) assert t2.GetPosition() == (20.0, 5.0, 0.0) # this has to be wrapped in a function, otherwise the exception # handling holds a reference to the FrameSync object which breaks # the delete test at the end def testException(fs): try: fs.removeFrame('test') except KeyError: pass else: assert False testException(frameSync) # test cleanup f1Ref = weakref.ref(f1) om.removeFromObjectModel(f1) del f1 assert f1Ref() is None t1Ref = weakref.ref(t1) del t1 assert t1Ref() is None # add frame again t1 = vtk.vtkTransform() f1 = vis.FrameItem('frame 1', t1, view=None) om.addToObjectModel(f1) frameSync.addFrame(f1) t1.Translate(0,0,10) t1.Modified() assert t2.GetPosition() == (20.0, 5.0, 10.0) # verify FrameSync object can be deleted frameSyncRef = weakref.ref(frameSync) del frameSync assert frameSyncRef() is None # verify frames are no longer synced after FrameSync is deleted t1.Translate(0,0,10) t1.Modified() assert t2.GetPosition() == (20.0, 5.0, 10.0) sys.exit(0)