Incorporar widgets com jupyter-cadquery (threejs): posição incorreta no carregamento


8

Estou usando jupyter-cadquerypara visualizar alguns modelos 3D feitos com o CadQuery .

Ao visualizar os modelos em um notebook Jupyter, tudo funciona como esperado.

Mas, ao tentar incorporar o widget em um documento HTML, parece que a câmera, quando carregada, está apontando (0, 0, 0), não como o esperado. Depois de interagir com o widget, a câmera apontará para a coordenada esperada.

Aqui está o código para reproduzir o erro e uma animação do problema mencionado (consulte as instruções abaixo sobre como reproduzi-lo com o 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

resultado

Observe como a visualização do cubo "salta" repentinamente na interação.

Poderia ser um problema ipywidgets? Como a visualização é boa quando exibida no notebook.

Como poderia ser consertado?

Como reproduzir

Você pode reproduzi-lo com o Binder, sem precisar criar um ambiente local (é certo que instalar o CadQuery / jupyter-cadquery não é a coisa mais fácil / rápida a fazer):

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

Basta executar o código acima em um novo caderno vazio. Veja como renderermostra o modelo 3D sem problemas no notebook:

Captura de tela de 2019-12-23 21-28-42

Após a execução, um export.htmldocumento também aparecerá na lista de arquivos à esquerda. Abra-o e clique no botão "Confiar em HTML" na parte superior do visualizador e clique em Atualizar. Se você interagir com a exibição, poderá reproduzir o problema.

Captura de tela de 2019-12-23 21-25-21

Observe que, também, a perspectiva é perdida (que não é uma visão ortogonal). Consertar isso seria uma vantagem! ^^


mm .... Eu acho que há algum problema com a tradução. Apenas tente colocar box1 = Workplane ('XY'). Box (10, 10, 10) .translate ((10, 10, 10)). Trsnalate == box, você verá que, em html, a caixa tem a posição correta. Eu sei que isso muda a figura, mas é um ponto de partida.
Diego Baranowski

@DiegoBaranowski Obrigado pelo seu comentário. Eu sei disso, mas, infelizmente, não é uma solução. A tradução faz parte do exemplo mínimo reproduzível.
Peque

Sim .. Eu tentei com embed_data e coloquei o html em um modelo (veja aqui: ipywidgets.readthedocs.io/en/latest/… ), mas o mesmo erro.
Diego Baranowski

@ ZF007 O CadQuery não depende do FreeCAD. Costumava, mas esse não é mais o caso. Eu reverti sua edição.
Peque 01/01

O cadquery 1.2.0 não roda sem o FreeCAD. Ele continua gerando um erro de importação. Após as instruções adequadas, onde encontrá-lo, lançou um novo erro que só é executado no python 3.6 devido a uma dll específica. Estou tentando consertar isso no anaconda instalando um novo ambiente. (recebi muitos progs de CAD, mas nunca rodou no FreeCAD, então é um bom exercício de Natal ;-)
ZF007

Respostas:



0

Demorou alguns dias, não conseguiu que o cadquery funcionasse corretamente, mas sua segunda pergunta sobre esse tópico sem o cadquery tornou possível analisar o problema ...

O salto ocorre porque orbit.update()para target não ocorre e a função update()não está disponível em python; somente em c ++ ou c #, etc. A partir dos documentos:

Ao animar a rotação da câmera acima, usamos o quaternion da câmera. Este é o método mais robusto para animar rotações de forma livre. Por exemplo, a animação acima foi criada movendo a câmera primeiro manualmente e depois lendo suas propriedades de posição e quaternion nas visualizações desejadas ...

O texto pode ser encontrado aqui na página 12. E também discutido aqui no github.

No entanto, o salto pode ser reproduzido no IPython se você aplicar o seguinte:

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

aqui positioné adicionado com as coordenadas alvo [0, 5, 0], mas a atualização é feita apenas quando você clica com o mouse e ajusta a posição do cubo / câmera. O salto é semelhante / igual ao salto, como visto no export.HTML.

Conclusão: a posição da câmera programada é vista como um salto após a interferência manual devido à ausência da .update()função da classe python OrbitControls e, portanto, não é um erro ou erro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.