跳到主要内容

静态柔性建模

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_rowssample_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 回调。