[PYTHON] Ich habe versucht, die Operationen zusammenzufassen, die wahrscheinlich mit numpy-stl verwendet werden

Einführung

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.

Was ist numpy-stl?

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.

Offizielle Website und Referenzmaterialien

--numpy-stl Projektseite https://pypi.org/project/numpy-stl/ --numpy-stl Dokumentation https://numpy-stl.readthedocs.io/en/latest/

Installation

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

Verschiedene Operationen

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 möchte einen Würfel machen (reguläres Hexaeder)

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()

Ich möchte meine STL laden

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()

Ich möchte das 3D-Modell am Ursprung ausrichten

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

Aktualisieren Sie die Netzinformationen

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

Ich möchte das 3D-Modell vergrößern / verkleinern

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

Ich möchte ein 3D-Modell verschieben

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()

Ich möchte 3D-Modelle kombinieren

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()

Ich möchte ein 3D-Modell speichern

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')

Bonus

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.

XYZprintで読み込んで見たときのスクショその1 XYZprintで読み込んで見たときのスクショその2

abschließend

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

Ich habe versucht, die Operationen zusammenzufassen, die wahrscheinlich mit numpy-stl verwendet werden
Ich habe versucht, es zu erweitern, damit die Datenbank mit der Analysesoftware von Wiire verwendet werden kann
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Pferde vorherzusagen, die mit LightGBM unter den Top 3 sein werden
Ich habe versucht, die Methoden zusammenzufassen, die häufig bei der grundlegenden Algo-Implementierung in Quantx Factory verwendet werden
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
[LPIC 101] Ich habe versucht, die Befehlsoptionen zusammenzufassen, die leicht zu Fehlern führen können
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, die Befehle zusammenzufassen, die Anfängeringenieure heute verwenden
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
[Neuer Mitarbeiter studiert] Lassen Sie uns die Linux-Befehle zusammenfassen, die voraussichtlich von nun an für den Netzwerkaufbau verwendet werden
[Flask] Ich habe versucht, die "Docker-Compose-Konfiguration" zusammenzufassen, die schnell für Webanwendungen erstellt werden kann
Ich habe versucht, ein Schätzmodell für Artikeltitel zu erstellen, die wahrscheinlich mit Qiita in Einklang stehen
Ich habe versucht, die Linux-Befehle zusammenzufassen, die heute von Anfängeringenieuren verwendet werden - Teil 1-
Ich habe versucht, die Daten mit Zwietracht zu speichern
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Plotly Trace- und Layout-Vorlagen, die wahrscheinlich in Streudiagrammen verwendet werden
Ich habe versucht, SparseMatrix zusammenzufassen
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
[Erste COTOHA-API] Ich habe versucht, die alte Geschichte zusammenzufassen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Ich habe versucht zusammenzufassen, wie das EPEL-Repository erneut verwendet wird
Ich habe versucht zusammenzufassen, was der Python-starke Mann in der professionellen Nachbarschaft des Wettbewerbs tut
Ich habe versucht, die Sprachen, die Anfänger von nun an lernen sollten, absichtlich zusammenzufassen
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht zusammenzufassen, was mit Qiita mit Word Cloud ausgegeben wurde
Ich habe am Wochenende versucht, mit Bitcoin Systre zu beginnen
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Mir wurde gesagt, dass ich XML_SetHashSalt nicht finden konnte, als ich versuchte, pip mit Python zu verwenden.
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich versuchte zusammenzufassen, bis ich die Bank verließ und Ingenieur wurde
Ich habe versucht, Deep Learning zu implementieren, das nicht nur mit NumPy tiefgreifend ist
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, eine Blockchain zu implementieren, die tatsächlich mit ungefähr 170 Zeilen funktioniert
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, mit Hy anzufangen