• HowTo set keyframes for PosXYZ/RotXYZ/ScaleXYZ with a script

    17
    1
    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
  • 0 Votes
    8 Posts
    1k Views
    P
    Thanks for the good explanation.
  • [SOLVED] ARROWBUTTON resource not accessible for Python?

    5
    0 Votes
    5 Posts
    855 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
  • Switch render engine to Redshift (In memory)

    python
    4
    0 Votes
    4 Posts
    975 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
  • Cinema 4D R2023 - c4d.plugins.RegisterObjectPlugin issue

    2023 python
    6
    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.
  • 3D Mouse Slider Focus

    python windows r19 maxon api
    13
    1
    0 Votes
    13 Posts
    4k Views
    CairynC
    @charly CollieMouse rotates around the current selection or the explicit rotation center (the one you set with the INS shortcut). It will not rotate around the mouse pointer (I think... I implemented so many modes over time that I tend to forget the options...). The mouse pointer only exists in 2D space anyway so the actual rotation would happen around a projection of the mouse position into the scene, and if you move the mouse, the rotational center would change... not sure whether that is even a usable mode. The mode I'd recommend would be around the explicit center: Position the mouse, press INS (or whatever shortcut you use), and then use the 3D mouse to rotate around that. C4D shows the explicit center as green cross so you always know where it is. At the moment there is no R2023 version of CollieMouse anyway, so the point is moot. But you can reach me under cairyn (at) tigress (dot) com if you require specialty development.
  • CreateRepositoryFromUrl results in TypeError in 2023

    python 2023
    4
    0 Votes
    4 Posts
    737 Views
    T
    Hi @m_adam, this works perfectly. Thank you for your fast response.
  • How to use RemoveConnections?

    2023 python
    3
    0 Votes
    3 Posts
    303 Views
    B
    @Manuel Gotcha. Thanks for the clarification. Works as expected.
  • Simple Organisational Structure Generation Script

    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?

    python 2023
    3
    0 Votes
    3 Posts
    349 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
  • Complete Replica of a Native Objects UI?

    2023 python
    7
    1
    0 Votes
    7 Posts
    1k Views
    B
    @iplai @ferdinand Thanks for providing details especially the third party API. Seems like a handy utility library I'll see what I can do with it.
  • Merge Undos for the BeginTransaction() method?

    2023 python
    8
    0 Votes
    8 Posts
    1k Views
    B
    @ferdinand gotcha. thanks for clarification and adding links.
  • Wrong Polygon indices

    c++
    3
    1
    0 Votes
    3 Posts
    496 Views
    F
    Hi @m_adam, I just tested your suggestion and worked flawless, thank you very much. Cheers and happy holidays
  • 0 Votes
    2 Posts
    332 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
  • Load XGroup via Python

    python
    2
    0 Votes
    2 Posts
    359 Views
    M
    Hi @cgweasel unfortunately this is not exposed, Xpresso is no longer developed except for critical issues, it is very likely that this will not be added to the API. Cheers, Maxime.
  • Timeline playing - MSG or method to get it?

    2023 python s26
    3
    0 Votes
    3 Posts
    635 Views
    mocolocoM
    Hello @m_adam, Thanks a lot, it works like a charm! Have a good day, Christophe
  • Volume Object Example

    2023 c++
    5
    0 Votes
    5 Posts
    860 Views
    D
    Thanks! That worked for me! Dan
  • Does XRef or XRef simple are now accessible with Python?

    2023 python s26
    7
    0 Votes
    7 Posts
    2k Views
    ferdinandF
    Hey @mocoloco, Should, that's why I asked. Yeah, that is not the style of the classic API, there are only little error messages and things like that. What you can also do, is use the return value of SetParameter, a boolean. It will be False when setting the parameter failed. I used 'Ge' to design all [...] Eh, I understand, you mean from GeDialog, or what? I think it just stands for GenericDialog, it also pops up in thing like GeListNode or GeClipMap. There are some really old entities in the classic API and naming conventions were different then Ge is at least not a name for interface gadgets in our APIs. Cheers, Ferdinand
  • PreferenceData plugin, Text disappears when directory is set

    python r19 sdk
    10
    0 Votes
    10 Posts
    2k Views
    DunhouD
    @m_adam Thanks a lot for this example A big shout out !
  • GeClipMap and init(BaseBitmap)

    c++ sdk
    13
    0 Votes
    13 Posts
    2k Views
    WickedPW
    Sounds like what I'm doing should be OK then. If I run into any problems, I'll pop back in for further advice. Thanks @ferdinand, your help is always appreciated. We can close this one. WP.