Skip to content

Instantly share code, notes, and snippets.

@notaTeapot
Last active July 11, 2024 08:29
Show Gist options
  • Save notaTeapot/5feea53dccc921ea6af88a4d222e1e2b to your computer and use it in GitHub Desktop.
Save notaTeapot/5feea53dccc921ea6af88a4d222e1e2b to your computer and use it in GitHub Desktop.
Open 3d Widget with editing
# Partially Working Error on Exit
from PySide2 import QtWidgets, QtGui,QtCore
import open3d as o3d
import win32gui
import sys
import threading
import time
class Worker(QtCore.QObject):
def run(self,vis):
vis.run()
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
widget = QtWidgets.QWidget()
layout = QtWidgets.QGridLayout(widget)
self.setCentralWidget(widget)
file_path = "C:\\test\test.pcd"
self.pcd = o3d.io.read_point_cloud(file_path)
self.vis = o3d.visualization.VisualizerWithEditing()
self.vis.create_window()
self.vis.add_geometry(self.pcd)
hwnd = win32gui.FindWindowEx(0, 0, None, "Open3D - free view")
self.window = QtGui.QWindow.fromWinId(hwnd)
self.windowcontainer = self.createWindowContainer(self.window, widget)
layout.addWidget(self.windowcontainer, 0, 0)
self.thread = QtCore.QThread()
self.worker = Worker()
self.thread.started.connect(lambda: self.worker.run(self.vis))
self.thread.start()
timer = QtCore.QTimer(self)
timer.timeout.connect(self.blub)
timer.start(100)
#print("starting vis")
btn = QtWidgets.QPushButton(text="test")
btn.clicked.connect(lambda: print("Button pressed!"))
layout.addWidget(btn)
def blub(self):
#Function to keep PySide eventloop running
pass
def start_vis(self):
print("thread start")
self.vis.run()
print("thread end")
def update_vis(self):
#self.vis.update_geometry()
self.vis.poll_events()
self.vis.update_renderer()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = MainWindow()
form.setWindowTitle('o3d Embed')
form.setGeometry(100, 100, 600, 500)
form.show()
sys.exit(app.exec_())
@KazyaGlaedwine
Copy link

I want to press btn to add another geometry, but run() will block the current thread. So I didn't succeed, Do you know how to solve it, thank you very much!

I solved it by using open3d.visualization.Visualizer() instead of self.vis = o3d.visualization.VisualizerWithEditing()
VisualizerWithEditing() can only render one geometry at a time even though you succeeded in adding it whereas Visualizer can only render more than one geometry.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment