Jump to content

Basic Dialog Interaction


Guest getSet

Recommended Posts

Guest getSet

I want to use python to interact with c4d dialog boxes. I understand that the details of this process can vary greatly depending on exactly what is to be accomplished. But for a simple example, let's use the 'Bake Objects...' dialog. The following is a script that:

  • finds 'Cube' (note: scene must have an object named "Cube")
  • opens the timeline dope sheet
  • makes the cube the active object
  • opens the 'Bake Objects...' dialog

What code do I add to then set 'Bake Expressions' and 'Position' check boxes to 'True' and click 'OK'?

import c4d
from c4d import gui

def main():
    obj = doc.SearchObject("Cube")
    c4d.CallCommand(465001541)    # Launch 'Timeline (DopeSheet)'
    obj.SetBit(c4d.BIT_ACTIVE)
    c4d.CallCommand(465001219)    # Launch 'Bake Objects...'
    
    # what goes here to toggle checkboxes and click 'OK'?
    
    c4d.EventAdd()
    
if __name__=='__main__':
    main()

I have found references to what I assume are relevant parameters in resource\modules\newman:

  • dialog definitions of IDD_BAKE in \c4d_symbols.h
  • the dialog layout in \dialogs\IDD_BAKE.res
  • and string labels in \strings_us\dialog\IDD_BAKE.str

But I have not been able to put the pieces together. Thanks for any input.

---------------------------------------------------------------

Updated June 7th. 2017:

No takers on my query... Maybe my approach of interacting with the dialog box is off-base.

It seemed like checking a few boxes and clicking OK would be no big deal. I hope to understand more in the future. 

In my specific case I wanted "bake" the position of an object, when the position is controlled by a python tag attached to the object. In the "Bake Objects..." dialog, you would select "Bake Expressions" and "Position" and click "OK."

For example the attached c4d scene (bakeCube.c4d) has a cube whose position is controlled by the python tag.

I was able to "bake" the position keys for the object by browsing through the time of the document, as described at the end of this page (manual: c4d.documents.BaseDocument). Inspiration came from tcastudios, in this post (plugincafe: Press and hold button).

With the cube selected, run this code in this script manager to "bake" the position described by the python expression tag.

import c4d

def BrowseDoc(doc):
  # Save current time
  ctime = doc.GetTime() 

  # Get FPS and minimum + maximum frames
  fps = doc.GetFps()
  start = doc.GetMinTime().GetFrame(fps)
  until  = doc.GetMaxTime().GetFrame(fps)

  # Look through the frames
  for frame in xrange(start, until+1):
    c4d.StatusSetBar(100.0*float(frame-start)/float(until-start))
    doc.SetTime(c4d.BaseTime(frame, fps))
    c4d.DrawViews(c4d.DRAWFLAGS_ONLY_ACTIVE_VIEW|c4d.DRAWFLAGS_NO_THREAD|c4d.DRAWFLAGS_NO_REDUCTION|c4d.DRAWFLAGS_STATICBREAK)

    doc.RecordKey(op, c4d.ID_BASEOBJECT_REL_POSITION)

    c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED) # Update timeline

  doc.SetTime(ctime) # Set time back
  c4d.EventAdd(c4d.EVENT_ANIMATE)
  c4d.StatusClear()
  
BrowseDoc(doc)

You will see the newly created position keys in the timeline dope sheet. 

bakeCube.c4d

Link to post

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...