#!/usr/bin/env python #------------------------------------------------------------------------------ # # The Python translation of SoQt-1.2.0/test-code/components/tripleview.cpp # #-- ORIGINAL COPYRIGHT NOTICE ------------------------------------------------- # # This file is part of the Coin 3D visualization library. # Copyright (C) 1998-2004 by Systems in Motion. All rights reserved. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # ("GPL") version 2 as published by the Free Software Foundation. # See the file LICENSE.GPL at the root directory of this source # distribution for additional information about the GNU GPL. # # For using Coin with software that can not be combined with the GNU # GPL, and for taking advantage of the additional benefits of our # support services, please contact Systems in Motion about acquiring # a Coin Professional Edition License. # # See <URL:http://www.coin3d.org/> for more information. # # Systems in Motion, Teknobyen, Abels Gate 5, 7030 Trondheim, NORWAY. # <URL:http://www.sim.no/>. # #------------------------------------------------------------------------------ # # This is just a simple test application to check that we can have # SoQtComponent derived objects within other widgets. # # It also demonstrates having multiple views on a scene from multiple # SoQtRenderArea instances. # # Note that this example doesn't work correctly with SoQt + TGS' # Inventor for some reason. Looks like a TGS' Inventor bug to me. See # also Bugzilla #20. # # mortene@sim.no # #______________________________________________________________________________ from iv import * from qt import * import math import sys start = SbTime.getTimeOfDay() # Timer callback function will rotate the scene according to the # current time. def timer_callback(scenerotate, sensor): timediff = SbTime.getTimeOfDay() - start rotx = SbRotation(SbVec3f(1, 0, 0), 0.5 * timediff.getValue()) roty = SbRotation(SbVec3f(0, 1, 0), timediff.getValue()) rotz = SbRotation(SbVec3f(0, 0, 1), 1.5 * timediff.getValue()) assert(isinstance(scenerotate, SoRotation)) scenerotate.rotation.setValue(rotx * roty * rotz) # timer_callback() # Make a Qt renderarea as a child widget of viewparent, adding the # scene under common and a camera with the given orientation. def add_view(viewparent, common, cameraorientation): root = SoSeparator() camera = SoPerspectiveCamera() camera.orientation.setValue(cameraorientation) root.addChild(camera) root.addChild(common) area = SoQtRenderArea(viewparent) area.setSceneGraph(root) camera.viewAll(root, area.getViewportRegion()) # add_view() def main(): # Initialize system. app = QApplication(sys.argv) parent = QWidget() app.setMainWidget(parent) SoQt.init(parent) parent.setMinimumSize(300, 200) # Set up the Qt widget layout data. hlayout = QHBoxLayout(parent) view0 = QGroupBox(parent) hlayout.addWidget(view0, 0.66) vlayout = QVBoxLayout() hlayout.addLayout(vlayout, 0.33) view1 = QGroupBox(parent) vlayout.addWidget(view1, 0.50) view2 = QGroupBox(parent) vlayout.addWidget(view2, 0.50) # Construct the common part of the scenegraph. commonroot = SoGroup() light = SoDirectionalLight() light.direction.setValue(-0.5, -0.5, -0.8) commonroot.addChild(light) scenerotate = SoRotation() commonroot.addChild(scenerotate) if len(sys.argv) == 2: myInput = SoInput() myInput.openFile(sys.argv[1]) fileroot = SoDB.readAll(myInput) if not fileroot: sys.exit(1) commonroot.addChild(fileroot) else: mat = SoMaterial() mat.diffuseColor.setValue(1, 1, 0) commonroot.addChild(mat) cube = SoCube() commonroot.addChild(cube) mat = SoMaterial() mat.diffuseColor.setValue(0, 0, 1) commonroot.addChild(mat) trans = SoTranslation() trans.translation.setValue(0, 0, 1) commonroot.addChild(trans) sphere = SoSphere() sphere.radius.setValue(0.5) commonroot.addChild(sphere) # Add the 3 renderareas. add_view(view0, commonroot, SbRotation(SbVec3f(0, 0, 1), 0)) add_view(view1, commonroot, SbRotation(SbVec3f(0, 1, 0), math.pi / 2)) add_view(view2, commonroot, SbRotation(SbVec3f(1, 0, 0), -math.pi / 2)) # Set up a timer callback to do a simple animation. ts = SoTimerSensor(timer_callback, scenerotate) ts.setInterval(SbTime(0.02)) # max 50 fps ts.schedule() # Map window and start event loop. SoQt.show(parent) SoQt.mainLoop() # main() if __name__ == '__main__': main() # Local Variables: *** # mode: python *** # End: ***