Skip to content
Snippets Groups Projects
Commit 7cccf9a6 authored by Max Orok's avatar Max Orok
Browse files

First draft of t8.py

parent 04d9a63f
No related branches found
No related tags found
No related merge requests found
# This file reimplements gmsh/tutorial/t8.geo in Python.
# It demonstrates post-processing, animations and using options.
import gmsh
model = gmsh.model
factory = model.geo
# adapted t1.py section {{{
gmsh.initialize()
gmsh.option.setNumber("General.Terminal", 1)
lc = 1e-2
factory.addPoint(0, 0, 0, lc, 1)
factory.addPoint(.1, 0, 0, lc, 2)
factory.addPoint(.1, .3, 0, lc, 3)
factory.addPoint(0, .3, 0, lc, 4)
factory.addLine(1, 2, 1)
factory.addLine(3, 2, 2)
factory.addLine(3, 4, 3)
factory.addLine(4, 1, 4)
factory.addCurveLoop([4, 1, -2, 3], 1)
factory.addPlaneSurface([1], 1)
model.addPhysicalGroup(0, [1, 2], 1)
model.addPhysicalGroup(1, [1, 2], 2)
model.addPhysicalGroup(2, [1], 6)
model.setPhysicalName(2, 6, "My surface")
model.geo.synchronize()
# }}}
# -- begin t8.py --
# add post-processing views to work on
gmsh.merge("view1.pos")
gmsh.merge("view1.pos")
gmsh.merge("view4.pos") # contains 2 views inside
# set general options
option = gmsh.option
option.setNumber("General.Trackball", 0)
option.setNumber("General.RotationX", 0)
option.setNumber("General.RotationY", 0)
option.setNumber("General.RotationZ", 0)
white = (255, 255, 255)
black = (0, 0, 0)
# Color options are special
# Setting a color option of "X.Y" actually sets the option "X.Color.Y"
# Sets "General.Color.Background", etc.
option.setColor("General.Background", white[0], white[1], white[2])
# We can make our own shorter versions of repetitive methods
set_color = lambda name, c: option.setColor(name, c[0], c[1], c[2])
set_color("General.Foreground", black)
set_color("General.Text", black)
option.setNumber("General.Orthographic", 0)
option.setNumber("General.Axes", 0); option.setNumber("General.SmallAxes", 0)
# set options for each view
# If we were to follow the geo example blindly, we would
# read the number of views from the relevant option value
#
# Make sure to cast to int since getNumber returns a float
# v0 = int(option.getNumber("PostProcessing.NbViews")) - 4
# v1 = v0 + 1; v2 = v0 + 2; v3 = v0 + 3
# A nicer way is to use gmsh.view.getTags()
view_tags = [v0, v1, v2, v3] = gmsh.view.getTags()
# View name format helper function -- Returns "View[X]." for an input of X
view_fmt = lambda v: "View[" + str(v) + "]."
# option setter
def set_opt(name, val):
# if it's a string, call the string method
val_type = type(val)
if val_type == type("str"):
option.setString(name, val)
# otherwise call the number method
elif val_type == type(0.5) or val_type == type(1):
option.setNumber(name, val)
else:
print("error: bad input to set_opt: " + name + " = " + str(val))
print("error: set_opt is only meant for numbers and strings, aborting")
quit(1)
# We'll use this helper function for our views
set_view_opt = lambda v_num, name, val: set_opt(view_fmt(v_num) + name, val)
# v0
set_view_opt(v0, "IntervalsType", 2)
set_view_opt(v0, "OffsetZ", 0.05)
set_view_opt(v0, "RaiseZ", 0)
set_view_opt(v0, "Light", 1)
set_view_opt(v0, "ShowScale", 0)
set_view_opt(v0, "SmoothNormals", 1)
# v1
set_view_opt(v1, "IntervalsType", 1)
# can't set ColorTable in API yet
# option.setColorTable(view_opt[v1] + "ColorTable", "{ Green, Blue }")
set_view_opt(v1, "NbIso", 10)
set_view_opt(v1, "ShowScale", 0)
# v2
set_view_opt(v2, "Name", "Test...")
set_view_opt(v2, "Axes", 1)
set_color(view_fmt(v2) + "Axes", black)
set_view_opt(v2, "IntervalsType", 2)
set_view_opt(v2, "Type", 2)
set_view_opt(v2, "IntervalsType", 2)
set_view_opt(v2, "AutoPosition", 0)
set_view_opt(v2, "PositionX", 85)
set_view_opt(v2, "PositionY", 50)
set_view_opt(v2, "Width", 200)
set_view_opt(v2, "Height", 130)
# v3
set_view_opt(v3, "Visible", 0)
t = 0
# step through time for each view
for num in range(1, 4):
# update timesteps
for v in view_tags:
set_view_opt(v, "TimeStep", t)
# helper function to match the geo file's +=, -= operators for numbers
adjust_num_opt = lambda name, diff: set_opt(name, option.getNumber(name) + diff)
current_step = option.getNumber(view_fmt(v0) + "TimeStep")
max_step = option.getNumber(view_fmt(v0) + "NbTimeStep") - 1
if current_step < max_step:
t = t + 1
else:
t = 0
v0_max = option.getNumber(view_fmt(v0) + "Max")
adjust_num_opt(view_fmt(v0) + "RaiseZ", 0.01 / v0_max * t)
if num == 3:
set_opt("General.GraphicsWidth", option.getNumber("General.MenuWidth") + 640)
set_opt("General.GraphicsHeight", 480)
frames = 50
for num2 in range(frames):
adjust_num_opt("General.RotationX", 10)
set_opt("General.RotationY", option.getNumber("General.RotationX") / 3)
adjust_num_opt("General.RotationZ", 0.1)
gmsh.fltk.wait(0.01) # open the GUI, wait for 0.01s and resume execution
gmsh.graphics.draw()
# write out the graphics scene to an image file
# Gmsh will try to detect the file extension
if num == 3:
gmsh.write("t2-{:.2g}.gif".format(num2))
gmsh.write("t2-{:.2g}.ppm".format(num2))
gmsh.write("t2-{:.2g}.jpg".format(num2))
if num == 3:
pass
# Here we could make a system call to generate a movie. For example:
# import subprocess
# call_ffmpeg1 = "ffmpeg -hq -r 5 -b 800 -vcodec mpeg1video -i t8-%02d.jpg t8.mpg"
# call_ffmpeg2 = "ffmpeg -hq -r 5 -b 800 -i t8-%02d.jpg t8.asf"
# subprocess.call(call_ffmpeg1.split(' '))
# subprocess.call(call_ffmpeg2.split(' '))
# show the GUI at the end
gmsh.fltk.run()
gmsh.finalize()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment