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

Paraview服务端设置插件属性后客户端无法获取的问题排查与解决

问题:Paraview自定义插件服务端设置属性后客户端无法获取正确值

我在自行编译的Paraview 5.11(Linux Artix系统,本地服务端+客户端)中遇到问题:自定义插件的pvserver里,某数据源的ScaleFactor属性既可以由服务端算法自动设置,也能由客户端手动设置。客户端手动设置后能正常取回正确值,但服务端自动设置后,客户端用vtkSMPropertyHelper获取到的始终是默认值1,尽管服务端调试输出显示值正确,渲染行为也符合预期。

相关代码与配置

插件XML配置

<IntVectorProperty
    command="GetScaleFactor"
    information_only="1"
    name="ScaleFactorInfo">
  </IntVectorProperty>

  <IntVectorProperty
    command="SetScaleFactor"
    default_values="1"
    information_property="ScaleFactorInfo"
    name="ScaleFactor"
    number_of_elements="1">
    <Documentation>
      This property can be used to read only every inc-th pixel along the dimensions of the image.
    </Documentation>
  </IntVectorProperty>

客户端操作代码

...
//Set ScaleFactor using the user's choice if not autoscaled
if (!useAutoScale)
    vtkSMPropertyHelper(src->getProxy(), "ScaleFactor").Set(client_choice_num);

...
//time passes
...

//Retrieve ScaleFactor
int scaleFac;
vtkSMPropertyHelper(src->getProxy(), "ScaleFactor").Get(&scaleFac);

//use the retrieved ScaleFactor on the client side

服务端自定义插件代码

//myCustomReader.h
class VTK_EXPORT myCustomReader : public vtkMPIImageReader
{
  public:
    ...
    vtkGetMacro(ScaleFactor, int);
    vtkSetMacro(ScaleFactor, int);
    ...
  protected:
    ...
  private:
    ...
    /**
     * @brief This property can be used to read only every inc-th pixel along the
     * dimensions of the image.
     *
     */
    int ScaleFactor;
};

//myCustomReader.cxx
...
//if the image should be scaled automatically
if (AutoScale){
    int sf = calcScaleFactor(size, limit);
    this->SetScaleFactor(sf);
}
...
vtkDebugMacro(<< "Scale factor: " << this->GetScaleFactor())
...

问题原因

  1. 信息属性未触发更新:XML中ScaleFactor的information_property指向ScaleFactorInfo(仅用于获取信息的属性),但服务端设置ScaleFactor后,没有触发该信息属性的更新通知,客户端不会主动拉取最新值,只会保留初始默认值。
  2. VTK属性通知机制缺失:默认的vtkSetMacro仅修改变量值,不会触发Modified()或跨端的属性更新广播。服务端算法变更属性后,未明确通知客户端同步,导致客户端代理缓存的还是默认值。

解决方法(无需迁移计算逻辑到客户端)

方法1:服务端设置属性后主动触发信息更新

修改服务端myCustomReader.cxx的代码,在设置ScaleFactor后触发信息更新与通知:

if (AutoScale){
    int sf = calcScaleFactor(size, limit);
    this->SetScaleFactor(sf);
    // 触发对象修改事件,通知依赖组件
    this->Modified();
    // 更新算法信息,确保属性变更能被传递到客户端
    this->UpdateInformation();
}

方法2:优化XML配置增强信息同步

调整XML配置,让信息属性能响应服务端的变更事件,确保客户端能同步最新值:

<IntVectorProperty
    command="GetScaleFactor"
    information_only="1"
    name="ScaleFactorInfo">
  <!-- 绑定ModifiedEvent,当服务端对象变更时触发信息更新 -->
  <vtkCommandEvent name="ModifiedEvent"/>
</IntVectorProperty>

<IntVectorProperty
    command="SetScaleFactor"
    default_values="1"
    information_property="ScaleFactorInfo"
    name="ScaleFactor"
    number_of_elements="1">
    <Documentation>
      This property can be used to read only every inc-th pixel along the dimensions of the image.
    </Documentation>
    <!-- 提示客户端该属性可能从服务端同步更新 -->
    <Hints>
        <PropertyWidgetDecorator type="ServerSideProperty"/>
    </Hints>
</IntVectorProperty>

方法3:客户端主动请求更新信息

如果无法修改服务端或XML配置,可在客户端获取属性前主动请求服务端更新信息:

// Retrieve ScaleFactor前先更新代理的属性信息
src->getProxy()->UpdatePropertyInformation();
int scaleFac;
vtkSMPropertyHelper(src->getProxy(), "ScaleFactor").Get(&scaleFac);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:54:55