You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenMesh属性管理器疑问:属性初始化与跨函数访问问题

OpenMesh命名属性相关问题解答

问题1:执行auto GroupMark = FProp<bool>(*this, "shellGroupMark");时,属性会被初始化吗?

分两种场景判断:

  • 属性未存在时:这行代码会为网格创建新的面命名属性,同时自动对所有面的属性值做默认初始化——bool类型默认设为false,数值类型设为0,自定义类型会调用其默认构造函数。
  • 属性已存在时:这行代码只是将GroupMark绑定到已有的属性上,不会修改任何现有属性值,仅作为属性的访问入口。

注:这里的FProp应该是OpenMesh PropertyManager的封装(针对面属性的简化typedef),本质是属性的访问代理,行为完全依赖底层属性是否已创建。

问题2:someFuncA未结束时,someFuncB为何无法使用GroupMark?

你的代码存在两个关键问题:

  1. 局部变量作用域限制:GroupMark是someFuncA中的局部变量,仅在someFuncA的代码块内可见,someFuncB作为独立函数根本无法直接访问这个变量。另外你代码里写的shellGroupMark是未定义的变量(和GroupMark名字不一致,应该是笔误)。
  2. 属性访问必须显式绑定:哪怕命名属性已经存在于网格中,你也必须在someFuncB里通过FProp(即PropertyManager)重新绑定到该属性,才能读写属性值。你注释掉的auto GroupMark = FProp<bool>(*this, "shellGroupMark");其实就是正确做法——这行代码不会重复创建属性,只是获取已存在属性的访问权限。

修正示例

你可以选择两种方式解决:

方式1:在someFuncB中重新绑定属性

bool someFuncB(const SmartFaceHandle& startFace)
{
    auto GroupMark = FProp<bool>(*this, "shellGroupMark"); // 绑定已存在的属性
  
    for(const SmartFaceHandle& face : faces())
    {
        GroupMark[face] = true;
    }
    return true;
}

方式2:将属性访问器作为参数传递

// 修改someFuncB的参数
bool someFuncB(const SmartFaceHandle& startFace, FProp<bool>& GroupMark)
{
    for(const SmartFaceHandle& face : faces())
    {
        GroupMark[face] = true;
    }
    return true;
}

// 在someFuncA中调用
if(someFuncB(face, GroupMark))
{
    // 执行你的操作
}

内容的提问来源于stack exchange,提问作者asdbvvc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:12:39