THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 03/08/2012 at 01:36, xxxxxxxx wrote:
Hello dear MAXON support. :wink:
This tiny script here opens a modal dialog and after clicking ok, it changes the color of Nodes in the XPresso Manager of the selected XPresso Tag.
Question: Why are most of the nodes being disconnected when doing an Undo?
Animated PNG
# coding: utf-8
# author: Niklas Rosenstein <[email protected]>
""" XPresso Node-Color Modificator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Select an XPresso Tag (just a single tag)
2. Execute the script
3. Change the parameters
4. Press Ok
5. See changes in the XPresso Manager
[6. Make an Undo and start from step 2 if you don't like the changes]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This software comes AS IS and the author does not give ANY WARRANTY in
MERCHANTIBILITY or FITNESS of the software. The author does not give ANY
WARRANTY that the software will not make any damages to your software or
hardware.
"""
import c4d
import c4d.modules.graphview as c4dgv
class Dialog(c4d.gui.GeDialog) :
EDT_MUL = 1000
EDT_INCLROOT = 1001
EDT_MODROOTCOL = 1002
BTN_OK = 2000
BTN_CN = 2001
def __init__(self) :
super(Dialog, self).__init__()
self.ok = False
self.data = {self.EDT_MUL: 0.5, self.EDT_INCLROOT: False,
self.EDT_MODROOTCOL: False}
def CreateLayout(self) :
self.SetTitle("XPresso Node-Color")
self.GroupBegin(0, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT)
self.AddStaticText(0, c4d.BFH_LEFT, name="Multiplier")
self.AddEditNumberArrows(self.EDT_MUL, c4d.BFH_SCALEFIT)
self.AddCheckbox(self.EDT_INCLROOT, c4d.BFH_LEFT, initw=0, inith=10, name="Include Root")
self.AddCheckbox(self.EDT_MODROOTCOL, c4d.BFH_LEFT, initw=0, inith=10, name="Modify Default Color")
self.AddButton(self.BTN_OK, c4d.BFH_SCALEFIT, name="Ok")
self.AddButton(self.BTN_CN, c4d.BFH_SCALEFIT, name="Cancel")
self.GroupEnd()
return True
def InitValues(self) :
self.SetReal(self.EDT_MUL, self.data[self.EDT_MUL], min=0, step=0.01)
self.SetBool(self.EDT_INCLROOT, self.data[self.EDT_INCLROOT])
self.SetBool(self.EDT_MODROOTCOL, self.data[self.EDT_MODROOTCOL])
return True
def Command(self, id, msg) :
if id == self.EDT_MUL:
self.data[id] = self.GetReal(id)
elif id in (self.EDT_INCLROOT, self.EDT_MODROOTCOL) :
self.data[id] = self.GetBool(id)
elif id == self.BTN_OK:
self.ok = True
self.Close()
elif id == self.BTN_CN:
self.ok = False
self.Close()
return True
def Open(self) :
super(Dialog, self).Open(c4d.DLG_TYPE_MODAL, defaultw=200)
def Succeeded(self) :
return self.ok
def GetResult(self) :
return self.data
def change_colors(node, data) :
color = node[c4d.ID_GVBASE_COLOR]
if color != data['root-col'] or data[Dialog.EDT_MODROOTCOL]:
doc.AddUndo(c4d.UNDOTYPE_CHANGE, node)
node[c4d.ID_GVBASE_COLOR] = color * data[Dialog.EDT_MUL]
node.Message(c4d.MSG_CHANGE)
for child in node.GetChildren() :
change_colors(child, data)
def main() :
tag = doc.GetActiveTag()
if not tag:
print "No Tag selected."
return
if not tag.CheckType(c4d.Texpresso) :
print "The selected Tag must be an XPresso Tag."
return
master = tag.GetNodeMaster()
root = master.GetRoot()
dlg = Dialog()
dlg.Open()
if not dlg.Succeeded() : return
data = dlg.GetResult()
data['root-col'] = root[c4d.ID_GVBASE_COLOR]
if data[Dialog.EDT_INCLROOT]:
change_colors(root, data)
else:
for child in root.GetChildren() :
change_colors(child, data)
c4d.EventAdd()
if __name__ == "__main__":
main()
Thank you very much in advance,
Nik