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

    Edge ring selection

    Cinema 4D SDK
    2024 python windows
    2
    2
    296
    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.
    • T
      Tpaxep
      last edited by

      Hi folks, I am actively trying to learn Python for Cinema 4D, and lately I have been struggling with edge selection, specifically the Loop and Ring functions.
      I got the code working as expected in r21, but in r25 and 2024 it no longer works, I have been trying to figure out what the problem is, but alas, I have not been able to. I would really appreciate it if you could show me what I am missing

      import c4d
      from c4d import utils
      
      def select_ring_edge(obj, edge_id):
          bc = c4d.BaseContainer()
          bc.SetData(c4d.MDATA_RING_EDGE, edge_id)
          bc.SetData(c4d.MDATA_RING_SELECTION, c4d.SELECTION_NEW)
      
          result = c4d.utils.SendModelingCommand(
              command=c4d.ID_MODELING_RING_TOOL,
              list=[obj],
              mode=c4d.MODELINGCOMMANDMODE_EDGESELECTION,
              bc=bc,
              doc=c4d.documents.GetActiveDocument(),
              flags=c4d.MODELINGCOMMANDFLAGS_CREATEUNDO
          )
          c4d.EventAdd()
          return result
      
      def main():
          doc = c4d.documents.GetActiveDocument()
          obj = doc.GetActiveObject()
          if obj is None:
              c4d.gui.MessageDialog("select obj.")
              return
      
          edge_index = 3
      
          result = select_ring_edge(obj, edge_index)
          if result:
              print("DONE")
          else:
              print("ERROR")
      
      if __name__ == '__main__':
          main()
      1 Reply Last reply Reply Quote 0
      • M
        m_adam
        last edited by ferdinand

        Hi @Tpaxep,

        Welcome to the Maxon developers forum and its community, it is great to have you with us!

        Getting Started

        Before creating your next postings, we would recommend making yourself accustomed with our forum and support procedures. You did not do anything wrong, we point all new users to these rules.

        • Forum Overview: Provides a broad overview of the fundamental structure and rules of this forum, such as the purpose of the different sub-forums or the fact that we will ban users who engage in hate speech or harassment.
        • Support Procedures: Provides a more in detail overview of how we provide technical support for APIs here. This topic will tell you how to ask good questions and limits of our technical support.
        • Forum Features: Provides an overview of the technical features of this forum, such as Markdown markup or file uploads.

        It is strongly recommended to read the first two topics carefully, especially the section Support Procedures: How to Ask Questions.

        About your First Question

        The tool has indeed been updated, but the docs were not.

        Here is how to call it. Note that you have to pass a polygon index, this is mandatory and it needs to be adjacent to one of the vertex to indicate a direction of the ring selection. Here is your script adapted, to be run on a sphere that was made editable.

        import c4d
        from c4d import utils
        
        def select_ring_edge(obj, v1Id, v2Id, polyId):
            bc = c4d.BaseContainer()
            bc.SetData(c4d.MDATA_RING_SEL_STOP_AT_SELECTIONS, False)
            bc.SetData(c4d.MDATA_RING_SEL_STOP_AT_NON_QUADS, False)
            bc.SetData(c4d.MDATA_RING_SEL_STOP_AT_POLES, True)
            bc.SetData(c4d.MDATA_RING_BOTH_SIDES, False)
            bc.SetData(c4d.MDATA_RING_SWAP_SIDES, False)
            
            bc.SetData(c4d.MDATA_RING_FIRST_VERTEX, v1Id)
            bc.SetData(c4d.MDATA_RING_SECOND_VERTEX, v2Id)
            bc.SetData(c4d.MDATA_RING_POLYGON_INDEX, polyId)
            
            
            bc.SetData(c4d.MDATA_RING_SELECTION, c4d.SELECTION_NEW)
        
            result = c4d.utils.SendModelingCommand(
                command=c4d.ID_MODELING_RING_TOOL,
                list=[obj],
                mode=c4d.MODELINGCOMMANDMODE_EDGESELECTION,
                bc=bc,
                doc=c4d.documents.GetActiveDocument(),
                flags=c4d.MODELINGCOMMANDFLAGS_NONE
            )
            c4d.EventAdd()
            return result
        
        def main():
            doc = c4d.documents.GetActiveDocument()
            obj = doc.GetActiveObject()
            if obj is None:
                c4d.gui.MessageDialog("select obj.")
                return
        
            firstVertex = 346
            secondVertex = 347
            polygonIndex = 312
        
            result = select_ring_edge(obj, firstVertex, secondVertex, polygonIndex)
            if result:
                print("DONE")
            else:
                print("ERROR")
        
        if __name__ == '__main__':
            main()
        

        Note that the same settings also apply for the ID_MODELING_LOOP_TOOL, just modify RING by LOOP in the constant so MDATA_RING_SEL_STOP_AT_SELECTIONS become MDATA_LOOP_SEL_STOP_AT_SELECTIONS.

        Cheers,
        Maxime.

        MAXON SDK Specialist

        Development Blog, MAXON Registered Developer

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