def colorTransformChanged(self, obj=0):
     """
     Perform and visualize color transformation
     Args:
         obj (QAbstractButton): Radiobutton of UI
     """
     colorTransformMode = 0  # keep original colors
     if obj == self.colorTransform1:
         colorTransformMode = 1
     elif obj == self.colorTransform2:
         colorTransformMode = 2
     cmds.mnpr(ct=(colorTransformMode))
     print("mnpr -ct {0};".format(colorTransformMode))
Beispiel #2
0
def changeStyle():
    """Resets MNPR to load a new style"""
    # reset stylization
    cmds.mnpr(resetStylization=True)

    # delete old config node
    if cmds.objExists(mnpr_info.configNode):
        cmds.delete(mnpr_info.configNode)
    # flush undo
    cmds.flushUndo()
    print("style deleted")
    # deregister node
    cmds.mnpr(rn=False)
    # register node
    cmds.mnpr(rn=True)
    # create new config node
    selectConfig()
    # refresh AETemplate
    mnpr_runner.reloadConfig()

    # set new media type
    mnpr_info.media = cmds.mnpr(style=True, q=True)

    # rebuild opened UI's
    import mnpr_UIs
    if cmds.window(mnpr_UIs.BreakdownUI.windowTitle, exists=True):
        mnpr_runner.openOverrideSettings(rebuild=True)
    import mnpr_FX
    if cmds.window(mnpr_FX.MNPR_FX_UI.windowTitle, exists=True):
        mnpr_runner.openPaintFX(rebuild=True)

    lib.printInfo("Style changed")
def openOverrideSettings(rebuild=False):
    """Opens the viewport renderer UI
     Args:
        rebuild (bool): If the UI is rebuilt when opened
    """
    mnpr_system.check()
    mnpr_system.selectConfig()
    if cmds.mnpr(listOperations=True)[0]:
        mnpr_UIs.BreakdownUI(rebuild=rebuild)
 def channelsChanged(self):
     """ Enable/disable RGBA channels """
     neg = 1 - self.negate.isChecked() * 2
     r = self.r.isChecked()
     g = self.g.isChecked()
     b = self.b.isChecked()
     a = self.a.isChecked()
     if self.sender() == self.a:
         if a:
             # alpha channel display was enabled -> disable color channels
             # save rgb
             self.cChannels[0] = r
             self.cChannels[1] = g
             self.cChannels[2] = b
             # uncheck rgb
             self.r.setChecked(False)
             self.g.setChecked(False)
             self.b.setChecked(False)
             # disable rgb
             self.r.setDisabled(True)
             self.g.setDisabled(True)
             self.b.setDisabled(True)
         else:
             # alpha channel display was disabled -> restore color channels
             # enable rgb
             self.r.setDisabled(False)
             self.g.setDisabled(False)
             self.b.setDisabled(False)
             # check rgb
             self.r.setChecked(self.cChannels[0])
             self.g.setChecked(self.cChannels[1])
             self.b.setChecked(self.cChannels[2])
             # set rgb
             r = self.cChannels[0]
             g = self.cChannels[1]
             b = self.cChannels[2]
     cmds.mnpr(ch=(r * neg, g * neg, b * neg, a * neg))
     if not a:
         print("mnpr -ch {0} {1} {2} {3}".format(r * neg, g * neg, b * neg,
                                                 a * neg))
     else:
         print("mnpr -ch 0 0 0 {0}".format(a * neg))
def updateMNPR(env=''):
    """
    Checks for updates and updates MNPR
    Args:
        env (str): MNPR directory
    """
    mnpr_system.check()
    if not env:
        env = cmds.mnpr(env=True)
    import mnpr_updater
    mnpr_updater.checkUpdates(env)
