Position Update



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 14/03/2012 at 10:39, xxxxxxxx wrote:

    Hi all,
    I'm trying to store all the positions by frame of an object to retry the distance traveled of this element, but I can't calculate the value at time of the position...

    For more clarity here's my code:

    import c4d
    #Welcome to the world of Python

    def main() :
        fps     = doc.GetFps()
        frame = doc.GetTime().GetFrame(doc.GetFps())
        obj = op.GetObject()
        Distance = []
        currentTime   = doc.GetTime()
        
        for i in range (0, frame) :
            doc.SetTime(c4d.BaseTime(i,fps))
            print GPos # return always the same vector (obj position in current frame)
    Distance.append(GPos)
            obj.Message(c4d.MSG_UPDATE)
            c4d.EventAdd()
            doc.SetTime(c4d.BaseTime(frame,fps)
        print Distance #contains always the same vector

    I know that I have to update the scene before retry the object position(may be c4d.DrawViews command), but I don't know how.
    Please help me 😊

    Luther



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 14/03/2012 at 15:37, xxxxxxxx wrote:

    Hi Luther,

    where does your GPos variable come from?

    -Niklas



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 14/03/2012 at 23:39, xxxxxxxx wrote:

    Hi Niklas,
    I'm so sorry... when I cut and paste my code I always lost something :nerd:

    GPos = obj.GetMg().off

    Luther



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 00:55, xxxxxxxx wrote:

    Hi Luther,
     
    I guess/hope you're doing that operation within the for-loop? Just a hint, why don't you use ~.GetAbsPos() ?
    __ 
    -Niklas



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 02:35, xxxxxxxx wrote:

    Hi Niklas,
    I thought it was the same as GetAbsPos(). Isn't It?
    What do you mean by "doing that operation within the for-loop?". for i in range(0,frame) is not a loop?

    Luther



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 06:04, xxxxxxxx wrote:

    Hi Luther,
    Yes it is, I just wondered why you do it this way. :) Yes it is a for-loop, but I wanted to know if you're calling op.GetMg().off within the for loop or not, i.e.
     
    for i in range(frame) : # same as range(0, frame), better use xrange by the way
        GPos = op.GetMg().off
        # ...
     
    and not
     
    GPos = op.GetMg().off
    for i in range(frame) :
        # ...
     
    But that would be too obvious I guess, and anyway, even if you're doing that, it won't work... I just tested it and saw that the position is not updated by just setting the document time, and I don't know how to update it .. I know there is a way to do it, but c4d.EventAdd() nor c4d.GeSyncMessage() seem to fix that... sry :D
     
    -niklas



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 06:40, xxxxxxxx wrote:

    In Py SDK, documents -> BaseDocument at the end,
    there is a example how to run thru the document.

    Cheers
    Lennart



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 07:06, xxxxxxxx wrote:

    Hi Niklas,
    thank you for your reply and your test...
    Anyway, anyone knows the way to update a value in a given frame?

    What is wrong in this code?

    _

    _
    import c4d
    #Welcome to the world of Python
      
    def main() :
        fps     = doc.GetFps()
        frame = doc.GetTime().GetFrame(doc.GetFps())
        obj = op.GetObject()
        Distance = []
        
        for i in xrange (0, frame) :
            doc.SetTime(c4d.BaseTime(i,fps))
            c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED)
            GPos = obj.GetAbsPos()
            Distance.append(GPos)
            doc.SetTime(c4d.BaseTime(frame,fps))
            
        print Distance # return a list of the same vector (in this case the position in the current frame)
     _
    

    _
    _
    _
    😢

    Cheers

    Luther



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 07:09, xxxxxxxx wrote:

    Ops...

    Hi Lennart, I wrote before read your post... I wil read the Sdk soon.

    Thank you

    Luther



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 10:52, xxxxxxxx wrote:

    @lennart: Ah right! I knew I saw it somewhere! Your mind is genius ;O



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 11:37, xxxxxxxx wrote:

    Hi Lennart, Niklas,
    Its seems to me that it doesn't works... When I call "c4d.DrawViews" Cinema freeze.

    May be I wrote somenthing wrong...

    Here's my code:

    _

    _
      
    import c4d
    from c4d import documents
      
        
    def main() :
        fps     = doc.GetFps()
        frame = doc.GetTime().GetFrame(doc.GetFps())
        obj = op.GetObject()
        Distance = []
        
        for i in xrange (0, frame) :
            c4d.StatusSetBar(100*(i-0)/(frame-0))
            doc.SetTime(c4d.BaseTime(i,fps))
            c4d.DrawViews(c4d.DRAWFLAGS_ONLY_ACTIVE_VIEW|c4d.DRAWFLAGS_NO_THREAD|c4d.DRAWFLAGS_NO_REDUCTION|c4d.DRAWFLAGS_STATICBREAK)
            GPos = obj.GetAbsPos()
            c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED)
            
            Distance.append(GPos)
        doc.SetTime(c4d.BaseTime(frame,fps))
        c4d.EventAdd(c4d.EVENT_ANIMATE)
        c4d.StatusClear()   
        print Distance 
      
     _
    

    _



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 12:56, xxxxxxxx wrote:

    That example is for a Command setup, not runtime/expression.
    Typically to write to file and/or set keyframes etc.
    If you need to check object position at different frame(s) from current
    at runtime you might need to look into/use AnimateObject()

    Cheers
    Lennart



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 13:06, xxxxxxxx wrote:

    So you want to compute the distance an object traveled within a PythonTag? Why didn't you say so earlier? :P
    I don't know why you want to store the distance between each frame in a list, anyway, just create a global-variable and store your data there. Iterating over the full timeline each frame is quite imperformant..

    import     c4d  
      
    data = dict( distance = 0,  
               prevPos  = None )  
      
    def main() :  
      position = op.GetOrigin().GetAbsPos()  
        
      # Check for `None` explicit because `prevPos` could  
      # be `c4d.Vector(0)` which evaluates to `False`, too.  
      if data['prevPos'] is None:  
          pass  
      else:  
          data['distance'] += (position - data['prevPos']).GetLength()  
            
      data['prevPos'] = position  
      print data['distance']
    

    -Niklas



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 13:31, xxxxxxxx wrote:

    @ Lennart: Thanks for your reply, I will look immediately
    @ Niklas: wow, you save my life 👍 Thank you!!!!



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 13:54, xxxxxxxx wrote:

    For a bit of trivia in the matter, using the following
    in a Py Generator (Optimize Cache Off) will animate
    an animated object per frame and generate a spline of the path
    and read the total length :)

    Cheers
    Lennart

      
    import c4d   
    from c4d.utils import SplineLengthData   
      
    def main() :   
      
        fps           = doc.GetFps()   
        doctime       = doc.GetTime()       
        currentframe = doctime.GetFrame(fps)   
        start        = doc.GetMinTime().GetFrame(fps)   
        end           = doc.GetMaxTime().GetFrame(fps)   
      
        pspline       = c4d.BaseObject(c4d.Ospline)   
        pspline.ResizeObject(end,0)   
           
        obj = doc.SearchObject('Cube')# <- Animated Object   
      
        for i in xrange(end) :   
            doc.AnimateObject(obj,c4d.BaseTime(i, fps),c4d.ANIMATEFLAGS_0)   
            pspline.SetPoint(i,obj.GetAbsPos())   
              
        pspline.Message(c4d.MSG_UPDATE)   
      
        sld = SplineLengthData()   
        sld.Init(pspline,0)   
        tot = sld.GetLength()   
        print tot   
        sld.Free()   
           
        # Place obj back on track again   
        doc.AnimateObject(obj,c4d.BaseTime(currentframe,fps),c4d.ANIMATEFLAGS_0)   
        return pspline   
    


  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/03/2012 at 15:30, xxxxxxxx wrote:

    wow Lennart,  I'm touched 🙂
    Thank you so much



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 16/03/2012 at 04:21, xxxxxxxx wrote:

    Hi Lennart,
    just to know, why this code doesn't work fine now? The "Distance"list store alway the same vector again...

    import c4d
    #Welcome to the world of Python
      
    def main() :
        fps     = doc.GetFps()
        frame = doc.GetTime().GetFrame(doc.GetFps())
        obj = op.GetObject()
        Distance = []
        for i in xrange (frame) :
            doc.AnimateObject(obj,c4d.BaseTime(i, fps),c4d.ANIMATEFLAGS_0)
            GPos =  obj.GetAbsPos()
            Distance.append(GPos)
        print Distance
    

    Cheers

    Luther



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 16/03/2012 at 07:00, xxxxxxxx wrote:

    Please note that you must not call update functions or change the document structure within the execution functions of objects/tags/materials/... this might lead to crashs. From the c4d.threading module:

    For all threaded functions it's forbidden to:
    > 1. Add an Event.
    > 2. Make any changes to materials.
    > 3. Change the structure of objects attached to the scene.
    > 4. Change parameters of elements attached to the scene (allowed, but not recommended except for tags).
    > 5. Call a Draw function.
    > 6. Perform any GUI functionality (e.g. displaying messages, opening dialogs etc.).
    > 7. During drawing to do any file operations. (During execution t's allowed.)
    > 8. Create undos.
    >

    Cheers, Sebastian



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 19/03/2012 at 05:42, xxxxxxxx wrote:

    Hi Sebastian,
    thanks for your note. Any suggestion for my last post?

    Cheers,

    Luther



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 21/03/2012 at 15:09, xxxxxxxx wrote:

    The AnimateObject() function needs an animated object as far as I know.
    That is , key framed in some fashion.

    To run it safer, regarding Sebastians notes, do the AnimateObject() function
    on a clone of the object (it is not inserted into the doc).

    Cheers
    Lennart


Log in to reply