Ich dachte, es wäre einfach, wenn die mit einem 3D-Drucker zu modellierenden Dinge zu einem Muster würden und ich ohne Erlaubnis durch Eingabe von Zahlen ein Modell erstellen könnte. Als ich googelte, fand ich heraus, was numpy-stl heißt, und fasste es als Memo zusammen.
Eine grobe Übersetzung des offiziellen Dokuments sieht so aus.
Eine einfache Bibliothek zum schnellen und einfachen Arbeiten mit STL-Dateien (sowie gängigen 3D-Modellen). Alle Operationen hängen stark von numpy ab und sind eine der schnellsten STL-Bibliotheken für Python.
Kurz gesagt, es ist eine Bibliothek, in der Sie 3D-Modelle wie numpy erstellen und mit vorhandenen STL-Dateien spielen können.
--numpy-stl Projektseite https://pypi.org/project/numpy-stl/ --numpy-stl Dokumentation https://numpy-stl.readthedocs.io/en/latest/
Grundsätzlich ist pip in Ordnung. Dieses Mal habe ich es unter macOS Catalina 10.15.6, Python 3.7.7 ausgeführt.
install
pip3 install numpy-stl
Wenn Sie das generierte 3D-Modell überprüfen möchten, installieren Sie auch die folgenden Bibliotheken.
install
pip3 install mpl_toolkits
pip3 install matplotlib
Ich werde es hinzufügen, wenn ich Lust habe, mich zu drehen. (Wenn Sie jedoch mit numpy-stl googeln, werden Sie einige solche Artikel sehen.)
Ich habe es zu einer Funktion gemacht, weil es eine große Sache war. Geben Sie die Größe in die Argumente scale_x, scale_y, scale_z ein. Dies hängt vom Einheitensystem ab, aber im Standardzustand ohne Argumente sollten Sie in der Lage sein, einen Würfel mit einer Höhe und Breite von 1 zu erstellen.
cube_model.py
import numpy as np
from stl import mesh
def cube_model(scaleX=1, scaleY=1, scaleZ=1):
scaleX = scaleX / 2
scaleY = scaleY / 2
scaleZ = scaleZ / 2
vertices = np.array([\
[-1*scaleX, -1*scaleY, -1*scaleZ],
[+1*scaleX, -1*scaleY, -1*scaleZ],
[+1*scaleX, +1*scaleY, -1*scaleZ],
[-1*scaleX, +1*scaleY, -1*scaleZ],
[-1*scaleX, -1*scaleY, +1*scaleZ],
[+1*scaleX, -1*scaleY, +1*scaleZ],
[+1*scaleX, +1*scaleY, +1*scaleZ],
[-1*scaleX, +1*scaleY, +1*scaleZ]])
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]])
cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
cube.remove_duplicate_polygons=True
for i, f in enumerate(faces):
for j in range(3):
cube.vectors[i][j] = vertices[f[j],:]
return cube
Klicken Sie hier, um das Programm zu laden
test_plot.py
import numpy as np
from stl import mesh
from mpl_toolkits import mplot3d
from matplotlib import pyplot
from cube_model import cube_model
figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)
your_mesh = cube_model(10,10,10)
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))
scale = your_mesh.points.flatten()
print(scale)
axes.auto_scale_xyz(scale, scale, scale)
pyplot.show()
Geben Sie Ihre eigene STL-Datei in your_stl_model.stl an.
read_stl_file.py
import numpy as np
from stl import mesh
from mpl_toolkits import mplot3d
from matplotlib import pyplot
figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)
your_mesh = mesh.Mesh.from_file('your_stl_model.stl')
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))
scale = cube_comb.points.flatten()
axes.auto_scale_xyz(scale, scale, scale)
pyplot.show()
Es wird verwendet, um die Mitte des Modells auf (0,0,0) auszurichten, wenn die gelesene STL in eine seltsame Richtung fliegt. Geben Sie im Argument my_mesh das Mesh-Objekt ein, wenn Sie die STL-Datei usw. lesen.
mesh_location_zero.py
import numpy as np
from stl import mesh
def mesh_location_zero(my_mesh):
midPosRel = (my_mesh.max_ - my_mesh.min_)/2
my_mesh.x = my_mesh.x - (midPosRel[0] + my_mesh.min_[0])
my_mesh.y = my_mesh.y - (midPosRel[1] + my_mesh.min_[1])
my_mesh.z = my_mesh.z - (midPosRel[2] + my_mesh.min_[2])
return my_mesh
Da die Elemente im Netzobjekt aktualisiert werden, wird dies auch beim Verschieben ausgeführt, einschließlich Anpassen des Koordinatensystems, oder wenn das Modell vergrößert, gedreht oder geändert wird. Die Argumente sind die gleichen.
mesh_update.py
import numpy as np
from stl import mesh
def mesh_update(my_mesh):
my_mesh.update_areas()
my_mesh.update_max()
my_mesh.update_min()
my_mesh.update_units()
return my_mesh
Die Erweiterung / Verkleinerung wurde ebenfalls zu einer Funktion gemacht. Geben Sie in my_mesh das Ihres eigenen 3D-Modells ein und in scale_x, scale_y, scale_z 1,0 als 100% und das Vergrößerungsverhältnis.
mesh_scale.py
import numpy as np
from stl import mesh
def mesh_scale(my_mesh, scale_x, scale_y, scale_z):
my_mesh.x = my_mesh.x * scale_x
my_mesh.y = my_mesh.y * scale_y
my_mesh.z = my_mesh.z * scale_z
return my_mesh
Sie können es mit mesh.translate verschieben. Das Argument wird in numpy.array angegeben. (Dieses Mal verwende ich auch cube_model.py.)
move_model.py
import numpy as np
from stl import mesh
from mpl_toolkits import mplot3d
from matplotlib import pyplot
from cube_model import cube_model
figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)
your_mesh = cube_model(5,20,5)
your_mesh.translate(np.array([1,3,1]))
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))
scale = cube_comb.points.flatten()
print(scale)
axes.auto_scale_xyz(scale, scale, scale)
pyplot.show()
Sie können Modelle mit numpy.concatenate kombinieren. Ich verkaufe nur, dass ich ein Modell mit Numpy machen kann. (Dieses Mal verwende ich auch cube_model.py.)
mesh_scale.py
import numpy as np
from stl import mesh
from mpl_toolkits import mplot3d
from matplotlib import pyplot
from cube_model import cube_model
figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)
your_mesh = cube_model(10,10,10)
your_mesh2 = cube_model(5,20,5)
your_mesh2.translate(np.array([1,1,1]))
cube_comb = mesh.Mesh(np.concatenate([
your_mesh.data.copy(),
your_mesh2.data.copy(),
]))
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(cube_comb.vectors))
scale = cube_comb.points.flatten()
print(scale)
axes.auto_scale_xyz(scale, scale, scale)
pyplot.show()
Kann mit mesh.save gespeichert werden. Die Argumente sind der Speicherzielpfad und der Dateiname.
save_model.py
import numpy as np
from stl import mesh
from cube_model import cube_model
your_mesh = cube_model(10,10,10)
your_mesh2 = cube_model(5,20,5)
your_mesh2.translate(np.array([1,1,1]))
cube_comb = mesh.Mesh(np.concatenate([
your_mesh.data.copy(),
your_mesh2.data.copy(),
]))
cube_comb.save('your_model.stl')
Ich habe versucht, die in der Software "XYZprint" erstellten STL-Daten zu streamen, die zum Streamen von Modellierungsdaten mit einem von XYZprinting erstellten 3D-Drucker verwendet wurden. Ich bin froh, dass ich die laminierten Daten richtig machen kann.
Diesmal habe ich versucht, numpy-stl zu bedienen. Wenn es andere Vorgänge gibt, die Sie im Allgemeinen verwenden könnten, fügen Sie sie hinzu, wenn Sie Lust dazu haben.
Recommended Posts