Beispiel #6
0
    def load(self, name):
        """
        Loads the specified attribute set
        Args:
            name (str): Name of the attribute set to import
        """
        attrs = self[name]['attributes']
        # check if substrate is available
        substrateAttr = "{0}.substrateTexture".format(mnpr_info.configNode)
        p = lib.Path(lib.getLibDir()).parent().child("textures")
        textures = os.listdir(p.path)
        if attrs[substrateAttr] not in textures:
            # check if substrates have been installed
            if len(textures) <= 2:
                result = cmds.confirmDialog(t="Substrates (papers/canvas) not found", m="The required substrate is not available.\nWould you like to download the MNPR substrates?", b=['Yes', 'Load anyway', 'Close'], icn="warning")
                if result == "Close":
                    return
                elif result == "Yes":
                    mnpr_runner.downloadSubstrates()
                    return
                else:
                    cmds.warning("Substrate texture not found, reverting to default substrate (style might not display correctly)")
                    attrs[substrateAttr] = "rough_default_2k.jpg"
            else:
                cmds.warning("Substrate texture not found, reverting to default substrate (style might not display correctly)")
                attrs[substrateAttr] = "rough_default_2k.jpg"

        # check change of style first
        styleAttr = "{0}.style".format(mnpr_info.configNode)
        if styleAttr in attrs:
            style = attrs[styleAttr]
            if style != cmds.mnpr(style=True):
                lib.setAttr(mnpr_info.configNode, "style", style)
                func = functools.partial(self.loadStyle, attrs)
                return cmds.scriptJob(runOnce=True, event=["SelectionChanged", func])
            else:
                # set attributes
                for attr in attrs:
                    splitter = attr.split('.')
                    lib.setAttr(splitter[0], splitter[1], attrs[attr])
        else:
            # for legacy presets (we do not worry about styles here)
            for attr in attrs:
                splitter = attr.split('.')
                if "NPRConfig" in splitter[0]:
                    splitter[0] = "mnprConfig"
                lib.setAttr(splitter[0], splitter[1], attrs[attr])
        lib.printInfo("Attributes set successfully")
 def operationChanged(self):
     """ Enable/disable operation in MNPR """
     operations = len(self.operationsCBoxDict.keys())
     changedOperation = 0
     for index in range(operations):
         prev = cmds.mnpr(renderOperation=index)
         if self.operationsCBoxDict[index].isChecked():
             cmds.mnpr(renderOperation=index, s=1)
         else:
             cmds.mnpr(renderOperation=index, s=0)
         if cmds.mnpr(renderOperation=index) != prev:
             changedOperation = index
     # give back information as to what the toggle is doing with mnpr
     print("mnpr -renderOperation {0} -s {1};".format(
         changedOperation, int(self.sender().isChecked())))
    def buildUI(self):
        # global UI variables
        self.setGeometry(500, 400, 250, 250)
        margin = 10 * self.dpiS

        # OPERATIONS
        rOpsGroup = qt.WidgetGroup(qLayout=QtWidgets.QGridLayout())
        rOps = cmds.mnpr(listOperations=True)
        index = 0
        self.operationsCBoxDict = dict()
        self.operationsReloadDict = dict()
        paintIconDir = os.path.join(mnpr_info.iconDir, "coop_refresh.png")
        for operation in rOps:
            self.operationsReloadDict[index] = qt.IconButton(
                paintIconDir, "Reload Shaders",
                [14 * self.dpiS, 14 * self.dpiS])
            self.operationsReloadDict[index].setProperty(
                "operationIndex", index)
            rOpsGroup.addWidget(self.operationsReloadDict[index], index, 0)
            self.operationsCBoxDict[index] = QtWidgets.QCheckBox(operation)
            self.operationsCBoxDict[index].setChecked(True)
            rOpsGroup.addWidget(self.operationsCBoxDict[index], index, 1)
            index += 1

        # TARGETS
        targetGroup = qt.WidgetGroup(qLayout=QtWidgets.QHBoxLayout())
        targetLabel = QtWidgets.QLabel("Active target: ")
        self.targetCoBox = QtWidgets.QComboBox()
        nprTargets = cmds.mnpr(lsT=True)
        self.targetCoBox.addItems(nprTargets)
        self.targetCoBox.setCurrentIndex(len(nprTargets) - 1)
        targetGroup.addWidgets([targetLabel, self.targetCoBox])
        targetGroup.setContentsMargins(margin, margin, margin, margin)

        # CHANNELS
        channelGroup = qt.WidgetGroup(qLayout=QtWidgets.QHBoxLayout())
        channelsLabel = QtWidgets.QLabel("Channels: ")
        self.r = QtWidgets.QCheckBox("R")
        self.r.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.r.setChecked(True)
        self.g = QtWidgets.QCheckBox("G")
        self.g.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.g.setChecked(True)
        self.b = QtWidgets.QCheckBox("B")
        self.b.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.b.setChecked(True)
        self.a = QtWidgets.QCheckBox("A")
        self.a.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.negate = QtWidgets.QCheckBox("NEG")
        self.negate.setLayoutDirection(QtCore.Qt.RightToLeft)
        channelGroup.addWidgets(
            [channelsLabel, self.r, self.g, self.b, self.a, self.negate])
        channelGroup.setContentsMargins(margin, margin, margin, margin)

        # COLOR TRANSFORMATION
        colorTransformGroup = qt.WidgetGroup(qLayout=QtWidgets.QHBoxLayout())
        colorTransformLabel = QtWidgets.QLabel("Color xform: ")
        self.colorTransformButtonGroup = QtWidgets.QButtonGroup()
        self.colorTransform0 = QtWidgets.QRadioButton("Original")
        self.colorTransform0.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.colorTransform0.setChecked(True)
        self.colorTransformButtonGroup.addButton(self.colorTransform0)
        self.colorTransform1 = QtWidgets.QRadioButton("-> Lab")
        self.colorTransform1.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.colorTransform1.setChecked(False)
        self.colorTransformButtonGroup.addButton(self.colorTransform1)
        self.colorTransform2 = QtWidgets.QRadioButton("-> RGB")
        self.colorTransform2.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.colorTransform2.setChecked(False)
        self.colorTransformButtonGroup.addButton(self.colorTransform2)
        colorTransformGroup.addWidgets([
            colorTransformLabel, self.colorTransform0, self.colorTransform1,
            self.colorTransform2
        ])
        colorTransformGroup.setContentsMargins(margin, margin, margin, margin)

        # Create Layout
        ''' Create the layouts and add widgets '''
        rOpsBox = QtWidgets.QGroupBox("Render Operations (passes)")
        rOpsLayout = QtWidgets.QVBoxLayout(rOpsBox)
        rOpsLayout.addWidget(rOpsGroup)

        # self.layout.addWidget(self.header)
        self.setContentsMargins(0, margin * 1.5, 0, 0)
        self.layout.addWidget(rOpsBox)
        self.layout.addWidget(qt.HLine(height=10 * self.dpiS))
        self.layout.addWidget(targetGroup)
        self.layout.addWidget(qt.HLine(height=10 * self.dpiS))
        self.layout.addWidget(channelGroup)
        self.layout.addWidget(qt.HLine(height=10 * self.dpiS))
        self.layout.addWidget(colorTransformGroup)
        self.layout.addWidget(self.brand)

        # Create Connections
        ''' SIGNAL '''
        for index in range(len(rOps)):
            self.operationsCBoxDict[index].stateChanged.connect(
                self.operationChanged)
            self.operationsReloadDict[index].clicked.connect(
                self.reloadOperationShaders)
        self.targetCoBox.currentIndexChanged.connect(self.targetChanged)
        self.r.stateChanged.connect(self.channelsChanged)
        self.g.stateChanged.connect(self.channelsChanged)
        self.b.stateChanged.connect(self.channelsChanged)
        self.a.stateChanged.connect(self.channelsChanged)
        self.negate.stateChanged.connect(self.channelsChanged)
        self.colorTransformButtonGroup.buttonClicked[
            'QAbstractButton *'].connect(self.colorTransformChanged)
 def targetChanged(self):
     """ Change and visualize render target """
     cmds.mnpr(renderTarget=self.targetCoBox.currentIndex())
     print("mnpr -renderTarget {0};".format(
         self.targetCoBox.currentIndex()))
 def reloadOperationShaders(self):
     """ Reload shader of operation """
     operationIndex = self.sender().property("operationIndex")
     cmds.mnpr(rOS=operationIndex)
     print("mnpr -rOS {0};".format(operationIndex))
