Restore old Pointselection



  • On 22/12/2015 at 02:45, xxxxxxxx wrote:

    Hi, I want to store a Pointsselection and later restore that Selection on another Identical Object.
    I tried this...but with no luck

    points = obj.GetPointS()
    count =  NewObj.GetPointCount()
    newPoints = NewObj.GetPointS()
    newPoints.DeselectAll()
      
    for i in xrange(count) :
    	if points.IsSelected(i) :
    		newPoints.Select(i)
    


  • On 22/12/2015 at 03:02, xxxxxxxx wrote:

    Hi Holgar,

    You can simply use BaseSelect.CopyTo() to copy a selection to another. Note you have to send a MSG_UPDATE after changing the selection:

    sel = obj.GetPointS()
    otherSel = newObj.GetPointS()
    sel.CopyTo(otherSel)
    newObj.Message(c4d.MSG_UPDATE)
    


  • On 22/12/2015 at 03:49, xxxxxxxx wrote:

    Thanks Yannick. But it does not work for me. What I do is I make CallCommand with Shrinkselection and than I want to restore the old selection. Its not working.



  • On 22/12/2015 at 03:52, xxxxxxxx wrote:

    Could you post some code?



  • On 22/12/2015 at 04:16, xxxxxxxx wrote:

    def main() :
      
        
        selobj=doc.GetSelection()
      
        obj=selobj[0]
        sel = obj.GetPointS()
        obj.Message(c4d.MSG_UPDATE)
      
        c4d.CallCommand(12559) # Shrink Selection
        newobj=obj.GetClone()
        newobj.InsertAfter(obj)
        
        
        otherSel = newobj.GetPointS()
        sel.CopyTo(otherSel)
        newobj.Message(c4d.MSG_UPDATE)
        obj.Remove()
      
        c4d.EventAdd()
      
      
    if __name__=='__main__':
        main()
    


  • On 22/12/2015 at 05:26, xxxxxxxx wrote:

    Just some question:

    selobj=doc.GetSelection()  
    Why dont you use doc.GetActiveObject() or doc.GetActiveObjects?  
    You just wanna work with Objects, rigth?  
    
    
    
    obj.Message(c4d.MSG_UPDATE)  
    Why do you send this message befor the selection change?  
      
    c4d.CallCommand(12559) # Shrink Selection  
    Isnt it more comfortable to use   
    c4d.utils.SendModelingCommand(command = c4d.MCOMMAND_SELECTSHRINK,  
                                    list = [selobj],  
                                    mode = c4d.MODELINGCOMMANDMODE_POINTSELECTION,  
                                    bc = c4d.BaseContainer(),  
                                    doc = doc)  
    Ok, in this case selobj is the active object in any cases.  
      
    And finally just to clearify:   
    - you store the selection of an object  
    - you shrink the selection  
    - you create and insert a clone of the object with the shrinked selection  
    - you put the unshrinked selection at the clone and remove the object  
    Where is the difference before and after the script?       
    


  • On 22/12/2015 at 06:19, xxxxxxxx wrote:

    This is just an example copied from a script. I store the selection before I shrink the selection. So I would expect i can restore it later from the state before I shrink it. But I guess something is wrong with my logic.



  • On 22/12/2015 at 06:33, xxxxxxxx wrote:

    Ok, I understand.

    I think sel isnt an instance or clone of obj.GetPointS(), so you change sel with SELECTSHRINK, too.

    import c4d  
    from c4d import gui  
    #Welcome to the world of Python  
      
    def main() :  
      
      obj = doc.GetActiveObject()  
      if obj == None: return  
        
      sel = c4d.BaseSelect()  
      obj.GetPointS().CopyTo(sel)  
      
      c4d.utils.SendModelingCommand(command = c4d.MCOMMAND_SELECTSHRINK,  
                                  list = [obj],  
                                  mode = c4d.MODELINGCOMMANDMODE_POINTSELECTION,  
                                  bc = c4d.BaseContainer(),  
                                  doc = doc)  
                                    
      newobj = obj.GetClone()  
      newobj.InsertAfter(obj)  
      newobj.SetRelPos(c4d.Vector(0,0,200))  
        
      other_sel = newobj.GetPointS()  
      sel.CopyTo(other_sel)  
      newobj.Message(c4d.MSG_UPDATE)  
      
      c4d.EventAdd()  
        
      
    if __name__=='__main__':  
      main()
    


  • On 23/12/2015 at 00:30, xxxxxxxx wrote:

    so How would I be able to restore my old selection than? Any Idea?

    Edit: Sorry..just realized that your code is now working. I see. Thanks.


Log in to reply