• Can REAL MIN / MAX value be changed on Init?

    Moved Bugs 2023 python s26 sdk
    20
    0 Votes
    20 Posts
    5k Views
    mocolocoM
    Hi there, Was the issue fixed on R2023 or R2024? Thanks, Christophe
  • Make Description Parameter Uneditable

    Cinema 4D SDK r23 2023 python windows
    3
    1
    0 Votes
    3 Posts
    622 Views
    ThomasBT
    @ferdinand As always thank you very much Ferdinand, it works as expected
  • RS Proxy Export Parameters?

    Cinema 4D SDK 2023 python
    2
    1
    0 Votes
    2 Posts
    319 Views
    B
    False Alarm. Found it under C:\Program Files\Maxon Cinema 4D 2023\Redshift\res\description instead. Hehe. Closing this thread now.
  • RenderDocument produces different color

    Moved Bugs python 2023
    13
    1
    0 Votes
    13 Posts
    4k Views
    ferdinandF
    Hey @moghurt, this is on our radar, but I cannot give an ETA when this will be auotmated. Cheers, Ferdinand
  • 0 Votes
    8 Posts
    2k Views
    P
    Thanks for the good explanation.
  • [SOLVED] ARROWBUTTON resource not accessible for Python?

    Cinema 4D SDK
    5
    0 Votes
    5 Posts
    901 Views
    ferdinandF
    Great to hear! One thing I forgot to mention: For ICONID1 XXX and ICONID2 YYY you can use any of the built-in icon IDs as listed here. When you want to use your own icons, you must make sure the icon IDs are registered before the node which is using them in its description. Simply put the c4d.gui.RegisterIcon call before the RegisterXXXPlugin call of the plugin using them. Cheers, Ferdinand
  • 0 Votes
    17 Posts
    3k Views
    ferdinandF
    Hey @vannipo, GUI builder is inside C4D, isn't it? I am not sure, atm. There is no WYSIWYG GUI builder for dialogs in Cinema 4D anymore. A long time ago existed the classic API Resource Editor, but it is not published anymore by us. The Resource Editor you can find via CTRL + C in a modern Cinema 4D instance is an editor for maxon API resources, a different and newer GUI paradigm in Cinema 4D. When you want to implement a dialog, you will have to either write a resource file manually or use the methods of GeDialog to add elements at runtime, you could have a look at this posting where I recently lined out some basics. The Python GUI Manual is quite superficial at the moment, but we have some simple examples on GitHub. For learning dialog resource markup, I would recommend the Dialog Resource Manual. The most important point for an animator is to key the desired channel as fast as possible. [...] But, the pop-up idea is very interesting, and I will have a look [...] Yeah, I understood that you were after a very streamlined setup. When you want to make zero compromises, nine shortcuts are probably the best solution. The solution I proposed with the popup menu is a compromise of the number of shortcut keys to allocate and the speed with which keys can be generated. The advantage is here that the popup menu will always open under your mouse cursor no matter where it is, which will minimize mouse travel distances. But when you overpopulate the menu with all nine entries (you can also add separators if you want to), selecting the right item will probably become slow. So, if you want a good compromise, you could use three scripts (translate/rotate/scale) which each provide a popup for x, y, or z. Btw, is it possible to set a "real name" for a script? atm, everywhere it just shows the filename. You can supply a different name from its filename by adding file docstring containing Name-en-US: XXXX where XXX is the name of the plugin. This can also be done for description that will be displayed when you hover the command with Description-en-US: XXX. If you need to support other language please refer to Plugin Structure Manual which specify the different language code. Finally you can find an example within GitHub - script_custom_name_description.py Cheers, Ferdinand
  • Implement A Usage Counter?

    General Talk python r25
    3
    0 Votes
    3 Posts
    698 Views
    B
    @ferdinand Thanks for the pointers. I'll try to look up those options. Will close this thread now.
  • 0 Votes
    6 Posts
    1k Views
    M
    @ferdinand said in A few items that should get fixed on the Python side: Hey @mikegold10, ..., the word "of" does not in any way indicate ownership, [...] It does, of is a possessive preposition, in is a relative preposition, specifically one that denotes a place. See here for an overview of the subject. I would not even challenge the fact that for you and your peers of might sound more natural (or maybe even all native speakers as you claim). But language in general, and especially things like prepositions, pronouns, and flexions, is subject to language change which is often highly regional, so what people consider correct can vary regionally. As indicated in my first answer, prepositions are quite interchangeable, and if the text would have said of instead of in, I would not waste any time on changing that. But in the same notion, I cannot change the preposition on what you subjectively consider better. The grammatical situation from a Standard English point of view seems obvious here and personal preference cannot be grounds for a change. I am more than happy to change the preposition when you can demonstrate with a respectable English style guide like Oxford English that it would be more common to use here of. But that seems unlikely to me. Cheers, Ferdinand As additional supportive evidence for my proposed change, I am providing a link to a respected source for the definitions of American English words, including many sample phrases that provide context for the often huge set of alternative definitions that are provided for commonly used words like "of" (and "in"): Meriam-Webster Dictionary: of - Definition / preposition Specifically, under the definitions of the word "of," when used as a preposition (i.e., Section 1 of 3 on the page, as linked above), please examine the following alternative definitions and examples of proper English usage that I believe are of relevance to my proposed change to the original Python comment: a, c, and e a and b b Here is a copy of the original comment to provide context: The index of the first and last selected elements in the given segment. ..., and the revised version that replaces the preposition in with of:: The index of the first and last selected elements of the given segment. Of course the decision is yours to make. I am simply trying to "open your mind" to, as well as provide objective evidence for, an alternative phrasing which I perceive to be a better fit for the technical subject matter that is being documented, within the framework of modern American English usage patterns. I have to concede on the fact that this is ultimately subjective and may (or may not - not sure) be specific to the en_US locale. Michael
  • Switch render engine to Redshift (In memory)

    Cinema 4D SDK python
    4
    0 Votes
    4 Posts
    1k Views
    ferdinandF
    Hi @everyone, just as an FYI, the example is slightly outdated. With 2023.0.0 or newer, there is no need to manually define a symbol for the Redshift renderer, as one can use the newly exposed VPrsrenderer symbol (c4d.VPrsrenderer in Python). I have updated the C++ example. Cheers, Ferdinand
  • Set the Preview of an Asset using an Image file.

    Cinema 4D SDK 2023 python
    8
    0 Votes
    8 Posts
    2k Views
    ferdinandF
    Hello @tdapper, I still do not fully understand what you want to do, but in general, my answer does not change much. I do not want to be rude here, but in C++ you have everything you need. And what you want to do here, is fundamentally interfere with how the Asset API works. Such low-level access is traditionally the domain of the C++ API and not the Python API. Bottom line is that it's cool that the asset browser automatically creates thumbnails [...] That was less me showing off the features of the asset API and more pointing out its general approach. Therefore we are basically trying to replicate the functionality you get when you right-click on the thumbnail in the Asset Browser and Click "Update Thumbnail from File...". 'Update Thumbnail from File...' will not prevent thumbnails from being overwritten either. So the only way to do so, would be to make the metadata entry read-only as pointed out in my first posting. Perhaps there is a way to just immediately kill the job that creates the thumbnail from being generated in the background or prevent that job from starting in the first place. If that is not possible, maybe there is a message we could intercept to know the thumbnail has been updated so we can run our workaround right after the thumbnail creation job is finished instead of waiting a hardcoded amount of time. Maybe there is another option that we're not clearly seeing right now? Neither your first nor second option are possible. The preview thumbnail job queue is non-public and there is no such thing as messages in the maxon API. There are Observables which realize the idea of events, but they are not exposed in Python nor are you able to stop a preview rendering with them. Again, I do not want to be rude here, but as pointed out in my first posting, what you want to do is not intended. You could get hacky from the Python API, but that is more or less up to you. [image: 1674145517216-982bbbbf-ca43-4f16-a85c-b9b5cb836a6f-image.png] Fig. 1: The physical location of thumbnails for local assets is always the same, net.maxon.asset.previewimageurl.meta.png. With that knowledge one can infer the future pyhsical location of a thumbnail for a local asset. # Create a new object asset. asset: maxon.AssetDescription = maxon.AssetCreationInterface.CreateObjectAsset( obj, doc, storeAssetStruct, assetId, assetName, assetVersion, assetMetadata, True) # Get the physical location of the asset #asset, normally one should not touch # AssetDescriptionInterface.GetUrl(). Then get the directory of that path and infer the # preview thumbnail location from it. assetUrl: maxon.Url = asset.GetUrl() assetPath: maxon.Url = maxon.Url(assetUrl.GetSystemPath()) previewFile: maxon.Url = assetPath + maxon.Url("net.maxon.asset.previewimageurl.meta.png") # Print out the paths, #previewFile won't yet exist at this point, because the thumbnailing is # parallelized. print (f"{assetUrl = }") print (f"{assetPath = }") print (f"{previewFile = }") print (f"{os.path.exists(previewFile.GetUrl()) = }") Example output: assetUrl = file:///C:/Users/f_hoppe/AppData/Roaming/Maxon/2023.1.3_97ABE84B/userrepository/object_a2c9ff14d748481fb9a8ae03d7bfa9b7/1/asset.c4d assetPath = file:///C:/Users/f_hoppe/AppData/Roaming/Maxon/2023.1.3_97ABE84B/userrepository/object_a2c9ff14d748481fb9a8ae03d7bfa9b7/1/ previewFile = file:///C:/Users/f_hoppe/AppData/Roaming/Maxon/2023.1.3_97ABE84B/userrepository/object_a2c9ff14d748481fb9a8ae03d7bfa9b7/1/net.maxon.asset.previewimageurl.meta.png os.path.exists(previewFile.GetUrl()) = False With that knowledge you could start messing with that file. But that is obviously out of scope of support and a hack. Otherwise you will have to use the C++ API or file a bug report for your thumbnails being black in the first place. Cheers, Ferdinand
  • 0 Votes
    6 Posts
    1k Views
    M
    @baca said in Cinema 4D R2023 - c4d.plugins.RegisterObjectPlugin issue: Any suggestion how to properly handle that kind of issues -- just catch exception and warn user using message box somehow? Correct you can catch the OsError and check if there is the word 50 in the exception message. Would it be reasonable to switch to NodeData from ObjectData -- It depends of your plugin if this is at the end an ObjectData then it's irrelevant, if this is just an object that you store in a list in memory or in a custom GeListHead then NodeData is perfectly relevant. does RegisterNodePlugin has separate 50 plugins registrations? Yes each type have 50 plugins. What's the logic behind plugin initialization order -- alphabetical, date-based, random? Folders from g_additionalModulePath are iterated by alphabetical order and each files are then iterated by alphabetical order too. Cheers, Maxime.
  • 0 Votes
    4 Posts
    802 Views
    T
    Hi @m_adam, this works perfectly. Thank you for your fast response.
  • How to use RemoveConnections?

    Cinema 4D SDK 2023 python
    3
    0 Votes
    3 Posts
    312 Views
    B
    @Manuel Gotcha. Thanks for the clarification. Works as expected.
  • Editing RS Nodes with Python

    Cinema 4D SDK python
    5
    0 Votes
    5 Posts
    1k Views
    M
    Hello @cgweasel, without further questions or postings, we will consider this topic as solved by Friday 02/06/2023 and flag it accordingly. Thank you for your understanding, Maxime.
  • Simple Organisational Structure Generation Script

    Cinema 4D SDK 2023 python
    6
    0 Votes
    6 Posts
    1k Views
    ManuelM
    @nealhulme you can have a look at our forum guidelines we have a section that explains how to mark your thread as a question. Then you can select a post as the answer or mark the thread solved. I forgot, welcome to the forum, i did not saw it was your first post. Cheers, Manuel
  • Skin Weights File Parser?

    Cinema 4D SDK python 2023
    3
    0 Votes
    3 Posts
    382 Views
    ManuelM
    hi, this is out of scope of the support and i never used configparser. Maybe maxime or Ferdinand will have some nice tips out of their head without having to investigate. I am happy you found a solution by pre-processing the file first. Cheers, Manuel
  • How to detectflip normals of object inwardoutward?

    Cinema 4D SDK r23 python
    4
    0 Votes
    4 Posts
    1k Views
    M
    Hello @FSS, without further questions or postings, we will consider this topic as solved by Friday 02/06/2023 and flag it accordingly. Thank you for your understanding, Maxime.
  • 0 Votes
    2 Posts
    344 Views
    ManuelM
    hi, welcome to the forum and thanks for reaching us out. Thanks for the question and the clarity of it. The issue here is that you are changing the Time value of the keys but not their indexes. One function that could help you is SortKeysByTime but as you can see, it is marked as private. I am not sure why it is marked private here. There might have some cases where this function will not give you the correct result. you could create your own algorithm to sort those keys. Another solution could be to delete those keys and re-insert them, they will be sorted as you insert them. Cheers, Manuel
  • Timeline playing - MSG or method to get it?

    Cinema 4D SDK 2023 python s26
    3
    0 Votes
    3 Posts
    671 Views
    mocolocoM
    Hello @m_adam, Thanks a lot, it works like a charm! Have a good day, Christophe