Проверка и исправление геометрии

Проверка: validate и assert_valid

validate() возвращает отчёт об ошибках, is_valid() — признак корректности. assert_valid() выбрасывает ShapeValidationError, если форма некорректна. Эти методы ничего не исправляют.

import zencad as z

body = z.box(10)
report = body.validate()
assert report.valid
print(report.to_dict())
body.assert_valid()

Валидность не означает замкнутость тела. Для проверки итогового solid используйте zencad check model.py --valid --solid. Формат отчёта.

unify

Удаляет лишние рёбра и объединяет грани одной поверхности. Работает с двумерными и трёхмерными объектами. Для такого упрощения также доступен метод body.clean().

from zencad import *

body = cylinder(r=10, h=10) + cylinder(r=10, h=10).move(5, 5)
simplified = unify(body)
simplified.assert_valid()
display(simplified)
show()
До После

heal — исправление дефектов геометрии

Исправляет дефекты средствами OpenCascade, создавая новую форму. Результат нужно проверить: исправление не всегда возможно.

В примере (box-reversed-face.brep) — куб 10 × 10 × 10 с неправильно ориентированной гранью.

from pathlib import Path
import zencad as z

body = z.from_brep(Path(__file__).with_name("box-reversed-face.brep"))
before = body.validate()
print(before.valid)  # False
print([issue.code for issue in before.issues])
# ['bad_orientation_of_subshape']

fixed = body.heal(tolerance=1e-7, max_tolerance=1e-3)
fixed.assert_valid()
print(fixed.is_valid())  # True
print(round(float(fixed.mass()), 6))  # 1000.0

assert not body.is_valid()
z.display(fixed)
z.show()

heal исправляет ориентацию грани; исходная форма остаётся неизменной. tolerance задаёт рабочую точность, max_tolerance — верхнюю границу допуска, в единицах модели.