文章目录
探查说明
Tcl 能完成实体探查、相对位置筛选,以及部分模型的源面和目标面候选识别。但"任意形状、任意描述都能自动识别"目前不能保证。你现有 Agent 缺少的核心是"先查询、读取结果、再生成操作脚本"的流程,单独扩大 RAG 不够。
我已把完整函数体和示例写出来,没有继续运行 HyperMesh:
以下是官方文档核查结果和设计方案,不是实际运行通过的声明。
一、是否需要再建一个"模型探查知识库"? :codex-annotation{index="1"}
需要补充探查能力的知识组织,但不用针对每一种用户表述另建知识库。而且,你当前代码里已经登记了这些命令:
text
hm_getboundingbox
hm_getcentroid
hm_getvolumeofsolid
hm_getsurfacesfromsolid
hm_getplanarfaces
hm_getsurfacefromface
hm_getsurfacenormalatcoordinate
问题是,它们被放在 special_industry_workflows 的 P3 分组 ;而 get_alias_index 明确跳过 P3。这意味着登记了命令,并不等于用户说"左边那个"时能召回它。
所以首先应做:
- 把这些命令组织成
model_inventory、target_resolution、source_target_discovery三组。 - 补完整的查询流程示例,包括返回值和适用条件。
- 核对对应文档是否真正进入 Chroma;缺失的文档再补充入库。
- 将查询阶段与网格生成阶段分开检索,避免都挤进当前最多 8 张候选命令卡里。
二、有没有真正的探查命令?ID 怎样与用户要的实体对应? :codex-annotation{index="2"} :codex-annotation{index="5"}
有。下面这段直接读取当前已导入模型,不预设实体 ID:
tcl
*createmark solids 1 all
set solid_ids [lsort -integer [hm_getmark solids 1]]
set rows [dict create]
set index 0
foreach sid $solid_ids {
incr index
*createmark solids 2 "by id only" $sid
set center [hm_getcentroid solids 2]
set bbox [hm_getboundingbox solids 2 0 0 0]
set volume [hm_getvolumeofsolid solids $sid]
set surfaces [hm_getsurfacesfromsolid $sid bounding]
dict set rows $sid [dict create \
id $sid \
label S$index \
center $center \
bbox $bbox \
volume $volume \
surfaces $surfaces]
puts [list SOLID [dict get $rows $sid]]
}
它在做五件事:
- 查出当前模型有哪些实体,取得实际 ID。
- 查询每个实体的几何中心。
- 查询每个实体的包围盒。
- 查询体积。
- 查询该实体对应的边界面 ID。
hm_getcentroid 支持查询实体和曲面的几何中心;hm_getsurfacesfromsolid 返回指定实体所属的 surface ID。中心查询文档、实体边界面查询文档
例如,假设查询结果是:
| 临时标签 | 真实 ID | 中心 X | 体积 |
|---|---|---|---|
| S1 | 17 | −40 | 1000 |
| S2 | 42 | 40 | 2000 |
那么:
- "全局 X 方向左边那个"通过比较 X,得到 17。
- "体积较大的那个"通过比较体积,得到 42。
- "S2"通过本次展示的标签映射,得到 42。
不是先定一个 ID,再猜它是什么实体;是先查询所有实体的事实,再按用户描述筛选出 ID。
上次那段代码只做到了"列出事实",没有把后面的筛选补全,这确实不完整。
三、用户只说相对位置,怎样写 Tcl? :codex-annotation{index="4"} :codex-annotation{index="6"}
不需要用户提供坐标,坐标由 Tcl 查出来。用户提供的是关系。
完整示例文件中已经定义了 mq::unique_extreme 等函数,包含比较、容差和并列检测。以下调用不依赖预先指定的实体 ID:
tcl
source {D:/Altair_Agent_Knowledge/0714/project827/artifacts/tcl_probe_20260926/geometry_query_examples.tcl}
set rows [mq::inventory]
mq::publish $rows
# 示例 A:按全局 X,几何中心最靠左的实体
set sid [mq::unique_extreme $rows x min 1e-6]
mq::mark_target $rows $sid
其他要求分别对应:
tcl
# 示例 B:按全局 Z,几何中心最高的实体
set sid [mq::unique_extreme $rows z max 1e-6]
# 示例 C:体积最大的实体
set sid [mq::unique_extreme $rows volume max 1e-6]
# 示例 D:用户从刚才展示的清单中选择 S2
set sid [mq::by_label $rows S2]
# 示例 E:同一个 HyperMesh GUI 当前画面中最靠左的实体
set sid [mq::unique_extreme $rows screen_x min 1.0]
# 示例 F:同一个 GUI 当前画面中最靠上的实体
set sid [mq::unique_extreme $rows screen_y min 1.0]
这里有两个必须说清的边界:
- "最高"究竟是位置最高,还是自身高度最大,需要按用户语义选择对应属性。上面的 B 是中心位置最高。
screen_x/screen_y使用官方hm_viewproject,属于 GUI 命令 。独立 hmbatch 不知道用户桌面当前朝向,所以当前纯批处理流程不能直接理解"我屏幕左边那个"。必须传入实际视图信息,或采用用户已看到的统一展示视图。投影命令文档
不能把屏幕左边默认为全局 X 最小。
你要求其他指代也逐一交代,结论如下:
| 指代 | 当前能否给出可靠实现 |
|---|---|
| 已明确方向中的最左、最上 | 可以,查询坐标后比较 |
| 体积较大 | 可以,查询体积后比较 |
| 从已展示清单中选 S2 | 可以,使用本次标签映射 |
| "其中一个",没有任何区别 | 不能唯一确定,应返回待选择 |
| "那个圆锥"适用于任意输入模型 | 目前没有提供可靠通用识别器,不能算已解决 |
对应未解决情况,示例里明确返回状态,而不是偷偷选第一个:
tcl
# 多实体且无区分信息时,返回 NEEDS_TARGET_SELECTION
set sid [mq::unspecified_target $rows]
# 当前没有实现通用圆锥识别,返回 UNSUPPORTED_SHAPE_PREDICATE
set sid [mq::select_by_shape_name $rows cone]
"只有一个底面"等特征不足以证明是圆锥。找不到可靠识别算法时,就应该承认这条自动识别路线尚未实现。
四、源面和目标面能否由 Tcl 自己确定? :codex-annotation{index="3"}
对于普通圆柱、同轴圆台等具有两个合适平面端面的模型,可以用 Tcl 找到候选端面;对于任意复杂实体,不能保证通用确定。
这次查到了完整命令链:
| 步骤 | 官方 Tcl 命令 |
|---|---|
| 查目标实体有哪些边界面 | hm_getsurfacesfromsolid |
| 查 surface 包含哪些几何 face | hm_getfacesfromsurface |
| 查询哪些 face 是平面 | hm_getplanarfaces |
| 将 face 对应回 surface | hm_getsurfacefromface |
| 查询面中心 | hm_getcentroid |
| 查询面法向 | hm_getsurfacenormalatcoordinate |
尤其需要注意:hm_getplanarfaces 返回的是 face ID,不能直接当作 solidmap 使用的 surface ID。 平面查询文档、法向查询文档
完整示例中的 mq::cap_candidates 已经实现以下算法:
- 查询目标实体的边界 surface。
- 找出其中由单个平面 face 构成的 surface。
- 查询这些面的中心和法向。
- 检查是否恰好有两个合适候选。
- 检查法向平行、两面分离、中心连线沿法向。
- 返回查询得到的真实源面、目标面 ID。
例如,从"体积最大的实体"一直到端面 ID,调用是:
tcl
source {D:/Altair_Agent_Knowledge/0714/project827/artifacts/tcl_probe_20260926/geometry_query_examples.tcl}
set rows [mq::inventory]
# 自动查询并选出唯一体积最大的实体
set sid [mq::unique_extreme $rows volume max 1e-6]
# 自动查询、比较平面端面,取得真实 surface ID
set caps [mq::cap_candidates $sid auto]
puts [list TARGET_SOLID $sid \
SOURCE [dict get $caps source] \
DESTINATION [dict get $caps destination]]
这里的 cap_candidates 不是没有实现的占位函数,完整函数体就在提供的 Tcl 文件中。
随后才能使用返回的 ID:
tcl
*createmark solids 1 "by id only" $sid
*createmark surfs 1 "by id only" [dict get $caps source]
*createmark surfs 2 "by id only" [dict get $caps destination]
*solidmap_solids_begin2 1 1 2 2048 4.0
*solidmap_solids_end
但要准确区分:
- 找到几何上合适的端面候选:这份脚本有明确实现。
- 保证整个实体一定能成功映射:这份脚本没有证明,需要结合拓扑和实际网格结果。
- 完整尖顶圆锥:只有一个平面端面,这份规则应直接返回"不适用",不能编造第二个端面。
- 多块端面、弯曲扫掠、复杂装配:超出这个保守示例的范围,需要另外的算法。
因此,上次说"确定源面、目标面后调用"确实跳过了关键步骤;这次补全了受限范围内的候选识别实现,没有把它包装成任意模型的通用解决方案。
五、怎样让你的 Agent 写出这些脚本,而不是仍然直接猜 ID?
建议把当前流程从:
text
用户请求 → 检索网格命令 → 写网格 Tcl → 执行
改为:
text
用户请求
→ 生成查询 Tcl
→ 执行查询并返回事实
→ 根据事实筛选目标,必要时继续查询
→ 生成网格 Tcl
→ 执行并验证
所有几何控制仍然通过 Tcl。Python 只负责调度、接收结果和维护模型状态。
需要落到代码里的三个改变:
-
增加
QUERY操作类型。当前执行工具会自动补保存逻辑,并关注是否生成 HM;查询阶段应允许只打印实体事实,不画网格、不要求输出 HM。
-
把"缺少模型事实时先查询"设为强制流程。
不能只在提示词中建议。新模型尚未探查、目标未唯一确定时,状态机不能进入网格执行阶段。
-
让模型读取查询结果后再继续。
RAG 返回的是"如何查询";实际 Tcl 返回的是"这个模型里有什么"。后者必须进入当前会话状态,不能让 LLM 从文档示例里抄实体编号。
可以给查询阶段这样的明确约束:
text
当前模型事实不足时,先生成只读 QUERY Tcl。
实体和面 ID 必须来自当前模型的查询结果。
用户给相对关系;位置、尺寸、体积由 Tcl 查询。
候选不唯一时继续查询或请求选择,不按 ID 顺序猜测。
缺少特征识别能力时返回 UNSUPPORTED_PREDICATE。
目标唯一确定之前禁止生成网格。
六、用户特征千奇百怪,怎样避免无限扩建知识库?
把表达拆成可组合的属性和关系,而不是收集所有句子:
text
"右边两个里面体积较大的那个"
= 明确右方向
+ 形成右侧候选集合
+ 查询候选体积
+ 取唯一最大值
位置、尺寸、体积、面积、邻接、平面、法向等是底层能力;LLM 负责把句子组合成查询和筛选步骤。
但"像喷嘴的那个""最危险的那个"可能需要形状识别或载荷信息。RAG 能教模型使用已有算法,不能替代尚未实现的识别算法。
对你当前项目,最实际的方案是:先修正现有探查命令的 P3 路由,增加 QUERY → 读取事实 → 选择目标 → MESH 流程,优先支持可计算的相对属性;通用形状识别和复杂扫掠拓扑明确作为后续能力。