Here's a more complete example that goes down to the curves and keys and counts keys in certain states:
import c4d
from c4d import gui
def GetNextObject(op):
if op==None: return None
if op.GetDown(): return op.GetDown()
while not op.GetNext() and op.GetUp(): op = op.GetUp()
return op.GetNext()
def IterAllObjects(doc):
if doc is None: return
op = doc.GetFirstObject()
while op is not None:
yield op
op = GetNextObject(op)
def IterAllShaders(obj):
if obj is None: return
op = obj.GetFirstShader()
while op is not None:
yield op
op = GetNextObject(op)
def IterAllMaterials(doc):
if doc is None: return
op = doc.GetFirstMaterial()
while op is not None:
yield op
op = op.GetNext()
def IterAllObjTracks(doc):
if doc is None: return
for track in doc.GetCTracks():
yield track, "Document"
for obj in IterAllObjects(doc):
for track in obj.GetCTracks():
yield track, obj.GetName()
for tag in obj.GetTags():
for track in tag.GetCTracks():
yield track, obj.GetName() + "::" + tag.GetName()
for shader in IterAllShaders(tag):
for track in shader.GetCTracks():
yield track, obj.GetName() + "::" + tag.GetName() + "::" + shader.GetName()
if tag.GetType() == c4d.Texpresso:
nodemaster = tag.GetNodeMaster()
if nodemaster:
node = nodemaster.GetRoot()
while node is not None:
for track in node.GetCTracks():
yield track, obj.GetName() + "::" + tag.GetName() + "::" + node.GetName()
node = GetNextObject(node)
for shader in IterAllShaders(obj):
for track in shader.GetCTracks():
yield track, obj.GetName() + "::" + shader.GetName()
def IterAllMatTracks(doc):
if doc is None: return
for mat in IterAllMaterials(doc):
for track in mat.GetCTracks():
yield track, mat.GetName()
for shader in IterAllShaders(mat):
for track in shader.GetCTracks():
yield track, mat.GetName() + "::" + shader.GetName()
def showTrack(track, name):
print name, track.GetName(),
print "SelDope," if track.GetNBit(c4d.NBIT_TL1_SELECT) else "UnselDope,",
print "SelFC," if track.GetNBit(c4d.NBIT_TL1_SELECT2) else "UnselFC,",
print "SelCurve," if track.GetNBit(c4d.NBIT_TL1_FCSELECT) else "UnselCurve,",
if track.GetNBit(c4d.NBIT_TL1_HIDE):
print "Hidden!"
else:
curve = track.GetCurve()
if curve == None:
print "No curve!"
else:
keySelected = 0
keySelectedFC = 0
keyMute = 0
# curve does not have a function "GetFirstKey()"
for key_id in xrange(curve.GetKeyCount()):
key = curve.GetKey(key_id)
if key.GetNBit(c4d.NBIT_TL1_SELECT):
keySelected += 1
if key.GetNBit(c4d.NBIT_TL1_SELECT2):
keySelectedFC += 1
if key.GetNBit(c4d.NBIT_CKEY_MUTE):
keyMute += 1
print "Keys:", curve.GetKeyCount(), "SelDope:", keySelected, "SelFC:", keySelectedFC, "Mute:", keyMute
def main():
print " "
print "Keys per track"
print "=============="
for track, name in IterAllObjTracks(doc):
showTrack(track, name)
for track, name in IterAllMatTracks(doc):
showTrack(track, name)
if __name__=='__main__':
main()
showTrack and main are the functions that are different from the last example. It is easy to verify now that stuff stays selected independently of what is shown in the timeline.