OCC entities for arbitrary 3D geometry

OCC entities for arbitrary 3D geometry#

While meshwell provides convenient polygon-based entities (PolySurface, PolyPrism), you can also wrap arbitrary OpenCASCADE shapes via OCC_entity. This gives you full access to the OCP geometric modeler while still benefiting from meshwell’s fragment/tagging/meshing workflow.

from functools import partial

from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox
from OCP.gp import gp_Pnt

from meshwell.cad_occ import cad_occ
from meshwell.occ_entity import OCC_entity
from meshwell.occ_xao_writer import write_xao
/home/runner/work/meshwell/meshwell/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
def _make_box():
    return BRepPrimAPI_MakeBox(gp_Pnt(0, 0, 0), 1, 1, 1).Shape()


box_entity = OCC_entity(
    occ_function=_make_box,
    physical_name="box",
    mesh_order=1,
    dimension=3,
)

write_xao(cad_occ([box_entity]), "box.xao")

You can wrap any zero-argument callable that returns a TopoDS_Shape: primitives, boolean results, imported STEP bodies, etc. For parameterized shapes, use functools.partial or a closure.

def cylinder(radius, height):
    from OCP.BRepPrimAPI import BRepPrimAPI_MakeCylinder

    return BRepPrimAPI_MakeCylinder(radius, height).Shape()


custom_entity = OCC_entity(
    occ_function=partial(cylinder, radius=0.5, height=2.0),
    physical_name="cyl",
    mesh_order=1,
    dimension=3,
)

write_xao(cad_occ([custom_entity]), "cyl.xao")

Use OCC_entity when you need:

  • Primitive shapes beyond polygon extrusion (spheres, cones, tori)

  • Shapes from external STEP / BREP files

  • Any OCP boolean composition you want processed as a single labeled entity