numpy-stl库的基本使用及notebook下的使用

news2025/1/20 5:57:02

numpy-stl库的基本使用及notebook下的可视化

https://pypi.org/project/numpy-stl/

安装

conda install -c conda-forge numpy-stl

引入资源

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from stl import mesh

读取stl文件

stl_file = 'assets/fan.stl'
stl_mesh = mesh.Mesh.from_file(stl_file)

print('stl_mesh info:', stl_file)
print('vectors=', len(stl_mesh.vectors))
print('points=', len(stl_mesh.points))
print('normals=', len(stl_mesh.normals))

out 输出如下

stl_mesh info: assets/fan.stl
vectors= 1792
points= 1792
normals= 1792

points、vectors、normals对比

points基本等同于vectors,只是数据结构不同。每个points对应stl文件中的一个三角面3个点的数据,每个点有3个数值

normals则为一个法向量

数据如下所示:

print('points:', stl_mesh.points[0])
print('vectors:', stl_mesh.vectors[0])
print('normals:', stl_mesh.normals[0])

输出如下:

points: [  5.044177 -23.97724   97.42546    5.656812 -25.27308  106.0007
   5.831299 -23.8088    97.4243  ]
vectors: [[  5.044177 -23.97724   97.42546 ]
 [  5.656812 -25.27308  106.0007  ]
 [  5.831299 -23.8088    97.4243  ]]
normals: [-1.4429097  6.7504697  1.123177 ]

stl_mesh.xstl_mesh.ystl_mesh.z

print('stl_mesh.x: lenth =',len(stl_mesh.x))
print(stl_mesh.x)
stl_mesh.x: lenth = 1792
[[ 5.044177e+00  5.656812e+00  5.831299e+00]
 [ 6.767709e+00  6.065555e+00  6.507149e+00]
 [ 5.839584e+00  6.021440e+00  5.280423e+00]
 ...
 [-9.914779e-05 -9.914779e-05 -9.914779e-05]
 [-9.914779e-05 -9.914779e-05  6.999990e+01]
 [ 6.999990e+01 -9.914779e-05  6.999990e+01]]

获取stl信息 (-获取体积,-重心, -惯性矩)

#  (Volume-获取体积, Center of gravity-重心, Inertia-惯性矩)
volume, cog, inertia = stl_mesh.get_mass_properties()
print("Volume                                  = {0}".format(volume))
print("Position of the center of gravity (COG) = {0}".format(cog))
print("Inertia matrix at expressed at the COG  = {0}".format(inertia[0,:]))
print("                                          {0}".format(inertia[1,:]))
print("                                          {0}".format(inertia[2,:]))


# 获取包围盒子
def get_min_max(mesh):
    minx = mesh.x.min()
    miny = mesh.y.min()
    minz = mesh.z.min()
    maxx = mesh.x.max()
    maxy = mesh.y.max()
    maxz = mesh.z.max()
    return minx, miny, minz, maxx, maxy,maxz

# 获取最大包围盒
minx, miny, minz, maxx, maxy,maxz = get_min_max(stl_mesh)
print('minx, miny, minz, maxx, maxy, maxz  =>', minx, miny, minz, maxx, maxy,maxz )
Volume                                  = 72816.68152088734
Position of the center of gravity (COG) = [ 33.07755097 -17.88736306  27.97393759]
Inertia matrix at expressed at the COG  = [60897330.17635337 -1572272.4035636   3817171.80348613]
                                          [-1572272.4035636  80751169.91015446  3975033.54231323]
                                          [ 3817171.80348613  3975033.54231323 29649477.37738535]
minx, miny, minz, maxx, maxy, maxz  => -9.914779e-05 -32.0 0.000244812 69.9999 3.552714e-15 106.0016

手动创建一个mesh网格模型,并保存

# 定义8个vector
vertices = np.array([
    [-1, -1, -1],
    [+1, -1, -1],
    [+1, +1, -1],
    [-1, +1, -1],
    [-1, -1, +1],
    [+1, -1, +1],
    [+1, +1, +1],
    [-1, +1, +1]
])
# 定义12个triangle
faces = np.array([
    [0, 3, 1],
    [1, 3, 2],
    [0, 4, 7],
    [0, 7, 3],
    [4, 5, 6],
    [4, 6, 7],
    [5, 1, 2],
    [5, 2, 6],
    [2, 3, 6],
    [3, 7, 6],
    [0, 1, 5],
    [0, 5, 4]
])

