python读取.stl文件(以及转换为obj方法)
目录
.1 文本方式读取
1.2 stl解析
1.3 stl创建
.2 把点转换为.stl
.3 stl组装
.4 stl转obj(带f法向量的obj)
.5 ply生成
.1 文本方式读取
代码如下
stl_path='/home/pxing/codes/point_improve/data/003_cracker_box/0.stl'points=[]
f = open(stl_path)
lines = f.readlines()
prefix='vertex'
num=3
for line in lines:#print (line)if line.startswith(prefix):values = line.strip().split()#print(values[1:4])if num%3==0:points.append(values[1:4])num=0num+=1#print(type(line))
print(points)
f.close()
该代码可以直接将stl文件中对点直接都输出
改进版本
import numpy as npstl_path='/home/pxing/codes/point_improve/data/003_cracker_box/0.stl'
points=[]
f = open(stl_path)
lines = f.readlines()
prefix='vertex'
num=3
for line in lines:#print (line)if line.startswith(prefix):values = line.strip().split()#print(values[1:4])if num%3==0:points.append(values[1:4])num=0num+=1#print(type(line))
points=np.array(points)
f.close()
print(points.shape)
np.save("/home/pxing/codes/point_improve/feature_get/point_get/test.npy", points)
把输出的点转换为npy并且保存
1.2 stl解析
.stl文件格式如下图所示:
那么读取该文件就需要知道stl的构成
stl是一种表示三角网格的文件格式
STL只能用来表示封闭的面或者体,stl文件有两种:一种是ASCII明码格式,另一种是二进制格式
ASCII明码格式:
STL文件的首行给出了文件路径及文件名
STL三维模型就是由一系列这样的三角面片构成
三角面片的信息单元 facet 是一个带矢量方向的三角面片
每一个facet由7 行数据组成:
facet normal 是三角面片指向实体外部的法矢量坐标
outer loop 代表随后的3行数据分别是三角面片的3个顶点坐标
3顶点沿指向实体外部的法矢量方向逆时针排列
solid [filename] //文件名,可以是任何字符
facet normal [i j k] //面的法线,i、j、k为三个分量,各分量之间用空格隔开,不能用逗号隔开
outor loop
vertex [x y z] //三角面片的第一个点,x、y、z三个坐标之间要用空格隔开
vertex [x y z] //三角面片的第二个点
vertex [x y z] //三角面片的第三个点
endloop
endfacet //完成一个三角面片的定义
、、、、 //其他facet
endsolid [filename] //完成一个stl文件的定义
示例:
在电脑上新建一个txt文件,然后编辑。编辑完了之后保存,并将文件后缀名改为stl,即可完成一个创建了一个stl文件。如下图,利用文本编辑器将一个四面体的几何数据保存到文件中
效果如下图所示:
1.3 stl创建
创建一个三角形面片
solid mystl
facet normal 0 -1 0
outor loop
vertex -100 0 0
vertex 100 0 0
vertex 0 0 -100
endloop
endfacet
end solid mystl
.2 把点转换为.stl
import numpy as np
import sys
sys.path.append('/home/pxing/codes/grasp_ROI_get/')
from gripper_area import area_getarr=np.array(area_get.main())
#print(arr[0,0:3])
with open('stl_process/data/test1.stl','a') as file0:print('solid mystl ',file=file0)print('facet normal' ,0,0,0,file=file0)print('outor loop',file=file0)print('vertex',arr[0,0],arr[0,1],arr[0,2 ],file=file0)print('vertex',arr[1,0],arr[1,1],arr[1,2 ],file=file0)print('vertex',arr[2,0],arr[2,1],arr[2,2 ],file=file0)print('endloop\nendfacet',file=file0)print('end solid mystl',file=file0)
.3 stl组装
import os
import numpy as npdef stl_get(stl_path):points=[]f = open(stl_path)lines = f.readlines()prefix='vertex'num=3for line in lines:#print (line)if line.startswith(prefix):values = line.strip().split()#print(values[1:4])if num%3==0:points.append([values[1],values[2],values[3]])num=0num+=1#print(type(line))points=np.array(points,dtype='float64')#points=points*1000#3d打印用f.close()#print(points.shape)#np.save("/home/pxing/codes/point_improve/feature_get/point_get/index_mm_level.npy", t)return pointsdef stl_generate(arr,stl_path):with open(stl_path,'a') as file0:print('solid mystl ',file=file0)for i in range((arr.shape[0]-3)):print('facet normal' ,0,0,0,file=file0)print('outor loop',file=file0)print('vertex',arr[i,0],arr[i,1],arr[i,2 ],file=file0)print('vertex',arr[i+1,0],arr[i+1,1],arr[i+1,2 ],file=file0)print('vertex',arr[i+2,0],arr[i+2,1],arr[i+2,2 ],file=file0)print('endloop\nendfacet',file=file0)print('end solid mystl',file=file0)print('generate success')def mkdir(path):folder = os.path.exists(path)if not folder:#判断是否存在文件夹如果不存在则创建为文件夹os.makedirs(path) #makedirs 创建文件时如果路径不存在会创建这个路径file_path='/home/pxing/codes/point_improve/data/process_projection/'#stl储存的位置
goods_list=os.listdir(file_path)
for i in goods_list:#对所有0子文件夹进行组装index=0file_stl_path=file_path+i+'/'+str(index)stl_list=os.listdir(file_stl_path)if stl_list:arr_assembly=np.array([[0,0,0]])#创建一个空数组来组成后面的元素for j in stl_list:print(stl_list)stl_path=file_stl_path+'/'+jarr=stl_get(stl_path)arr_assembly=np.concatenate((arr_assembly,arr),axis=0)arr_assembly=np.delete(arr_assembly,[0,0],axis=0)file_save_path='/home/pxing/codes/point_improve/data/auto_assembly_data/'+i+'/'+str(index)mkdir(file_save_path)stl_save_path=file_save_path+'/'+str(index)+'.stl'stl_generate(arr_assembly,stl_save_path)else:pass
.4 stl转obj(带f法向量的obj)
import numpy as npdef stl_get(stl_path):points=[]f = open(stl_path)lines = f.readlines()prefix='vertex'num=3for line in lines:#print (line)if line.startswith(prefix):values = line.strip().split()#print(values[1:4])if num%3==0:points.append([values[1],values[2],values[3]])num=0num+=1#print(type(line))points=np.array(points,dtype='float64')#points=points*1000#3d打印用f.close()#print(points.shape)#np.save("/home/pxing/codes/point_improve/feature_get/point_get/index_mm_level.npy", t)return points# 点云数据stl_path='/home/pxing/codes/point_improve/data/rotation_data/assembly_projection_isaac.stl'
points = stl_get(stl_path)# 计算点云的法向量
def compute_normals(points):normals = []for i, p0 in enumerate(points):v1 = points[(i+1) % len(points)] - p0v2 = points[(i+2) % len(points)] - p0normals.append(np.cross(v1, v2))return normalsnormals = compute_normals(points)# 将点云和法向量保存为OBJ格式文件
with open('/home/pxing/codes/point_improve/data/obj/point_f_assembly.obj', 'w') as f:for i, p in enumerate(points):f.write(f'v {p[0]} {p[1]} {p[2]}\n')n = normals[i]f.write(f'vn {n[0]} {n[1]} {n[2]}\n')
生成带面的obj
import numpy as npdef stl_get(stl_path):points=[]f = open(stl_path)lines = f.readlines()prefix='vertex'num=3for line in lines:#print (line)if line.startswith(prefix):values = line.strip().split()#print(values[1:4])if num%3==0:points.append([values[1],values[2],values[3]])num=0num+=1#print(type(line))points=np.array(points,dtype='float64')#points=points*1000#3d打印用f.close()#print(points.shape)#np.save("/home/pxing/codes/point_improve/feature_get/point_get/index_mm_level.npy", t)return points# 点云数据stl_path='/home/pxing/codes/point_improve/data/rotation_data/assembly_projection_isaac.stl'
points = stl_get(stl_path)# 计算点云的法向量
def compute_normals(points):normals = []for i, p0 in enumerate(points):v1 = points[(i+1) % len(points)] - p0v2 = points[(i+2) % len(points)] - p0normals.append(np.cross(v1, v2))return normalsnormals = compute_normals(points)# 将点云和法向量保存为OBJ格式文件
with open('/home/pxing/codes/point_improve/data/obj/point_f_assembly.obj', 'w') as f:for i, p in enumerate(points):f.write(f'v {p[0]} {p[1]} {p[2]}\n')n = normals[i]f.write(f'vn {n[0]} {n[1]} {n[2]}\n')# 将点云转换为面信息for i in range(0, len(points), 3):f.write(f'f {i+1}//{i+1} {i+2}//{i+2} {i+3}//{i+3}\n')
.5 ply生成
import numpy as npdef stl_get(stl_path):points=[]f = open(stl_path)lines = f.readlines()prefix='vertex'num=3for line in lines:#print (line)if line.startswith(prefix):values = line.strip().split()#print(values[1:4])if num%3==0:points.append([values[1],values[2],values[3]])num=0num+=1#print(type(line))points=np.array(points,dtype='float64')#points=points*1000#3d打印用f.close()#print(points.shape)#np.save("/home/pxing/codes/point_improve/feature_get/point_get/index_mm_level.npy", t)return points# 点云数据stl_path='/home/pxing/codes/point_improve/data/rotation_data/assembly_projection_isaac.stl'
points = stl_get(stl_path)# 将点云保存为含有顶点和面信息的PLY格式文件
with open('/home/pxing/codes/point_improve/data/obj/point_cloud.ply', 'w') as f:# 写入PLY文件头f.write('ply\n')f.write('format ascii 1.0\n')f.write(f'element vertex {len(points)}\n')f.write('property float x\n')f.write('property float y\n')f.write('property float z\n')f.write(f'element face {len(points)}\n')f.write('property list uchar int vertex_indices\n')f.write('end_header\n')# 写入点云数据for p in points:f.write(f'{p[0]} {p[1]} {p[2]}\n')# 写入面数据for i in range(len(points)):f.write(f'3 {i} {i} {i}\n')
python读取.stl文件(以及转换为obj方法)相关推荐
- 什么是.dat? python读取.dat文件并转换为png图像——超简单实现
相信大家和我一样,对于.dat文件是感到十分陌生的.因此在刚接触到这个小任务的时候我实在花了一些时间来了解到底什么是.dat文件.这里我将我自己的认识分享给大家: 总体而言,对于.dat文件的定义,我 ...
- python 读取stl文件_读取STL模型 并用opengl显示
说起STL模型,相信使用过CAD三维软件的人都不陌生, STL = STL文件,一种3D模型文件格式STL(STereo Lithography的缩写) STL文件格式是由3D SYSTEMS 公司于 ...
- python读取stl文件三维坐标_python vtk 读取三维raw数据存为stl
1.安装vtk: 2.读取三维raw.显示.保存为stl: import vtk # Read 3D RAW image reader=vtk.vtkImageReader() # reader.Se ...
- python 读取jpg文件是yuv_Python读取YUV文件,并显示的方法
今天小编就为大家分享一篇Python读取YUV文件,并显示的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 Python读取YUV格式文件,并使用opencv显示的方法 open ...
- 使用python读取大文件
读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容. python读取大文件通常两种方法:第一种是利用yield生成器读取:第二种是:利用open( ...
- python怎么读取txt文件内容然后保存到excel-Python实现读取txt文件并转换为excel的方法示例...
本文实例讲述了Python实现读取txt文件并转换为excel的方法.分享给大家供大家参考,具体如下: 这里的txt文件内容格式为: 892天平天国定都在?A开封B南京C北京(B) Python代码如 ...
- python读取txt文件并写入excel-Python实现读取txt文件并转换为excel的方法示例
本文实例讲述了Python实现读取txt文件并转换为excel的方法.分享给大家供大家参考,具体如下: 这里的txt文件内容格式为: 892天平天国定都在?A开封B南京C北京(B) Python代码如 ...
- python删除重复值所在的行数_使用python读取txt文件的内容,并删除重复的行数方法...
注意,本文代码是使用在txt文档上,同时txt文档中的内容每一行代表的是图片的名字. #coding:utf-8 import shutil readDir = "原文件绝对路经" ...
- python读取文件某一行-使用python读取.text文件特定行的数据方法
如何用python循环读取下面.txt文件中,用红括号标出来的数据呢? 首先,观察数据可知,不同行的第一个数据元素不一样,所以考虑直接用正则表达式. 再加上,对读和写文件的操作,就行了 注:我用的是p ...
最新文章
- 卷积神经网络(CNN)简介
- 基于ARM的GCC编译器,各版本arm-gcc区别与安装
- UIApplication,UIWindow,UIViewController,UIView(layer)
- 【转】jenkins 忘记admin用户账号密码
- sharepoint的文件是怎样存放的及存放的表是哪个
- mysql 内存占用_mysql占用内存过多
- js indexOf()
- Python使用pandas合并多个Excel文件
- 【零基础学Java】—类的定义(七)
- win10安装mysql zip_win10 安装mysql zip 压缩包版
- 《我的世界》AI大战降临:6000万帧超大数据集已发布,NeurIPS 19向你约战
- Atitit session机制的实现 目录 1. Web状态管理 Cookie 和 Session。 token 	1 2. session 管理设计	1 2.1. session 的存储(可以
- mysql创建数据库sql语句
- 中国地图流动图(一)
- 索引导致大量写入数据时效率低下
- 社交网络算法对权力的游戏角色进行分析
- Ceph Recovery分析
- 学习笔记——利用串口通信控制LED指示灯开关
- 这篇不讨好任何人的回忆录,记录了我从双非学校到BAT/TMD六offer的原因
- 机器学习(1)——安装与配置 Anconda 、tensorflow、keras、jupyter notebook
热门文章
- [luogu] P1504 积木城堡 01背包
- 【其他】用ps切片处理素材
- 圣斗士星矢游戏抽奖计算机怎么计算,圣斗士星矢手游抽奖概率是多少 抽奖概率公布[多图]...
- windows上的时间管理软件
- win7打开资源管理器显示计算机而不是库
- 计算机按键模块,计算器键盘-TM1650/AIP650
- 【安全牛学习笔记】Smurf攻击、Sockstress
- html 文字段落编辑,美化html段落文本 Ⅰ
- 标签软件如何批量打印多排条码标签
- UVa232 Crossword Answers(纵横字谜的答案)