TopologyWatertight and Two-Manifold
For a closed solid, every edge should belong to exactly two consistently oriented triangles. Boundary edges indicate holes; more than two incident faces indicate nonmanifold branching. Duplicate faces and zero-area triangles confuse inside/outside tests even when the silhouette looks correct.
The 3MF Core specification defines manifold edges by shared endpoints and consistent pairing. Treat this as a precise topology condition, not a promise that the shape is physically sensible.
GeometrySelf-Intersection and Winding
Two watertight shells can still overlap. A single shell can pass through itself. Robust boolean union, intersection detection, or winding-number classification is needed before claiming one valid material volume. Face normals must point outward consistently so offsets and slicers agree about interior.
ProcessWall Thickness and Minimum Features
Minimum thickness is not universal. It depends on nozzle or laser spot, layer height, material, orientation, curvature, and whether the wall carries load. Measure local thickness in the direction between opposing surfaces, not merely edge length. Holes, embossed text, pins, and gaps each have their own resolution limit.
OrientationOverhangs, Supports, and Strength
An orientation changes support volume, contact scars, layer-aligned strength, build height, cooling, and failure risk. Optimize a weighted score rather than one magic angle. A cosmetic face may justify extra support elsewhere; a loaded hook may need layers running across its stress path.
ClearanceAssemblies Need Air
Nominally coincident parts fuse. Moving fits need deliberate clearance based on process calibration. Test coupons outperform generic internet numbers. Store intended fit class and printer profile alongside the geometry.
Code ExampleFast Diagnostics with Trimesh
import trimesh
mesh = trimesh.load_mesh("candidate.glb", force="mesh")
mesh.remove_unreferenced_vertices()
report = {
"watertight": mesh.is_watertight,
"winding_consistent": mesh.is_winding_consistent,
"euler_number": int(mesh.euler_number),
"components": len(mesh.split(only_watertight=False)),
"bounds_mm": (mesh.extents * 1000.0).tolist(),
}
if mesh.is_watertight and mesh.volume < 0:
mesh.invert()
print(report)
mesh.export("candidate-reviewed.3mf")
This is a first pass, not certification. Add collision tests, local thickness sampling, overhang analysis, and a real slicer preview before manufacturing.
Release GateInspect the Toolpath
Confirm shells, perimeters, bridges, sparse infill islands, unsupported starts, seam position, thin-wall substitution, and the first-layer footprint. A valid mesh can produce a bad toolpath; the toolpath is the final geometric interpretation.
