Skip to content

Instantly share code, notes, and snippets.

View fwilleke80's full-sized avatar
💭
Mostly inactive, sometimes active, I really don't feel like updating my status

Frank Willeke fwilleke80

💭
Mostly inactive, sometimes active, I really don't feel like updating my status
View GitHub Profile
@fwilleke80
fwilleke80 / c4d-save-as-template.py
Last active July 17, 2019 10:06
[C4D] Save current document as template. Like the built-in script, just better, and in Python.
"""
Name-US:Save as template
Description-US:Saves the current document as template (hold CTRL to remove existing template, hold SHIFT to skip question dialog)
Name-DE:Als Template speichern
Description-DE:Speichert das aktuelle Dokument als Template (CTRL gedrückt halten um vorhandenes Template zu entfernen, SHIFT gedrückt halten um Abfrage zu überspringen)
"""
import os
import c4d
@fwilleke80
fwilleke80 / c4d-restart-cinema.py
Last active July 17, 2019 10:05
[C4D] A really tiny script that restarts Cinema 4D
"""
Name-US:Restart Cinema 4D
Description-US:Restart Cinema 4D (hold SHIFT to skip the question)
Name-DE:Cinema 4D neustarten
Description-DE:Cinema 4D neustarten (SHIFT halten, um die Abfrage zu überspringen)
"""
import c4d
@fwilleke80
fwilleke80 / c4d-close-all-documents.py
Last active July 17, 2019 10:04
Close all open documents in Cinema 4D, even the unsaved ones, skip the Save question for each one
"""
Name-US:Close all documents
Description-US:Close all open documents, even the unsaved ones (hold SHIFT to skip the question)
Name-DE:Alle Dokumente schließen
Description-DE:Schließt alle Dokumente, auch die ungespeicherten (SHIFT halten um die Abfrage zu unterdrücken)
"""
import c4d
@fwilleke80
fwilleke80 / c4d-tag-show-dirty-checksums.pyp
Last active May 9, 2019 10:40
[C4D] A small Tag plugin that will output the most important dirty checksums for the object it's attached to into the console. Quite handy to check if an object keeps refreshing or rebuilding its cache. Simply attach the "Show Dirty Checksums" tag to an object and watch the Python console output.
import c4d
ID_SHOWDIRTYCHECKSUMSTAG = 1052821
class ShowDirtySumsTag(c4d.plugins.TagData):
def Init(self, node):
priorityData = node[c4d.EXPRESSION_PRIORITY]
if priorityData is not None:
@fwilleke80
fwilleke80 / getc4dresid.py
Last active November 6, 2018 08:59
Put this script into "Cinema 4D Rx/plugins" and run it from the command line to find free resource IDs for a plugin in a certain module. Call with "-h" command line option to get help.
#!/usr/bin/python
#
# Example calls:
#
# python getc4dresid.py --module lbwss --plugin osurfacespread
# Get some free resource IDs from plugin "Osurfacespread" in module "lbwss"
#
# python getc4dresid.py --module cinea4dsdk --plugin oatom --limit 1
# Get the next free resource ID from plugin "Oatom" in module "cinema4dsdk"
@fwilleke80
fwilleke80 / printcallstack.py
Last active April 9, 2018 14:16
This function prints out the callstack, starting from top calling function down to the function the call came from.
import inspect
def PrintCallstack(printArgs = False):
"""Print the callstack, starting from top calling function
down to the function that called PrintCallstack().
To also print out all arguments passed to the calling function,
including the arguments' values, set printArgs to True.
Careful, this can get quite overwhelming.
"""
@fwilleke80
fwilleke80 / c4d-hierarchy-iterating-generators.py
Last active April 9, 2018 09:12
[C4D] This script contains two generator functions that allow you to effortlessly iterate over objects hierarchies in Cinema 4D, as well as some simple testing code that will iterate the hierarchy of the current document (starting form the selected object), and print it to the console.
import c4d
"""
This script demonstrates two generator functions, AllChildren() and AllParents().
To test this, use any scene with a reasonably complex hierarchy, select any one object and run the script.
"""
def AllChildren(startOp, maxDepth = 0, currentRecursionDepth = 1):
"""Yield all objects that are part of startOp's child hierarchy.
Set maxDepth to a value != 0 to restrict recursion to a certain depth.
@fwilleke80
fwilleke80 / c4d-messagetostring.cpp
Last active July 6, 2017 09:14
[C4D] Return the name of a message ID as string. Very handy to find out what messages you're receiving. Call this from any Message() function in the Cinema 4D API, and simply pass the message ID and message data pointer.
#include "c4d_general.h"
#include "c4d_plugin.h"
#include "ge_sys_math.h"
#include "c4d_string.h"
#include "ge_prepass.h"
#include "c4d_baselist.h"
#include "c4d_commanddata.h"
#include "c4d_falloffdata.h"
#include "c4d_messageplugin.h"
#include "c4d_baseeffectordata.h"
@fwilleke80
fwilleke80 / c4d-hidedescription.cpp
Last active July 6, 2017 09:01
[C4D] Show or hide an element from a node's description
/// Show or hide an element from a node's description
///
/// param[in] node The node whose description we're changing
/// param[in] descr The description we're changing
/// param[in] MyDescID The ID of the element
/// param[in] show Pass true to show, or false to hide
/// return False if an error occurred, otherwise true
static Bool ShowDescription(GeListNode *node, Description *descr, Int32 descID, Bool show)
{
AutoAlloc<AtomArray> ar;
@fwilleke80
fwilleke80 / c4d-get-vertex-normal.cpp
Last active May 12, 2017 09:13
[C4D] Get vertex normal
/// Return the normal vector for a vertex of a polygon object.
/// The normal is computed as an average of the normals of all polygons that are neighbors to the specified vertex.
///
/// @param[in] op The PolygonObject
/// @param[in] neighbor Pointer to a Neighbor object. Must already be initialized, caller owns the pointed object.
/// @param[in] pointIndex The index of the vertex we want the normal of
/// @return The normal of the point in local object space
static Vector GetVertexNormal(PolygonObject *op, Neighbor *neighbor, Int32 pointIndex)
{
// Variables