Пример #1
0
    def __init__(self,_tabViewWidget):
        self.screenshotDataDict={}
        from weakref import ref
        self.tabViewWidget=ref(_tabViewWidget)
        tvw=self.tabViewWidget()
        # print
#        print MODULENAME,'  ScreenshotManager: __init__(),   self.tabViewWidget=',self.tabViewWidget
#        print MODULENAME,'  ScreenshotManager: __init__(),   type(self.tabViewWidget)=',type(self.tabViewWidget)
#        print MODULENAME,'  ScreenshotManager: __init__(),   dir(self.tabViewWidget)=',dir(self.tabViewWidget)
        # self.sim=self.tabViewWidget.sim
        
        self.basicSimulationData=tvw.basicSimulationData
        self.basicSimulationData=tvw.basicSimulationData
        self.screenshotNumberOfDigits=len(str(self.basicSimulationData.numberOfSteps))
        
        # self.screenshotNumberOfDigits=len(str(self.sim.getNumSteps()))
        self.maxNumberOfScreenshots=20 # we limit max number of screenshots to discourage users from using screenshots as their main analysis tool
                                       #a better solution is to store latice to a pif file and then do postprocessing 
        self.screenshotCounter3D=0
        
        # self.screenshotGraphicsWidget = GraphicsFrameWidget(self.tabViewWidget)
        print 'CREATING SCREENSHOT WINDOW'
        self.screenshotGraphicsWidget = GraphicsFrameWidget(tvw)
        self.screenshotGraphicsWidget.screenshotWindowFlag=True
        
        xSize=Configuration.getSetting("Screenshot_X")
        ySize=Configuration.getSetting("Screenshot_Y")
        
        print 'xSize=',xSize,' ySize=',ySize
        
        self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(xSize,ySize) # default size
        self.screenshotGraphicsWidget.qvtkWidget.resize(xSize,ySize)
        
        winsize = self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().GetSize()
        print 'ADDITIONAL SCREENSHOT WINDOW SIZE=',winsize
        
#        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget=',self.screenshotGraphicsWidget
#        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget.winId().__int__()=',self.screenshotGraphicsWidget.winId().__int__()
#        print
#        import pdb; pdb.set_trace()
#        bad = 1/0
#        SimpleTabView.   # rwh: add this to the graphics windows dict

#        self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
#        self.tabViewWidget.updateActiveWindowVisFlags()
        
        self.screenshotGraphicsWidget.readSettings()
        # # # self.tabViewWidget.addSubWindow(self.screenshotGraphicsWidget)
        self.screenshotSubWindow=tvw.addSubWindow(self.screenshotGraphicsWidget)
        
        #necessary to avoid spurious maximization of screenshot window. possible bug either in Player or in QMDIArea
        self.screenshotSubWindow.showMinimized()
        self.screenshotSubWindow.hide()
        
        
        self.screenshotGraphicsWidgetFieldTypesInitialized=False
Пример #2
0
    def __init__(self, _tabViewWidget):

        self.screenshotDataDict = {}
        from weakref import ref
        self.tabViewWidget = ref(_tabViewWidget)
        tvw = self.tabViewWidget()
        # print
        #        print MODULENAME,'  ScreenshotManager: __init__(),   self.tabViewWidget=',self.tabViewWidget
        #        print MODULENAME,'  ScreenshotManager: __init__(),   type(self.tabViewWidget)=',type(self.tabViewWidget)
        #        print MODULENAME,'  ScreenshotManager: __init__(),   dir(self.tabViewWidget)=',dir(self.tabViewWidget)
        # self.sim=self.tabViewWidget.sim

        self.basicSimulationData = tvw.basicSimulationData
        self.basicSimulationData = tvw.basicSimulationData
        self.screenshotNumberOfDigits = len(
            str(self.basicSimulationData.numberOfSteps))

        # self.screenshotNumberOfDigits=len(str(self.sim.getNumSteps()))
        self.maxNumberOfScreenshots = 20  # we limit max number of screenshots to discourage users from using screenshots as their main analysis tool
        #a better solution is to store latice to a pif file and then do postprocessing
        self.screenshotCounter3D = 0

        # self.screenshotGraphicsWidget = GraphicsFrameWidget(self.tabViewWidget)
        print 'CREATING SCREENSHOT WINDOW'

        self.screenshotGraphicsWidget = None
        # MDIFIX - temporary
        # return

        # MDIFIX
        self.screenshotGraphicsWidget = GraphicsFrameWidget(tvw, tvw)
        # self.screenshotGraphicsWidget.allowSaveLayout = False # we do not save screenshot widget in the windows layout
        self.screenshotGraphicsWidget.is_screenshot_widget = True  # important because e.g. we do not save screenshot widget in the windows layout
        # self.screenshotGraphicsWidget = GraphicsFrameWidget(tvw)

        self.screenshotGraphicsWidget.screenshotWindowFlag = True

        xSize = Configuration.getSetting("Screenshot_X")
        ySize = Configuration.getSetting("Screenshot_Y")

        print 'xSize=', xSize, ' ySize=', ySize

        self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(
            xSize, ySize)  # default size
        self.screenshotGraphicsWidget.qvtkWidget.resize(xSize, ySize)

        winsize = self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow(
        ).GetSize()
        print 'ADDITIONAL SCREENSHOT WINDOW SIZE=', winsize

        #        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget=',self.screenshotGraphicsWidget
        #        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget.winId().__int__()=',self.screenshotGraphicsWidget.winId().__int__()
        #        print
        #        import pdb; pdb.set_trace()
        #        bad = 1/0
        #        SimpleTabView.   # rwh: add this to the graphics windows dict

        #        self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
        #        self.tabViewWidget.updateActiveWindowVisFlags()

        self.screenshotGraphicsWidget.readSettings()
        # # # self.tabViewWidget.addSubWindow(self.screenshotGraphicsWidget)
        self.screenshotSubWindow = tvw.addSubWindow(
            self.screenshotGraphicsWidget)

        #necessary to avoid spurious maximization of screenshot window. possible bug either in Player or in QMDIArea
        self.screenshotSubWindow.showMinimized()
        self.screenshotSubWindow.hide()

        self.screenshotGraphicsWidgetFieldTypesInitialized = False
