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

如何将PyVista网格导出为Wavefront OBJ时自定义组名

解决PyVista导出OBJ时自定义组名的问题

PyVista的Plotter.export_obj方法不会直接使用add_mesh时传入的name参数作为OBJ文件的组名,而是自动生成grpXXX格式的随机名称。要实现自定义组名,你需要使用MultiBlock容器来管理网格,具体步骤如下:

方法步骤

  1. 创建pv.MultiBlock容器,用于存储所有需要导出的网格
  2. 将每个圆柱网格(或同一ID下合并的多个圆柱)添加到MultiBlock时,指定自定义名称
  3. 使用MultiBlock的save方法导出OBJ文件,此时每个子块的名称会成为OBJ中的组名

修改后的代码

方案1:每个圆柱作为独立组

import pyvista as pv

# 假设以下变量已提前定义:df, dfa, ID_FIELD, C1, C2, C3, C4, FROM_COLUMN, NUM_TO_GENERATE

IDS = df[ID_FIELD].values
blocks = pv.MultiBlock()  # 创建MultiBlock容器

length = len(IDS)
for index, id in enumerate(IDS[: NUM_TO_GENERATE]):
    print(f"Making Column {index}/{length}", end=", ")
    data = dfa.loc[dfa[ID_FIELD] == id]
    print(f"NUM ROWS: {len(data)}")
    print(id)

    x = float(df.loc[df[ID_FIELD] == id][C1])
    z = float(df.loc[df[ID_FIELD] == id][C2])
    for row in data.values:
        height = float(row[C3]) - float(row[C4])
        cyl = pv.Cylinder(height=height, center=(
            x, float(row[FROM_COLUMN]) + height/2, z), direction=(0, 1.0, 0))
        # 将圆柱添加到MultiBlock,指定自定义组名
        blocks.append(cyl, name=str(id))

# 可选:用Plotter预览网格
p = pv.Plotter()
p.add_mesh(blocks)
p.add_axes()
p.show()

# 导出OBJ文件,组名即为设置的id
blocks.save("data.obj")

方案2:同一ID的多个圆柱合并为一个组

如果希望同一ID对应的所有圆柱归为同一个组,可以先合并网格再添加到MultiBlock:

import pyvista as pv

# 假设以下变量已提前定义:df, dfa, ID_FIELD, C1, C2, C3, C4, FROM_COLUMN, NUM_TO_GENERATE

IDS = df[ID_FIELD].values
blocks = pv.MultiBlock()

length = len(IDS)
for index, id in enumerate(IDS[: NUM_TO_GENERATE]):
    print(f"Making Column {index}/{length}", end=", ")
    data = dfa.loc[dfa[ID_FIELD] == id]
    print(f"NUM ROWS: {len(data)}")
    print(id)

    x = float(df.loc[df[ID_FIELD] == id][C1])
    z = float(df.loc[df[ID_FIELD] == id][C2])
    
    # 创建空网格用于合并当前ID的所有圆柱
    combined_cyl = pv.PolyData()
    for row in data.values:
        height = float(row[C3]) - float(row[C4])
        cyl = pv.Cylinder(height=height, center=(
            x, float(row[FROM_COLUMN]) + height/2, z), direction=(0, 1.0, 0))
        combined_cyl += cyl
    
    # 将合并后的网格添加到MultiBlock,组名为id
    blocks.append(combined_cyl, name=str(id))

# 预览与导出
p = pv.Plotter()
p.add_mesh(blocks)
p.add_axes()
p.show()

blocks.save("data.obj")

关键说明

  • MultiBlock是PyVista用于管理多个网格的容器,导出OBJ时会将每个子块的名称作为组名写入文件
  • 确保传入的组名是字符串类型(用str(id)转换),避免非字符串ID导致的命名异常
  • 若不需要预览,可直接省略Plotter相关代码,仅使用MultiBlock完成导出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:45:43