• GeUserArea.GetDragObject() for xpresso node

    Cinema 4D SDK python
    4
    0 Votes
    4 Posts
    936 Views
    ferdinandF
    Hey everyone, Just as an FYI: cinema::GvCopyBuffer is not a public type. Just saying this so that future C++ users do not run against a wall here. One might be able to wiggle through with a forward/dummy deceleration of GvCopyBuffer, but officially this is not supported in the public C++ API either. And we therefore cannot provide forum support for this in C++ either. Cheers, Ferdinand
  • 0 Votes
    4 Posts
    1k Views
    L
    Hello, Ferdinand! Thank you for your attention to my question, your time, and your academic explanations.
  • 0 Votes
    4 Posts
    1k Views
    O
    And that's good to know about using GetMl() over Get Mg(), mainly for the performance reasons if I understood correctly.
  • SetPortValue for Texture node ColorSpace

    Cinema 4D SDK python 2024 windows
    3
    0 Votes
    3 Posts
    877 Views
    M
    Thank you so much, this was very helpful to learn. All the best.
  • 0 Votes
    5 Posts
    1k Views
    ferdinandF
    Hey @lednevandrey, without wanting to be rude, I really struggle with understanding what you want to convey. Material[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_UVW does not work because Python is case sensitive and you gave your BaseMaterial instance the symbol material. So, Python is complaining about that. But as said before, a material, i.e., BaseMaterial is not the right place to set the projection. It is the counter part to the thing you see in the Material Manager of Cinema 4D and has no projection. The projection is set in the Material Tag, which slightly confusingly is called TextureTag in the API. Cheers, Ferdinand """Assigns the first material in the document to the selected object and sets its projection to UVW. """ import c4d import mxutils doc: c4d.documents.BaseDocument # The currently active document. op: c4d.BaseObject | None # The primary selected object in `doc`. Can be `None`. def main() -> None: """Called by Cinema 4D when the script is being executed. """ if not op: raise ValueError("Please select an object.") # Get the first material in the document. material: c4d.BaseMaterial = doc.GetFirstMaterial() if not material: raise ValueError("No materials found in the document.") # Get the first existing texture tag on #op or create a new one when none exists. tag: c4d.BaseTag = op.GetTag(c4d.Ttexture) or op.MakeTag(c4d.Ttexture) if not tag: raise ValueError("Failed to get or create a texture tag.") # Set the material and projection. tag[c4d.TEXTURETAG_MATERIAL] = material tag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_UVW # Update the Cinema 4D UI. c4d.EventAdd() if __name__ == '__main__': main()
  • 0 Votes
    6 Posts
    2k Views
    i_mazlovI
    Hi @tx3008, Welcome to the Maxon developers forum and its community, it is great to have you with us! Getting Started Before creating your next postings, we would recommend making yourself accustomed with our forum and support procedures. You did not do anything wrong, we point all new users to these rules. Forum Overview: Provides a broad overview of the fundamental structure and rules of this forum, such as the purpose of the different sub-forums or the fact that we will ban users who engage in hate speech or harassment. Support Procedures: Provides a more in detail overview of how we provide technical support for APIs here. This topic will tell you how to ask good questions and limits of our technical support. Forum Features: Provides an overview of the technical features of this forum, such as Markdown markup or file uploads. It is strongly recommended to read the first two topics carefully, especially the section Support Procedures: Asking Questions. About your First Question Third party software is out of scope of our Support Procedures, namely: We cannot provide support for third party libraries. Hence I've moved your thread to the "General Talk" forum. Many thanks to @Dunhou for taking an active role of our community! Much appreciated! Cheers, Ilia
  • Query Morph Order Based on the UI Order?

    Cinema 4D SDK 2024 python
    3
    1
    0 Votes
    3 Posts
    863 Views
    B
    Hi @ferdinand Thanks for the response. Found a workaround it. Basically, just name the poses properly in a sorting order. Query the GetName() method and perform my own sorting. Regards, Ben
  • 0 Votes
    6 Posts
    1k Views
    ferdinandF
    Great to hear that you found your solution! Do not hesitate to ask more questions when you run into problems while exploring our Python API. But just as a heads up, we prefer users opening new topics for new questions. For details see the Support Procedures linked above. Cheers, Ferdinand
  • Set UVWs for Ngons?

    Cinema 4D SDK s26 python
    4
    1
    0 Votes
    4 Posts
    876 Views
    E
    @ferdinand I figured this issue out so you can mark this as solved/closed. Thank you.
  • Not able to post?

    Cinema 4D SDK s26 python
    2
    0 Votes
    2 Posts
    648 Views
    ferdinandF
    Hey @ELJeffery, Thank you for pointing this out. We are generally aware of this issue. If anyone else is experiencing similar issues, please point them out. While we are aware that the issue exists and we can see the incident reports in the back end, it is not 100% clear to us how frequent this does happen to human users (and how urgent this is issue is). So, when you run into the issue too, please drop us here the Cloudflare Ray ID of your error page. As an FYI, the issue usually rectifies itself after a few minutes. Cheers, Ferdinand
  • C4DAtom.SetParameter/GetParameter help

    Cinema 4D SDK 2024 python
    3
    0 Votes
    3 Posts
    697 Views
    i_mazlovI
    Hi @ops, Thanks for reaching out to us and thanks for sharing your solution with the community, this is highly appreciated! You're right, the most common way of accessing object's attributes is by using subscript operator. Cheers, Ilia
  • 0 Votes
    8 Posts
    2k Views
    DunhouD
    Wow @m_adam , thanks for that, I'll check this after work!
  • 0 Votes
    2 Posts
    645 Views
    i_mazlovI
    Hi @BigRoy, For the alembic camera, you can use c4d.MSG_GETREALCAMERADATA, for example: def main(): data = dict() op.Message(c4d.MSG_GETREALCAMERADATA, data) print(data['res']) Another option (which would work for other object types as well) would be to check type of the object's cache using GetCache(). Cheers, Ilia
  • 0 Votes
    2 Posts
    719 Views
    M
    Hey BigRoy, sadly it's still impossible, I will start the discussion again, thanks for the reminder. Cheers, Maxime.
  • 0 Votes
    5 Posts
    1k Views
    R
    I was just looking for the exact same thing and would second the need for these 3 hooks without the need for a Python Generator object. It would make the pipeline integration of C4D much more straightforward. @m_adam
  • Import and managing 'merged' Alembic

    Cinema 4D SDK python 2023
    4
    1
    0 Votes
    4 Posts
    2k Views
    i_mazlovI
    Hi @BigRoy, in python the lifetime of the objects is handled automatically so you're right, there's no need to do anything special to destruct the object. Good job on your project! Thanks for sharing it with the community! Cheers, Ilia
  • 0 Votes
    3 Posts
    771 Views
    i_mazlovI
    Hi @datamilch, you can use the EVMSG_CHANGE message as a trigger to check your objects for changes. The timer approach might seem imprecise from the first glance, but can actually be used, I don't think there're any significant reasons against it. Additionally, the recent change was made to make BaseList2D being hashable. This effectively means you can operate with your objects in a dict. The python tag approach is the least efficient, although would still work, yes. You're saying your GeDialog plugin uses "mostly the ideantical userdata". If it was "identical", you could potentially use c4d.gui.DescriptionCustomGui with the SetObject function to make it point to your object. This way you can avoid hassling around all the data sync, because it is all handled as a built-in functionality of this class. This is how the attribute manager effectively works, or the Active Object Dialog as well. For your further postings please follow our guidelines on How to Ask Questions, namely: Please consolidate your questions into a singular posting by editing your last posting Cheers, Ilia
  • CopyBitmapToClipboard gamma issue

    Cinema 4D SDK python 2024 windows
    2
    1
    0 Votes
    2 Posts
    555 Views
    i_mazlovI
    Hi @John_Do, Please note that this forum is for the public APIs of Maxon products related topics. We unfortunately cannot help with the end user issues. Please ask your end user questions in our Support Center. This and also other important considerations are mentioned in the Scope of Support part of our Support Procedures. With that's said, your question gives a fuzzy impression on what exactly you're asking about. Namely, you're talking (presumably) about the CopyToClipboard() function, but then also claim the issue is not there, rather when you paste this bitmap in the PV. Could you please share some code snippet, which highlights the issue, especially the pasting part, which seem to not work as expected. Please also make sure you've setup the Picture Viewer's View Transform to meet your needs. In our internal bug tracking system I'm also seeing 2 issues that we already keep track of: A-B comparison issue that was just recently fixed and is not yet released Picture Viewer issue with OCIO enabled when using EXR files However, none of these seem to be specifically related to your case. If you're still having this issue and it is not related to our SDK, I would kindly ask you to reach out to our Support Center. Cheers, Ilia
  • 0 Votes
    4 Posts
    1k Views
    H
    @i_mazlov Thanks much for explanation.
  • 0 Votes
    2 Posts
    452 Views
    ferdinandF
    Hey @rui_mac, thank you for reaching out to us. In general only shaders which are volume shaders have access to the object for which they are being called for. In Python (or in COFFEE) you cannot implement volume shaders and therefore cannot access the object which is being rendered. When you are implementing a volume shader in C++, you can do this (untested pseudo code): cinema::Vector MyShader::Output(cinema::BaseShader* shader, cinema::ChannelData* cd){ // Get the volume data from the channel data. cinema::VolumeData* const vd = cd ? cd->vd : nullptr; if (!vd) return COLOR_RENDER_ERROR; // Get the ray objects. for (cinema::Int32 i; i < vd->GetObjCount(); i++) { const cinema::RayObject* const ro = vd->GetObj(i); if (!obj) continue; // Attempt to find the object this ray object has been constructed for. const cinema::BaseObject* const op = ro._texture_link ? ro._texture_link : ro._link; if (!op) return COLOR_RENDER_ERROR; // Do stuff with the object ... } return COLOR_RENDER_ERROR; } Cheers, Ferdinand