Пример #3
0
class ScreenshotManager:
    def __init__(self, _tabViewWidget):

        self.screenshotDataDict = {}
        from weakref import ref
        self.tabViewWidget = ref(_tabViewWidget)
        tvw = self.tabViewWidget()
        # print
        #        print MODULENAME,'  ScreenshotManager: __init__(),   self.tabViewWidget=',self.tabViewWidget
        #        print MODULENAME,'  ScreenshotManager: __init__(),   type(self.tabViewWidget)=',type(self.tabViewWidget)
        #        print MODULENAME,'  ScreenshotManager: __init__(),   dir(self.tabViewWidget)=',dir(self.tabViewWidget)
        # self.sim=self.tabViewWidget.sim

        self.basicSimulationData = tvw.basicSimulationData
        self.basicSimulationData = tvw.basicSimulationData
        self.screenshotNumberOfDigits = len(
            str(self.basicSimulationData.numberOfSteps))

        # self.screenshotNumberOfDigits=len(str(self.sim.getNumSteps()))
        self.maxNumberOfScreenshots = 20  # we limit max number of screenshots to discourage users from using screenshots as their main analysis tool
        #a better solution is to store latice to a pif file and then do postprocessing
        self.screenshotCounter3D = 0

        # self.screenshotGraphicsWidget = GraphicsFrameWidget(self.tabViewWidget)
        print 'CREATING SCREENSHOT WINDOW'

        self.screenshotGraphicsWidget = None
        # MDIFIX - temporary
        # return

        # MDIFIX
        self.screenshotGraphicsWidget = GraphicsFrameWidget(tvw, tvw)
        # self.screenshotGraphicsWidget.allowSaveLayout = False # we do not save screenshot widget in the windows layout
        self.screenshotGraphicsWidget.is_screenshot_widget = True  # important because e.g. we do not save screenshot widget in the windows layout
        # self.screenshotGraphicsWidget = GraphicsFrameWidget(tvw)

        self.screenshotGraphicsWidget.screenshotWindowFlag = True

        xSize = Configuration.getSetting("Screenshot_X")
        ySize = Configuration.getSetting("Screenshot_Y")

        print 'xSize=', xSize, ' ySize=', ySize

        self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(
            xSize, ySize)  # default size
        self.screenshotGraphicsWidget.qvtkWidget.resize(xSize, ySize)

        winsize = self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow(
        ).GetSize()
        print 'ADDITIONAL SCREENSHOT WINDOW SIZE=', winsize

        #        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget=',self.screenshotGraphicsWidget
        #        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget.winId().__int__()=',self.screenshotGraphicsWidget.winId().__int__()
        #        print
        #        import pdb; pdb.set_trace()
        #        bad = 1/0
        #        SimpleTabView.   # rwh: add this to the graphics windows dict

        #        self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
        #        self.tabViewWidget.updateActiveWindowVisFlags()

        self.screenshotGraphicsWidget.readSettings()
        # # # self.tabViewWidget.addSubWindow(self.screenshotGraphicsWidget)
        self.screenshotSubWindow = tvw.addSubWindow(
            self.screenshotGraphicsWidget)

        #necessary to avoid spurious maximization of screenshot window. possible bug either in Player or in QMDIArea
        self.screenshotSubWindow.showMinimized()
        self.screenshotSubWindow.hide()

        self.screenshotGraphicsWidgetFieldTypesInitialized = False

    def cleanup(self):
        # have to do cleanup to ensure some of the memory intensive resources e.g. self.screenshotGraphicsWidget get deallocated
        if self.screenshotGraphicsWidget:
            print 'JUST BEFORE CLOSING self.screenshotGraphicsWidget'
            # this close and assignment do not do much for the non-mdi layout
            self.screenshotGraphicsWidget.close()
            self.screenshotGraphicsWidget = None
        self.tabViewWidget = None
        self.basicSimulationData = None

    def produceScreenshotCoreName(self, _scrData):
        return str(_scrData.plotData[0]) + "_" + str(_scrData.plotData[1])

    def produceScreenshotName(self, _scrData):
        screenshotName = "Screenshot"
        screenshotCoreName = "Screenshot"

        if _scrData.spaceDimension == "2D":
            screenshotCoreName = self.produceScreenshotCoreName(_scrData)
            screenshotName = screenshotCoreName + "_" + _scrData.spaceDimension + "_" + _scrData.projection + "_" + str(
                _scrData.projectionPosition)
        elif _scrData.spaceDimension == "3D":
            screenshotCoreName = self.produceScreenshotCoreName(_scrData)
            screenshotName = screenshotCoreName + "_" + _scrData.spaceDimension + "_" + str(
                self.screenshotCounter3D)
        return (screenshotName, screenshotCoreName)

    def writeScreenshotDescriptionFile(self, _fileName):
        from XMLUtils import ElementCC3D

        screenshotFileElement = ElementCC3D("CompuCell3DScreenshots")

        for name in self.screenshotDataDict:
            scrData = self.screenshotDataDict[name]
            if scrData.spaceDimension == "2D":
                scrDescElement = screenshotFileElement.ElementCC3D(
                    "ScreenshotDescription")
                scrDescElement.ElementCC3D("Dimension", {},
                                           str(scrData.spaceDimension))
                scrDescElement.ElementCC3D(
                    "Plot", {
                        "PlotType": str(scrData.plotData[1]),
                        "PlotName": str(scrData.plotData[0])
                    })
                scrDescElement.ElementCC3D(
                    "Projection", {
                        "ProjectionPlane": scrData.projection,
                        "ProjectionPosition": str(scrData.projectionPosition)
                    })
                scrDescElement.ElementCC3D(
                    "Size", {
                        "Width":
                        str(scrData.screenshotGraphicsWidget.size().width()),
                        "Height":
                        str(scrData.screenshotGraphicsWidget.size().height())
                    })

            if scrData.spaceDimension == "3D":
                scrDescElement = screenshotFileElement.ElementCC3D(
                    "ScreenshotDescription")
                scrDescElement.ElementCC3D("Dimension", {},
                                           str(scrData.spaceDimension))
                scrDescElement.ElementCC3D(
                    "Plot", {
                        "PlotType": str(scrData.plotData[1]),
                        "PlotName": str(scrData.plotData[0])
                    })
                scrDescElement.ElementCC3D(
                    "CameraClippingRange", {
                        "Min": str(scrData.clippingRange[0]),
                        "Max": str(scrData.clippingRange[1])
                    })
                scrDescElement.ElementCC3D(
                    "CameraFocalPoint", {
                        "x": str(scrData.focalPoint[0]),
                        "y": str(scrData.focalPoint[1]),
                        "z": str(scrData.focalPoint[2])
                    })
                scrDescElement.ElementCC3D(
                    "CameraPosition", {
                        "x": str(scrData.position[0]),
                        "y": str(scrData.position[1]),
                        "z": str(scrData.position[2])
                    })
                scrDescElement.ElementCC3D(
                    "CameraViewUp", {
                        "x": str(scrData.viewUp[0]),
                        "y": str(scrData.viewUp[1]),
                        "z": str(scrData.viewUp[2])
                    })
                scrDescElement.ElementCC3D(
                    "Size", {
                        "Width":
                        str(scrData.screenshotGraphicsWidget.size().width()),
                        "Height":
                        str(scrData.screenshotGraphicsWidget.size().height())
                    })

        screenshotFileElement.CC3DXMLElement.saveXML(str(_fileName))

    def readScreenshotDescriptionFile(self, _fileName):
        import XMLUtils

        xml2ObjConverter = XMLUtils.Xml2Obj()
        root_element = xml2ObjConverter.Parse(_fileName)
        scrList = XMLUtils.CC3DXMLListPy(
            root_element.getElements("ScreenshotDescription"))
        for scr in scrList:
            if scr.getFirstElement("Dimension").getText() == "2D":
                print MODULENAME, "GOT 2D SCREENSHOT"
                scrData = ScreenshotData()
                scrData.spaceDimension = "2D"

                plotElement = scr.getFirstElement("Plot")
                scrData.plotData = (plotElement.getAttribute("PlotName"),
                                    plotElement.getAttribute("PlotType"))

                projElement = scr.getFirstElement("Projection")
                scrData.projection = projElement.getAttribute(
                    "ProjectionPlane")
                scrData.projectionPosition = int(
                    projElement.getAttribute("ProjectionPosition"))

                sizeElement = scr.getFirstElement("Size")
                scrSize = [
                    int(sizeElement.getAttribute("Width")),
                    int(sizeElement.getAttribute("Height"))
                ]

                # scrData initialized now will initialize graphics widget
                (scrName, scrCoreName) = self.produceScreenshotName(scrData)
                if not scrName in self.screenshotDataDict:
                    scrData.screenshotName = scrName
                    scrData.screenshotCoreName = scrCoreName
                    scrData.screenshotGraphicsWidget = self.screenshotGraphicsWidget
                    self.screenshotDataDict[scrData.screenshotName] = scrData
                else:
                    print MODULENAME, "Screenshot ", scrName, " already exists"

            elif scr.getFirstElement("Dimension").getText() == "3D":
                scrData = ScreenshotData()
                scrData.spaceDimension = "3D"
                plotElement = scr.getFirstElement("Plot")
                scrData.plotData = (plotElement.getAttribute("PlotName"),
                                    plotElement.getAttribute("PlotType"))
                sizeElement = scr.getFirstElement("Size")
                scrSize = [
                    int(sizeElement.getAttribute("Width")),
                    int(sizeElement.getAttribute("Height"))
                ]

                (scrName, scrCoreName) = self.produceScreenshotName(scrData)
                print MODULENAME, "(scrName,scrCoreName)=", (scrName,
                                                             scrCoreName)
                okToAddScreenshot = True

                # extracting Camera Settings
                camSettings = []

                clippingRangeElement = scr.getFirstElement(
                    "CameraClippingRange")
                camSettings.append(
                    float(clippingRangeElement.getAttribute("Min")))
                camSettings.append(
                    float(clippingRangeElement.getAttribute("Max")))

                focalPointElement = scr.getFirstElement("CameraFocalPoint")
                camSettings.append(float(focalPointElement.getAttribute("x")))
                camSettings.append(float(focalPointElement.getAttribute("y")))
                camSettings.append(float(focalPointElement.getAttribute("z")))

                positionElement = scr.getFirstElement("CameraPosition")
                camSettings.append(float(positionElement.getAttribute("x")))
                camSettings.append(float(positionElement.getAttribute("y")))
                camSettings.append(float(positionElement.getAttribute("z")))

                viewUpElement = scr.getFirstElement("CameraViewUp")
                camSettings.append(float(viewUpElement.getAttribute("x")))
                camSettings.append(float(viewUpElement.getAttribute("y")))
                camSettings.append(float(viewUpElement.getAttribute("z")))

                for name in self.screenshotDataDict:
                    scrDataFromDict = self.screenshotDataDict[name]
                    if scrDataFromDict.screenshotCoreName == scrCoreName and scrDataFromDict.spaceDimension == "3D":
                        print MODULENAME, "scrDataFromDict.screenshotCoreName=", scrDataFromDict.screenshotCoreName, " scrCoreName=", scrCoreName

                        if scrDataFromDict.compareExistingCameraToNewCameraSettings(
                                camSettings):
                            print MODULENAME, "CAMERAS ARE THE SAME"
                            okToAddScreenshot = False
                            break
                        else:
                            print MODULENAME, "CAMERAS ARE DIFFERENT"
                print MODULENAME, "okToAddScreenshot=", okToAddScreenshot

                if (not scrName
                        in self.screenshotDataDict) and okToAddScreenshot:
                    scrData.screenshotName = scrName
                    scrData.screenshotCoreName = scrCoreName

                    scrData.screenshotGraphicsWidget = self.screenshotGraphicsWidget

                    scrData.extractCameraInfoFromList(camSettings)
                    self.screenshotDataDict[scrData.screenshotName] = scrData

            else:
                print MODULENAME, "GOT UNKNOWN SCREENSHOT"

    def add2DScreenshot(self, _plotName, _plotType, _projection,
                        _projectionPosition,
                        _camera):  # called from GraphicsFrameWidget
        if len(self.screenshotDataDict) > self.maxNumberOfScreenshots:
            print MODULENAME, "MAX NUMBER OF SCREENSHOTS HAS BEEN REACHED"

        scrData = ScreenshotData()
        scrData.spaceDimension = "2D"
        scrData.plotData = (_plotName, _plotType)
        print MODULENAME, " add2DScreenshot(): scrData.plotData=", scrData.plotData  # e.g. =('Cell_Field', 'CellField')
        #        print MODULENAME," add2DScreenshot(): _camera=",_camera
        #        print MODULENAME,"  add2DScreenshot():  incoming _camera: Range,FP,Pos,Up,Distance", \
        #                _camera.GetClippingRange(),_camera.GetFocalPoint(),_camera.GetPosition(),_camera.GetViewUp(),_camera.GetDistance()
        scrData.projection = _projection
        scrData.projectionPosition = int(_projectionPosition)

        #        import pdb; pdb.set_trace()

        (scrName, scrCoreName) = self.produceScreenshotName(scrData)

        print MODULENAME, "  add2DScreenshot():  THIS IS NEW SCRSHOT NAME", scrName  # e.g. Cell_Field_CellField_2D_XY_150

        if not scrName in self.screenshotDataDict:
            scrData.screenshotName = scrName
            scrData.screenshotCoreName = scrCoreName
            scrData.screenshotGraphicsWidget = self.screenshotGraphicsWidget  # = GraphicsFrameWidget (rf. __init__)

            #            cam = self.screenshotGraphicsWidget.getCamera()
            #            print MODULENAME,"  add2DScreenshot():  cam: Range,FP,Pos,Up,Distance", \
            #                cam.GetClippingRange(),cam.GetFocalPoint(),cam.GetPosition(),cam.GetViewUp(),cam.GetDistance()
            #            cam.SetClippingRange(_cam.GetClippingRange())
            #            cam.SetDistance(_cam.GetDistance())
            #            cam.SetFocalPoint(_cam.GetFocalPoint())
            #            cam.SetPosition(_cam.GetPosition())
            #            cam.SetThickness(_cam.GetThickness())
            #            cam.SetViewUp(_cam.GetViewUp())   # not needed for 2D

            #            print MODULENAME," add2DScreenshot(): scrData.screenshotGraphicsWidget=",scrData.screenshotGraphicsWidget
            #            print MODULENAME," add2DScreenshot(): type(scrData.screenshotGraphicsWidget)=",type(scrData.screenshotGraphicsWidget)

            #            self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
            #            print MODULENAME," add2DScreenshot(): win id=", self.tabViewWidget.lastActiveWindow.winId().__int__()
            tvw = self.tabViewWidget()
            if tvw:
                tvw.updateActiveWindowVisFlags(self.screenshotGraphicsWidget)

            scrData.extractCameraInfo(
                _camera
            )  # so "camera" icon (save images) remembers camera view

            # on linux there is a problem with X-server/Qt/QVTK implementation and calling resize right after additional QVTK
            # is created causes segfault so possible "solution" is to do resize right before taking screenshot.
            # It causes flicker but does not cause segfault.
            # User should NOT close or minimize this "empty" window (on Linux anyway).
            if sys.platform == 'Linux' or sys.platform == 'linux' or sys.platform == 'linux2':
                #                pass
                self.screenshotDataDict[scrData.screenshotName] = scrData
            else:
                self.screenshotDataDict[scrData.screenshotName] = scrData
        else:
            print MODULENAME, "Screenshot ", scrName, " already exists"

    def add3DScreenshot(self, _plotName, _plotType,
                        _camera):  # called from GraphicsFrameWidget
        if len(self.screenshotDataDict) > self.maxNumberOfScreenshots:
            print MODULENAME, "MAX NUMBER OF SCREENSHOTS HAS BEEN REACHED"
        scrData = ScreenshotData()
        scrData.spaceDimension = "3D"
        scrData.plotData = (_plotName, _plotType)
        print MODULENAME, "add3DScreenshot(): scrData.plotData", scrData.plotData
        (scrName, scrCoreName) = self.produceScreenshotName(scrData)

        print MODULENAME, "add3DScreenshot(): scrName", scrName
        okToAddScreenshot = True
        for name in self.screenshotDataDict:
            scrDataFromDict = self.screenshotDataDict[name]
            if scrDataFromDict.screenshotCoreName == scrCoreName and scrDataFromDict.spaceDimension == "3D":
                if scrDataFromDict.compareCameras(_camera):
                    print MODULENAME, "CAMERAS ARE THE SAME"
                    okToAddScreenshot = False
                    break
                else:
                    print MODULENAME, "CAMERAS ARE DIFFERENT"

#        print MODULENAME,"okToAddScreenshot=",okToAddScreenshot
        if (not scrName in self.screenshotDataDict) and okToAddScreenshot:
            scrData.screenshotName = scrName
            scrData.screenshotCoreName = scrCoreName
            scrData.screenshotGraphicsWidget = self.screenshotGraphicsWidget
            #            self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
            #            print MODULENAME," add3DScreenshot(): win id=", self.tabViewWidget.lastActiveWindow.winId().__int__()
            tvw = self.tabViewWidget()
            if tvw:
                tvw.updateActiveWindowVisFlags(self.screenshotGraphicsWidget)

            scrData.extractCameraInfo(_camera)

            # on linux there is a problem with X-server/Qt/QVTK implementation and calling resize right after additional QVTK
            # is created causes segfault so possible "solution" is to do resize right before taking screenshot.
            # It causes flicker but does not cause segfault
            # User should NOT close or minimize this "empty" window (on Linux anyway).
            if sys.platform == 'Linux' or sys.platform == 'linux' or sys.platform == 'linux2':
                #                pass
                self.screenshotDataDict[scrData.screenshotName] = scrData
                self.screenshotCounter3D += 1
            else:
                self.screenshotDataDict[scrData.screenshotName] = scrData
                self.screenshotCounter3D += 1
        else:
            print MODULENAME, "Screenshot ", scrCoreName, " with current camera settings already exists. You need to rotate camera i.e. rotate picture using mouse to take additional screenshot"

    def outputScreenshots(
            self, _generalScreenshotDirectoryName, _mcs
    ):  # called from SimpleTabView:handleCompletedStep{Regular,CML*}
        #        print MODULENAME, 'outputScreenshots():  _generalScreenshotDirectoryName=',_generalScreenshotDirectoryName
        mcsFormattedNumber = string.zfill(
            str(_mcs), self.screenshotNumberOfDigits
        )  # fills string with 0's up to self.screenshotNumberOfDigits width

        if not self.screenshotGraphicsWidgetFieldTypesInitialized:
            tvw = self.tabViewWidget()
            if tvw:
                self.screenshotGraphicsWidget.setFieldTypesComboBox(
                    tvw.fieldTypes)

        # apparently on linux and most likely OSX we need to resize screenshot window before each screenshot
        xSize = Configuration.getSetting("Screenshot_X")
        ySize = Configuration.getSetting("Screenshot_Y")
        self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(
            xSize, ySize)  # default size
        self.screenshotGraphicsWidget.qvtkWidget.resize(xSize, ySize)

        if not sys.platform.startswith(
                'win'
        ):  # we hide and restore screenshot window on linux and OSX only on windows it is not necessary
            self.screenshotSubWindow.showNormal()
            self.screenshotSubWindow.show()

