Source code for geouned.GEOReverse.core

import typing
import FreeCAD
import Import

from pathlib import Path

from .Modules.buildCAD import buildCAD, makeTree
from .Modules.MCNPinput import McnpInput
from .Modules.Objects import CadCell
from .Modules.XMLinput import XmlInput


[docs] class CsgToCad: """Base class for the conversion of CSG to CAD models""" def __init__(self): pass
[docs] def export_cad( self, input_filename: str, csg_format: str, output_filename: str = "cad_from_csg", bounding_box: typing.Tuple[int, int, int, int, int, int] = (-1000, -1000, -1000, 1000, 1000, 1000), universe_start: int = 0, level_max: str = "all", cell_range_type: str = "all", cell_range: typing.Tuple[int] = (), mat_range_type: str = "all", mat_range: typing.Tuple[int] = (), # TODO add these to the method signature # splitTolerance in the Options class # mat = this is in the CADselection dictionary but not in the docs https://github.com/GEOUNED-org/GEOUNED/blob/76ef697c7dca6a828c7498996ff3313859c872f2/docs/User_Guide_GEOUNED_v2.0.pdf ): """export the CSG geometry in OpenMC or MCNP format to a CAD model. Args: input_filename (str): The filename and path of the input CSG text file. csg_format (str): The format of the CSG input file, options are 'openmc_xml' or 'mcnp' output_filename (str, optional): The filename stem and path of the output file created. Two files will be created with the '.step' suffix and one with the 'FCStd' suffix. Defaults to 'cad_from_csg'. bounding_box (typing.Tuple[int, int, int, int, int, int], optional): The bounding box coordinates of the CSG geometry. This should encompass the entire CSG geometry. Format is (xmin, ymin, zmin, xmax, ymax, zmax) Defaults to (-1000, -1000, -1000, 1000, 1000, 1000). universe_start (int, optional): The Universe ID to be converted to CAD. If universe_start is left as 0 then all the universes and any nested universes are converted. If set then the universe and all its nested universes are converted. Defaults to 0. level_max (str, optional): Level maximum of nested universe to be translated. If level_max < highest nested universe level, cells inside the container cell whose level is level_max will not be translated. This container cell will be the CAD solid written in the CAD file. Defaults to "all". cell_range_type (str, optional): Define how to consider the range values. setting to 'all' results in all the cells with any cell ID being converted (range a no effect). setting to 'include' results in only cells defined in 'range' being converted. setting to 'exclude' results in exclude all cells defined in range. Defaults to "all". cell_range (typing.Tuple[int], optional): list of cells to be included/excluded for the conversion. Defaults to (). mat_range_type (str, optional): Define how to consider the range values. setting to 'all' results in all the materials with any cell ID being converted (range a no effect). setting to 'include' results in only materials defined in 'range' being converted. setting to 'exclude' results in exclude all materials defined in range. Defaults to "all". mat_range (typing.Tuple[int], optional): list of materials to be included/excluded for the conversion. Defaults to (). Raises: ValueError: If the csg_format is not 'openmc_xml' or 'mcnp' then a ValueError is raised. """ # TODO check file extensions are correct # if Path(output_filename).suffix not in ['.stp', '.step']: # raise ValueError(f"output file must have a .stp or .step extension, not {universe_start.suffix}") # get geometry definition from OpenMC XML or MCNP input if csg_format == "mcnp": geo = McnpInput(input_filename) elif csg_format == "openmc_xml": geo = XmlInput(input_filename) else: msg = f"input format type {csg_format} is not supported. Supported options are 'openmc_xml' or 'mcnp'" raise ValueError(msg) Path(output_filename).parent.mkdir(parents=True, exist_ok=True) UnivCell = CadCell() UnivCell.shape = UnivCell.makeBox(FreeCAD.BoundBox(*bounding_box)) # TODO make these variable names lower case in the downstream code CADselection = { "Ustart": universe_start, "levelMax": level_max, "cell": [cell_range_type, cell_range], "mat": [mat_range_type, mat_range], "format": csg_format, "cell_range_type": cell_range_type, "cell_range": cell_range, "mat_range_type": mat_range_type, "mat_range": mat_range, } # TODO don't return fails variable, just fail in the method and raise the error there CADCells, fails = buildCAD(UnivCell, geo, CADselection) if fails: print("failed in conversion", fails) CADdoc = FreeCAD.newDocument("converted_with_geouned") makeTree(CADdoc, CADCells) Import.export(CADdoc.Objects[0:1], f"{output_filename}.step") CADdoc.saveAs(f"{output_filename}.FCStd")