• Getting a polygonal version of an animated mesh

    Moved Cinema 4D SDK
    3
    0 Votes
    3 Posts
    706 Views
    R
    Well, I do have a loop but I just pasted the code that would, hopefully, perform the calculation. And I did tried the GetDeformCache approach, but my mistake was, in fact the cloning of the object. Thank you so much for the code, Adam.
  • How to output BaseBitmap with ShaderData plugin

    Cinema 4D SDK python
    2
    0 Votes
    2 Posts
    560 Views
    r_giganteR
    Hi Merkvilson, thanks for reaching out us. If the final intent is to simply get BaseBitmapinformation to be returned by your shader, rather than sampling a Xbitmap shader I suggest instead to simply query the color information by using BaseBitmap::GetPixel and eventually apply color space transformation. def Output(self, sh, cd) : x = int(cd.p.x * self.bitmap.GetBw()) y = int(cd.p.y * self.bitmap.GetBh()) col = self.bitmap.GetPixel(x, y) return c4d.Vector(float(col[0]/256.0), float(col[1]/256.0), float(col[2]/256.0)) Best, Riccardo
  • 0 Votes
    4 Posts
    854 Views
    a_blockA
    Hi, I'm glad you found something working for you. I just want to mention, this way of using the deform cache directly will only work for very specific setups, for arbitrary object configurations you will most likely need to iterate through the cache. So, I think, it's worth to give those manuals another read. Also Maxime has posted some snippets in Getting a polygonal version of an animated mesh, which might be useful for you. Cheers, Andreas
  • GetActiveObjects(flags)

    Cinema 4D SDK python r20
    3
    0 Votes
    3 Posts
    546 Views
    P
    @s_bach Ok, Thanks.
  • GV Node AddPort fail

    Cinema 4D SDK python r19
    5
    1
    1 Votes
    5 Posts
    1k Views
    M
    This issue is now fixed in R21. Cheers, Maxime.
  • 0 Votes
    3 Posts
    638 Views
    B
    Hi Sebastian! Turns out my issues are two seperate, but equally self inflicted problems Inserting and activating works as expected, I am blocking the update with some custom UI stuff so I will have to find a solution for that. Calling EventAdd() in the closeEvent of the UI doesn't do anything. Is there another way to force Cinema to update everything? Killing the document not only doesn't update, but actually crashes Cinema, because I am trying to kill the document from within a callback that is reacting to MSG_DOCUMENTINFO_TYPE_LOAD. I am doing some more involved environment management and sometimes I have to close a document after loading. I have a workaround that will have to do for now. In the callback I change the document path to a string I can then look for in EVMSG_CHANGE. When I detect my string there, I can then kill the document. It's not very elegant and if anyone has a better solution I would be very happy, but otherwise consider this problem solved
  • How to check if a spline is a freehand spline?

    General Talk r19 python
    3
    0 Votes
    3 Posts
    822 Views
    S
    Hello, I just want to add that an example on how check a spline can be found in the BaseObject Manual. best wishes, Sebastian
  • Render from picture viewer programatically

    Cinema 4D SDK r20 python windows
    2
    0 Votes
    2 Posts
    515 Views
    r_giganteR
    Hi mafster, thanks for reaching out us. With regard to accessing images being available in the Picture Viewer, I'm sorry to confirm that there is no PictureViewer-related classes/functions exposed in the API. This is valid for both C++ and Python API. Best, Riccardo
  • 0 Votes
    4 Posts
    1k Views
    a_blockA
    Hi, good we got you going It is not wrong per se to use multiple plugin directories. Actually Cinema 4D R20 was specifically designed to have multiple ones. You just need to make sure not to have duplicate plugins in these directories. Cheers, Andreas
  • Cinema 4D Script: Web Search Selected Text

    General Talk
    4
    1
    2 Votes
    4 Posts
    1k Views
    mikeudinM
    @a_block said in Cinema 4D Script: Web Search Selected Text: I have added the "showcase" tag, so people are hopefully able to filter for your and other similar threads more easily. Great! Thank you!
  • 0 Votes
    2 Posts
    1k Views
    S
    Hello, you cannot create a Material in the main() function of a Python Generator object. The main() function of the Python Generator object defines a cache of "virtual" BaseObjects which will appear in the scene. Materials cannot be created this way. A material must be inserted into the BaseDocument. This must only happen from the main thread, typically in reaction to some user interaction. One way of doing this would be to add a user data button to your Generator. Then your user could simply press that button to create the needed materials. Pressing the button can be detected by implementing the message() function. This could look like this: def main(): # search for material mat = doc.SearchMaterial("Generator Material") if mat is None: return None # create object cube = c4d.BaseObject(c4d.Ocube) # apply material ttag = cube.MakeTag(c4d.Ttexture) ttag[c4d.TEXTURETAG_MATERIAL] = mat return cube def message(id, data): if id == c4d.MSG_DESCRIPTION_COMMAND: buttonId = data['id'] # check button ID if buttonId[1].id == 1: # create material and insert it into the host document c4d.StopAllThreads() material = c4d.Material() material.SetName("Generator Material") material[c4d.MATERIAL_COLOR_COLOR] = c4d.Vector(1,0,0) doc.InsertMaterial(material, None) c4d.EventAdd() Also, please use the Q&A system. best wishes, Sebastian
  • 0 Votes
    4 Posts
    1k Views
    S
    @stevejlv I found a workaround: the value part in the value;string Cycle option list does not have to be 0,1,2 etc. So I can give them the exact value as the string part (as long as they are int) and get the value I want the old fashioned way: [c4d.ID_USERDATA,1]
  • 0 Votes
    4 Posts
    1k Views
    CairynC
    @bentraje Yeah, the second part was meant just in case you have need for a manual process. GetModelingAxis() takes multiselections of elements into account. However, I believe GetModelingAxis() works by selected mode (as you can have different selections for points, polys, and edges in parallel depending on whether the point, poly, edge, or object mode is active. So if you explicitly need the point selection and use the method in a script, you may want to switch to the point mode before using GetModelingAxis(). (Also, the actual modeling axis can be changed by the tools, so caution is in order. Personally, this is the behavior I needed, so I didn't make any big experiments.)
  • 0 Votes
    2 Posts
    587 Views
    P
    Together with the help from the c4dlounge.eu forum the issues is solved. The main issue was I did not read the manual good enough. "Note that Size symbolizes the axis size and not the expansion of the object itself. For planar projections, the true dimension is the two/fold of the axis length."
  • 0 Votes
    5 Posts
    1k Views
    M
    thanks solved: self.data = {'sphere_size': 15, 'extension_ratio': 1, 'extend_vector': False} kind regards
  • Changing DATETIME_GUI date format

    Cinema 4D SDK python r19
    3
    1
    0 Votes
    3 Posts
    699 Views
    A
    @s_bach Hi Sebastian, Thanks for your help! That makes sense! Andre
  • 0 Votes
    6 Posts
    1k Views
    B
    @Cairyn Interesting "(not just on every frame but far more often)" I guess for now I guess I'll just do it in piecemeal. Other parts in Xpresso nodes and the other python tag. Thanks for the tip on the Python nodes on the Xpresso editor. Haven't tried it. I would go for the pure Xpresso set-up but its a bit finicky to set-up such as identifying where the node sits in the xpresso editor otherwise it sits on top of each other (An automatic layout command would be nice). @m_adam Thanks for the reference!
  • 0 Votes
    3 Posts
    576 Views
    M
    This issue is now fixed in R21. So you don't need to manually SetDirty / Send the message. Cheers, Maxime.
  • 0 Votes
    3 Posts
    949 Views
    M
    Hi @SteveJLV welcome in the plugincafe community, I would like to point you to some rules: Read Before Posting. Nothing wrong here, but just in case. Q&A New Functionality. I've setup your topic correctly. As you already figured it out, you never assign a new value to the variable. In Python, everything is passed by value by default in 90% of the time. Meaning when you do x = y will actually copy y to x, so afterward if you do x + 10 it will not affect y value. If you have more questions, don't hesitate. Cheers, Maxime.