如何将PyVista网格导出为Wavefront OBJ时自定义组名
解决PyVista导出OBJ时自定义组名的问题
PyVista的Plotter.export_obj方法不会直接使用add_mesh时传入的name参数作为OBJ文件的组名,而是自动生成grpXXX格式的随机名称。要实现自定义组名,你需要使用MultiBlock容器来管理网格,具体步骤如下:
方法步骤
- 创建
pv.MultiBlock容器,用于存储所有需要导出的网格 - 将每个圆柱网格(或同一ID下合并的多个圆柱)添加到
MultiBlock时,指定自定义名称 - 使用
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
相关产品推荐
相关产品推荐

