From ebfb816a6111a17d7d72bf51c55a8c68827878b6 Mon Sep 17 00:00:00 2001 From: Kilian Weishaupt <kilian.weishaupt@iws.uni-stuttgart.de> Date: Tue, 20 Jun 2017 14:00:02 +0200 Subject: [PATCH] Merge branch 'postprocessing/exportscreenshot' into 'master' [postprocessing] Add pvpython script to export 2d screenshots See merge request !510 --- bin/postprocessing/exportscreenshot2d.py | 186 +++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 bin/postprocessing/exportscreenshot2d.py diff --git a/bin/postprocessing/exportscreenshot2d.py b/bin/postprocessing/exportscreenshot2d.py new file mode 100644 index 0000000000..d7a826a52e --- /dev/null +++ b/bin/postprocessing/exportscreenshot2d.py @@ -0,0 +1,186 @@ +#### TODO: +# - different colors for legend +# - read-in pvds with time outputs +# - read-in multiple vtus, e.g. for multidomain +# - rendering method 2d and 3d + +# parse arguments +import argparse +import os +import sys + +bool = ['True','False'] +parameterType = ['CELLS','POINTS'] +legendOrientation = ['Horizontal','Vertical'] +parser = argparse.ArgumentParser( + prog='\033[1m\033[94m' + 'pvbatch' + '\033[0m' + ' ' + sys.argv[0], + description='Export a screenshot of a standard 2D plot. To change the color palette, change the default in the paraview GUI.' +) +# on/off-type features +offscreen = parser.add_mutually_exclusive_group(required=False) +offscreen.add_argument('--offscreen', dest='offscreen', action='store_true', help='Enable offscreen rendering (large pixel size)') +offscreen.add_argument('--no-offscreen', dest='offscreen', action='store_false', help='Disable offscreen rendering (low pixel sizes)') +parser.set_defaults(offscreen=False) +showaxesgrid = parser.add_mutually_exclusive_group(required=False) +showaxesgrid.add_argument('--showAxesGrid', dest='showAxesGrid', action='store_true', help='Show the axes grid for the domain') +showaxesgrid.add_argument('--no-showAxesGrid', dest='showAxesGrid', action='store_false', help='Do not show the axes grid for the domain') +parser.set_defaults(showAxesGrid=False) +showlegend = parser.add_mutually_exclusive_group(required=False) +showlegend.add_argument('--showLegend', dest='showLegend', action='store_true', help='Show the parameter legend/range') +showlegend.add_argument('--no-showLegend', dest='showLegend', action='store_false', help='Do not show the parameter legend/range') +parser.set_defaults(showLegend=True) +showorientaxes = parser.add_mutually_exclusive_group(required=False) +showorientaxes.add_argument('--showOrientationAxes', dest='showOrientationAxes', action='store_true', help='Show the orientation axis') +showorientaxes.add_argument('--no-showOrientationAxes', dest='showOrientationAxes', action='store_false', help='Do not the orientation axis') +parser.set_defaults(showOrientationAxes=False) +# more complicated features +parser.add_argument('-f', '--files', nargs='+', required=True, help="vtu files to be processed") +parser.add_argument('-o', '--outputDirectory', default='', help="Directory to which the pcitures are written") +parser.add_argument('-of', '--outFile', default='', help="Basename of the written png file") +parser.add_argument('-p', '--parameter', default='', help='The name of the parameter to be plotted') +parser.add_argument('-pc', '--parameterComponent', type=int, default=-1, help='Plot only a specific component of a vector (default: magnitude=-1)') +parser.add_argument('-pr', '--parameterRange', type=float, nargs=2, default=[0, 0], help='Adjustment of the color rane (default: min/max)') +parser.add_argument('-pt', '--parameterType', choices=parameterType, default='CELLS', help='The type of the data field (CELLS or POINTS)') +parser.add_argument('-lo', '--legendOrientation', choices=legendOrientation, default='Horizontal', help='The name of the parameter to be plotted') +parser.add_argument('-lp', '--legendPosition', type=float, nargs=2, default=[0.25, 0.0], help='The position of the legend') +parser.add_argument('-lz', '--legendZoom', type=float, nargs=2, default=[0.5, 0.5], help='The zoom of the legend') +parser.add_argument('-lt', '--legendTitle', default='', help="Title of the legend") +parser.add_argument('-lct', '--legendComponentTitle', default='none', help="Title of the legend component") +parser.add_argument('--size', type=int, nargs=2, default=[600, 400], help="The pixel size of the png file (default: 600x400)") +parser.add_argument('--scale', type=float, nargs=3, default=[1.0, 1.0, 1.0], help="Scaling factors in each direction") +parser.add_argument('--whiteBackground', dest='whiteBackground', action='store_true', help="Sets a white background") +parser.add_argument('-v', '--verbosity', type=int, default=2, help='Verbosity of the output') +args = vars(parser.parse_args()) + +try: + from paraview.simple import * +except ImportError: + print("`paraview.simple` not found. Make sure using pvbatch.") + +# import locations +commonOutDirectory = False +outDirectory = args['outputDirectory'] +if not outDirectory == '': + outDirectory += '/' + commonOutDirectory = True + if not os.path.exists(outDirectory): + os.makedirs(outDirectory) + +# loop over all vtu files +counter = 1 +for curFile in args['files']: + # print progress to command line + fileWithoutPath = os.path.basename(curFile) + if not commonOutDirectory: + abspath = os.path.abspath(curFile) + outDirectory = os.path.dirname(abspath) + '/' + basename = os.path.splitext(fileWithoutPath)[0] + if args['verbosity'] == 1: + print("Processing file ({}/{}): {}".format(counter, len(args['files']), fileWithoutPath)) + counter += 1 + + # read vtu file and print available parameters + vtuFile = XMLUnstructuredGridReader(FileName=curFile) + if args['parameter'] == '': + print "\nNo parameter was specified, use '-p PARAMETER' to specify it. Available parameters are:" + if args['parameterType'] == 'CELLS': + print vtuFile.CellArrayStatus + else: + print vtuFile.PointArrayStatus + exit(1) + + # get active view + renderView1 = GetActiveView() + if not renderView1: + # When using the ParaView UI, the View will be present, not otherwise. + renderView1 = CreateRenderView() + + # print additional help message for large picture sizes + if (args['size'][0] > 1024 or args['size'][1] > 1024) and args['offscreen'] == False: + print "\nIt seems like you want to export a picture greater then your actual screen size. Use:" + print "pvbatch --use-offscreen-rendering SCRIPT OPTIONS --offscreen" + exit(2) + renderView1.ViewSize = args['size'] + + if args['showOrientationAxes'] == False: + renderView1.OrientationAxesVisibility = 0 + + if args['showAxesGrid'] == True: + renderView1.AxesGrid.Visibility = 1 + + # show data in view + vtuFileDisplay = Show(vtuFile, renderView1) + vtuFileDisplay.Scale = args['scale'] + + # reset view to fit data + renderView1.ResetCamera() + + # set scalar coloring + ColorBy(vtuFileDisplay, (args['parameterType'], args['parameter'])) + + # show color bar/color legend + if args['showLegend'] == True: + vtuFileDisplay.SetScalarBarVisibility(renderView1, True) + + # get color transfer function/color map for the parameter + parameterLUT = GetColorTransferFunction(args['parameter']) + + # plot only a specific vector component + if args['parameterComponent'] != -1: + parameterLUT.VectorMode = 'Component' + parameterLUT.VectorComponent = args['parameterComponent'] + #if args['parameterRange'][0] == 0 and args['parameterRange'][1] == 0: + #vtuFileDisplay.RescaleTransferFunctionToDataRange(False) + if args['showLegend'] == True: + velocityLUTColorBar = GetScalarBar(parameterLUT, renderView1) + velocityLUTColorBar.Title = args['parameter'] + velocityLUTColorBar.ComponentTitle = str(args['parameterComponent']) + + # adjust the range of the legend + if args['parameterRange'][0] != 0 or args['parameterRange'][1] != 0: + mean = (args['parameterRange'][0] + args['parameterRange'][1]) / 2 + parameterLUT.RGBPoints = [args['parameterRange'][0], 0.231373, 0.298039, 0.752941, + mean, 0.865003, 0.865003, 0.865003, + args['parameterRange'][1], 0.705882, 0.0156863, 0.14902] + if args['parameterRange'][0] == 0 and args['parameterRange'][1] == 0: + vtuFileDisplay.RescaleTransferFunctionToDataRange(False) + + # the placement and size of the legend + legend = GetScalarBar(parameterLUT, renderView1) + legend.Position = args['legendPosition'] + legend.Position2 = args['legendZoom'] + legend.Orientation = args['legendOrientation'] + + # rename the legend if desired + if args['legendTitle'] != '': + legend.Title = args['legendTitle'] + if args['legendComponentTitle'] != 'none': + legend.ComponentTitle = args['legendComponentTitle'] + + # set a white background color and black color for fonts and the grid + if args['whiteBackground'] == True: + renderView1.Background = [255, 255, 255] + legend.TitleColor = [0.0, 0.0, 0.0] + legend.LabelColor = [0.0, 0.0, 0.0] + if args['showAxesGrid'] == True: + renderView1.AxesGrid.GridColor = [0.0, 0.0, 0.0] + renderView1.AxesGrid.XTitleColor = [0.0, 0.0, 0.0] + renderView1.AxesGrid.YTitleColor = [0.0, 0.0, 0.0] + renderView1.AxesGrid.ZTitleColor = [0.0, 0.0, 0.0] + renderView1.AxesGrid.XLabelColor = [0.0, 0.0, 0.0] + renderView1.AxesGrid.YLabelColor = [0.0, 0.0, 0.0] + renderView1.AxesGrid.ZLabelColor = [0.0, 0.0, 0.0] + + # current camera placement for renderView1 + renderView1.InteractionMode = '2D' + #renderView1.CameraPosition = [5.0, 0.12345, 0.0] + #renderView1.CameraFocalPoint = [5.0, 0.12345, 0.0] + + # uncomment the following to render all views + RenderAllViews() + UseOffscreenRenderingForScreenshots = 1 + + # save screenshot + if not args['outFile'] == '': + basename = args['outFile'] + SaveScreenshot(outDirectory + basename + '.png') -- GitLab