Betten Sie Widgets mit jupyter-cadquery (threejs) ein: falsche Position beim Laden

8

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

Ausgabe

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

https://mybinder.org/v2/gh/bernhard-42/jupyter-cadquery/master?urlpath=lab&filepath=examples%2Fcadquery.ipynb

Führen Sie einfach den obigen Code in einem neuen leeren Notizbuch aus. Sehen Sie, wie das renderer3D-Modell ohne Probleme auf dem Notebook angezeigt wird:

Screenshot vom 23.12.2019 21-28-42

Nach der Ausführung export.htmlwird 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.

Screenshot vom 23.12.2019 21-25-21

Beachten Sie, dass auch die Perspektive verloren geht (das ist keine orthogonale Ansicht). Das zu beheben wäre ein Plus! ^^

Peque
quelle
mm .... Ich denke, dass es ein Problem mit der Übersetzung gibt. Versuchen Sie einfach, box1 = Arbeitsebene ('XY'). Box (10, 10, 10) .translate ((10, 10, 10)) zu setzen. Trsnalate == box, Sie werden sehen, dass die Box in HTML die richtige Position hat. Ich weiß, dass es die Figur ändert, aber es ist ein Ausgangspunkt.
Diego Baranowski
@DiegoBaranowski Danke für deinen Kommentar. Ich weiß davon, aber leider ist es keine Lösung. Die Übersetzung ist Teil des minimal reproduzierbaren Beispiels.
Peque
Ja. Ich habe es mit embedded_data versucht und das HTML in eine Vorlage eingefügt (siehe hier: ipywidgets.readthedocs.io/en/latest/… ), aber der gleiche Fehler.
Diego Baranowski
@ ZF007 CadQuery ist nicht von FreeCAD abhängig. Früher war es so, aber das ist nicht mehr der Fall. Ich habe Ihre Bearbeitung zurückgesetzt.
Peque
Die Cadquery 1.2.0 läuft nicht ohne FreeCAD. Es wird immer wieder ein Importfehler ausgegeben. Nach den richtigen Anweisungen, wo es zu finden ist, wurde ein neuer Fehler ausgegeben, der aufgrund einer bestimmten DLL nur unter Python 3.6 ausgeführt wird. Ich versuche, dies in Anaconda durch die Installation einer neuen Umgebung zu beheben. (habe viele CAD-Progs bekommen, bin aber nie in FreeCAD gelaufen, also ist es eine schöne Weihnachtsübung
;-)

Antworten:

0

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 Funktion update()in Python nicht verfügbar ist. nur in c ++ oder c # usw. Aus den Dokumenten:

Bei der Animation der obigen Kameradrehung haben wir die Quaternion der Kamera verwendet. Dies ist die robusteste Methode zum Animieren von Freiformrotationen. Die obige Animation wurde beispielsweise erstellt, indem zuerst die Kamera manuell bewegt und dann ihre Position und Quaternionseigenschaften in den gewünschten Ansichten ausgelesen wurden ...

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 positionwerden 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.

ZF007
quelle