# self.screenshotGraphicsWidget.setShown(True)
        winsize = self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow(
        ).GetSize()
        # print 'ADDITIONAL SCREENSHOT WINDOW SIZE=',winsize
        # # #         self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(winsize[0],winsize[1])

        #        print MODULENAME,'outputScreenshots(): type(winsize), [0],[1]=',type(winsize),winsize[0],winsize[1]
        #        self.screenshotGraphicsWidget.qvtkWidget.resize(400,400)   # rwh, why?? (if I don't, it defaults to (100,30)
        # self.screenshotGraphicsWidget.qvtkWidget.resize(winsize[0],winsize[1])   # rwh, why?? (if I don't, it defaults to (100,30)
        # self.screenshotGraphicsWidget.qvtkWidget.resize(611,411)   # rwh, why?? (if I don't, it defaults to (100,30)
        #        print MODULENAME,'outputScreenshots(): dir(self.screenshotGraphicsWidget.qvtkWidget)=',dir(self.screenshotGraphicsWidget.qvtkWidget)
        #        print MODULENAME,'outputScreenshots(): dir(self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow())=',dir(self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow())

        #        print MODULENAME,'outputScreenshots(): self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().GetSize()=',self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().GetSize()
        #        self.screenshotGraphicsWidget.qvtkWidget.resize(343,300)   # rwh, why??

        #        print MODULENAME,'outputScreenshots(): win size=',  self.tabViewWidget.mainGraphicsWindow.size() # PyQt4.QtCore.QSize(367, 378)

        #        print MODULENAME,'outputScreenshots(): self.screenshotDataDict=',self.screenshotDataDict
        for scrName in self.screenshotDataDict.keys():
            #            print MODULENAME,'----------->>>>> outputScreenshots(): scrName =',scrName  # e.g. FGF_ConField_2D_XY_0  (i.e. subdir name)
            scrData = self.screenshotDataDict[scrName]
            #            print MODULENAME,'outputScreenshots(): scrData.screenshotGraphicsWidget.size().width(), height() =',scrData.screenshotGraphicsWidget.size().width(),scrData.screenshotGraphicsWidget.size().height()  # 100,30 ?!
            scrFullDirName = os.path.join(_generalScreenshotDirectoryName,
                                          scrData.screenshotName)

            if not os.path.isdir(
                    scrFullDirName
            ):  # will create screenshot directory if directory does not exist
                print MODULENAME, '   outputScreenshots(): doing os.mkdir on scrFullDirName=', scrFullDirName
                os.mkdir(scrFullDirName)

            scrFullName = os.path.join(
                scrFullDirName,
                scrData.screenshotName + "_" + mcsFormattedNumber + ".png")

            #            print MODULENAME,'outputScreenshots(): scrData.spaceDimension =',scrData.spaceDimension  # 2D

            # rwh: why is this necessary??
            if scrData.spaceDimension == "2D":  # cf. this block with how it's done in MVCDrawView2D.py:takeSimShot()
                self.screenshotGraphicsWidget.setDrawingStyle("2D")
                self.screenshotGraphicsWidget.draw2D.initSimArea(
                    self.basicSimulationData)  # MVCDrawViewBase
                self.screenshotGraphicsWidget.draw2D.setPlane(
                    scrData.projection, scrData.projectionPosition)
                scrData.prepareCamera()

            elif scrData.spaceDimension == "3D":
                self.screenshotGraphicsWidget.setDrawingStyle("3D")
                self.screenshotGraphicsWidget.draw3D.initSimArea(
                    self.basicSimulationData)
                #                print MODULENAME,'outputScreenshots(): calling scrData.prepareCamera() '
                scrData.prepareCamera()

            else:
                print MODULENAME, ' WARNING - got to unexpected return'
                return  # should not get here

            # #have to set up camera
            # scrData.prepareCamera()

            # self.screenshotGraphicsWidget.drawField(self.basicSimulationData,scrData.plotData)
            # self.screenshotGraphicsWidget.setFieldTypes(scrData.plotData)