Beispiel #11
0
def playblast(saveDir, width, height, renderCamera, modelPanel, renderSize=1):
    """
    Playblasts the timeslider
    Args:
        saveDir (str): save directory with *.mov extension
        width (int):  width in pixels
        height:  height in pixels
        renderCamera: camera to playblast from
        modelPanel: modelPanel to playblast from
        renderSize: render size (factor)
    """
    check()  # check that everything is in order
    renderSize = resolutionCheck(
        width, height, renderSize)  # make sure resolution is reasonable
    aPlayBackSliderPython = mel.eval('$tmpVar=$gPlayBackSlider')
    audioNode = cmds.timeControl(aPlayBackSliderPython, q=True,
                                 s=True)  # get audio node

    # get working values to be changed
    workingRenderSize = cmds.getAttr("{0}.renderScale".format(
        mnpr_info.configNode))
    workingColorDepth = cmds.getAttr("{0}.colorDepth".format(
        mnpr_info.configNode))
    workingCamera = cmds.modelEditor(modelPanel, cam=True, q=True)
    workingCameraShape = cmds.listRelatives(workingCamera, s=True)
    if workingCameraShape:
        workingCameraShape = workingCameraShape[0]
    else:
        # we already have the shape
        workingCameraShape = workingCamera

    # set desired attributes
    cmds.mnpr(g=True)
    mnprOperations = len(cmds.mnpr(lsO=True))
    cmds.mnpr(renderOperation=mnprOperations - 1, s=0)  # HUD
    cmds.mnpr(renderOperation=mnprOperations - 2, s=0)  # UI
    cmds.modelEditor(modelPanel, cam=renderCamera, e=True)  # change modelPanel
    lib.setAttr(mnpr_info.configNode, "renderScale", renderSize)
    lib.setAttr(mnpr_info.configNode, "colorDepth",
                2)  # needs to be 32bit to avoid artefacts
    cmds.refresh()

    # try playblasting
    try:
        cmds.playblast(f=saveDir,
                       format="qt",
                       w=width,
                       h=height,
                       percent=100,
                       qlt=100,
                       v=True,
                       fo=True,
                       os=True,
                       s=audioNode,
                       compression="PNG")
    except RuntimeError:
        try:
            cmds.playblast(f=saveDir,
                           format="avi",
                           w=width,
                           h=height,
                           percent=100,
                           qlt=100,
                           v=True,
                           fo=True,
                           os=True,
                           s=audioNode)
        except RuntimeError:
            cmds.error(
                "Video cannot be playblasted as qt or avi, please check the installed codecs."
            )

    # bring everything back to normal
    cmds.mnpr(renderOperation=mnprOperations - 1, s=1)  # HUD
    cmds.mnpr(renderOperation=mnprOperations - 2, s=1)  # UI
    cmds.modelEditor(modelPanel, cam=workingCameraShape, e=True)
    lib.setAttr(mnpr_info.configNode, "renderScale", workingRenderSize)
    lib.setAttr(mnpr_info.configNode, "colorDepth", workingColorDepth)
    cmds.mnpr(g=False)
    cmds.refresh()

    lib.printInfo(
        "Video has been successfully playblasted to: {0}".format(saveDir))
