这里的“点云”不是照片扫描出来的点,而是SolidWorks 把零件的 CAD 曲面三角化后,按面返回的三维坐标点。每个点都有零件局部坐标,单位是毫米;点按所属面分组,所以能看出哪些点来自平面、圆柱面等。
读取用的是 SolidWorks 命令桥里的sample_part_face_point_cloud,底层调用PartFaceAnnotationService.TrySampleCurrentPart。返回的数据包含各面的三角网格点和面信息。另一个export_feudal3d_exact_part接口读取了特征树尺寸;切除-拉伸2的尺寸是 10 mm。
我把两类数据结合起来定位:
- 圆柱面的 X 范围约为
-6.5 到 3.5 mm,中点是-1.5 mm,半径是 5 mm,因此直径为 10 mm。 - 同一圆柱面的 Z 范围约为
332 到 342 mm,中点是337 mm;另一端对应-337 mm。 - 圆柱面贴着
y≈-492.75 mm的外壁,内壁约在y=-490.75 mm,所以切入轴沿 Y 方向。
因此,圆心位置是由各面上的三维点算出来的,10 mm 的特征尺寸则由 SolidWorks 特征树读出并相互核对。
具体实现分成三段:读取源几何、执行 Feudal3D 切除、刷新装配。
1. 从源件确定切除参数
源件数据使用 SolidWorks 命令桥读取。孔的圆柱面半径是 5 mm,因此直径为 10 mm;点云给出的中心是x=-1.5 mm、z=±337 mm,所在外表面约为y=-492.8 mm。零件长度方向是 Z,孔沿 Y 方向切入。
这里的坐标都是零件局部坐标,单位 mm。加到零件里的两个操作等价于:
{"id":"native-694-hole-neg","name":"切除-端部Ø10孔1","type":"cutCylinder","origin":[-1.5,-492.8,-337],"axis":[0,1,0],"depth":10,"diameter":10}另一个操作参数相同,只把 z 坐标改成337。origin是切除圆柱的起点,axis是切入方向。
2. 用 Feudal3D 内核算布尔切除
这不是单纯在画面上加个圆。Feudal3D 的实体内核会先按直径和深度生成圆柱工具,再根据origin和axis把它摆到零件坐标系中,最后从基体中做布尔减法。
相关实现位于 feudal3dNative.ts 和 feudal3dSolidKernel.ts:圆柱按弦高误差生成网格,内核检查切除后仍是有效实体,再输出计算后的顶点、三角形索引和体积。
3. 保存并刷新当前装配
两个cutCylinder操作写进项目里694焊接方管.SLDPRT|默认对应的共享零件数据,并重算、缓存结果网格。装配中的694焊接方管-1和694焊接方管-2都引用这份数据。
刷新时调用现有的/api/feudal3d-assembly-open接口发送项目快照;Feudal3D 页面收到后切换到该装配。接收逻辑在 Feudal3dPage.tsx。
所以这次没有新建一个通用 API:几何计算用 Feudal3D 已有的实体内核,项目刷新用已有的装配打开接口,写入的特征则保存在.f3d.json里。
这两个新增孔的布尔运算都成功,各去除约119.007 mm³,生成的网格有 1528 个三角形。先前存在的两个端部叉口特征没有改动;这次验证的是新增孔的参数和实体求值。