#            print MODULENAME,"   before drawFieldLocal, scrData.plotData=",scrData.plotData
            self.screenshotGraphicsWidget.setPlotData(scrData.plotData)
            self.screenshotGraphicsWidget.drawFieldLocal(
                self.basicSimulationData, False
            )  # second argument tells drawFieldLocal fcn not to use combo box to get field name
            #            print MODULENAME,"AFTER drawFieldLocal"

            # scrData.screenshotGraphicsWidget.setShown(True)
            # # scrData.screenshotGraphicsWidget.resize(400,400)

            # on linux there is a problem with X-server/Qt/QVTK implementation and calling resize right after additional QVTK
            # is created causes segfault so possible "solution" is to do resize right before taking screenshot. It causes flicker but does not cause segfault
            #            print MODULENAME,' sys.platform = ',sys.platform
            if sys.platform == 'darwin' or sys.platform == 'Linux' or sys.platform == 'linux' or sys.platform == 'linux2':
                scrData.screenshotGraphicsWidget.setShown(True)
#                scrData.screenshotGraphicsWidget.resize(self.tabViewWidget.mainGraphicsWindow.size())

# scrData.screenshotGraphicsWidget.takeSimShot(scrFullName)
            print MODULENAME, 'outputScreenshots():  calling self.screenshotGraphicsWidget.takeSimShot(', scrFullName
            self.screenshotGraphicsWidget.takeSimShot(scrFullName)
            # scrData.screenshotGraphicsWidget.setShown(False)

            if sys.platform == 'darwin' or sys.platform == 'Linux' or sys.platform == 'linux' or sys.platform == 'linux2':
                scrData.screenshotGraphicsWidget.setShown(False)

        if not sys.platform.startswith(
                'win'
        ):  # we hide and restore screenshot window on linux and OSX only on windows it is not necessary
            self.screenshotSubWindow.showNormal()
            self.screenshotSubWindow.hide()
Пример #4
0
class ScreenshotManager:
    def __init__(self,_tabViewWidget):
        self.screenshotDataDict={}
        from weakref import ref
        self.tabViewWidget=ref(_tabViewWidget)
        tvw=self.tabViewWidget()
        # print
#        print MODULENAME,'  ScreenshotManager: __init__(),   self.tabViewWidget=',self.tabViewWidget
#        print MODULENAME,'  ScreenshotManager: __init__(),   type(self.tabViewWidget)=',type(self.tabViewWidget)
#        print MODULENAME,'  ScreenshotManager: __init__(),   dir(self.tabViewWidget)=',dir(self.tabViewWidget)
        # self.sim=self.tabViewWidget.sim
        
        self.basicSimulationData=tvw.basicSimulationData
        self.basicSimulationData=tvw.basicSimulationData
        self.screenshotNumberOfDigits=len(str(self.basicSimulationData.numberOfSteps))
        
        # self.screenshotNumberOfDigits=len(str(self.sim.getNumSteps()))
        self.maxNumberOfScreenshots=20 # we limit max number of screenshots to discourage users from using screenshots as their main analysis tool
                                       #a better solution is to store latice to a pif file and then do postprocessing 
        self.screenshotCounter3D=0
        
        # self.screenshotGraphicsWidget = GraphicsFrameWidget(self.tabViewWidget)
        print 'CREATING SCREENSHOT WINDOW'
        self.screenshotGraphicsWidget = GraphicsFrameWidget(tvw)
        self.screenshotGraphicsWidget.screenshotWindowFlag=True
        
        xSize=Configuration.getSetting("Screenshot_X")
        ySize=Configuration.getSetting("Screenshot_Y")
        
        print 'xSize=',xSize,' ySize=',ySize
        
        self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(xSize,ySize) # default size
        self.screenshotGraphicsWidget.qvtkWidget.resize(xSize,ySize)
        
        winsize = self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().GetSize()
        print 'ADDITIONAL SCREENSHOT WINDOW SIZE=',winsize
        
#        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget=',self.screenshotGraphicsWidget
#        print MODULENAME,'  ScreenshotManager: __init__(),   self.screenshotGraphicsWidget.winId().__int__()=',self.screenshotGraphicsWidget.winId().__int__()
#        print
#        import pdb; pdb.set_trace()
#        bad = 1/0
#        SimpleTabView.   # rwh: add this to the graphics windows dict