Beispiel #12
0
def renderFrame(saveDir,
                width,
                height,
                renderSize=1,
                imgFormat=".jpg",
                override=mnpr_info.prototype):
    """
    Renders current frame in the viewport
    Args:
        saveDir (str): save directory
        width (int): width in pixels
        height (int): height in pixels
        renderSize (float): render size (factor)
        imgFormat (str): .jpg, .exr, etc)
        override (str): name of desired override (if any)
    """
    check()  # check that everything is in order
    renderSize = resolutionCheck(
        width, height, renderSize)  # make sure resolution is reasonable

    # get working values to be changed
    workingRenderSize = cmds.getAttr("{0}.renderScale".format(
        mnpr_info.configNode))
    workingColorDepth = cmds.getAttr("{0}.colorDepth".format(
        mnpr_info.configNode))

    # set desired attributes
    if workingColorDepth != 2:
        lib.setAttr(mnpr_info.configNode, "colorDepth", 2)
    if renderSize != workingRenderSize:
        lib.setAttr(mnpr_info.configNode, "renderScale", renderSize)
    # prepare renderer
    cmds.mnpr(g=True)  # enable mnprGamma
    mnprOperations = len(cmds.mnpr(lsO=True))
    cmds.mnpr(renderOperation=mnprOperations - 1, s=0)  # HUD
    cmds.mnpr(renderOperation=mnprOperations - 2, s=0)  # UI
    cmds.refresh()

    # render frame
    try:
        screenshotPath = lib.screenshot(saveDir,
                                        width,
                                        height,
                                        format=imgFormat,
                                        override=override)  # render the frame
    except WindowsError:
        print("Screenshot saving has been canceled")
    except:
        traceback.print_exc()

    if screenshotPath:
        # bring everything back to normal
        cmds.mnpr(renderOperation=mnprOperations - 1, s=1)  # HUD
        cmds.mnpr(renderOperation=mnprOperations - 2, s=1)  # UI
        lib.setAttr(mnpr_info.configNode, "renderScale", workingRenderSize)
        lib.setAttr(mnpr_info.configNode, "colorDepth", workingColorDepth)
        cmds.mnpr(g=False)
        cmds.refresh()
        return screenshotPath
