def excepthook(exc_type, exc_value, exc_traceback): """ Handle unexpected errors by popping an error window and restarting the app. """ global last_failure_time failure_time = datetime.datetime.now() difference_with_last_failure = failure_time - last_failure_time last_failure_time = failure_time if difference_with_last_failure < datetime.timedelta(seconds=2): return string_tb = traceback.format_exception(exc_type, exc_value, exc_traceback) from_kitsupublisher = any("kitsupublisher" in tb_step for tb_step in string_tb) if not from_kitsupublisher: sys.__excepthook__(exc_type, exc_value, exc_traceback) return header = "\n=== An error occured !=== \nError message:\n" traceback_print = "".join(string_tb) message = "%s%s" % (header, traceback_print) if is_blender_context(): from dccutils.dcc_blender import BlenderContext BlenderContext.software_print(message) else: print(message) app = QtWidgets.QApplication.instance() create_error_dialog(app.current_window, traceback_print) app.current_window.close() launch_main_window(app)
def create_preview(self): """ Create the preview following the type of object to display. """ if not self.preview_file: self.preview_widget = NoPreviewWidget(self, "No preview yet") else: try: if is_video(self.preview_file): if (is_blender_context() or is_maya_context() or is_houdini_context() or get_current_binding() not in ["PySide2", "PyQt5"]): # Video not supported yet on Blender nor Maya # Qt video support introduced in PySide2/PyQt5 raise MediaNotSetUp() else: from kitsupublisher.views.task_panel.PreviewVideoWidget import ( PreviewVideoWidget, ) self.preview_widget = PreviewVideoWidget( self, self.preview_file) else: self.preview_widget = PreviewImageWidget( self, self.preview_file) except MediaNotSetUp: self.preview_widget = None message = ( "Error while displaying the preview. <br/> Please " "refer to the web interface by following this link :") self.preview_widget = NoPreviewWidget(self, message, self.kitsu_task_url)
def get_preview_selector_items(self): """ Return available previews depending on the context. """ if is_maya_context() or is_blender_context(): return ["Take screenshot", "Take playblast", "From local file"] elif is_houdini_context(): return ["Take screenshot", "From local file"] else: return ["From local file"]
def init_context(self): """ Initialize the context class, depending on which software is used. """ if is_blender_context(): from dccutils.blender import BlenderContext as Context elif is_maya_context(): from dccutils.maya import MayaContext as Context elif is_houdini_context(): from dccutils.houdini import HoudiniContext as Context else: raise ContextNotFoundError self.context = Context()
def display_video_preview(self, animation_path): """ Display the video. """ if is_blender_context() or is_maya_context() or is_houdini_context(): raise MediaNotSetUp() self.clear_preview() self.preview_widget = QtMultimediaWidgets.QVideoWidget() self.preview_widget.resize(300, 300) self.preview_widget.move(0, 0) self.player = QtMultimedia.QMediaPlayer() self.player.setVideoOutput(self.preview_widget) self.player.setMedia( QtMultimedia.QMediaContent( QtCore.QUrl.fromLocalFile(animation_path))) self.frame_preview_layout.addWidget(self.preview_widget) self.player.play()