#        self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
#        self.tabViewWidget.updateActiveWindowVisFlags()
        
        self.screenshotGraphicsWidget.readSettings()
        # # # self.tabViewWidget.addSubWindow(self.screenshotGraphicsWidget)
        self.screenshotSubWindow=tvw.addSubWindow(self.screenshotGraphicsWidget)
        
        #necessary to avoid spurious maximization of screenshot window. possible bug either in Player or in QMDIArea
        self.screenshotSubWindow.showMinimized()
        self.screenshotSubWindow.hide()
        
        
        self.screenshotGraphicsWidgetFieldTypesInitialized=False
        
        
    def cleanup(self):
        # have to do cleanup to ensure some of the memory intensive resources e.g. self.screenshotGraphicsWidget get deallocated
        if self.screenshotGraphicsWidget:
            print 'JUST BEFORE CLOSING self.screenshotGraphicsWidget'
            self.screenshotGraphicsWidget.close()
            self.screenshotGraphicsWidget=None
        self.tabViewWidget=None
        self.basicSimulationData=None
    
    def produceScreenshotCoreName(self,_scrData):
        return str(_scrData.plotData[0])+"_"+str(_scrData.plotData[1])
        
    def produceScreenshotName(self,_scrData):
        screenshotName="Screenshot"
        screenshotCoreName="Screenshot"
        
        if _scrData.spaceDimension=="2D":
            screenshotCoreName=self.produceScreenshotCoreName(_scrData)
            screenshotName=screenshotCoreName+"_"+_scrData.spaceDimension+"_"+_scrData.projection+"_"+str(_scrData.projectionPosition)
        elif _scrData.spaceDimension=="3D":
            screenshotCoreName=self.produceScreenshotCoreName(_scrData)
            screenshotName=screenshotCoreName+"_"+_scrData.spaceDimension+"_"+str(self.screenshotCounter3D)
        return (screenshotName,screenshotCoreName)
    
    def writeScreenshotDescriptionFile(self,_fileName):
        from XMLUtils import ElementCC3D
        
        screenshotFileElement=ElementCC3D("CompuCell3DScreenshots")
        
        for name in self.screenshotDataDict:
            scrData=self.screenshotDataDict[name]
            if scrData.spaceDimension=="2D":
                scrDescElement=screenshotFileElement.ElementCC3D("ScreenshotDescription")
                scrDescElement.ElementCC3D("Dimension", {}, str(scrData.spaceDimension))
                scrDescElement.ElementCC3D("Plot", {"PlotType":str(scrData.plotData[1]),"PlotName":str(scrData.plotData[0])})
                scrDescElement.ElementCC3D("Projection", {"ProjectionPlane":scrData.projection,"ProjectionPosition":str(scrData.projectionPosition)})
                scrDescElement.ElementCC3D("Size", {"Width":str(scrData.screenshotGraphicsWidget.size().width()),"Height":str(scrData.screenshotGraphicsWidget.size().height())})
                
            if scrData.spaceDimension=="3D":
                scrDescElement=screenshotFileElement.ElementCC3D("ScreenshotDescription")                
                scrDescElement.ElementCC3D("Dimension", {}, str(scrData.spaceDimension))
                scrDescElement.ElementCC3D("Plot", {"PlotType":str(scrData.plotData[1]),"PlotName":str(scrData.plotData[0])})
                scrDescElement.ElementCC3D("CameraClippingRange", {"Min":str(scrData.clippingRange[0]),"Max":str(scrData.clippingRange[1])})
                scrDescElement.ElementCC3D("CameraFocalPoint", {"x":str(scrData.focalPoint[0]),"y":str(scrData.focalPoint[1]),"z":str(scrData.focalPoint[2])})
                scrDescElement.ElementCC3D("CameraPosition", {"x":str(scrData.position[0]),"y":str(scrData.position[1]),"z":str(scrData.position[2])})
                scrDescElement.ElementCC3D("CameraViewUp", {"x":str(scrData.viewUp[0]),"y":str(scrData.viewUp[1]),"z":str(scrData.viewUp[2])})
                scrDescElement.ElementCC3D("Size", {"Width":str(scrData.screenshotGraphicsWidget.size().width()),"Height":str(scrData.screenshotGraphicsWidget.size().height())})
                
        screenshotFileElement.CC3DXMLElement.saveXML(str(_fileName))
        
    def readScreenshotDescriptionFile(self,_fileName):        
        import XMLUtils
        
        xml2ObjConverter = XMLUtils.Xml2Obj()
        root_element=xml2ObjConverter.Parse(_fileName)
        scrList=XMLUtils.CC3DXMLListPy(root_element.getElements("ScreenshotDescription"))
        for scr in scrList:
            if scr.getFirstElement("Dimension").getText()=="2D":
                print MODULENAME,"GOT 2D SCREENSHOT"
                scrData=ScreenshotData()
                scrData.spaceDimension="2D"
                
                plotElement=scr.getFirstElement("Plot")
                scrData.plotData=(plotElement.getAttribute("PlotName"),plotElement.getAttribute("PlotType"))
                
                projElement=scr.getFirstElement("Projection")
                scrData.projection=projElement.getAttribute("ProjectionPlane")
                scrData.projectionPosition=int(projElement.getAttribute("ProjectionPosition"))
                
                sizeElement=scr.getFirstElement("Size")
                scrSize=[int(sizeElement.getAttribute("Width")),int(sizeElement.getAttribute("Height"))]
                
                # scrData initialized now will initialize graphics widget
                (scrName,scrCoreName)=self.produceScreenshotName(scrData)
                if not scrName in self.screenshotDataDict:
                    scrData.screenshotName=scrName
                    scrData.screenshotCoreName=scrCoreName
                    scrData.screenshotGraphicsWidget=self.screenshotGraphicsWidget
                    self.screenshotDataDict[scrData.screenshotName]=scrData
                else:
                    print MODULENAME,"Screenshot ",scrName," already exists"
                
            elif scr.getFirstElement("Dimension").getText()=="3D":
                scrData=ScreenshotData()
                scrData.spaceDimension="3D"
                plotElement=scr.getFirstElement("Plot")
                scrData.plotData=(plotElement.getAttribute("PlotName"),plotElement.getAttribute("PlotType"))
                sizeElement=scr.getFirstElement("Size")
                scrSize=[int(sizeElement.getAttribute("Width")),int(sizeElement.getAttribute("Height"))]
                
                (scrName,scrCoreName)=self.produceScreenshotName(scrData)
                print MODULENAME,"(scrName,scrCoreName)=",(scrName,scrCoreName)
                okToAddScreenshot=True
                
                # extracting Camera Settings
                camSettings=[]
                
                clippingRangeElement=scr.getFirstElement("CameraClippingRange")
                camSettings.append(float(clippingRangeElement.getAttribute("Min")))
                camSettings.append(float(clippingRangeElement.getAttribute("Max")))
                
                focalPointElement=scr.getFirstElement("CameraFocalPoint")
                camSettings.append(float(focalPointElement.getAttribute("x")))
                camSettings.append(float(focalPointElement.getAttribute("y")))
                camSettings.append(float(focalPointElement.getAttribute("z")))
                
                positionElement=scr.getFirstElement("CameraPosition")
                camSettings.append(float(positionElement.getAttribute("x")))
                camSettings.append(float(positionElement.getAttribute("y")))
                camSettings.append(float(positionElement.getAttribute("z")))
                
                viewUpElement=scr.getFirstElement("CameraViewUp")
                camSettings.append(float(viewUpElement.getAttribute("x")))
                camSettings.append(float(viewUpElement.getAttribute("y")))
                camSettings.append(float(viewUpElement.getAttribute("z")))
                
                for name in self.screenshotDataDict:
                    scrDataFromDict=self.screenshotDataDict[name]
                    if scrDataFromDict.screenshotCoreName==scrCoreName and scrDataFromDict.spaceDimension=="3D":
                        print MODULENAME,"scrDataFromDict.screenshotCoreName=",scrDataFromDict.screenshotCoreName," scrCoreName=",scrCoreName
                        
                        if scrDataFromDict.compareExistingCameraToNewCameraSettings(camSettings):
                            print MODULENAME,"CAMERAS ARE THE SAME"
                            okToAddScreenshot=False
                            break
                        else:
                            print MODULENAME,"CAMERAS ARE DIFFERENT"
                print MODULENAME,"okToAddScreenshot=",okToAddScreenshot    
                
                if (not scrName in self.screenshotDataDict) and okToAddScreenshot:
                    scrData.screenshotName=scrName
                    scrData.screenshotCoreName=scrCoreName            
                    
                    scrData.screenshotGraphicsWidget=self.screenshotGraphicsWidget
                    
                    scrData.extractCameraInfoFromList(camSettings)
                    self.screenshotDataDict[scrData.screenshotName]=scrData
                
            else:
                print MODULENAME,"GOT UNKNOWN SCREENSHOT"
            
           
    def add2DScreenshot(self, _plotName,_plotType,_projection,_projectionPosition,_camera):   # called from GraphicsFrameWidget
        if len(self.screenshotDataDict)>self.maxNumberOfScreenshots:
            print MODULENAME,"MAX NUMBER OF SCREENSHOTS HAS BEEN REACHED"
        
        scrData=ScreenshotData()
        scrData.spaceDimension="2D"
        scrData.plotData=(_plotName,_plotType)        
        print MODULENAME," add2DScreenshot(): scrData.plotData=",scrData.plotData   # e.g. =('Cell_Field', 'CellField')
#        print MODULENAME," add2DScreenshot(): _camera=",_camera
#        print MODULENAME,"  add2DScreenshot():  incoming _camera: Range,FP,Pos,Up,Distance", \
#                _camera.GetClippingRange(),_camera.GetFocalPoint(),_camera.GetPosition(),_camera.GetViewUp(),_camera.GetDistance()
        scrData.projection = _projection
        scrData.projectionPosition = int(_projectionPosition)
        
#        import pdb; pdb.set_trace()
        
        (scrName,scrCoreName)=self.produceScreenshotName(scrData)
        
        print MODULENAME,"  add2DScreenshot():  THIS IS NEW SCRSHOT NAME",scrName   # e.g. Cell_Field_CellField_2D_XY_150
        
        if not scrName in self.screenshotDataDict:
            scrData.screenshotName = scrName
            scrData.screenshotCoreName = scrCoreName
            scrData.screenshotGraphicsWidget = self.screenshotGraphicsWidget   # = GraphicsFrameWidget (rf. __init__)
            
#            cam = self.screenshotGraphicsWidget.getCamera()
#            print MODULENAME,"  add2DScreenshot():  cam: Range,FP,Pos,Up,Distance", \
#                cam.GetClippingRange(),cam.GetFocalPoint(),cam.GetPosition(),cam.GetViewUp(),cam.GetDistance()
#            cam.SetClippingRange(_cam.GetClippingRange())
#            cam.SetDistance(_cam.GetDistance())
#            cam.SetFocalPoint(_cam.GetFocalPoint())
#            cam.SetPosition(_cam.GetPosition())
#            cam.SetThickness(_cam.GetThickness())
#            cam.SetViewUp(_cam.GetViewUp())   # not needed for 2D

#            print MODULENAME," add2DScreenshot(): scrData.screenshotGraphicsWidget=",scrData.screenshotGraphicsWidget
#            print MODULENAME," add2DScreenshot(): type(scrData.screenshotGraphicsWidget)=",type(scrData.screenshotGraphicsWidget)
            
#            self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
#            print MODULENAME," add2DScreenshot(): win id=", self.tabViewWidget.lastActiveWindow.winId().__int__()
            tvw=self.tabViewWidget()
            if tvw:
                tvw.updateActiveWindowVisFlags(self.screenshotGraphicsWidget)
            
            scrData.extractCameraInfo(_camera)   # so "camera" icon (save images) remembers camera view
            
            # on linux there is a problem with X-server/Qt/QVTK implementation and calling resize right after additional QVTK 
            # is created causes segfault so possible "solution" is to do resize right before taking screenshot. 
            # It causes flicker but does not cause segfault.
            # User should NOT close or minimize this "empty" window (on Linux anyway).
            if sys.platform=='Linux' or sys.platform=='linux' or sys.platform=='linux2': 
#                pass
                self.screenshotDataDict[scrData.screenshotName] = scrData
            else:
                self.screenshotDataDict[scrData.screenshotName] = scrData
        else:
            print MODULENAME,"Screenshot ",scrName," already exists"


    def add3DScreenshot(self, _plotName,_plotType,_camera):   # called from GraphicsFrameWidget
        if len(self.screenshotDataDict)>self.maxNumberOfScreenshots:
            print MODULENAME,"MAX NUMBER OF SCREENSHOTS HAS BEEN REACHED"        
        scrData=ScreenshotData()
        scrData.spaceDimension="3D"
        scrData.plotData=(_plotName,_plotType)
        print MODULENAME,"add3DScreenshot(): scrData.plotData",scrData.plotData
        (scrName,scrCoreName)=self.produceScreenshotName(scrData)

        print MODULENAME,"add3DScreenshot(): scrName",scrName
        okToAddScreenshot=True
        for name in self.screenshotDataDict:
            scrDataFromDict=self.screenshotDataDict[name]
            if scrDataFromDict.screenshotCoreName==scrCoreName and scrDataFromDict.spaceDimension=="3D":
                if scrDataFromDict.compareCameras(_camera):
                    print MODULENAME,"CAMERAS ARE THE SAME"
                    okToAddScreenshot=False
                    break
                else:
                    print MODULENAME,"CAMERAS ARE DIFFERENT"
                    
#        print MODULENAME,"okToAddScreenshot=",okToAddScreenshot    
        if (not scrName in self.screenshotDataDict) and okToAddScreenshot:
            scrData.screenshotName=scrName
            scrData.screenshotCoreName=scrCoreName
            scrData.screenshotGraphicsWidget=self.screenshotGraphicsWidget 
#            self.tabViewWidget.lastActiveWindow = self.screenshotGraphicsWidget
#            print MODULENAME," add3DScreenshot(): win id=", self.tabViewWidget.lastActiveWindow.winId().__int__()
            tvw=self.tabViewWidget()
            if tvw:
                tvw.updateActiveWindowVisFlags(self.screenshotGraphicsWidget)
            
            scrData.extractCameraInfo(_camera)

            # on linux there is a problem with X-server/Qt/QVTK implementation and calling resize right after additional QVTK 
            # is created causes segfault so possible "solution" is to do resize right before taking screenshot. 
            # It causes flicker but does not cause segfault
            # User should NOT close or minimize this "empty" window (on Linux anyway).
            if sys.platform=='Linux' or sys.platform=='linux' or sys.platform=='linux2':
#                pass
                self.screenshotDataDict[scrData.screenshotName] = scrData
                self.screenshotCounter3D += 1
            else:
                self.screenshotDataDict[scrData.screenshotName] = scrData
                self.screenshotCounter3D += 1
        else:
            print MODULENAME,"Screenshot ",scrCoreName," with current camera settings already exists. You need to rotate camera i.e. rotate picture using mouse to take additional screenshot"
            
            
    def outputScreenshots(self,_generalScreenshotDirectoryName,_mcs):  # called from SimpleTabView:handleCompletedStep{Regular,CML*}
