The Maxon SDK Team is currently short staffed due to the winter holidays. No forum support is being provided between 15/12/2025 and 5/1/2026. For details see Maxon SDK 2025 Winter Holidays.
  • Multiple bool undo problem

    c++ r20
    2
    0 Votes
    2 Posts
    400 Views
    r_giganteR
    Hi Roger, thanks for reaching out us. With regard to the reported behavior, I'm able to reproduce it either with a custom ObjectData and the ordinary Cinema 4D standard tools (like cube generator and the Fillet option). But there's more: if the undo operates on a parameter whose values is currently equal to its initializing value, the undo is simply ignored. This can be easily tested and verified by initializing the BOOL parameter used in the resource to true in the ObjectData::Init(): as you will see the result is simply the opposite of your reported case. To me the behavior is consistent but I will check with the team responsible and see if it can be considered a bug. Best, Riccardo
  • SaveDocument() file name character limit?

    python windows r19
    3
    0 Votes
    3 Posts
    746 Views
    .
    Problem was with the total path length versus the file name length. 256 characters for the entire path and filename.
  • retrieve data from multiple cloners in python

    Moved
    10
    0 Votes
    10 Posts
    3k Views
    P
    Thank you @m_adam it's really helpful! I was going to a wrong direction. I chose to do a project that has every new aspect to explore :)) I will for sure disturb you in future with my questions. I appreciate your suggestions. Parvin
  • Copy link object

    r20 c++
    4
    0 Votes
    4 Posts
    981 Views
    M
    Hi, the topic is now marked as solved, did you solve your issue? The only workaround I was able to find is to make use of AddToExecution and define it to GENERATOR+1, here you retrieve and clone the cache of the linked object in a member variable of your instance, then in the next GVO you make use of this cache, but this has the application that you work always on a mesh that has been generated in a previous SceneExecution call, which may be an issue in case of animation. Cheers, Maxime.
  • Tag plugin and Dirty check

    r20 python
    5
    1
    0 Votes
    5 Posts
    822 Views
    P
    I create a workaround that is working. I think, like you say, that the Subdivision Surface is not ok, when I initially load the scene. I now get the polygon object under the sss and that works.
  • Problem on AddUndo and SendModellingCommand (Weld Tool)

    r20 python
    3
    0 Votes
    3 Posts
    798 Views
    B
    Thanks @m_adam Works as expected. Have a great day ahead!
  • How to use object plugin to get data from my tag plug-in

    c++
    3
    0 Votes
    3 Posts
    807 Views
    M
    @s_bach Thank you for your answer!
  • IsEqual not defined

    r20 c++
    3
    0 Votes
    3 Posts
    579 Views
    C4DSC
    @m_magalhaes said in IsEqual not defined: MAXON_OPERATOR_EQUALITY(Int32Pair, a, b); Thanks, didn't know about the MAXON_OPERATOR_EQUALITY. Very handy indeed. However, I had already tried providing an equality operator in my Int32Pair class, as such: Bool operator == (const Int32Pair& other) { return (a == other.a) && (b == other.b); } But that still resulted in the "IsEqual not defined" compiler error. The macro, however, is working fine. Looking further at my implementation of operator==, I now notice I didn't declare it as a const method. Adding the const does get rid of the compiler error. Oh boy! Overlooked a minor "typo", with major consequences. Again, thanks for the macro.
  • How to get InExcludeData in ModifyObject

    r20 c++
    4
    0 Votes
    4 Posts
    838 Views
    M
    @m_magalhaes Thank you for your answer. really helpful!
  • Tag used on multiple objects.

    python r20
    6
    0 Votes
    6 Posts
    970 Views
    P
    Read() and Write() works. Thanks.
  • Baking textures for PBR object

    2
    0 Votes
    2 Posts
    846 Views
    r_giganteR
    Hi krftt thanks for reaching out us. With regard to your question, if the intent is to bake the final appearance of a PBR material on a texture, I confirm that there are no means to achieve this considering that the baked data will also be camera-dependent. If, on the contrary, your goal is to sample the shader used in any of the reflection layers used in a PBR material you can consider BaseShader::Sample() and, given a ChannelData, retrieve the color at a specific point - see this thread. To browse through the different channel you can use something like: # check for an active material mat = doc.GetActiveMaterial() if mat is None: return # retrieve the reflection layers count layersCount = mat.GetReflectionLayerCount() # loop through the layers for i in xrange(layersCount): # get the ReflectionLayer instance and the related data ID reflLayer = mat.GetReflectionLayerIndex(i) reflLayerData = reflLayer.GetDataID() # check for the instance to be the one currently active in the Attribute Manager if reflLayer.GetFlags() & (c4d.REFLECTION_FLAG_TAB): # retrieve the color color = mat[reflLayerData + c4d.REFLECTION_LAYER_COLOR_COLOR] # try to retrieve the shader colorShader = mat[reflLayerData + c4d.REFLECTION_LAYER_COLOR_TEXTURE] # do something with the data retrieved if colorShader is None: print "Selected layer is ", reflLayer.GetName(), "and uses color: ", color else: print "Selected layer is ", reflLayer.GetName(), "and uses shader: ", colorShader.GetName() Best, Riccardo
  • How to updata message when i save data in NodeData::Message

    r20 c++
    4
    0 Votes
    4 Posts
    920 Views
    M
    @r_gigante Oh!Thank you!The plug-in ID is the reason for the problem,use another shorter number and everything is ok. Thank your for your help!
  • modulo - behind the scenes

    r19 r20 c++
    3
    0 Votes
    3 Posts
    551 Views
    C4DSC
    Thanks for the info.
  • Unable to kill my C4DThread

    8
    0 Votes
    8 Posts
    2k Views
    r_giganteR
    Hi Mafster, thanks for following up. The documentation here properly indicates that passing no parameter to Wait() is passing True. Long story short, this value is required in order to avoid Cinema being stuck on waiting for the thread to end. Hoping this helps in solving the issue, give best. Riccardo
  • Python - Cinema 4D R20.057 - Export to Alembic without Dialog

    python r20
    6
    0 Votes
    6 Posts
    2k Views
    P
    Yes it is! Thank you very much!
  • Problems of copying position keyframs to another obj

    5
    0 Votes
    5 Posts
    2k Views
    Q
    @m_adam Thank you for another detailed answer !
  • c4dpy crashes

    python r20 windows
    4
    1
    0 Votes
    4 Posts
    694 Views
    P
    Ok, I will give it a try and let you know. Thanks.
  • Retrieve the World Rotation of a Selected Edge?

    r20 python
    4
    0 Votes
    4 Posts
    1k Views
    ManuelM
    hello, To answer this question if someone want to do it by code. import c4d from c4d import gui # Welcome to the world of Python # Main function def main(): #get the selected object op = doc.GetActiveObject() if not op: raise TypeError("there's no object selected") if not op.IsInstanceOf(c4d.Opolygon): raise TypeError("obj should be a polygon object") #setup neighbor nbr = c4d.utils.Neighbor() nbr.Init(op) #get the selected edge bs = op.GetSelectedEdges(nbr,c4d.EDGESELECTIONTYPE_SELECTION) #maximum number of edge should be number of polygon * 4 sel = bs.GetAll(op.GetPolygonCount() * 4) #get all polygon vadr = op.GetAllPolygons() #init point a and b index to -1 for error check a = b = -1 #initialise a counter to check in sel array. countEdge = 0 #we can check now every edge to find the corresponding points. So for each polygon for i in xrange(op.GetPolygonCount()): #get the polygon information pli = nbr.GetPolyInfo(i) for side in xrange(4): # Test all 4 sides of a polygon # Only proceed if edge is marked # and edge really exists (for triangles side 2 from c..d does not exist as c==d) if pli["mark"][side] or (side==2 and vadr[i].c == vadr[i].d): continue #if the edge is marked as selected in our sel array if sel[countEdge]: if side==0: a=vadr[i].a; b=vadr[i].b elif side==1: a=vadr[i].b; b=vadr[i].c elif side==2: a=vadr[i].c; b=vadr[i].d elif side==3: a=vadr[i].d; b=vadr[i].a countEdge +=1 if a == -1 or b == -1: raise ValueError("points index can't be negatives") #get all points array points = op.GetAllPoints() #Get the direction of the edge in global coordinate (multiply the points'vector by the matrix of the object) opmg = op.GetMg() #i've picked a direction from point a to point b so the angle could need to be reverted. dirVector = points[b]*opmg - points[a]*opmg #normalize a vector is often a good idea. dirVector.Normalize() #transform the vector to hpb note the result is in radian hpb = c4d.utils.VectorToHPB(dirVector) #transform radian to degree hpb.x = c4d.utils.RadToDeg(hpb.x) hpb.y = c4d.utils.RadToDeg(hpb.y) hpb.z = c4d.utils.RadToDeg(hpb.z) print "the edge is poiting to",dirVector,"the corresponding angle is", hpb # Execute main() if __name__=='__main__': main() Cheers Manuel
  • This topic is deleted!

    1
    0 Votes
    1 Posts
    3 Views
    No one has replied
  • Saving & Loading User Preset

    3
    0 Votes
    3 Posts
    666 Views
    P
    Hi Maxime, thank you very much! Good to know. I would otherwise searched forever. Cheers, PdZ