【wrl2stl_v2.0】WRL文件保留原始网格的同时转STL文件-Python

前几天发布的wrl转stl的博客:【wrl2stl】WRL文件转STL文件-Python-****博客

这个版本的程序存在几个问题:

  1. 需要先舍弃Avizo导出的网格信息(wrl),然后用pyvista重新网格化。需要注意的是,每一次网格化都是一次挑战,因为每次网格化都需要设定采样间距,且不同结构的尺度不同,可能会导致三维结构信息的损失,甚至损坏;
  2. Avizo的分割参数设置不当可能导致wrl文件中存在两个独立的结构,此时使用pyvista网格化会导致结构“炸掉”。      

今天发现使用pyvista读取stl文件后,小圆球的索引一直是最后的。同时小圆球的尺寸是固定的,长度为642。也就是说,只要删除最后642个点,就可以删掉小圆球。

去pyvista手册上搜索remove,还真有这个功能。

在GitHub上,作者也介绍过这个功能

delete points from mesh · pyvista/pyvista · Discussion #1616

于是修改代码,前半部分使用pymeshlab将wrl转为stl,后半段是对stl进行编辑和平移,也就不需要点云网格化了,尽可能保全结构信息。

# wrl2stl2center_1108.py

import numpy as np
import pymeshlab
import os
from tqdm import tqdm
import pyvista as pv

gel = r'C:\Users\Administrator\Desktop\wrl2stl_1108test'

for root, dirs, files in os.walk(gel):
    for file in tqdm(files):
        if file.endswith(".wrl"):
            wrls = os.path.join(root, file)

            ms = pymeshlab.MeshSet()
            ms.load_new_mesh(wrls)
            wrls = wrls.replace('.wrl', '.stl')
            ms.save_current_mesh(wrls)

            mesh = pv.read(wrls)
            mesh.remove_points(range(len(mesh.points) - 642, len(mesh.points) - 1), inplace=True)
            mesh.points -= np.mean(mesh.points, axis=0)
            mesh.save(wrls)

目前程序还存在一个问题,Avizo分割不完全,导致wrl文件中会存在两个独立的网格结构,这会影响后续单颗粒的结构分析。

但是目前还没有找到能够检测一个文件中存在多个闭合网格结构的代码。

如果找到,后续再进行更新。


补充说明:

直接使用记事本打开wrl文件是看不到小圆球的坐标信息的,坐标点的数量也不包括小圆球。但使用meshlab打开wrl文件是能看到的。所以之前wrl2xyz的程序并没有出现小圆球的问题,因为是直接读取的。

上一篇:FPGA 实现CAN通信


下一篇:深入剖析Java中的静态多态与动态多态:原理、实现与差异