Skocz do zawartości
View in the app

A better way to browse. Learn more.

Max3D.pl

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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,3k
  • 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

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.