Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Problems with Edit Slider

    Scheduled Pinned Locked Moved PYTHON Development
    10 Posts 0 Posters 815 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      On 14/05/2013 at 11:15, xxxxxxxx wrote:

      Hi,

      When I assign a value in InitValues(self) for an EditSlider, I can't use the slider anymore (it stays at the same value). So when I try to get the value it doesn't work, because the slider can't be edited.

      I've followed the Python SDK instructions, but I'm not getting any further.
      Are there special things I have to do to make it work?

      Greetings,

      Casimir

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 14/05/2013 at 13:04, xxxxxxxx wrote:

        post your code.

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 15/05/2013 at 06:44, xxxxxxxx wrote:

          Here is the code:

          import c4d
          import os
          import sys
          from c4d import gui, plugins, bitmaps, documents, utils
          from c4d.modules import mograph

          PLUGIN_ID = 1000003 # Test ID

          #Global Variables

          FOOT_X = 16.0
          FOOT_Y = 4.0
          FOOT_Z = 24.0

          #Groups

          GroupFoot = 20100

          #CreateObjectMethods

          def AddLeftFoot(doc) :

          global L_Foot
            L_Foot = c4d.BaseObject(c4d.Ocube)
            L_Foot[c4d.PRIM_CUBE_LEN, c4d.VECTOR_X] = FOOT_X
            L_Foot[c4d.PRIM_CUBE_LEN, c4d.VECTOR_Y] = FOOT_Y
            L_Foot[c4d.PRIM_CUBE_LEN, c4d.VECTOR_Z] = FOOT_Z
            L_Foot[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y] = FOOT_Y/2
            L_Foot.SetName('L_Foot')
            doc.InsertObject(L_Foot)
            c4d.EventAdd()

          #SliderDialog

          class InitializeSubDialog(c4d.gui.SubDialog) :

          def CreateLayout(self) :         #Layout
                self.SetTitle("Character Values")
                
                #Group Foot
                self.GroupBegin(GroupFoot, c4d.BFH_SCALEFIT, 2, 0, "Foot")
                self.GroupBorderSpace(5, 5, 5, 5)
                self.GroupBorder(c4d.BORDER_GROUP_IN)
                self.AddStaticText(0, c4d.BFH_LEFT, 0, 0, "Foot_X", 0)
                self.AddEditSlider(20101, c4d.BFH_SCALEFIT, 500, 0)
                self.GroupEnd()
               
                return True

          def InitValues(self) :           #Initialize Layout Values (Called when the dialog is initialized by the GUI.)

          self.SetReal(id = 20101, value = None, min = 5.0, max = 20.0, step = 1.0, format = c4d.FORMAT_METER)
                return True

          def Command(self, id, msg) :     #Commands
               
                global L_Foot
                if (id == 20101) :           #Foot_X SLider
                    FOOT_X = self.GetReal(20101)
                    L_Foot[c4d.PRIM_CUBE_LEN, c4d.VECTOR_X] = FOOT_X
                    c4d.EventAdd()
               
                return True

          #InitialDialog

          class InitializeDialog(c4d.gui.GeDialog) :

          def CreateLayout(self) :         #Layout
                self.SetTitle("Character Creator")

          self.AddStaticText(0, c4d.BFH_CENTER, 0, 0, "GENDER", 0)
                self.AddComboBox(10001, c4d.BFH_CENTER, 200, 0)
                self.AddChild(10001, 0, "MALE")
                self.AddChild(10001, 1, "FEMALE")
                self.AddSeparatorH(200, c4d.BFH_CENTER)
                self.AddButton(10002, c4d.BFH_CENTER, 150, 0, "Create Character")
           
                return True

          def InitValues(self) :           #Initialize Layout Values (Called when the dialog is initialized by the GUI.)
           
                return True

          def Command(self, id, msg) :     #Commands
               
                if (id == 10002) :           #Button Create Character
                    GENDER = self.GetLong(10001)
                    print GENDER
                    doc = c4d.documents.GetActiveDocument()
                    AddLeftFoot(doc)
                    InitializeSubDialog().Open(dlgtype = c4d.DLG_TYPE_ASYNC, pluginid = PLUGIN_ID, defaultw = 500, defaulth = 600)
                   
                    return True

          c4d.EventAdd()

          return True

          class Initialize(c4d.plugins.CommandData) :

          dialog = None

          def Init(self, op) :
                return True

          def Message(self, type, data) :
                return True

          def Execute(self, doc) :
                if self.dialog is None:
                    self.dialog = InitializeDialog()
                return self.dialog.Open(dlgtype = c4d.DLG_TYPE_ASYNC, pluginid = PLUGIN_ID, defaultw = 200, defaulth = 160)

          if __name__ == "__main__":
            bmp = c4d.bitmaps.BaseBitmap()
            dir, file = os.path.split(__file__)
            fn = os.path.join(dir, "res", "IconChar.tif")
            bmp.InitWith(fn)
            print "Character Creator Loaded."
            result = plugins.RegisterCommandPlugin(PLUGIN_ID, "Character Creator", 0, bmp, "Character Creator", Initialize())

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 15/05/2013 at 07:36, xxxxxxxx wrote:

            And when I don't assign a value in the SetReal, I can use the slider and get information out of it.

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 15/05/2013 at 08:19, xxxxxxxx wrote:

              Not relates to your problem, but you will have problems if you store L_Foot globally. Better store it somewhere else than the global scope (eg from where you call AddLeftFoot(), and return L_Foot in this function)

              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 15/05/2013 at 09:28, xxxxxxxx wrote:

                Ditto what Nik said.
                It's ok to use globals in C4D plugins. But try not to get carried away with them.
                Put those kinds of values into your methods parameters whenever possible. It will be less confusing later on.

                The reason you're having trouble with your slider is because the main GeDialog needs an instance of the subdialog in it so it can talk to the sub dialog properly.

                Here's an example how to set up the dialogs:

                import c4d  
                import os  
                import sys  
                from c4d import gui, plugins, bitmaps, documents, utils  
                  
                PLUGIN_ID = 1000003 # Test ID  
                  
                GroupFoot = 2000  
                FOOT_X_TEXT = 1000  
                FOOT_X_SLIDER = 1001  
                  
                ###### The sub dialog ######  
                class InitializeSubDialog(gui.GeDialog) :       #<--You don't need to use "subdialog" ...It can just be another GeDialog  
                  
                  def CreateLayout(self) :  
                      self.SetTitle("Character Values")  
                        
                      #Group Foot  
                      self.GroupBegin(GroupFoot, c4d.BFH_SCALEFIT, 2, 0, "Foot")  
                      self.GroupBorderSpace(5, 5, 5, 5)  
                      self.GroupBorder(c4d.BORDER_GROUP_IN)  
                      self.AddStaticText(FOOT_X_TEXT, c4d.BFH_LEFT, 0, 0, "Foot_X", 0)  
                      self.AddEditSlider(FOOT_X_SLIDER, c4d.BFH_SCALEFIT, 500, 0)  
                      self.GroupEnd()  
                       
                      return True  
                   
                  
                  def InitValues(self) :  
                  
                      self.SetReal(id = FOOT_X_SLIDER, value = 5.0, min = 5.0, max = 20.0, step = 1.0, format = c4d.FORMAT_METER)  
                      return True  
                  
                  def Command(self, id, msg) :  
                      if (id == FOOT_X_SLIDER) :  
                          print self.GetReal(FOOT_X_SLIDER)   #Print the value of the slider  
                       
                      return True  
                  
                  
                ###### The main dialog ######  
                class InitializeDialog(gui.GeDialog) :  
                  
                  subdlg = InitializeSubDialog()       #The sub dialog's local class member instance <--- Very important!!!!!  
                  
                  def CreateLayout(self) :  
                      self.SetTitle("Character Creator")  
                  
                      self.AddStaticText(0, c4d.BFH_CENTER, 0, 0, "GENDER", 0)  
                      self.AddComboBox(10001, c4d.BFH_CENTER, 200, 0)  
                      self.AddChild(10001, 0, "MALE")  
                      self.AddChild(10001, 1, "FEMALE")  
                      self.AddSeparatorH(200, c4d.BFH_CENTER)  
                      self.AddButton(10002, c4d.BFH_CENTER, 150, 0, "Create Character")  
                  
                      return True  
                  
                  
                  def InitValues(self) :     
                      return True  
                  
                  
                  def Command(self, id, msg) :  
                       
                      if (id == 10002) :           #Button Create Character  
                          GENDER = self.GetLong(10001)  
                          print GENDER  
                          doc = c4d.documents.GetActiveDocument()          
                          self.subdlg.Open(dlgtype = c4d.DLG_TYPE_ASYNC, defaultw = 500, defaulth = 600)  
                           
                      c4d.EventAdd()  
                  
                      return True  
                  
                class Initialize(c4d.plugins.CommandData) :  
                  
                  dialog = None  
                  
                  def Init(self, op) :  
                      return True  
                  
                  def Message(self, type, data) :  
                      return True  
                  
                  def Execute(self, doc) :  
                      if self.dialog is None:  
                          self.dialog = InitializeDialog()  
                      return self.dialog.Open(dlgtype = c4d.DLG_TYPE_ASYNC, pluginid = PLUGIN_ID, defaultw = 200, defaulth = 160)  
                  
                      
                if __name__ == "__main__":  
                  bmp = c4d.bitmaps.BaseBitmap()  
                  dir, file = os.path.split(__file__)  
                  fn = os.path.join(dir, "res", "IconChar.tif")  
                  bmp.InitWith(fn)  
                  result = plugins.RegisterCommandPlugin(PLUGIN_ID, "Character Creator", 0, bmp, "Character Creator", Initialize()) 
                

                -ScottA

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  On 15/05/2013 at 10:34, xxxxxxxx wrote:

                  Thanks for saying where to store my variables, still having a bit trouble with python variables, im more used with C++. And how do you mean, not relates to your problem?
                  I really have no clue how to get that slider good.

                  Greets,

                  Casimir

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    On 15/05/2013 at 10:36, xxxxxxxx wrote:

                    Thanks for your answer scott!! I just saw it when I posted my other reply, I think it will be fine now 🙂

                    Greets

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

                      On 15/05/2013 at 10:42, xxxxxxxx wrote:

                      You have to pass a float to GeDialog.SetReal() as the value parameter. None won't work. 
                      I think that is breaking the slider. You also did not implement RestoreLayout() despite the 
                      fact that you did instantiate a non modal dialog which will generally end in a mess.

                      You should also always implement object.__int__() for each class. also use constantly self.
                      Both things are not mandatory but are considered as good style for a reason.

                      1 Reply Last reply Reply Quote 0
                      • H Offline
                        Helper
                        last edited by

                        On 15/05/2013 at 10:57, xxxxxxxx wrote:

                        Ok, thanks for your answers guys!

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post