静态柔性建模
cadflow.flexible 将稀疏的三维控制网格转换为确定性的索引三角网格。当布料、皮革、膜、护罩、服装或其他柔性零件的目标形态已经确定时,可以使用这一模块构造最终几何。
这里的静态表示预先设计的最终形态。该模块不求解平衡状态,不推进时间,也不会根据载荷、重力、接触或材料定律计算变形。
选择建模对象
| 对象 | 职责 |
|---|---|
FlexibleMaterial | 保存厚度和外观元数据 |
FlexiblePanel | 定义单个控制网格曲面及其采样密度 |
FlexiblePanelMesh | 保存单个 Panel 构建后的顶点、法向和三角形 |
FlexibleModel | 将多个具名 Panel 合并为一个确定性网格 |
FlexibleMesh | 提供测量、Panel 范围和 OBJ/STL/JSON 导出 |
RingSection / sectioned_panel | 从设计好的椭圆截面构建周期 Panel |
从控制网格构建 Panel
控制点的形状为 (rows, columns, 3)。控制网格描述几何形态,采样密度决定输出三角网格的细度。
from cadflow.flexible import FlexibleMaterial, FlexibleModel, FlexiblePanel
control_points = [
[(0, 0, 0), (0, 50, 6), (0, 100, 0)],
[(60, 0, 4), (60, 50, 18), (60, 100, 4)],
[(120, 0, 0), (120, 50, 6), (120, 100, 0)],
]
panel = FlexiblePanel(
name="formed cover",
control_points=control_points,
sample_rows=40,
sample_columns=48,
material=FlexibleMaterial(
name="coated fabric",
thickness=1.2,
color=(0.16, 0.42, 0.58),
roughness=0.7,
),
)
model = FlexibleModel("protective cover")
model.add_panel(panel)
mesh = model.build()
print(mesh.vertex_count, mesh.triangle_count)
print(mesh.bounds, mesh.surface_area, mesh.is_watertight)
控制网格至少需要两行两列,所有坐标都必须是有限数。sample_rows 和 sample_columns 必须是整数,并且不能小于对应的控制网格维度。
控制接缝、厚度与分辨率
- 控制列围成闭合截面时设置
periodic_columns=True。环上的控制列应各不相同,不要在末尾重复第一列。 - 材料厚度设为
0时生成单层曲面。正厚度会沿法向生成两层偏移曲面,并对剩余边界进行三角化,从而形成闭合薄壳。 - 下游产物需要更细密的三角形时,可以提高采样数。采样只改变网格密度,不会改变输入控制网格。
- 尺寸、厚度和下游公差应始终采用同一单位系统。
从截面构建周期 Panel
sectioned_panel 适合管状或服装类形态。每个 RingSection 在任意三维平面中定义一个椭圆;可选的褶皱参数会施加确定性的径向调制。
from cadflow.flexible import (
FlexibleMaterial,
FlexibleModel,
RingSection,
sectioned_panel,
)
sections = [
RingSection(
center=(0, 0, 0),
axis_u=(1, 0, 0),
axis_v=(0, 1, 0),
radius_u=200,
radius_v=120,
wrinkle_amplitude=0.02,
wrinkle_count=7,
),
RingSection(
center=(0, 0, 500),
axis_u=(1, 0, 0),
axis_v=(0, 1, 0),
radius_u=240,
radius_v=140,
),
]
panel = sectioned_panel(
"sleeve",
sections,
control_columns=24,
sample_rows=48,
sample_columns=72,
material=FlexibleMaterial(name="woven shell", thickness=1.5),
)
model = FlexibleModel("sectioned shell")
model.add_panel(panel)
mesh = model.build()
wrinkle_amplitude 属于设计几何的一部分,并不是物理载荷计算得到的位移。如果一个产物包含多个独立部件,可以继续向同一个 FlexibleModel 添加名称唯一的 Panel。mesh.panels 会保留每个 Panel 的顶点范围、三角形范围和材料。
检查与导出
if mesh.vertex_count == 0 or mesh.triangle_count == 0:
raise RuntimeError("flexible mesh is empty")
for panel_range in mesh.panels:
print(panel_range.name, panel_range.vertex_count, panel_range.triangle_count)
mesh.write_obj("outputs/sectioned-shell.obj")
mesh.write_stl("outputs/sectioned-shell.stl")
mesh.write_json("outputs/sectioned-shell.json")
OBJ 会保留 Panel 分组和顶点法向;二进制 STL 包含合并后的三角网格;JSON 记录 Panel 范围、材料元数据、包围盒、表面积和水密性。
交付前应检查顶点数、三角形数和包围盒,验证周期接缝连续,并在正厚度 Panel 应当闭合时确认 is_watertight。还应检查每个输出文件存在且非空。
执行边界
原生 C++ 构建器负责 Catmull-Rom 采样、周期接缝处理、顶点法向构造、法向厚度偏移和边界墙三角化。Python 负责控制几何、材料元数据、多 Panel 组合、测量和导出。每个 Panel 通过一次无状态数组调用跨越边界;原生构建器不会保留运动状态或 Python 回调。