Ich verwende jupyter-cadquery
, um einige mit CadQuery erstellte 3D-Modelle zu visualisieren .
Bei der Visualisierung der Modelle auf einem Jupyter-Notebook funktioniert alles wie erwartet.
Beim Versuch, das Widget in ein HTML-Dokument einzubetten, scheint die Kamera beim Laden jedoch (0, 0, 0)
nicht wie erwartet darauf zu zeigen. Sobald Sie mit dem Widget interagieren, zeigt die Kamera auf die erwartete Koordinate.
Hier ist der Code zum Reproduzieren des Fehlers und eine Animation des genannten Problems (siehe Anweisungen unten zum Reproduzieren mit Binder):
from cadquery import Workplane
from ipywidgets import embed
from jupyter_cadquery.cad_view import CadqueryView
from jupyter_cadquery.cadquery import Assembly
from jupyter_cadquery.cadquery import Part
# Create a simple assembly
box1 = Workplane('XY').box(10, 10, 10).translate((0, 0, 5))
a1 = Assembly([Part(box1)], "example 1")
# Generate HTML
a1.collect_shapes()
view = CadqueryView()
for shape in a1.collect_shapes():
view.add_shape(shape["name"], shape["shape"], shape["color"])
renderer = view.render()
embed.embed_minimal_html('export.html', views=renderer, title='Renderer')
renderer
Beachten Sie, wie die Ansicht des Würfels bei Interaktion plötzlich "springt".
Könnte es ein Problem sein mit ipywidgets
? Da die Ansicht in Ordnung ist, wenn sie im Notizbuch angezeigt wird.
Wie könnte es behoben werden?
Wie zu reproduzieren
Sie können es mit Binder reproduzieren, ohne eine lokale Umgebung erstellen zu müssen (zugegebenermaßen ist die Installation von CadQuery / jupyter-cadquery nicht die einfachste / schnellste Aufgabe):
Führen Sie einfach den obigen Code in einem neuen leeren Notizbuch aus. Sehen Sie, wie das renderer
3D-Modell ohne Probleme auf dem Notebook angezeigt wird:
Nach der Ausführung export.html
wird links in der Dateiliste auch ein Dokument angezeigt. Öffnen Sie es und stellen Sie sicher, dass Sie oben im Viewer auf die Schaltfläche "HTML vertrauen" klicken und auf "Aktualisieren" klicken. Wenn Sie mit der Ansicht interagieren, können Sie das Problem reproduzieren.
Beachten Sie, dass auch die Perspektive verloren geht (das ist keine orthogonale Ansicht). Das zu beheben wäre ein Plus! ^^
Antworten:
Dies kann ohne Notwendigkeit reproduziert werden
jupyter-cadquery
, daher wurde stattdessen eine neue Frage geöffnet:Einbetten von Widgets mit Pythonreejs: falsche Perspektive und Kameraansicht
quelle
Es hat ein paar Tage gedauert, bis Cadquery nicht richtig funktioniert hat, aber Ihre zweite Frage zu diesem Thema ohne Cadquery hat es möglich gemacht, das Problem zu untersuchen ...
Das Springen erfolgt, weil
orbit.update()
für das Ziel nicht auftritt und die Funktionupdate()
in Python nicht verfügbar ist. nur in c ++ oder c # usw. Aus den Dokumenten:Den Text finden Sie hier auf Seite 12. Und auch hier bei github.
Das Springen kann jedoch in IPython reproduziert werden, wenn Sie Folgendes anwenden:
renderer = Renderer(scene=scene, camera=camera, controls=[orbit], position=target, width=view_width, height=view_height)
Hier
position
werden die Zielkoordinaten [0, 5, 0] hinzugefügt. Die Aktualisierung hierfür erfolgt jedoch nur, wenn Sie mit der Maus klicken und die Position des Würfels / der Kamera anpassen. Der Sprung ist ähnlich / gleich dem Sprung, wie er in der export.HTML zu sehen ist.Schlussfolgerung: Die programmierte Kameraposition wird als Sprung nach manueller Interferenz angesehen, da die
.update()
Funktion der Python-Klasse OrbitControls fehlt und somit kein Fehler vorliegt.quelle