quickrecipes/export.py
# ----------------------------------------------------------------------------
#  CLASSES: nightly
#
#  Cyrus Harrison, Tue Sep 16 11:19:26 PDT 2025
# 
#  Modifications:
#    Justin Privitera, Fri Aug 14 15:52:42 PDT 2026
#    Added OBJ export quickrecipe.
# ----------------------------------------------------------------------------

from os.path import join as pjoin


def clean_data(path):
  print(path)
  if os.path.isfile(path):
    os.remove(path)
  elif os.path.isfile(path):
    # Note: assumes passed dir is already empty
    os.rmdir(path)

def export_to_vtk():
  clean_data("my_vtk_export.vtk")
  # exportToVTK {
  # Create a Pseudocolor plot and export multiple fields
  AddPlot("Pseudocolor", "d")
  # optional: setup operators to modify data before export
  DrawPlots()
  eatts = ExportDBAttributes()
  eatts.filename = "my_vtk_export"
  eatts.db_type = "VTK"
  eatts.variables = ("d","p")
  ExportDatabase(eatts)
  # exportToVTK }
  TestValueEQ("qr_export_to_vtk",os.path.isfile("my_vtk_export.vtk"),True)

def export_to_silo():
  clean_data("my_silo_export.silo")
  # exportToSilo {
  # Create a Pseudocolor plot and export multiple fields
  AddPlot("Pseudocolor", "d")
  # optional: setup operators to modify data before export
  DrawPlots()
  eatts = ExportDBAttributes()
  eatts.filename = "my_silo_export"
  eatts.db_type = "Silo"
  eatts.variables = ("d","p")
  ExportDatabase(eatts)
  # exportToSilo }
  TestValueEQ("qr_export_to_silo",os.path.isfile("my_silo_export.silo"),True)
  DeleteAllPlots()

def export_to_blueprint():
  clean_data("my_blueprint_export.cycle_000048.root")
  # exportToBlueprint {
  # Create a Pseudocolor plot and export multiple fields
  AddPlot("Pseudocolor", "d")
  # optional: setup operators to modify data before export
  DrawPlots()
  eatts = ExportDBAttributes()
  eatts.filename = "my_blueprint_export"
  eatts.db_type = "Blueprint"
  eatts.variables = ("d","p")
  ExportDatabase(eatts)
  # exportToBlueprint }
  TestValueEQ("qr_export_to_blueprint",os.path.isfile("my_blueprint_export.cycle_000048.root"),True)
  DeleteAllPlots()

def export_to_csv():
  clean_data(pjoin("my_csv_export.csv","element_data.csv"))
  clean_data(pjoin("my_csv_export.csv","vertex_data.csv"))
  # clean up dir last 
  clean_data("my_csv_export.csv")
  # exportToBlueprintCSV {
  # Create a Pseudocolor plot and export multiple fields
  AddPlot("Pseudocolor", "d")
  # optional: setup operators to modify data before export
  DrawPlots()
  eatts = ExportDBAttributes()
  eatts.filename = "my_csv_export"
  eatts.db_type = "Blueprint"
  opts = GetExportOptions("Blueprint")
  eatts.variables = ("d","p")
  opts["Operation"] = "Flatten_CSV"
  ExportDatabase(eatts,opts)
  # exportToBlueprintCSV }
  TestValueEQ("qr_export_to_csv",os.path.isdir("my_csv_export.csv"),True)
  TestValueEQ("qr_export_to_csv_vertex",os.path.isfile(pjoin("my_csv_export.csv","element_data.csv")),True)
  TestValueEQ("qr_export_to_csv_cell",os.path.isfile(pjoin("my_csv_export.csv","vertex_data.csv")),True)
  DeleteAllPlots()

def export_to_obj():
  clean_data("my_obj_export.obj")
  clean_data("my_obj_export.mtl")
  clean_data("my_obj_export.png")
  # exportToOBJ {
  # Create a Pseudocolor plot and export a single field
  AddPlot("Pseudocolor", "d")
  # optional: setup operators to modify data before export
  DrawPlots()
  eatts = ExportDBAttributes()
  eatts.db_type = "WavefrontOBJ"
  eatts.variables = ("d")
  eatts.filename = "my_obj_export"

  # fetch Pseudocolor plot attributes to hand to OBJ export options
  # (assumes your current active plot is a pseudocolor plot)
  pc_atts = GetPlotOptions()

  opts = GetExportOptions("WavefrontOBJ")
  opts["Output colors"]              = 1 # turn colors on (1) or off (0)
  opts["Color table"]                = pc_atts.colorTableName # choose a color table by name
  opts["Number of colors"]           = 256 # choose a color table resolution
  opts["Invert color table"]         = pc_atts.invertColorTable
  opts["Use minimum"]                = pc_atts.minFlag
  opts["Minimum"]                    = pc_atts.min
  opts["Use color for values < min"] = pc_atts.useBelowMinColor
  opts["Color for values < min"]     = pc_atts.belowMinColor
  opts["Use maximum"]                = pc_atts.maxFlag
  opts["Maximum"]                    = pc_atts.max
  opts["Use color for values > max"] = pc_atts.useAboveMaxColor
  opts["Color for values > max"]     = pc_atts.aboveMaxColor

  ExportDatabase(eatts, opts)
  # exportToOBJ }
  TestValueEQ("qr_export_to_obj",os.path.isfile("my_obj_export.obj"),True)
  TestValueEQ("qr_export_to_obj_mtl",os.path.isfile("my_obj_export.mtl"),True)
  TestValueEQ("qr_export_to_obj_png",os.path.isfile("my_obj_export.png"),True)
  DeleteAllPlots()


OpenDatabase(silo_data_path("rect3d.silo"))
export_to_vtk()
export_to_silo()
export_to_blueprint()
export_to_csv()
export_to_obj()

Exit()