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))
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)
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))
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))
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
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))
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))
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 []