# 创建mesh
cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, face in enumerate(faces):
    for j in range(3):
        cube.vectors[i][j] = vertices[face[j], :]
cube.save('cube-write.stl', mode=stl.Mode.ASCII)

旋转移动mesh对象

# 平移
stl_mesh.translate(np.array([0,30,0])) # y方向移动
# 旋转
stl_mesh.rotate([0.0, 1.0, 0.0], np.radians(180)) # 绕y轴旋转90度

stl 3D可视化


show_mesh = stl_mesh
# Create a new plot
figure = plt.figure()
axes = figure.add_subplot(projection='3d')

# Load the STL files and add the vectors to the plot
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(show_mesh.vectors))

# Auto scale to the mesh size
scale = show_mesh.points.flatten()
axes.auto_scale_xyz(scale, scale, scale)

# Show the plot to the screen
plt.show()

在这里插入图片描述

jupyter-notebook中使用

可直接在notebook中渲染3D
在这里插入图片描述

numpy-stl的二进制与ASCII转换

numpy-stl安装好后,还有个比较方便的格式转化命令,如下所示,可直接在命令行下执行

$ stl2bin <your_ascii_stl_file.stl> <new_binary_stl_file.stl>
$ stl2ascii <your_binary_stl_file.stl> <new_ascii_stl_file.stl>
$ stl <your_ascii_stl_file.stl> <new_binary_stl_file.stl>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1847710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C malloc经典面试题解答与分析

本篇博客介绍关于C malloc经典的错误代码写法以及解决方法。 题目1 错误的代码&#xff1a; #include <iostream>void test01(char* p) {p (char*)malloc(10); }int main1() {char* p NULL;test01(&p);const char* str "hello";strcpy(p, str);print…

在Worpress增加网站的二级目录,并转向到站外网站

在WordPress中&#xff0c;你可以通过添加自定义重定向来实现将某个二级目录&#xff08;例如 www.example.com/subdir&#xff09;重定向到站外网站。可以通过以下几种方法来实现&#xff1a; 方法一&#xff1a;使用 .htaccess 文件 如果你的服务器使用Apache&#xff0c;你…

【JavaSE复习】基础、面向对象

JavaSE复习 1.Java入门1.1 cmd常见命令1.2 JDK下载和安装1.3 JRE和JDK 2.基础语法2.1 注释和关键字2.2 常量2.3 变量2.4 数据类型2.4.1 基本数据类型2.4.2 引用数据类型 2.5 IDEA 的下载和安装 3. 运算符3.1 算数运算符3.2 数据类型转换3.2.1 隐式转换3.2.2 强制转换 3.3 自增自…

Pyqt QCustomPlot 简介、安装与实用代码示例(四)

目录 前言实用代码示例Interaction ExampleItem DemoAdvanced Axes DemoFinancial Chart Demo 结语 所有文章除特别声明外&#xff0c;均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nixgnauhcuy’s blog&#xff01; 如需转载&#xff0c;请标明出处&#xff01; 完整代码…

Python | Leetcode Python题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A, B headA, headBwhile A ! B:A A.next if A else headBB B.next if B else headAreturn A

PostgreSQL的学习心得和知识总结(一百四十六)|深入理解PostgreSQL数据库之客户端侧auto savepoint的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

mongosh常用命令详解及如何开启MongoDB身份验证

目录 Mongosh常用命令介绍 连接到MongoDB实例 基本命令 查看当前数据库 切换数据库 查看所有数据库 查看当前数据库中的集合 CRUD操作 插入文档 查询文档 更新文档 删除文档 替换文档 索引操作 创建索引 查看索引 删除索引 聚合操作 数据库管理 创建用户 …

社区项目-项目介绍环境搭建

文章目录 1.技术选型2.原型设计1.安装AxureRP2.进行汉化3.载入元件库4.基本设计 3.元数建模1.安装元数建模软件2.新建项目3.新增一个刷题模块主题域4.新增数据表 subject_category5.新增关系图&#xff0c;将表拖过来6.新增题目标签表7.新增题目信息表8.新增单选表、多选表、判…

姿态识别论文复现(一)安装包+下载数据

