Các widget nhúng với jupyter-cadquery (bjj): sai vị trí khi tải


8

Tôi đang sử dụng jupyter-cadqueryđể trực quan hóa một số mô hình 3D được tạo bằng CadQuery .

Khi hình dung các mô hình trên máy tính xách tay Jupyter, mọi thứ hoạt động như mong đợi.

Nhưng khi cố gắng nhúng widget trong tài liệu HTML, có vẻ như máy ảnh, khi đang tải, đang chỉ vào (0, 0, 0), không như mong đợi. Khi bạn tương tác với widget, máy ảnh sẽ trỏ đến tọa độ dự kiến.

Đây là mã để tái tạo lỗi và hình ảnh động của vấn đề được đề cập (xem hướng dẫn dưới đây về cách tái tạo nó bằng 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

đầu ra

Lưu ý cách xem khối lập phương "nhảy" đột ngột khi tương tác.

Nó có thể là một vấn đề với ipywidgets? Vì chế độ xem ổn khi hiển thị trong sổ ghi chép.

Làm thế nào nó có thể được sửa chữa?

Cách sinh sản

Bạn có thể tái tạo nó bằng Binder mà không cần tạo môi trường cục bộ (thú nhận, cài đặt CadQuery / jupyter-cadquery không phải là điều dễ nhất / nhanh nhất để làm):

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

Chỉ cần thực thi mã ở trên trong một máy tính xách tay trống mới. Xem cách rendererhiển thị mô hình 3D mà không có bất kỳ sự cố nào trên sổ ghi chép:

Ảnh chụp màn hình từ 2019-12-23 21-28-42

Sau khi thực hiện, một export.htmltài liệu cũng sẽ xuất hiện trong danh sách tập tin bên trái. Mở nó và đảm bảo nhấp vào nút "Tin cậy HTML" trên đầu trình xem và nhấn refresh. Nếu bạn tương tác với chế độ xem, bạn có thể tái tạo vấn đề.

Ảnh chụp màn hình từ 2019-12-23 21-25-21

Lưu ý rằng, cũng, phối cảnh bị mất (đó không phải là một quan điểm trực giao). Sửa chữa đó sẽ là một lợi thế! ^^


mm .... Tôi nghĩ rằng có một số vấn đề với bản dịch. Chỉ cần thử đặt box1 = Workplane ('XY'). Box (10, 10, 10) .translate ((10, 10, 10)). Hộp Trsnalate ==, bạn sẽ thấy rằng trong html hộp có vị trí chính xác. Tôi biết rằng nó thay đổi con số, nhưng nó là một điểm khởi đầu.
Diego Baranowski

@DiegoBaranowski Cảm ơn bình luận của bạn. Tôi biết về điều đó nhưng thật không may, nó không phải là một giải pháp. Bản dịch là một phần của ví dụ tái sản xuất tối thiểu.
Peque

Có..Tôi đã thử với embed_data và đặt html vào một mẫu (xem tại đây: ipywidgets.readthedocs.io/en/latest/ Lỗi ), nhưng cùng một lỗi.
Diego Baranowski

@ ZF007 CadQuery không phụ thuộc vào FreeCAD. Nó đã từng, nhưng đó không còn là trường hợp nữa. Tôi hoàn nguyên chỉnh sửa của bạn.
Peque

Cadquery 1.2.0 không chạy mà không có FreeCAD. Nó liên tục ném một lỗi nhập khẩu. Sau khi tìm đúng hướng, nơi tìm thấy nó đã ném một lỗi mới chỉ chạy trên python 3.6 do một dll cụ thể. Tôi đang cố gắng khắc phục điều đó trong anaconda bằng cách cài đặt một môi trường mới. (có rất nhiều chương trình CAD nhưng chưa bao giờ chạy trong FreeCAD, vì vậy đây là một bài tập Giáng sinh tuyệt vời ;-)
ZF007

Câu trả lời:



0

Phải mất một vài ngày, không làm cho cadquery hoạt động đúng, nhưng câu hỏi thứ hai của bạn về chủ đề này mà không có cadquery làm cho nó có thể xem xét vấn đề ...

Việc nhảy xảy ra vì orbit.update()mục tiêu không xảy ra và chức năng update()không có sẵn trong python; chỉ trong c ++ hoặc c #, v.v. Từ các tài liệu:

Khi tạo hiệu ứng xoay camera ở trên, chúng tôi đã sử dụng phần tư của camera. Đây là phương pháp mạnh mẽ nhất để tạo hiệu ứng xoay hình tự do. Ví dụ: hình động ở trên được tạo bằng cách trước tiên di chuyển máy ảnh theo cách thủ công, sau đó đọc các thuộc tính vị trí và bậc bốn của nó ở chế độ xem mong muốn ...

Văn bản có thể được tìm thấy ở đây trên trang 12. Và cũng được thảo luận ở đây tại github.

Tuy nhiên, bước nhảy có thể được sao chép trong IPython nếu bạn áp dụng như sau:

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

ở đây positionđược thêm vào với tọa độ đích [0, 5, 0] nhưng việc cập nhật cho điều này chỉ được thực hiện khi bạn nhấp chuột và điều chỉnh theo vị trí của khối / camera. Bước nhảy tương tự / bằng với bước nhảy như đã thấy trong export.HTML.

Kết luận: vị trí camera được lập trình được xem là một bước nhảy sau khi can thiệp thủ công do sự vắng mặt của .update()chức năng của lớp python OrbitControls và do đó không phải là lỗi hay sai sót.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.