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
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Python: Key Error while initializing GUI, Dictionary, self

    Cinema 4D SDK
    2
    5
    1.2k
    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.
    • M
      mogh
      last edited by mogh

      "Dictionary" "self" and old SDK sample code might be my issue, but can somebody help me and point out, why I get a key error by just adding more gui elements to this old SDK ToolData plugin liquid-painter sample code.

      adding a Checkbox (Bool) worked, but adding other gui elements breaks the smaple code somehow.

      Key error on line 39 & 107 (marked in the Code so you don't need to search)
      Thanks in advance
      R20 Visualice

      import c4d
      import os
      from c4d import gui, plugins, bitmaps
      
      # be sure to use a unique ID obtained from www.plugincafe.com
      PLUGIN_ID = 1015073
      
      # for GeLoadString values must match with the header file
      IDS_PRIMITIVETOOL = 50000
      
      class SettingsDialog(gui.SubDialog):
          parameters = None
      
          def __init__(self, arg):
              self.parameters = arg
      
          def CreateLayout(self):
              self.GroupBegin(id=1000, flags=c4d.BFH_SCALEFIT, cols=2, rows=5)
              self.GroupBorderSpace(1, 1, 1, 1)
      
              # Bool
              self.element = self.AddStaticText(id=2003, flags=c4d.BFH_SCALEFIT, initw=1, name="Extend Vector: ", borderstyle=c4d.BORDER_NONE)
              self.element = self.AddCheckbox(id=2002, flags=c4d.BFH_SCALEFIT, initw=1, inith=0, name="")
              #valuebool = self.parameters['extend_vector']
              self.SetBool(2002, False)
      
              # Extension Value
              self.element = self.AddStaticText(id=3001, flags=c4d.BFH_SCALEFIT, initw=1, name="Extension Ratio: ", borderstyle=c4d.BORDER_NONE)
              valueextension = self.parameters['extension_ratio']
              self.AddEditSlider(id=3002, flags=c4d.BFH_SCALEFIT)
              self.SetFloat(id=3002, value=valueextension, min=0.1, max=100, step=0.1, min2=0.0001, max2=1000, quadscale=True)
      
              print self.parameters
      
              self.element = self.AddStaticText(id=1001, flags=c4d.BFH_SCALEFIT, initw=1, name="Sphere Size: ", borderstyle=c4d.BORDER_NONE)
              valuespheresize = self.parameters["sphere_size"]                         
      # first key error 
              self.AddEditNumberArrows(id=1002, flags=c4d.BFH_SCALEFIT)
              self.SetFloat(id=1002, value=valuespheresize, min=0, max=20)
      
              self.GroupEnd()
              return True
      
          def Command(self, id, msg):
              if id == 1002:
                  self.parameters['sphere_size'] = self.GetFloat(1002)
                  print "Sphere Size: ", self.GetFloat(1002)
              if id == 2002:
                  self.parameters['extend_vector'] = self.GetBool(2002)
                  print "Extend Vector:", self.GetBool(2002)
              if id == 3002:
                  self.parameters['extension_ratio'] = self.GetFloat(3002)
                  print "Extension Ratio: ", self.GetFloat(3002)
              return True
      
      
      class AVTTool(plugins.ToolData):
          # Inherit from ToolData to create your own tool
      
          def __init__(self):
              self.data = {'sphere_size': 15}
              self.data = {'extension_ratio': 1}
      
          def GetState(self, doc):
              if doc.GetMode() == c4d.Mpaint: return False
              return c4d.CMD_ENABLED
      
          def Debug(self, msg):
              # c4d.CallCommand(13957) # Konsole loeschen
              print "Konsole geloescht."
              return True
      
          def KeyboardInput(self, doc, data, bd, win, msg):
              key = msg.GetLong( c4d.BFM_INPUT_CHANNEL )
              cstr = msg.GetString( c4d.BFM_INPUT_ASC )
              if key == c4d.KEY_ESC:
                  # do what you want
                  print "ESC Key Pressed."
                  # return True to signal that the key is processed
                  return True
              return False
      
          def MouseInput(self, doc, data, bd, win, msg):
              mx = msg[c4d.BFM_INPUT_X]
              my = msg[c4d.BFM_INPUT_Y]
      
              device = 0
              if msg[c4d.BFM_INPUT_CHANNEL] == c4d.BFM_INPUT_MOUSELEFT:
                  device = c4d.KEY_MLEFT
              elif msg[c4d.BFM_INPUT_CHANNEL] == c4d.BFM_INPUT_MOUSERIGHT:
                  device = c4d.KEY_MRIGHT
              else:
                  return True
      
              null = c4d.BaseObject( c4d.Ometaball )
              null[c4d.METABALLOBJECT_SUBEDITOR] = 10
              null.MakeTag( c4d.Tphong )
      
              doc.AddUndo( c4d.UNDO_NEW, null )
      
              doc.InsertObject( null )
              doc.SetActiveObject( null )
              c4d.DrawViews( c4d.DA_ONLY_ACTIVE_VIEW | c4d.DA_NO_THREAD | c4d.DA_NO_ANIMATION )
      
              rad = self.data['sphere_size']                                                 
      # second key error 
              dx = 0.0
              dy = 0.0
      
              win.MouseDragStart( button=device, mx=int( mx ), my=int( my ),
                                  flags=c4d.MOUSEDRAGFLAGS_DONTHIDEMOUSE | c4d.MOUSEDRAGFLAGS_NOMOVE )
              result, dx, dy, channel = win.MouseDrag()
              while result == c4d.MOUSEDRAGRESULT_CONTINUE:
                  mx += dx
                  my += dy
      
                  # continue if user doesnt move the mouse anymore
                  if dx == 0.0 and dy == 0.0:
                      result, dx, dy, channel = win.MouseDrag()
                      continue
      
                  cl = c4d.BaseObject( c4d.Osphere )
      
                  cl.SetAbsPos( bd.SW( c4d.Vector( mx, my, 500.0 ) ) )
                  cl[c4d.PRIM_SPHERE_RAD] = rad
                  cl.InsertUnder( null )
      
                  c4d.DrawViews( c4d.DA_ONLY_ACTIVE_VIEW | c4d.DA_NO_THREAD | c4d.DA_NO_ANIMATION )
                  result, dx, dy, channel = win.MouseDrag()
      
              if win.MouseDragEnd() == c4d.MOUSEDRAGRESULT_ESCAPE:
                  doc.DoUndo( True )
      
              c4d.EventAdd()
              return True
      
          def GetCursorInfo(self, doc, data, bd, x, y, bc):
              if bc.GetId() == c4d.BFM_CURSORINFO_REMOVE:
                  return True
      
              bc.SetString( c4d.RESULT_BUBBLEHELP, plugins.GeLoadString( IDS_PRIMITIVETOOL ) )
              bc.SetLong( c4d.RESULT_CURSOR, c4d.MOUSE_POINT_HAND )
              return True
      
          def AllocSubDialog(self, bc):
              return SettingsDialog( self.data )  # always return new instance
      
      
      if __name__ == "__main__":
          bmp = bitmaps.BaseBitmap()
          dir, file = os.path.split(__file__)
          fn = os.path.join(dir, "res", "AligntoVector.tif")
          bmp.InitWith(fn)
          plugins.RegisterToolPlugin( id=PLUGIN_ID, str="Py-AlignToVector",
                                      info=0, icon=bmp,
                                      help="Select two Points to generate a Vector. Then Click additional points to move them onto the Vector.",
                                      dat=AVTTool() )
      
      1 Reply Last reply Reply Quote 0
      • S
        s_bach
        last edited by s_bach

        Hello,

        as always, please use the Q&A system and also tell us the version of Cinema 4D you are using.

        There is no issue with adding GUI elements. The issue is with these lines of code:

        self.data = {'sphere_size': 15}
        self.data = {'extension_ratio': 1}
        

        Please make sure you understand how to use a Dictionary in Python.

        best wishes,
        Sebastian

        MAXON SDK Specialist

        Development Blog, MAXON Registered Developer

        1 Reply Last reply Reply Quote 3
        • M
          mogh
          last edited by mogh

          Thanks Sebastian,

          I did read your dictionary link but was wondering why then this code works in the sample sdk

          what i've tried so far to set or read the dic. in the init

                  self.data["sphere_size"] = 15
                  self.data["extension_ratio"] = 1
          
                  self.data.get("sphere_size")
                  self.data.get("extension_ratio")
          
                  self.data = parameters["sphere_size"] = 15
                  self.data = parameters["extension_ratio"] = 1
          
                  self.data = parameters.get("sphere_size")
                  self.data = parameters.get("extension_ratio")
                  
                  self.data = {'sphere_size': 15}       # original SDK Code !
                  self.data = {'extension_ratio': 1}
          

          This is obviously a problem of myself understanding the concept of "self" but I really like to learn by solving c4d problems instead of generic Phyton lessons.

          kind regards mogh
          R20 Visualize

          1 Reply Last reply Reply Quote 0
          • S
            s_bach
            last edited by

            Hello,

            this isn't a Cinema 4D issue; it has also nothing to do with "self". It is just about understanding basic Python syntax.

            Just run this code

            someDict = { "a", 1}
            someDict = { "b", 2}
            print(someDict)
            

            to see that it only contains one key/value pair. This is because the second line does not add a key/pair value. The assignment operator overwrites the variable with a new Dictionary.

            I strongly recommend do to some generic Python lessons.

            best wishes,
            Sebastian

            MAXON SDK Specialist

            Development Blog, MAXON Registered Developer

            1 Reply Last reply Reply Quote 1
            • M
              mogh
              last edited by

              thanks solved:

              self.data = {'sphere_size': 15, 'extension_ratio': 1, 'extend_vector': False}
              

              kind regards

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