Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    FieldList.GetCount Bug

    Cinema 4D SDK
    r21 r20 r19 python
    2
    2
    527
    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.
    • P
      pyr
      last edited by m_adam

      If you delete a field object in the object manager, GetCount() does not change. Worse if you repeat the whole thing, the value even increases.
      The issue also apply to HasContent()

      workaround / seems to work in my usecase

          def CheckFieldHealth (self,doc,field):
      
              if field == None: return False
      
              def get_field_layers(field):
                  """ Returns all field layers that are referenced in a field list.
      
                  https://developers.maxon.net/forum/topic/11809/iterating-trough-field-list/2
      
                  """
      
                  def flatten_tree(node):
                      """ Listifies a GeListNode tree.
                      """
                      res = []
                      while node:
                          res.append(node)
                          for child in node.GetChildren():
                              res += flatten_tree(child)
                          node = node.GetNext()
                      return res
      
                  # get the GeListHead for the FieldList
                  root = field.GetLayersRoot()
                  if root is None:
                      return []
                  # Get the first node under the GeListHead
                  first = root.GetFirst()
                  if first is None:
                      return []
      
                  # traverse the graph
                  return flatten_tree(first)
      
              error = 0
              for f in get_field_layers(field):
      
      
                  if f.GetName() != None and f.GetLinkedObject(doc) == None and f[c4d.DESC_NAME]== None:
                      error += 1
      
              if error == field.GetCount(): return False
      
      
              return True
      
      1 Reply Last reply Reply Quote 0
      • M
        m_adam
        last edited by

        Hi @pyr, I've just reached the development team about it.

        So for them, this is not a bug since FieldList store only baseLink.
        In Python, we don't have BaseLink, but if you are not aware of what it is, please read BaseLink Manual.

        But since there is no BaseLink in Python, if a link points to a destructed object (like in your case, Python simply returns None)

        So I guess your workaround is ok.
        Cheers,
        Maxime

        MAXON SDK Specialist

        Development Blog, MAXON Registered Developer

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