Incrustar widgets con jupyter-cadquery (threejs): posición incorrecta en la carga

8

Estoy usando jupyter-cadquerypara visualizar algunos modelos 3D hechos con CadQuery .

Al visualizar los modelos en una computadora portátil Jupyter, todo funciona como se esperaba.

Pero cuando intenta incrustar el widget en un documento HTML, parece que la cámara, al cargar, apunta (0, 0, 0), no como se esperaba. Una vez que interactúa con el widget, la cámara apuntará a la coordenada esperada.

Aquí está el código para reproducir el error y una animación del problema mencionado (vea las instrucciones a continuación sobre cómo reproducirlo con 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

salida

Observe cómo la vista del cubo "salta" repentinamente en la interacción.

¿Podría ser un problema con ipywidgets? Dado que la vista está bien cuando se muestra en el cuaderno.

¿Cómo podría ser reparado?

Como reproducir

Puede reproducirlo con Binder, sin necesidad de crear un entorno local (es cierto que instalar CadQuery / jupyter-cadquery no es lo más fácil / rápido):

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

Simplemente ejecute el código anterior en un nuevo cuaderno vacío. Vea cómo renderermuestra el modelo 3D sin problemas en el portátil:

Captura de pantalla del 2019-12-23 21-28-42

Después de la ejecución, export.htmltambién aparecerá un documento en la lista de archivos a la izquierda. Ábralo y asegúrese de hacer clic en el botón "Confiar en HTML" en la parte superior del visor y presione actualizar. Si interactúa con la vista, puede reproducir el problema.

Captura de pantalla del 2019-12-23 21-25-21

Tenga en cuenta que, también, se pierde la perspectiva (que no es una vista ortogonal). ¡Arreglar eso sería una ventaja! ^^

Peque
fuente
mm .... Creo que hay algún problema con la traducción. Simplemente intente poner box1 = Workplane ('XY'). Box (10, 10, 10) .translate ((10, 10, 10)). Trsnalate == box, verá que en html el cuadro tiene la posición correcta. Sé que cambia la figura, pero es un punto de partida.
Diego Baranowski el
@DiegoBaranowski Gracias por tu comentario. Sé sobre eso pero, desafortunadamente, no es una solución. La traducción es parte del ejemplo reproducible mínimo.
Peque
Sí ... intenté con embed_data y puse el html en una plantilla (ver aquí: ipywidgets.readthedocs.io/en/latest/… ), pero el mismo error.
Diego Baranowski el
@ ZF007 CadQuery no depende de FreeCAD. Solía ​​hacerlo, pero ese ya no es el caso. Revertí tu edición.
Pequeño
El cadquery 1.2.0 no se ejecuta sin FreeCAD. Sigue arrojando un error de importación. Después de las instrucciones adecuadas donde encontrarlo, arrojó un nuevo error que solo se ejecuta en python 3.6 debido a un dll específico. Estoy tratando de arreglar eso en anaconda instalando un nuevo entorno. (obtuve muchos programas CAD pero nunca se ejecutó en FreeCAD, así que es un buen ejercicio de Navidad ;-)
ZF007

Respuestas:

0

Tomó algunos días, no funcionó correctamente la cadquery, pero su segunda pregunta sobre este tema sin cadquery hizo posible analizar el problema ...

El salto ocurre porque orbit.update()no se produce el objetivo y la función update()no está disponible en python; solo en c ++ o c #, etc. De los documentos:

Al animar la rotación de la cámara anterior, utilizamos el cuaternión de la cámara. Este es el método más robusto para animar rotaciones de forma libre. Por ejemplo, la animación anterior se creó moviendo primero la cámara manualmente y luego leyendo su posición y las propiedades de cuaternión en las vistas deseadas ...

El texto se puede encontrar aquí en la página 12. Y también se discute aquí en github.

Sin embargo, el salto se puede reproducir en IPython si aplica lo siguiente:

renderer = Renderer(scene=scene, camera=camera, controls=[orbit], position=target, width=view_width, height=view_height)

aquí positionse agrega con las coordenadas del objetivo [0, 5, 0] pero la actualización para esto solo se realiza cuando hace clic con el mouse y se ajusta a la posición del cubo / cámara. El salto es similar / igual al salto como se ve en la exportación. HTML.

Conclusión: la posición de la cámara programada se ve como un salto después de la interferencia manual debido a la ausencia de la .update()función de la clase de pitón OrbitControls y, por lo tanto, no es un error o error.

ZF007
fuente