jupyter-cadquery(threejs)を使用してウィジェットを埋め込む:ロード時の間違った位置


8

CadQueryでjupyter-cadquery作成されたいくつかの3Dモデルを視覚化するために使用しています

Jupyterノートブックでモデルを視覚化すると、すべてが期待どおりに機能します。

しかし、ウィジェットをHTMLドキュメントに埋め込もうとすると、ロード時にカメラがを指しているよう(0, 0, 0)に見え、期待どおりではないようです。ウィジェットを操作すると、カメラは予想される座標を指します。

エラーと上記の問題のアニメーションを再現するコードは次のとおりです(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

出力

キューブのビューが相互作用によって突然「ジャンプ」することに注意してください。

の問題ipywidgetsでしょうか?ノートブックに表示すると見栄えが良いので。

どうすれば修正できますか?

再現する方法

ローカル環境を作成する必要なく、バインダーでそれを再現できます(確かに、CadQuery / jupyter-cadqueryのインストールは、最も簡単/最速の方法ではありません)。

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

上記のコードを新しい空のノートブックで実行するだけです。rendererがノートブックで問題なく3Dモデルを表示する方法を参照してください。

2019-12-23 21-28-42からのスクリーンショット

実行後、export.htmlドキュメントは左側のファイルリストにも表示されます。それを開き、ビューアの上部にある[Trust HTML]ボタンをクリックして、更新をクリックしてください。ビューを操作すると、問題を再現できます。

2019-12-23 21-25-21のスクリーンショット

また、遠近法が失われることに注意してください(つまり、正射投影ビューではありません)。それを修正することはプラスです!^^


mm ....翻訳に問題があると思います。box1 = Workplane( 'XY')。box(10、10、10).translate((10、10、10))と入力してみてください。Trsnalate ==ボックス、htmlでボックスが正しい位置にあることがわかります。数字が変わることは知っていますが、それは出発点です。
Diego Baranowski

@DiegoBaranowskiコメントありがとうございます。私はそれについて知っていますが、残念ながらそれは解決策ではありません。翻訳は最小限の再現可能な例の一部です。
ペケ

はい。embed_dataを試し、htmlをテンプレートに入れましたが(ここを参照:ipywidgets.readthedocs.io/en/latest/…)、同じエラーが発生しました。
Diego Baranowski、

@ ZF007 CadQueryはFreeCADに依存しません。以前はそうでしたが、そうではありません。編集を元に戻しました。
ペケ

cadquery 1.2.0はFreeCADなしでは動作しません。インポートエラーが繰り返しスローされます。適切な指示の後、それを見つける場所は、特定のdllが原因でpython 3.6でのみ実行される新しいエラーをスローしました。新しい環境をインストールして、anacondaでそれを修正しようとしています。(多くのCADプログラムを入手したが、FreeCADで実行したことがないので、素晴らしいクリスマスの練習になる;-)
ZF007

回答:



0

数日かかりましたが、cadqueryが適切に機能しませんでしたが、cadqueryを使用せずにこのトピックに関する2番目の質問を行ったため、問題を確認できました...

ジャンプはorbit.update()、ターゲットが発生せず、関数update()がPythonで使用できないために発生します。c ++またはc#などでのみ。ドキュメントから:

上記のカメラの回転をアニメーション化するときは、カメラのクォータニオンを使用しました。これは、自由形式の回転をアニメーション化するための最も堅牢な方法です。たとえば、上記のアニメーションは、最初にカメラを手動で動かしてから、目的のビューでその位置とクォータニオンプロパティを読み取ることによって作成されました...

このテキストは12ページのここにあります。また、github でも議論されています

ただし、以下を適用すると、IPythonでジャンプを再現できます。

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

ここにpositionターゲット座標[0、5、0]が追加されますが、これに対する更新は、マウスクリックしてキューブ/カメラの位置に調整したときにのみ行われます。ジャンプは、export.HTMLで見られるジャンプと同様/同等です。

結論:プログラムされたカメラの位置は.update()、OrbitControls Pythonクラスの機能がないため、手動干渉後のジャンプと見なされ、バグやミスではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.