XPresso ports get disconnected on Undo



  • 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. 😉

    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 <rosensteinniklas@gmail.com>  
    """ 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



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/08/2012 at 01:48, xxxxxxxx wrote:

    Ok, I got it. Instead of calling BaseDocument.AddUndo() for every change, we should call GvNodeMaster.AddUndo() at the state where the Undo-Action should lead. So, just call it before any node is manipulated and it works fine. No call to BaseDocument.AddUndo() is necessary anymore.

    # coding: utf-8  
    # author: Niklas Rosenstein <rosensteinniklas@gmail.com>  
    """ 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]:  
        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()  
      master.AddUndo()  
      
      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()
    

    Thanks goes to Sebastian (s_rath).
    Niklas


Log in to reply