Skocz do zawartości

Featured Replies

Napisano

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?

  • Odpowiedzi 6
  • Wyświetleń 1,4k
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano
  • 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
  • Autor

No tak - działa ale tylko dopóki nie poruszę viewportu. Potem przestaje... damn!

Edytowane przez Kroopson
ortografia Panie

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.

Account

Navigation

Szukaj

Szukaj

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.