Napisano 8 Styczeń 20169 l Siema. Mam grubaśny problem z klasą M3dView i nie wiem o co chodzi. Tworzę sobie okienko do robienia screenshota modelu tak: def get_preview_window(): win = cmds.window() layout = cmds.paneLayout() model_editor = cmds.modelPanel() cmds.setParent("..") cmds.setParent("..") cmds.showWindow(win) get_preview_window() Teraz grabuję QImage tak: import ctypes import maya.OpenMaya as om import maya.OpenMayaUI as omui from PySide.QtGui import QImage view = omui.M3dView.active3dView() width = view.portWidth() height = view.portHeight() img = om.MImage() view.readColorBuffer(img, False) ptr = ctypes.cast(img.pixels().__long__(), ctypes.POINTER(ctypes.c_char)) ptrAsStr = ctypes.string_at(ptr, width * height * 4) qimg = QImage(ptrAsStr, width, height, QImage.Format_ARGB32) qimg = qimg.mirrored(horizontal=False, vertical=True) qimg.save('C:/screenshot.png') Problem w tym że grabuje mi kawałek głównego viewportu (o wielkości tego okna utworzonego wcześniej) zamiast zawartości modelEditor'a stworzonego przez funkcję get_preview_window(). Okienko jest kliknięte jako aktywne itp. Nawet nazwa wyciągnięta ze wskaźnika przez OpenMayaUI.MQtUtil.fullName(long(view.widget())) się zgadza ale output się nie zgadza :/ WTF :/ może to ktoś sprawdzić na innej majce niż 2016?
Napisano 14 Styczeń 20169 l Autor HUHU! Dobra - udało się rozwiązać!!!! Problem polegał na tym, że od Majki 2016 defaultowy bit depth viewportu jest 16bit (kFloat), a defaultowy MImage jest 8bit (kByte). Kiedy readColorBuffer dostaje MImage o nie tej głębokości bitów wypełnia go jakimś śmieciem, który jakimś cudem zawiera obraz z nieaktywnego aktualnie viewportu (MImage.create() robi to samo, dlatego na to wpadłem). Kod poniżej działa, ale myślę że trzeba będzie w końcu przerzucić się na używanie klas MRenderer i MTexture. #------------------------------ # grab active Model editor view to QImage #------------------------------ import ctypes import maya.OpenMaya as om import maya.OpenMayaUI as omui from PySide.QtGui import QImage, QWidget from shiboken import wrapInstance import uuid view = omui.M3dView.active3dView() model_editor_qwidget = wrapInstance(long(view.widget()), QWidget) view.refresh(True, True) img = om.MImage() if view.getRendererName() == view.kViewport2Renderer: print "Saving float point viewport" img.create(view.portWidth(), view.portHeight(), 4, om.MImage.kFloat) view.readColorBuffer(img) img.convertPixelFormat(om.MImage.kByte ) else: print "Saving fixed point viewport" view.readColorBuffer(img) pixels_size = view.portWidth() * view.portHeight() * bg_image.depth() pixels_pointer = bg_image.pixels() # --------------------------------------- convert the frame buffer to str pp = uuid.ctypes.cast(pixels_pointer.__long__(), uuid.ctypes.POINTER(uuid.ctypes.c_char)) pixels_string = uuid.ctypes.string_at(pp, pixels_size) # ------------------------------------------ make the QImage from the str image = QImage(pixels_string, width, height, QImage.Format_RGB32).mirrored(horizontal=False, vertical=True) image.save("c:/qimage.png", "PNG") PS. Jakby nie support Autodesku to bym się w życiu nie domyślił o co chodzi.
Napisano 14 Styczeń 20169 l Autor No tak - działa ale tylko dopóki nie poruszę viewportu. Potem przestaje... damn! Edytowane 14 Styczeń 20169 l przez Kroopson ortografia Panie
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto