Position Update

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)
 _

_
_
_
:cry:

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 :thumbsup: 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 :slightly_smiling_face:
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