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:
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 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.