Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
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
On 14/03/2012 at 15:37, xxxxxxxx wrote:
Hi Luther,
where does your GPos variable come from?
-Niklas
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
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
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?
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 -niklas
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
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
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
On 15/03/2012 at 10:52, xxxxxxxx wrote:
@lennart: Ah right! I knew I saw it somewhere! Your mind is genius ;O
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 _
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()
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? 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']
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!!!!
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
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
On 15/03/2012 at 15:30, xxxxxxxx wrote:
wow Lennart, I'm touched Thank you so much
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
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
On 19/03/2012 at 05:42, xxxxxxxx wrote:
Hi Sebastian, thanks for your note. Any suggestion for my last post?
Cheers,
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).