Beispiel #13
0
    def buildUI(self):

        self.setFixedHeight(95 * self.dpiS)
        layout = QtWidgets.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        self.setSizePolicy(QtWidgets.QSizePolicy.Maximum,
                           QtWidgets.QSizePolicy.Maximum
                           )  # avoid spacing between elements when resizing

        # header
        sider = VerticalLabel(self.fx.name, self.dpiS)
        layout.addWidget(sider)

        # type column
        typeColumnWidget = QtWidgets.QWidget()
        layout.addWidget(typeColumnWidget)
        typeColumnLayout = QtWidgets.QVBoxLayout(typeColumnWidget)
        typeColumnLayout.setContentsMargins(10 * self.dpiS, 15 * self.dpiS,
                                            10 * self.dpiS, 10 * self.dpiS)
        palette = QtGui.QPalette()
        palette.setColor(QtGui.QPalette.Background,
                         QtGui.QColor(50, 50, 50, 255))
        typeColumnWidget.setAutoFillBackground(True)
        typeColumnWidget.setPalette(palette)
        # type column widgets
        # material button
        style = cmds.mnpr(q=True, style=True)
        iconName = lib.toCamelCase("{0}_{1}.png".format(self.fx.name, style))
        noiseIconDir = os.path.join(self.iconDir, iconName)
        noiseBtn = qt.IconButton(noiseIconDir,
                                 "Noise {0}".format(self.fx.name),
                                 [45 * self.dpiS, 45 * self.dpiS],
                                 hColor=(100, 100, 100))
        typeColumnLayout.addWidget(noiseBtn)
        # type options
        typeOptionsGrp = QtWidgets.QWidget()
        typeColumnLayout.addWidget(typeOptionsGrp)
        typeOptionsLayout = QtWidgets.QHBoxLayout(typeOptionsGrp)
        typeOptionsLayout.setContentsMargins(0, 0, 0, 0)
        typeOptionsLayout.setSpacing(0)
        toggleIconDir = os.path.join(self.iconDir, "io.png")
        toggleBtn = qt.IconButton(toggleIconDir,
                                  "On | Off", [14 * self.dpiS, 14 * self.dpiS],
                                  hColor=(100, 100, 100))
        typeOptionsLayout.addWidget(toggleBtn)
        typeIconDir = os.path.join(self.iconDir, "3D2D.png")
        typeBtn = qt.IconButton(typeIconDir,
                                "3D | 2D", [28 * self.dpiS, 14 * self.dpiS],
                                hColor=(100, 100, 100))
        typeOptionsLayout.addWidget(typeBtn)

        # settings column
        pad = 5 * self.dpiS
        settingsColumnWidget = QtWidgets.QWidget()
        settingsColumnWidget.setFixedWidth(186 * self.dpiS)
        layout.addWidget(settingsColumnWidget)
        settingsColumnLayout = QtWidgets.QGridLayout(settingsColumnWidget)
        settingsColumnLayout.setContentsMargins(pad, pad, pad, pad * 1.5)
        settingsColumnLayout.setSpacing(pad)
        palette = QtGui.QPalette()
        palette.setColor(QtGui.QPalette.Background,
                         QtGui.QColor(60, 60, 60, 255))
        settingsColumnWidget.setAutoFillBackground(True)
        settingsColumnWidget.setPalette(palette)
        # noise options widget
        self.groupBoxWidget = QtWidgets.QGroupBox("{0}".format(
            self.fx.description))
        settingsColumnLayout.addWidget(
            self.groupBoxWidget, 1, 1, 2,
            2)  # (Widget, row, column, rowspan, colspan)
        groupBoxLayout = QtWidgets.QVBoxLayout(self.groupBoxWidget)
        spacing = pad
        top = pad * 5
        if len(self.fx.procOptions) < 2:
            spacing *= 3
            top = pad * 6
        groupBoxLayout.setContentsMargins(pad, top, 0, 0)
        groupBoxLayout.setSpacing(spacing)
        self.groupBoxWidget.setAutoFillBackground(True)
        self.groupBoxWidget.setStyleSheet(
            "QGroupBox { background-color: rgb(60, 60, 60); border: 0px; font-style: italic; font-weight: bold; }"
        )
        # add radio buttons dynamically
        self.optionsDict["scale"] = LabeledSlider("scale",
                                                  dpiS=self.dpiS,
                                                  labelWidth=40)
        self.optionsDict["scale"].slider.valueChanged.connect(
            lambda: nFX.noiseSlide(self.fx, self.optionsDict["scale"]))
        groupBoxLayout.addWidget(self.optionsDict["scale"])
        for option in self.fx.procOptions:
            self.optionsDict[option] = LabeledSlider(option,
                                                     dpiS=self.dpiS,
                                                     labelWidth=40)
            self.optionsDict[option].slider.valueChanged.connect(
                self.makeFunc(self.fx, self.optionsDict[option]))
            groupBoxLayout.addWidget(self.optionsDict[option])

        # reset and shift
        resetIconDir = os.path.join(self.iconDir, "reset.png")
        resetBtn = qt.IconButton(resetIconDir,
                                 "Reset {0}".format(self.fx.name),
                                 [14 * self.dpiS, 14 * self.dpiS],
                                 bColor=(60, 60, 60),
                                 hColor=(100, 100, 100))
        settingsColumnLayout.addWidget(resetBtn, 1, 3, 1, 1)
        self.shiftSlider = qt.RelativeSlider(QtCore.Qt.Vertical)
        settingsColumnLayout.addWidget(self.shiftSlider, 2, 3, 2, 1)
        self.shiftSlider.setRange(-100, 100)
        self.shiftSlider.valueChanged.connect(
            lambda: nFX.noiseShift(self.fx, self.shiftSlider))
        self.shiftSlider.sliderPressed.connect(lambda: nFX.selectMaterials())
        """ SIGNALS """
        noiseBtn.clicked.connect(lambda: mnpr_system.showShaderAttr())
        resetBtn.clicked.connect(lambda: nFX.noiseReset(self.fx))
        typeBtn.clicked.connect(lambda: nFX.noiseTypeClicked(self.fx))
        toggleBtn.clicked.connect(lambda: nFX.noiseToggleClicked(self.fx))