Lite-HRNet&#xff1a;轻量级高分辨率网络 简介&#xff1a;高分辨率网络Lite-HRNet&#xff0c;用于人体姿态估计 环境配置&#xff1a;该代码是在 Ubuntu 16.04 上使用 python 3.6 开发的。需要 NVIDIA GPU。使用 8 个 NVIDIA V100 GPU 卡进行开发和测试。其他平台或 GPU …

智慧园区解决方案PPT(53页)

## 1.1 智慧园区背景及需求分析 - 智慧园区的发展历程包括园区规划、经济、产业、企业、管理、理念的转变&#xff0c;强调管理模式创新&#xff0c;关注业务综合化、管理智慧化等发展。 ## 1.2 国家对智慧园区发展的政策 - 涉及多个国家部门&#xff0c;如工信部、住建部、…

uniapp公用返回组件

uniapp写一个公用的头部组件&#xff0c;包含home和返回。 页面中的引用 2.在components文件夹下&#xff0c;新建一个navBar.vue <template><view class"view-wrap"><view :style"{ height: barHeight }"></view><view cla…

EtherCAT扫盲,都是知识点

1. 什么是EtherCAT EtherCAT&#xff0c;全称Ethernet for Control Automation Technology&#xff0c;字面意思就是用于控制自动化技术的以太网。它是一种基于以太网的实时工业通信协议&#xff0c;简单说&#xff0c;就是让机器们通过网线互相聊天的高级方式。 EtherCAT 是最…

openEuler 22.03 (LTS-SP1)服务器用ntpd同步GPS时间服务器的案例

本文记录了openEuler 22.03 (LTS-SP1)的二级时间服务器用chronyd不能自动同步GPS时间服务器&#xff0c;改用ntpd同步GPS时间服务器成功的案例 一、环境简述 1、本环境中有两台GPS一级时间服务器&#xff0c;IP如下&#xff1a; 192.168.188.66 192.168.188.74 2、有一台o…

开发中遇到的错误 - @SpringBootTest 注解爆红

我在使用 SpringBootTest 注解的时候爆红了&#xff0c;ait 回车也导不了包&#xff0c;后面发现是因为没有加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>…

JAVA小知识28:FIle类文件对象

Java 中的 File 类是 java.io 包中的一个类&#xff0c;用于表示文件和目录路径名的抽象表示。它提供了一些方法来操作文件和目录 一、File的创建 1.1、绝对路径 绝对路径是指从文件系统的根目录开始定位文件或目录的完整路径。它通常以根目录符号开始&#xff0c;在 Window…

​Claude 3.5 最新体验:助力硕博生与科研人员高效完成论文,超越ChatGPT4o !

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 要不说AI领域的进展真的是日新月异&#xff0c;发展速度已经大大超过预期进度。娜姐本来在准备AI降重工具的测评文章&#xff08;最近好多小伙伴需要&#xff09;。 昨天晚上…

多头Attention MultiheadAttention 怎么用?详细解释

import torch import torch.nn as nn# 定义多头注意力层 embed_dim 512 # 输入嵌入维度 num_heads 8 # 注意力头的数量 multihead_attn nn.MultiheadAttention(embed_dim, num_heads)# 创建一些示例数据 batch_size 10 # 批次大小 seq_len 20 # 序列长度 query torch…

rknn转换后精度差异很大,失真算子自纠

下面是添加了详细注释的优化代码&#xff1a; import cv2 import numpy as np import onnx import onnxruntime as rt from onnx import helper, shape_inferencedef get_all_node_names(model):"""获取模型中所有节点的名称。参数:model (onnx.ModelProto): O…

【有手就会】图数据库Demo教程,实现反洗钱场景下银行转账流水数据分析

前言 星环社区版家族于近期发布了单机、30s一键启动的StellarDB图数据库&#xff0c;本篇文章将为用户介绍如何使用开发版StellarDB实现人物关系探索。 友情链接&#xff1a;白话大数据 | 关于图数据库&#xff0c;没有比这篇更通俗易懂的啦 TDH社区版本次发布StellarDB社区…

可信启动Trusted Board Boot

TBB Trusted Board Boot&#xff08;TBB&#xff09;对所有固件镜像&#xff08;包括普通世界的bootloader&#xff09;进行身份验证&#xff0c;以防止恶意固件在平台上运行。TBB使用公钥加密标准 &#xff08;PKCS&#xff09;来建立信任链&#xff08;Chain of Trust&#…