PolygonReduction Manual¶
About¶
The c4d.utils.PolygonReduction class allows to reduce the polygon count of a given c4d.PolygonObject while retaining its overall shape. The class gives access to the functionality used within the “Polygon Reduction” generator.
Create¶
c4d.utils.PolygonReduction objects are created with PolygonReduction.__init__() / ().
"""
Copyright: MAXON Computer GmbH
Author: Yannick Puech
Description:
- Creates a new PolygonReduction object.
Class/method highlighted:
- c4d.utils.PolygonReduction
"""
import c4d
polyReduction = c4d.utils.PolygonReduction()
Init¶
A c4d.utils.PolygonReduction object has to be initialized. It will pre-process the given c4d.PolygonObject.
PolygonReduction.PreProcess(): Pre-processes thec4d.PolygonObjectdefined in the given data argument.
The data dictionary argument has these keys:
_doc:
BaseDocument: The document._op:
c4d.PolygonObject: The polygon object to be reduced._thread:
c4d.threading.BaseThread: The caller thread. Set to None if synchronous pre-processing calculation is needed (e.g. during rendering)._settings:
c4d.BaseContainer: The reduction constraints settings. See opolyreduxgen.h
Note
If it’s possible to abort the reduction operation and to retain the original mesh, it is advised to operate on a copy of the original c4d.PolygonObject.
"""
Copyright: MAXON Computer GmbH
Author: Yannick Puech
Description:
- Configures the given PolygonReduction object.
- Reduces the given PolygonObject to 25%.
Class/method highlighted:
- c4d.utils.PolygonReduction
"""
import c4d
def main():
# Checks if selected object is valid
if op is None:
raise ValueError("op is none, please select one object.")
# Check if it's a polygon object
if not op.IsInstanceOf(c4d.Opolygon):
raise TypeError("Selected object is not a polygon Object.")
# Defines settings for PolygonReduction.PreProcess()
settings = c4d.BaseContainer()
settings[c4d.POLYREDUXOBJECT_PRESERVE_3D_BOUNDARY] = True
settings[c4d.POLYREDUXOBJECT_PRESERVE_UV_BOUNDARY] = True
# Defines data for PolygonReduction.PreProcess()
data = dict()
data['_op'] = op
data['_doc'] = doc
data['_settings'] = settings
data['_thread'] = None
# Creates PolygonReduction object
polyReduction = c4d.utils.PolygonReduction()
if polyReduction is None:
raise RuntimeError("Failed to create the PolygonReduction.")
# Pre-process the data
if not polyReduction.PreProcess(data):
raise RuntimeError("Failed to Pre-Process the PolygonReduction with data.")
# Runs the reduce process of the polygon object
polyReduction.SetReductionStrengthLevel(0.75)
# Updates original PolygonObject
op.Message(c4d.MSG_UPDATE)
# Pushes an update event to Cinema 4D
c4d.EventAdd()
if __name__ == '__main__':
main()
If the _thread key is set the pre-process is running asynchronously in a background thread.
PolygonReduction.IsPreprocessing(): Returns True if preprocessing is running.PolygonReduction.StopPreprocessing(): Aborts preprocessing.PolygonReduction.Reset(): Aborts preprocessing and frees all temporary data.
Note
This asynchronous mode may be used e.g. in a generator object.
After the pre-process the c4d.utils.PolygonReduction object is ready:
PolygonReduction.IsValid(): Returns True if a valid object and a valid document are associated with the object.PolygonReduction.GetData(): Returns the dictionary data associated with the object.
Reduce¶
The linked c4d.PolygonObject can be reduced by defining the overall reduction strength or the target triangle, vertex or edge count.
PolygonReduction.GetMaxReductionStrengthLevel(): Returns the maximum reduction strength (1.0)PolygonReduction.SetReductionStrengthLevel(): Sets the overall reduction strength.PolygonReduction.GetReductionStrengthLevel(): Returns the current overall reduction strength.
The desired triangle count is defined with:
PolygonReduction.SetTriangleLevel(): Sets the desired triangle count.
Note
The desired triangle count must be between the Max and Min values retrieve with:
PolygonReduction.GetMaxTriangleLevel(): Returns the maximum number of triangles possible.PolygonReduction.GetMinTriangleLevel(): Returns the minimum number of triangles possible.
The actual triangle count can be retrieve with:
PolygonReduction.GetTriangleLevel(): Returns the actual current triangle count.
"""
Copyright: MAXON Computer GmbH
Author: Yannick Puech
Description:
- Reduces the active PolygonObject to the given triangle count.
Class/method highlighted:
- c4d.utils.PolygonReduction
"""
import c4d
def main():
# Checks if selected object is valid
if op is None:
raise ValueError("op is none, please select one object.")
# Check if it's a polygon object
if not op.IsInstanceOf(c4d.Opolygon):
raise TypeError("Selected object is not a polygon Object.")
# Defines settings for PolygonReduction.PreProcess()
settings = c4d.BaseContainer()
settings[c4d.POLYREDUXOBJECT_PRESERVE_3D_BOUNDARY] = True
settings[c4d.POLYREDUXOBJECT_PRESERVE_UV_BOUNDARY] = True
# Defines data for PolygonReduction.PreProcess()
data = dict()
data['_op'] = op
data['_doc'] = doc
data['_settings'] = settings
data['_thread'] = None
# Creates PolygonReduction object
polyReduction = c4d.utils.PolygonReduction()
if polyReduction is None:
raise RuntimeError("Failed to create the PolygonReduction.")
# Pre-process the data
if not polyReduction.PreProcess(data):
raise RuntimeError("Failed to Pre-Process the PolygonReduction with data.")
# Asks for number of triangle level
while True:
# Opens a Dialog where user can enter a text
userInput = c4d.gui.InputDialog("Enter number of triangle level:")
# Checks if operation was cancelled
if userInput == "":
return
# Tries to convert to integer
try:
triangleLevel = int(userInput)
break
except ValueError:
c4d.gui.MessageDialog("Please enter a number.")
# Checks entered number of triangle level is valid
if not polyReduction.GetMinTriangleLevel() < triangleLevel < polyReduction.GetMaxTriangleLevel():
raise RuntimeError("Entered value is not valid.")
# Sets the triangle level
polyReduction.SetTriangleLevel(triangleLevel)
# Gets triangle level count after reduction
realTriangleResult = polyReduction.GetTriangleLevel()
print("Triangle Result: {0}".format(realTriangleResult))
# Updates original PolygonObject
op.Message(c4d.MSG_UPDATE)
# Pushes an update event to Cinema 4D
c4d.EventAdd()
if __name__ == '__main__':
main()
The vertex count is defined with:
PolygonReduction.SetVertexLevel(): Sets the desired vertex count.
Note
The desired vertex count must be between the Max and Min values retrieve with:
PolygonReduction.GetMaxVertexLevel(): Returns the maximum number of vertices possible.PolygonReduction.GetMinVertexLevel(): Returns the minimum number of vertices possible.
The actual vertex count can be retrieve with:
PolygonReduction.GetVertexLevel(): Returns the actual current vertex count.
"""
Copyright: MAXON Computer GmbH
Author: Yannick Puech
Description:
- Reduces the active PolygonObject to the given vertex count.
Class/method highlighted:
- c4d.utils.PolygonReduction
"""
import c4d
def main():
# Checks if selected object is valid
if op is None:
raise ValueError("op is none, please select one object.")
# Check if it's a polygon object
if not op.IsInstanceOf(c4d.Opolygon):
raise TypeError("Selected object is not a polygon Object.")
# Defines settings for PolygonReduction.PreProcess()
settings = c4d.BaseContainer()
settings[c4d.POLYREDUXOBJECT_PRESERVE_3D_BOUNDARY] = True
settings[c4d.POLYREDUXOBJECT_PRESERVE_UV_BOUNDARY] = True
# Defines data for PolygonReduction.PreProcess()
data = dict()
data['_op'] = op
data['_doc'] = doc
data['_settings'] = settings
data['_thread'] = None
# Creates PolygonReduction object
polyReduction = c4d.utils.PolygonReduction()
if polyReduction is None:
raise RuntimeError("Failed to create the PolygonReduction.")
# Pre-process the data
if not polyReduction.PreProcess(data):
raise RuntimeError("Failed to Pre-Process the PolygonReduction with data.")
# Asks for number of vertex level
while True:
# Opens a Dialog where user can enter a text
userInput = c4d.gui.InputDialog("Enter number of vertex level:")
# Checks if operation was cancelled
if userInput == "":
return
# Tries to convert to integer
try:
vertexLevel = int(userInput)
break
except ValueError:
c4d.gui.MessageDialog("Please enter a number.")
# Checks entered number of vertex level is valid
if not polyReduction.GetMinVertexLevel() < vertexLevel < polyReduction.GetMaxVertexLevel():
raise RuntimeError("Entered value is not valid.")
# Sets the vertex level
polyReduction.SetVertexLevel(vertexLevel)
# Gets vertex level count after reduction
realVertexResult = polyReduction.GetVertexLevel()
print("Vertex Result: {0}".format(realVertexResult))
# Updates original PolygonObject
op.Message(c4d.MSG_UPDATE)
# Pushes an update event to Cinema 4D
c4d.EventAdd()
if __name__ == '__main__':
main()
Finally the edge count can be defined with:
PolygonReduction.SetRemainingEdgesLevel(): Sets the desired edge count.
Note
The desired edge count must be less than the Max value retrieve with:
PolygonReduction.GetMaxRemainingEdgesLevel(): Returns the number of remaining edges.
The actual edge count can be retrieve with:
PolygonReduction.GetRemainingEdgesLevel(): Returns the actual edge count.
"""
Copyright: MAXON Computer GmbH
Author: Yannick Puech
Description:
- Reduces the active PolygonObject to the given edge count.
Class/method highlighted:
- c4d.utils.PolygonReduction
"""
import c4d
def main():
# Checks if selected object is valid
if op is None:
raise ValueError("op is none, please select one object.")
# Check if it's a polygon object
if not op.IsInstanceOf(c4d.Opolygon):
raise TypeError("Selected object is not a polygon Object.")
# Defines settings for PolygonReduction.PreProcess()
settings = c4d.BaseContainer()
settings[c4d.POLYREDUXOBJECT_PRESERVE_3D_BOUNDARY] = True
settings[c4d.POLYREDUXOBJECT_PRESERVE_UV_BOUNDARY] = True
# Defines data for PolygonReduction.PreProcess()
data = dict()
data['_op'] = op
data['_doc'] = doc
data['_settings'] = settings
data['_thread'] = None
# Creates PolygonReduction object
polyReduction = c4d.utils.PolygonReduction()
if polyReduction is None:
raise RuntimeError("Failed to create the PolygonReduction.")
# Pre-process the data
if not polyReduction.PreProcess(data):
raise RuntimeError("Failed to Pre-Process the PolygonReduction with data.")
# Asks for number of edges level
while True:
# Opens a Dialog where user can enter a text
userInput = c4d.gui.InputDialog("Enter number of edges level:")
# Checks if operation was cancelled
if userInput == "":
return
# Tries to convert to integer
try:
edgesLevel = int(userInput)
break
except ValueError:
c4d.gui.MessageDialog("Please enter a number.")
# Sets edges level number
polyReduction.SetRemainingEdgesLevel(min(edgesLevel, polyReduction.GetMaxRemainingEdgesLevel()))
polyReduction.SetRemainingEdgesLevel(min(edgesLevel, polyReduction.GetMaxRemainingEdgesLevel()))
# Retrieves edges level count after reduction
realEdgeResult = polyReduction.GetRemainingEdgesLevel()
print("Edge Result: {0}".format(realEdgeResult))
# Updates the original PolygonObject
op.Message(c4d.MSG_UPDATE)
# Pushes an update event to Cinema 4D
c4d.EventAdd()
if __name__ == '__main__':
main()