How to use c4d.utils.PolygonReduction
-
Hi all,
I'm struggling to understand how does the polygon reduction works. The manual provides a sample code:
https://developers.maxon.net/docs/py/2023_2/manuals/manual_polygonreduction.htmlI tried to run this one, but I get the following error:
StandardError: The dictionary must contain a valid polygonal BaseObject (_op dictionary entry)I understand this error: I'm providing the wrong object type (https://developers.maxon.net/docs/py/2023_2/types/objects.html). I think I have to convert the object to PolygonObject, am I right? If so, how do I do that?
-
Hi,
That's right, the error you're getting is related to the type of the passed object to be processed by the
PolygonReduction.
The sample code shouldn't try to process an object that isn't aPolygonObjectbecause there's this check at the beginning:if not polyObject.IsInstanceOf(c4d.Opolygon): returnTo convert a
BaseObjectto aPolygonObjectthe Current State to Object modeling command can be used.
The utility function below invokes theMCOMMAND_CURRENTSTATETOOBJECT:def CSTO(obj, doc, inheritance, keepAnimation, noGenerate): bc = c4d.BaseContainer() bc.SetBool(c4d.MDATA_CURRENTSTATETOOBJECT_INHERITANCE, inheritance) bc.SetBool(c4d.MDATA_CURRENTSTATETOOBJECT_KEEPANIMATION, keepAnimation) bc.SetBool(c4d.MDATA_CURRENTSTATETOOBJECT_NOGENERATE, noGenerate) res = c4d.utils.SendModelingCommand(c4d.MCOMMAND_CURRENTSTATETOOBJECT, list=[obj.GetClone()], bc=bc, doc=doc) if isinstance(res, list): return res[0] else: return NoneThe CSTO() function can then be invoked like this:
if not polyObject.IsInstanceOf(c4d.Opolygon): polyObject = CSTO(polyObject, doc, True, True, False) if polyObject is None: returnI moved the topic to "CINEMA 4D DEVELOPMENT" category and I turned it into a question and answer (you can do this by yourself, see Q&A New Functionality).
-
Thank you y_puech
Would you be so kindly to explain me the difference between a BaseObject, a PolygonObject and a PointObject? Honestly I don't think the python documentation is really clear
Consider that I'm new to cinema4d (I'm from the blender's world)
-
Hi,
A BaseObject is the base type of every object in a document. A PointObject is an object that holds points. Then an object can be a PolygonObject if it has polygons.
For instance if a generator object is made editable then it's transformed into a PolygonObject which is also a PointObject.
The (reduced) object classes inheritance tree is as follows:- BaseObject
- PointObject
- SplineObject
- PolygonObject
- PointObject
- BaseObject
-
Thank you! This is so much clear now