14/04/2017
I’m currently working with one project where I mess with OBJ sequences (recorded with Brekel Pro PointCloud), so I created a script that loads OBJ files from a folder and a Python Tag that plays through objects making them visible and invisible depending the current frame.
Import obj folder
import c4d, os from c4d import storage as s def main(): extensions = ["obj"] # File extensions that will be imported folder = s.LoadDialog(c4d.FILESELECTTYPE_ANYTHING,'Select folder to import',c4d.FILESELECT_DIRECTORY,'') # Load folder if not folder: return # If there is no folder, stop the script files = os.listdir(folder) # Get files for f in files: # Loop through files ext = f.rsplit(".",1) # Get file extension if ext[1] in extensions: # If extension matches p = os.path.join(folder, f) # Full file path c4d.documents.MergeDocument(doc, p, 1) # Merge file to current project c4d.EventAdd() # Update Cinema 4D if __name__=='__main__': main()
OBJ Sequence Player
This is Python Tag with some custom constrols on it. You can change starting frame, reverse sequence and animate manually with custom mode. Controls are in Python Tag.
import c4d def main(): frame = doc[c4d.DOCUMENT_TIME].GetFrame(doc[c4d.DOCUMENT_FPS]) # Get current frame obj = op.GetObject() # Get object children = obj.GetChildren() # Get children index = 0 # Initialize index variable run = 0 # Initialize run variable rev = op[c4d.ID_USERDATA,2] # User data: Reverse sequence start = op[c4d.ID_USERDATA,3] # User data: Starting frame holdf = op[c4d.ID_USERDATA,4] # User data: Hold first frame holdl = op[c4d.ID_USERDATA,5] # User data: Hold last frame manon = op[c4d.ID_USERDATA,7] # User data: Activate manual mode manfr = op[c4d.ID_USERDATA,8] # User data: Set manual frame if manon == False: # If manual mode is off if rev == False: # If reverse mode is off for child in children: # Loop through children if frame == index+start: # If index maches with current frame child[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 2 # Default child[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 2 # Default run = 1 # Sequence is running else: # Otherwise child[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 # Off child[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 # Off index = index + 1 # Increase index else: # Otherwise for child in reversed(children): # Loop through reversed children if frame == index+start: child[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 2 child[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 2 run = 1 else: # Otherwise child[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 child[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 index = index + 1 if holdf == True and run == 0: # If hold start frame is on if frame < len(children)+start: if rev == True: children[-1][c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 2 children[-1][c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 2 else: children[0][c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 2 children[0][c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 2 if holdl == True and run == 0: # If hold last frame is on if frame >= len(children)+start: if rev == True: children[0][c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 2 children[0][c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 2 else: children[-1][c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 2 children[-1][c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 2 else: # Manual mode is on for i, child in enumerate(children): # Loop through children if i == manfr: # If index is same as custom frame children[manfr][c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 2 children[manfr][c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 2 else: # Otherwise child[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 child[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1
ar_tag_obj_sequence_player.c4d v1.0.1 (2023.1.2)