Object Oriented Python API
Ideas for an Object Oriented Python API
There are two possible tracks to follow on the road to providing VisIt with a more object oriented python API:
- Rewrite the guts of the Python API in an objected oriented manner.
- Wrap the existing interface with a higher level objected oriented layer.
Backward compatibility with the existing API is an important requirement so the second approach is our current focus.
From a data analysis stand point the current state machine like api can be pretty painful - here are some requests for an OO-api:
If you have a handle to an object you should be able to modify it & call update without any worry of what state VisIt is currently in.
For example: You have create a plot and add an operator. You have a handle to an operator & you want to make a change to some op attribute, and export the resulting dataset over time.
# # Imaginary Example Use Case: # db = Database("wave.visit") pc = Plot(db,"Pseudocolor","v") pc["centering"] = "nodal" isov = pc.add_operator("Isovolume") isov["variable"] = "v" isov["min"] = .1 pc.update() while db.has_next(): ts = db.next() pc.export(file_name="wave.exp.%40d.vtk" % ts,vars=("v","u"),export_type="VTK")
These modifications may translate to a long list of actual visit operations, for example:
- set the active window
- set the active database
- set the active plot
- activate a particular operator
- change the operator's attributes
- set the operator's attributes.
- export the plot
Proper bookkeeping to make this possible is going to be difficult.
Starting Point / Ideas for Useful Classes (loosely based on Cyrus attempt at wrapping for data analysis, with some new features):
# # (note for the outline of classes, pseudo python is used) # class Database(object): # general setup def init(path,host) def open() def close() # time step info & control def timestep() def set_timestep() def num_timesteps() # iterator like interface def has_next() def next() def reset() # time and cycle info def cycle() def time() #meta data def vars() def meshes() class Plot(object): # general setup & interaction def init(db,plot_type,var_name) def var() def set_var() def update() def hide() def show() def export(dir_name,file_name,vars,export_type) def materials() def select_materials(mats) # (or more general subsetting interface) # operator management def operators() def add_operator(op_inst) def remove_operator(op_inst) #proposed: interface change order of operators easily #proposed: access to plot attributes via get & set item (aka square brackets operator) class Operator(object): # general setup def init(op_type) #proposed: access to operator attributes via get & set item (aka square brackets operator) def update() class Window(object) def init(window_id) def render(output_name,options) # easy ability render a window def view() # some how sensibly manage the view properties ... class Engine(object): # general setup def init(host,visit_dir) def open(nprocs,partition,bank,wtime) def close()