Beispiel #14
0
    def buildUI(self):
        self.setFixedHeight(95 * self.dpiS)
        layout = QtWidgets.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        self.setSizePolicy(QtWidgets.QSizePolicy.Maximum,
                           QtWidgets.QSizePolicy.Maximum
                           )  # avoid spacing between elements when resizing

        # header
        sider = VerticalLabel(self.fx.name, self.dpiS)
        layout.addWidget(sider)

        # paintKey column
        paintKeyColumnWidget = QtWidgets.QWidget()
        layout.addWidget(paintKeyColumnWidget)
        paintKeyColumnLayout = QtWidgets.QVBoxLayout(paintKeyColumnWidget)
        paintKeyColumnLayout.setContentsMargins(10 * self.dpiS, 15 * self.dpiS,
                                                10 * self.dpiS, 0)
        palette = QtGui.QPalette()
        palette.setColor(QtGui.QPalette.Background,
                         QtGui.QColor(50, 50, 50, 255))
        paintKeyColumnWidget.setAutoFillBackground(True)
        paintKeyColumnWidget.setPalette(palette)
        # paintKey column widgets
        # paint button
        style = cmds.mnpr(q=True, style=True)
        iconName = lib.toCamelCase("{0}_{1}.png".format(self.fx.name, style))
        paintIconDir = os.path.join(self.iconDir, iconName)
        paintBtn = qt.IconButton(paintIconDir,
                                 "Paint {0}".format(self.fx.description),
                                 [45 * self.dpiS, 45 * self.dpiS])
        paintKeyColumnLayout.addWidget(paintBtn)
        # key buttons
        keysWidget = QtWidgets.QWidget()
        paintKeyColumnLayout.addWidget(keysWidget)
        keysLayout = QtWidgets.QHBoxLayout(keysWidget)
        keysLayout.setContentsMargins(0, 0, 0, 10 * self.dpiS)
        keysLayout.setSpacing(0)
        insertKeyDir = os.path.join(self.iconDir, "insertKey.png")
        insertKeyBtn = qt.IconButton(insertKeyDir,
                                     "Keyframe",
                                     [14 * self.dpiS, 14 * self.dpiS],
                                     hColor=(100, 100, 100))
        keysLayout.addWidget(insertKeyBtn)
        showKeyedTimelineDir = os.path.join(self.iconDir, "timeline.png")
        showKeyedTimelineBtn = qt.IconButton(showKeyedTimelineDir,
                                             "Show keys in timeline",
                                             [16 * self.dpiS, 8 * self.dpiS],
                                             hColor=(100, 100, 100))
        keysLayout.addWidget(showKeyedTimelineBtn)
        removeKeyDir = os.path.join(self.iconDir, "removeKey.png")
        removeKeyBtn = qt.IconButton(removeKeyDir,
                                     "Delete Keyframe",
                                     [14 * self.dpiS, 14 * self.dpiS],
                                     hColor=(100, 100, 100))
        keysLayout.addWidget(removeKeyBtn)

        # settings column
        pad = 5 * self.dpiS
        settingsColumnWidget = QtWidgets.QWidget()
        layout.addWidget(settingsColumnWidget)
        settingsColumnLayout = QtWidgets.QGridLayout(settingsColumnWidget)
        settingsColumnLayout.setContentsMargins(pad, pad, pad, pad)
        settingsColumnLayout.setSpacing(pad)
        palette = QtGui.QPalette()
        palette.setColor(QtGui.QPalette.Background,
                         QtGui.QColor(60, 60, 60, 255))
        settingsColumnWidget.setAutoFillBackground(True)
        settingsColumnWidget.setPalette(palette)
        # paint options widget
        self.groupBoxWidget = QtWidgets.QGroupBox("{0}".format(
            self.fx.description))
        settingsColumnLayout.addWidget(
            self.groupBoxWidget, 1, 1, 2,
            2)  # (Widget, row, column, rowspan, colspan)
        groupBoxLayout = QtWidgets.QGridLayout(self.groupBoxWidget)
        groupBoxLayout.setContentsMargins(pad * 3, pad * 3, 0, 0)
        groupBoxLayout.setSpacing(0)
        self.groupBoxWidget.setAutoFillBackground(True)
        self.groupBoxWidget.setStyleSheet(
            "QGroupBox { background-color: rgb(60, 60, 60); border: 0px; font-style: italic; font-weight: bold; }"
        )
        # add radio buttons dynamically
        row = 1
        column = 1
        for key in self.fx.paintOptions:
            self.optionWidgets[key] = QtWidgets.QRadioButton(key)
            groupBoxLayout.addWidget(self.optionWidgets[key], row, column, 1,
                                     1)
            row += 1
            if row > 2:
                column += 1
                row = 1
        self.optionWidgets[self.fx.paintOptions[0]].setChecked(True)
        # reset and flood buttons
        resetBtn = QtWidgets.QPushButton("Reset")
        settingsColumnLayout.addWidget(resetBtn, 3, 1, 1, 1)
        floodBtn = QtWidgets.QPushButton("Flood")
        settingsColumnLayout.addWidget(floodBtn, 3, 2, 1, 1)
        # vertical slider
        self.amountSld = QtWidgets.QSlider(QtCore.Qt.Vertical)
        settingsColumnLayout.addWidget(self.amountSld, 1, 3, 3, 1)
        self.amountSld.setRange(-100, 100)
        """ SIGNALS """
        paintBtn.clicked.connect(lambda: pFX.paintClicked(self))
        insertKeyBtn.clicked.connect(lambda: pFX.paintKeyClicked(self, True))
        showKeyedTimelineBtn.clicked.connect(
            lambda: pFX.showKeyedTimeline(self))
        removeKeyBtn.clicked.connect(lambda: pFX.paintKeyClicked(self, False))
        for key in self.fx.paintOptions:
            self.optionWidgets[key].clicked.connect(
                lambda: pFX.paintToggleClicked(self))
        resetBtn.clicked.connect(lambda: pFX.paintFloodClicked(self, True))
        floodBtn.clicked.connect(lambda: pFX.paintFloodClicked(self, False))
        self.amountSld.valueChanged.connect(
            lambda: pFX.paintValueChanged(self))
Beispiel #15
0
def getStyleFX():
    """
    Defines and returns the style effects
    Returns: style effects (list of MNPR_FX)
    """
    # general effects
    distortionFX = MNPR_FX("distortion", "Substrate distortion", "controlSetB",
                           [[1, 0, 0, 0]], ["distort", "revert"], ["noise"])
    gapsOverlapsFX = MNPR_FX("gaps-overlaps", "Gaps and overlaps",
                             "controlSetC", [[0, 0, 1, 0]],
                             ["overlaps", "gaps"], ["noise"])

    # watercolor effects
    densityFX_WC = MNPR_FX("density", "Pigment turbulence", "controlSetA",
                           [[0, 0, 1, 0]], ["accumulate", "dilute"], ["noise"])
    applicationFX_WC = MNPR_FX("application", "Granulate | Dry-brush",
                               "controlSetA", [[0, 1, 0, 0]],
                               ["granulate", "dry-brush"], ["noise"])
    blendingFX_WC = MNPR_FX("blending", "Color bleeding (wet-in-wet)",
                            "controlSetC", [[0, 0, 0, 1]], ["bleed", "revert"],
                            ["noise"])
    edgeFX_WC = MNPR_FX("edge manip", "Edge darkening", "controlSetC",
                        [[1, 0, 0, 0], [0, 1, 0, 0]],
                        ["darken", "lighten", "wider", "narrower"],
                        ["n. dark", "n. wide"])
    watercolorFX = [
        densityFX_WC, applicationFX_WC, distortionFX, edgeFX_WC,
        gapsOverlapsFX, blendingFX_WC
    ]

    # oil effects
    densityFX_OP = MNPR_FX("density", "Pigment turbulence", "controlSetA",
                           [[0, 0, 1, 0]], ["accumulate", "dilute"], ["noise"])
    blendingFX_OP = MNPR_FX("blending", "Paint stroke length", "controlSetC",
                            [[0, 0, 0, 1]], ["increase", "decrease"],
                            ["noise"])
    detailFX_OP = MNPR_FX("detail", "Paint stroke width", "controlSetA",
                          [[0, 0, 0, 1]], ["increase", "decrease"], ["noise"])
    applicationFX_OP = MNPR_FX("application", "Impasto | Dry-brush",
                               "controlSetA", [[0, 1, 0, 0]],
                               ["impasto", "dry-brush"], ["noise"])
    oilFX = [
        densityFX_OP, blendingFX_OP, detailFX_OP, applicationFX_OP,
        distortionFX, gapsOverlapsFX
    ]

    # charcoal effects
    densityFX_CH = MNPR_FX("density", "Pigment density", "controlSetA",
                           [[0, 0, 1, 0]], ["accumulate", "dilute"], ["noise"])
    applicationFX_CH = MNPR_FX("application", "Pigment application",
                               "controlSetA", [[0, 1, 0, 0]],
                               ["even", "granulation"], ["noise"])
    mixingFX_CH = MNPR_FX("mixing", "Mixing", "controlSetC", [[0, 0, 0, 1]],
                          ["mix", "separate"], ["noise"])
    smudgingFX_CH = MNPR_FX("smudging", "Smudging", "controlSetA",
                            [[0, 0, 0, 1]], ["smudge", "revert"], ["noise"])
    edgeFX_CH = MNPR_FX("edge manip", "Edge manipulation", "controlSetC",
                        [[1, 0, 0, 0]], ["soften", "revert"],
                        ["n. soften", "n. darken"])
    charcoalFX = [
        distortionFX, densityFX_CH, applicationFX_CH, mixingFX_CH,
        smudgingFX_CH, edgeFX_CH
    ]

    # query mnpr style and return
    style = cmds.mnpr(style=True, q=True).encode(
        'latin1')  # some users have had problems without encode('latin1')
    if style == "Watercolor":
        return watercolorFX
    elif style == "Oil":
        return oilFX
    elif style == "Charcoal":
        return charcoalFX
    return []