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
    1. Maxon Developers Forum
    2. gaschka
    3. Posts
    • Profile
    • Following 0
    • Followers 0
    • Topics 6
    • Posts 13
    • Best 0
    • Controversial 0
    • Groups 0

    Posts made by gaschka

    • RE: Rename Layers with Python containing Emoji?

      The same is true, trying to rename objects in the OM: It works manually, but not via script. Is it an encoding issue?

      posted in Cinema 4D SDK
      gaschkaG
      gaschka
    • Rename Layers with Python containing Emoji?
      import c4d
      
      doc: c4d.documents.BaseDocument  # The currently active document.
      op: c4d.BaseObject | None  # The primary selected object in `doc`. Can be `None`.
      
      def create_and_rename_layer(doc, layer_name):
          new_layer = c4d.documents.LayerObject()
          new_layer.SetName(layer_name)
          root_layer = doc.GetLayerObjectRoot()
          new_layer.InsertUnderLast(root_layer)
          c4d.EventAdd()
          return new_layer
      
      def main() -> None:
          layer_1_string = "Layer 1: \N{grinning face with smiling eyes}"
          print(layer_1_string)
          layer_1 = create_and_rename_layer(doc, layer_1_string)
      
          layer_2_string = "Layer 2: \U0001F600"
          print(layer_2_string)
          layer_2 = create_and_rename_layer(doc, layer_2_string)
      
          layer_3_string = "Layer 3: 🤣"
          print(layer_3_string)
          layer_3 = create_and_rename_layer(doc, layer_3_string)
      
      
      if __name__ == '__main__':
          main() 
      

      I've the code above, with which I try to create and rename layers, so they contain lovely Emoji. Though when I execute the code, I see the Emoji in the Console, but the layers refuse to rename accordingly.

      Cinema_4D  2024-03-03 um 15.34.56.png Cinema_4D  2024-03-03 um 15.35.00.png

      When I edit a layer by hand, I can input Emoji with no issues:

      60812c8a-6f62-490d-b6f7-036e7d839f1c-image.png

      posted in Cinema 4D SDK 2024 python windows
      gaschkaG
      gaschka
    • RE: Python tag initalization?

      @m_adam

      @m_adam said in Python tag initalization?:

      OM is not single threaded,

      Oh, that's an interesting insight for me. Perhaps I was misinformed, as Character Rigs had the tendency to get slow quite easily in C4D, and Animators look envy over to Maya, as they do have a parallel evaluation (and caching). Though I'm aware that there are changes/improvements to C4D performance lately. Thanks for the link. A lot of new information to learn an absorb 🙂

      posted in Cinema 4D SDK
      gaschkaG
      gaschka
    • RE: Python tag initalization?

      @baca thanks for the insights! I guess I sit too long next to game devs who have a tendency for premature optimizations and got infected 😂
      But I can second that: I know so many C4D artists who don't have a clue, neither they care, about how to keep theirs scene performant.

      posted in Cinema 4D SDK
      gaschkaG
      gaschka
    • RE: Python script to Python tag hand over?

      Thanks for your help and nudging me into the right direction, I think I can work with that 🙂

      posted in Cinema 4D SDK
      gaschkaG
      gaschka
    • RE: Python: How to inject code into a Python tag?

      Thanks to you both for your answers.

      @m_adam Regarning my issue with the file linking, I'll try to come up with a procedure for reproduction of my issue soon: It was quite random, but I was in the flow of writing my script, so I circumvented with the string solution, but I would prefer the file solution for sure.

      posted in Cinema 4D SDK
      gaschkaG
      gaschka
    • RE: Python tag initalization?

      @m_adam thanks a lot for the explaination and the code. Messages is a new concept for me and something I'll definitely explore.

      Referring to point 1: So checking if the object is changed, even with the OM traversal, is something I can ignore performance wise? I'm asking, because I want the tag to control a custom piece of a character rig, perhaps with multiple copies of it. Rigs tend to be quite performance critical and running single threaded in C4D due to the OM so I wonder if this kind of search in the OM can have a significant impact?

      posted in Cinema 4D SDK
      gaschkaG
      gaschka
    • RE: Python: User Data Float Slider?

      @i_mazlov Thank you for the friendly introduction and the hint to CUSTOMGUI and REALSLIDER, exactly what I was looking for.
      @baca Thank you for the additional tip.

      posted in Cinema 4D SDK
      gaschkaG
      gaschka
    • Python: How to import files as modules?

      Hello everybody,

      I'm new to this forum, so please bear with me in case my questions are hardly noob ish. I tried my best to consult the docs and the search first, but still I do have this question:

      Right now, I'm working on a script that hit the 600 lines mark, so I thought it's a good idea to create different files and use import to use these files as modules. But somehow C4D python refuses to find the file and use these files as modules. As soon as I deactivate the VSC C4D bridge, the import works (at least this is what the VSC console is telling me).
      I've set up an Environment Variable to my script repo with the hope this would fix it, but without any luck.

      Is this bad practice for a script? Shall I turn it into a plugin to have this as an option?

      posted in Cinema 4D SDK python 2024
      gaschkaG
      gaschka
    • Python: How to inject code into a Python tag?

      I'm working on a script, which creates bunch of objects in the OM and then adds a Python Tag to one of them, to control my new objects with a script.
      First I tried the following approach, which did not always work reliable from VSC, especially after restarting C4D. My impression was, that I had to open the linked file in the Script Manager once to be able to use the Execute in C4D command in VSC with that file linked successfully:

      def add_python_tag(obj, config):
          tag_file = os.path.join(os.path.dirname(__file__), "file_with_code_for_the_python_tag.py")
          
          if not obj or not os.path.exists(tag_file):
              return
          
          python_tag = c4d.BaseTag(c4d.Tpython)
          with open(tag_file, 'r') as f:
              python_code = f.read()
      
          python_tag[c4d.TPYTHON_CODE] = python_code
          obj.InsertTag(python_tag)
          
          c4d.EventAdd()
      

      So I'm using this approach now, but this feels very hacky, and I loose the syntax highlighting for all the injected code, which makes me still maintain the file above and then copy and paste into the string:

      def add_python_tag(obj):
          if not obj:
              return
      
          python_tag = c4d.BaseTag(c4d.Tpython)
      
          python_code = """
      
      import c4d
      
      def main():
          # my code for the Python tag
      
      
      # Execution
      if __name__ == '__main__':
          main()
      
      """
      
          python_tag[c4d.TPYTHON_CODE] = python_code
          obj.InsertTag(python_tag)
      
          c4d.EventAdd()
      

      I'm new to all of this, so I want to ask, if this a good practice, or are there other more slick ways to approach this?

      posted in Cinema 4D SDK python 2024
      gaschkaG
      gaschka
    • Python: User Data Float Slider?

      I create user data with a python script, which works fine.

      Now I want to change the appearance of the user data to a Float Slider, at least thats the name of it when I right click it in C4D and choose it underneath User Interface. Can I set it with Python? I'm not able to find the corresponsing call in the Docs, but perhaps I just don't know the correct string to search for.

      Please help 🙂

      Cinema_4D  2023-12-19 um 18.03.01.png

      # .... define create_null() up here
      
              squash_and_stretch_name = "Squash and Stretch"
              squash_and_stretch_type = c4d.DTYPE_REAL
              initial_value = 0
              min_value = 0.0
              max_value = 1.0
              step_value = 0.01
      
              user_data_null = create_null("User Data") 
      
              squash_and_stretch_container = c4d.GetCustomDataTypeDefault(squash_and_stretch_type)
              squash_and_stretch_container[c4d.DESC_NAME] = squash_and_stretch_name 
              squash_and_stretch_container[c4d.DESC_MIN] = min_value
              squash_and_stretch_container[c4d.DESC_MAX] = max_value
              squash_and_stretch_container[c4d.DESC_STEP] = step_value
              squash_and_stretch_container[c4d.DESC_DEFAULT] = initial_value
      
              user_data_null.AddUserData(squash_and_stretch_container)
      
      posted in Cinema 4D SDK python 2024
      gaschkaG
      gaschka
    • Python script to Python tag hand over?

      I'm working on a script that creates a python tag with some code.

      Now I want the main script to talk to the python tag script and hand over some information.

      I do it in an incredibly hacky way, and like to know if this is appropriate, or if there is a more elegant/reliable way to do it?

      def add_python_tag(obj, crtl1, crtl2):
          if not obj:
              return
      
          pos_1 = get_global_position(crtl1)
          pos_2 = get_global_position(crtl2)
      
          distance_init = (pos_1 - pos_2).GetLength()
      
          python_tag = c4d.BaseTag(c4d.Tpython)
      
          python_code = """
      
      import c4d
      
      def main():
      
          #some more code ...
      
          pos_1 = get_global_position(ctrl_01)
          pos_2 = get_global_position(ctrl_02)
      
          distance_const = distance_init
      
          distance = (pos_1 - pos_2).GetLength()
          stretch_coefficient = distance_const / distance
      
          # and even more code ... 
      
      
      # Execution
      if __name__ == '__main__':
          main()
      
      """
          
          python_code = python_code.replace("distance_init", str(distance_init))
      
          python_tag[c4d.TPYTHON_CODE] = python_code
          obj.InsertTag(python_tag)
      
          c4d.EventAdd()
      
      posted in Cinema 4D SDK 2024 python
      gaschkaG
      gaschka
    • Python tag initalization?

      Hello everyone,

      I'm new here 🙂

      I've a python script that creates a Python tag and injects some code into it. This Python tag is then searching in the hierarchy for objects to link to. This search is in the main() so I guess it executing every frame/interaction, which doesn't sound very performant, especially as it will relink the same object over and over again.

      Is there a way to initialize the python tag somehow, so in the example below, crtl_01 gets assigned just a single time, and then keeps its value without updating it?

      Is initialization the correct term for this?

      The code looks similar to this:

      import c4d
      
      def get_object_from_python_tag(tag):
          if tag and tag.GetType() == c4d.Tpython:
              linked_object = tag.GetMain()
              if linked_object:
                  return linked_object
          return None
      
      def get_parent_object(obj):
          return obj.GetUp()
      
      def find_object_in_hierarchy_by_name(current_obj, target_name):
          if current_obj.GetName() == target_name:
              return current_obj
      
          child = current_obj.GetDown()
          while child:
              result = find_object_in_hierarchy_by_name(child, target_name)
              if result:
                  return result
              child = child.GetNext()
      
          return None
      
      def main():
          python_null = get_object_from_python_tag(op)
      
          ctrl_01 = find_object_in_hierarchy_by_name(get_parent_object(python_null), "Helper_01")
      
      # Execution
      if __name__ == '__main__':
          main()
      
      posted in Cinema 4D SDK python 2024
      gaschkaG
      gaschka