SendModelingCommand -Loop/Ring



  • On 05/03/2013 at 17:03, xxxxxxxx wrote:

    I want to select a ring or a loop with SendModelingCommand.
    Unfortunately, the SKD is very confusing here, leaving it up to find out what some do, or not, by trying  :/
    http://chicagoc4d.com/C4DPythonSDK/modules/c4d.utils/index.html#c4d.utils.SendModelingCommand
    For instance there are many indented and duplicate entries under Untriangulate and ConvertSelection, which obviously don´t seem to have to do anything with it?

    Then the tools, which in c4d work not on a selection, but also select it (like loop or ring), don´t seem to take notice of MODELINGCOMMANDMODE_****SELECTION (the same as MODIFY_****SELECTION)?

    With the ring loop I got "some" achievment by this:

        bc = c4d.BaseContainer()  
      bc.SetData(c4d.MDATA_RING_EDGE, 22) # Giving an Edge Id for the ring manually  
      bc.SetData(c4d.MDATA_RING_SELECTION, c4d.SELECTION_NEW)  
      
      
      ring = utils.SendModelingCommand(command=c4d.ID_MODELING_RING_TOOL,  
                                      list=[obj],  
                                      mode=c4d.MODELINGCOMMANDMODE_EDGESELECTION,  
                                      bc=bc,  
                                      doc=doc,  
                                      flags=c4d.MODELINGCOMMANDFLAGS_CREATEUNDO)  
      c4d.EventAdd()  
      print ring
    

    But I have to put the edge ID in there manually and got no idea how to find out an edge ID...

    Doing the same with Loop Tool just gives me a False feedback, even if I fill out all its options.

       bc2 = c4d.BaseContainer()  
      
      bc2.SetData(c4d.MDATA_LOOP_SEL_STOP_AT_BOUNDS, True)  
      bc2.SetData(c4d.MDATA_LOOP_SEL_SELECT_BOUNDS, False)  
      bc2.SetData(c4d.MDATA_LOOP_SEL_GREEDY_SEARCH, False)  
      bc2.SetData(c4d.MDATA_LOOP_LOOP_EDGE, 11)  
      # bc2.SetData(c4d.MDATA_RING_EDGE, 22)  
      # bc2.SetData(c4d.MDATA_LOOP_SKIP, 0)  
      bc2.SetData(c4d.MDATA_LOOP_SELECTION, c4d.SELECTION_NEW)  
      # bc2.SetData(c4d.MDATA_LOOP_SEL_, 0)  
      
      
      loop = utils.SendModelingCommand(command=c4d.ID_MODELING_LOOP_TOOL,  
                                          list=[obj],  
                                          mode=c4d.MODELINGCOMMANDMODE_EDGESELECTION,  
                                          bc=bc2,  
                                          doc=doc,  
                                          flags=c4d.MODELINGCOMMANDFLAGS_CREATEUNDO)  
      print loop  
      c4d.EventAdd()
    


  • On 05/03/2013 at 17:18, xxxxxxxx wrote:

    edge ids are being defined under c4d.polygonobject.getedges().

    The edges are indexed by 4 * polygon + edge where polygon is the polygon index and edge is the edge index between 0 and 3.

    so the polygon with the id 4 will hold edge 4*4+0, +1, +2, (+3). the edge order is the same as
    the point order AB, BC, CA or AB, BC, CD, DA.



  • On 06/03/2013 at 04:27, xxxxxxxx wrote:

    Thanks,

    for ring selection it kind of works now, but I can´t get a proper undo, it always repeats all the iteration Steps from "for index in select_list:" :/

        doc = c4d.documents.GetActiveDocument()  
      obj = doc.GetActiveObject()  
      select_list = []  
      neigh = utils.Neighbor()    
      neigh.Init(obj)    
      edgecount = neigh.GetEdgeCount()  
      bs_selected = obj.GetSelectedEdges(neigh, c4d.EDGESELECTIONTYPE_SELECTION)  
      
      doc.StartUndo()  
      doc.AddUndo(c4d.UNDOTYPE_CHANGE_SELECTION, obj)  
      
      for i, index in enumerate(bs_selected.GetAll(edgecount)) :  
          if not index:  
              continue  
          else:  
              select_list.append(i)  
      
      for index in select_list:  
          bc = c4d.BaseContainer()  
          bc.SetData(c4d.MDATA_RING_EDGE, index)    
          bc.SetData(c4d.MDATA_RING_SELECTION, c4d.SELECTION_ADD)  
          # bc.SetData(c4d.MDATA_RING_SKIP, 35)  
      
          utils.SendModelingCommand(command=c4d.ID_MODELING_RING_TOOL,  
                                    list=[obj],  
                                    mode=c4d.MODELINGCOMMANDMODE_EDGESELECTION,  
                                    bc=bc,  
                                    doc=doc,  
                                    flags=c4d.MODELINGCOMMANDFLAGS_0)  
          doc.EndUndo()  
      c4d.EventAdd()
    

    But ID_MODELING_LOOP_TOOL seems broken, or I´m missing something crucial, anybody got luck with that? It doesn´t do anything besides reporting False...



  • On 11/03/2013 at 12:15, xxxxxxxx wrote:

    Got the ring Undo, by doing it in an isolated Document with a combination of DoUndo...

    But could anybody test if the ID_MODELING_LOOP_TOOL __ tool is really broken or me? I´ll report it, if its broken...


Log in to reply