#        print MODULENAME, 'outputScreenshots():  _generalScreenshotDirectoryName=',_generalScreenshotDirectoryName
        mcsFormattedNumber = string.zfill(str(_mcs),self.screenshotNumberOfDigits) # fills string with 0's up to self.screenshotNumberOfDigits width
        
        if not self.screenshotGraphicsWidgetFieldTypesInitialized:
            tvw=self.tabViewWidget()
            if tvw:
                self.screenshotGraphicsWidget.setFieldTypesComboBox(tvw.fieldTypes)
        
        # apparently on linux and most likely OSX we need to resize screenshot window before each screenshot
        xSize=Configuration.getSetting("Screenshot_X")
        ySize=Configuration.getSetting("Screenshot_Y")
        self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(xSize,ySize) # default size
        self.screenshotGraphicsWidget.qvtkWidget.resize(xSize,ySize)
        
        if  not sys.platform.startswith('win'):   # we hide and restore screenshot window on linux and OSX only on windows it is not necessary                 
            self.screenshotSubWindow.showNormal()
            self.screenshotSubWindow.show()
        
        
# self.screenshotGraphicsWidget.setShown(True)
        winsize = self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().GetSize()
        # print 'ADDITIONAL SCREENSHOT WINDOW SIZE=',winsize
# # #         self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().SetSize(winsize[0],winsize[1])

#        print MODULENAME,'outputScreenshots(): type(winsize), [0],[1]=',type(winsize),winsize[0],winsize[1]
#        self.screenshotGraphicsWidget.qvtkWidget.resize(400,400)   # rwh, why?? (if I don't, it defaults to (100,30)
        # self.screenshotGraphicsWidget.qvtkWidget.resize(winsize[0],winsize[1])   # rwh, why?? (if I don't, it defaults to (100,30)        
        # self.screenshotGraphicsWidget.qvtkWidget.resize(611,411)   # rwh, why?? (if I don't, it defaults to (100,30)
#        print MODULENAME,'outputScreenshots(): dir(self.screenshotGraphicsWidget.qvtkWidget)=',dir(self.screenshotGraphicsWidget.qvtkWidget)
#        print MODULENAME,'outputScreenshots(): dir(self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow())=',dir(self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow())

#        print MODULENAME,'outputScreenshots(): self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().GetSize()=',self.screenshotGraphicsWidget.qvtkWidget.GetRenderWindow().GetSize()
#        self.screenshotGraphicsWidget.qvtkWidget.resize(343,300)   # rwh, why??

#        print MODULENAME,'outputScreenshots(): win size=',  self.tabViewWidget.mainGraphicsWindow.size() # PyQt4.QtCore.QSize(367, 378)
        
#        print MODULENAME,'outputScreenshots(): self.screenshotDataDict=',self.screenshotDataDict
        for scrName in self.screenshotDataDict.keys():
#            print MODULENAME,'----------->>>>> outputScreenshots(): scrName =',scrName  # e.g. FGF_ConField_2D_XY_0  (i.e. subdir name)
            scrData = self.screenshotDataDict[scrName]
#            print MODULENAME,'outputScreenshots(): scrData.screenshotGraphicsWidget.size().width(), height() =',scrData.screenshotGraphicsWidget.size().width(),scrData.screenshotGraphicsWidget.size().height()  # 100,30 ?!
            scrFullDirName = os.path.join(_generalScreenshotDirectoryName,scrData.screenshotName)
            
            if not os.path.isdir(scrFullDirName):     # will create screenshot directory if directory does not exist
                print MODULENAME,'   outputScreenshots(): doing os.mkdir on scrFullDirName=',scrFullDirName
                os.mkdir(scrFullDirName)
                
            scrFullName = os.path.join(scrFullDirName,scrData.screenshotName+"_"+mcsFormattedNumber+".png")
            
#            print MODULENAME,'outputScreenshots(): scrData.spaceDimension =',scrData.spaceDimension  # 2D

            # rwh: why is this necessary??
            if scrData.spaceDimension=="2D":  # cf. this block with how it's done in MVCDrawView2D.py:takeSimShot()
                self.screenshotGraphicsWidget.setDrawingStyle("2D")
                self.screenshotGraphicsWidget.draw2D.initSimArea(self.basicSimulationData)   # MVCDrawViewBase
                self.screenshotGraphicsWidget.draw2D.setPlane(scrData.projection,scrData.projectionPosition)
                scrData.prepareCamera()
                
            elif scrData.spaceDimension=="3D":
                self.screenshotGraphicsWidget.setDrawingStyle("3D")
                self.screenshotGraphicsWidget.draw3D.initSimArea(self.basicSimulationData)
#                print MODULENAME,'outputScreenshots(): calling scrData.prepareCamera() '
                scrData.prepareCamera()
                
            else:
                print MODULENAME,' WARNING - got to unexpected return'
                return # should not get here
            
            # #have to set up camera
            # scrData.prepareCamera()
            
                        
            # self.screenshotGraphicsWidget.drawField(self.basicSimulationData,scrData.plotData)
            # self.screenshotGraphicsWidget.setFieldTypes(scrData.plotData)
#            print MODULENAME,"   before drawFieldLocal, scrData.plotData=",scrData.plotData
            self.screenshotGraphicsWidget.setPlotData(scrData.plotData)
            self.screenshotGraphicsWidget.drawFieldLocal(self.basicSimulationData,False) # second argument tells drawFieldLocal fcn not to use combo box to get field name
#            print MODULENAME,"AFTER drawFieldLocal"
            
            # scrData.screenshotGraphicsWidget.setShown(True)
            # # scrData.screenshotGraphicsWidget.resize(400,400)

            # on linux there is a problem with X-server/Qt/QVTK implementation and calling resize right after additional QVTK 
            # is created causes segfault so possible "solution" is to do resize right before taking screenshot. It causes flicker but does not cause segfault
#            print MODULENAME,' sys.platform = ',sys.platform
            if sys.platform=='darwin' or sys.platform=='Linux' or sys.platform=='linux' or sys.platform=='linux2':
                scrData.screenshotGraphicsWidget.setShown(True)
#                scrData.screenshotGraphicsWidget.resize(self.tabViewWidget.mainGraphicsWindow.size())

            # scrData.screenshotGraphicsWidget.takeSimShot(scrFullName)
            print MODULENAME, 'outputScreenshots():  calling self.screenshotGraphicsWidget.takeSimShot(',scrFullName
            self.screenshotGraphicsWidget.takeSimShot(scrFullName)
                # scrData.screenshotGraphicsWidget.setShown(False)
        
            if sys.platform=='darwin' or sys.platform=='Linux' or sys.platform=='linux' or sys.platform=='linux2':
                scrData.screenshotGraphicsWidget.setShown(False)
                
        if  not sys.platform.startswith('win'):      # we hide and restore screenshot window on linux and OSX only on windows it is not necessary      
            self.screenshotSubWindow.showNormal()
            self.screenshotSubWindow.hide()