• Breaking Tags Out Of A Shared Folder

    r21 sdk c++
    3
    1
    0 Votes
    3 Posts
    818 Views
    J
    Thanks for the response, that's what I was afraid of. John Terenece
  • BFM_DRAGRECEIVE

    sdk c++
    3
    0 Votes
    3 Posts
    704 Views
    WickedPW
    Thanks @m_adam, I had to jump through a bunch of hoops with this one, because I put the queue process into a progress dialog so that for large file arrays there's an indicator of progress. Otherwise it just appears to hang and the user won't know why. But this made it tricky when the timer is also used because of the different thread contexts involved with the timer, the progress dialog and everything else on the main thread. But with a bit of care, it seems to work. Thanks again, WP.
  • Automatic UV Rectangularize / MDATA_UVRECTANGULARIZE

    2
    0 Votes
    2 Posts
    589 Views
    M
    Hi sadly the only way is to use c4d.CallCommand(1055347) which does not open the window but directly execute the command. You can change the setting as you could in the windows, by editing the value in the BaseContainer of the document. Finally it act on the selected polygon, so the best way would be to select them. Find bellow a script that you can execute in the script manager that will select all polygon of an object and run the command. from typing import Optional import c4d doc: c4d.documents.BaseDocument # The active document op: Optional[c4d.BaseObject] # The active object, None if unselected def main() -> None: # Enables UV Polygon Mode if not already in any UV mode (needed for GetActiveUVSet to works) if doc.GetMode() not in [c4d.Muvpoints, c4d.Muvpolygons]: doc.SetMode(c4d.Muvpolygons) # Retrieves active UVSet, The UV windows need to be opened at least one time handle = c4d.modules.bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL) if handle is None: # If fail it may be because the Texture view is not open # Open A texture View c4d.CallCommand(170103) # In S22 you need to update the UV Mesh if c4d.API_VERSION >= 22000: c4d.modules.bodypaint.UpdateMeshUV(False) # Retrieves active UVSet, The UV windows need to be opened at least one time handle = c4d.modules.bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL) if handle is None: raise RuntimeError("There is no Active UVSet") # Select the polygon you want to operate on currentSel = op.GetPolygonS() previousSel = currentSel.GetClone() # Will be used to restore the initial selection state at the end currentSel.SelectAll(op.GetPolygonCount() - 1 ) # Update the UV mesh to properly take into account the new selection c4d.modules.bodypaint.UpdateMeshUV(True) # Define the settings settings = doc.GetSettingsInstance(c4d.DOCUMENTSETTINGS_MODELING) settings[c4d.MDATA_UVRECTANGULARIZE_ALIGN] = True settings[c4d.MDATA_UVRECTANGULARIZE_EQUIDISTANT] = False # Execute the command c4d.CallCommand(1055347) # Restore the initial selection previousSel.CopyTo(currentSel) c4d.modules.bodypaint.UpdateMeshUV(True) c4d.EventAdd() if __name__ == '__main__': main() Cheers, Maxime.
  • How to run a videoPost plug-in when user changes the scene?

    2
    0 Votes
    2 Posts
    329 Views
    i_mazlovI
    Hi @maxiokid , Please excuse the long answer delay. There're a lot of changes between R22 and 2023.2.2, so I'm not surprised the behavior has changed. The way you adapt your plugin to the new SDK depends on what you're trying to achieve. Please provide a more detailed description of the the effects you need to use inside the execute function. Usually a minimally functional code snippet that highlights the issue is a very self-explanatory way to do that. Cheers, Ilia
  • Getting rid of the burger icon in a dialog

    r25 c++
    12
    0 Votes
    12 Posts
    2k Views
    fwilleke80F
    Woot, it works!
  • UVCOMMAND_RELAX does not use the RELAXUV_EDGESEL_POINTER

    s26 python windows
    3
    0 Votes
    3 Posts
    486 Views
    V
    @ferdinand Thank you for the hint and the superfast response! I was not aware that these symbols dissolve into these numbers, which of course makes it much easier to work with them now. I was able to solve it with CallUVCommand: settings = c4d.BaseContainer() settings[c4d.RELAXUV_KEEP_BORDER] = False settings[c4d.RELAXUV_KEEP_NEIGHBORS] = False settings[c4d.RELAXUV_KEEP_POINTSEL] = False settings[c4d.RELAXUV_CUT_EDGESEL] = True settings[c4d.RELAXUV_EDGESEL_POINTER] = edge_sellection settings[c4d.RELAXUV_MAX_ITERATIONS] = 1 settings[c4d.RELAXUV_MODE] = c4d.RELAXUV_MODE_ABF ret = c4d.modules.bodypaint.CallUVCommand(handle.GetPoints(), handle.GetPointCount(), handle.GetPolys(), handle.GetPolyCount(), uvw, handle.GetPolySel(), handle.GetUVPointSel(), obj, handle.GetMode(), c4d.UVCOMMAND_RELAX, settings)
  • Send message from Modal dialog to Async (main) dialog

    python sdk
    3
    0 Votes
    3 Posts
    857 Views
    ferdinandF
    Hello @HerzogVonWiesel, Thank you for reaching out to us. Using the message system could be possible here but seems a bit overkill. Since you own both implementations, it would be best if you simply tie together the dialog instances you want to exchange information between. E.g.: import c4d class ConnectedDialog(c4d.gui.GeDialog): """Realizes a dialog type which has a binding to another dialog instance. Note that all methods in this example are not part of the GeDialog interface scheme, i.e., "custom" methods. """ def __init__(self) -> None: """ """ # The list of dialogs this dialog instance does exchange information with. self._connectedDialogs: list[ConnectedDialog] = [] super().__init__() def Bind(self, other: "ConnectedDialog", twoWay: bool = True) -> None: """Binds the dialog #other to #self and makes the connection optionally two-way. Also ensures that bindings are unique, i.e, two dialogs cannot be bound more than once in one direction. """ if not isinstance(other, ConnectedDialog): raise TypeError(f"{other = }") if other not in self._connectedDialogs: self._connectedDialogs.append(other) if twoWay and self not in other._connectedDialogs: other._connectedDialogs.append(self) def SpecialMessage(self, sender: "ConnectedDialog", *args) -> None: """Receives message stream from all connected dialogs. """ print (args) def Action(self, value: any, condition: any) -> None: """Exemplifies a method which informs all other dialog instances about an event. """ if condition: for dlg in self._connectedDialogs: dlg.SpecialMessage(self, value, condition) if __name__ == "__main__": # Instantiate five dialogs and creating bindings between all of them. dialogCollection: tuple[ConnectedDialog] = (ConnectedDialog() for _ in range(5)) for a in dialogCollection: for b in dialogCollection: a.Bind(b) You could do three million and one thing differently here; this is just an example to illustrate a pattern. The crucial information might be here for you (since we just talked about threading and dialogs before) that: The methods both of modal and async dialogs run on the main thread. Async in an async dialog are only the drawing routines which you do not have access to, even when you implement a dialog with a custom GeUserArea. That area only enqueues drawing instructions into a buffer and does not do the actual drawing. So, there is no danger of access violations, which Python of course does not know in the first place due to its GIL. When tying dialogs together is not possible then you can use the message system of Cinema 4D. But tying objects together is always possible in Python even when the objects live in two modules which do not have access to each other. You can either use sockets (a bit overkill) or be lazy and just setup shop in a commonly accessible object, e.g., the sys module. When you go for messages, I would recommend having a look at the Message Manual first as I gave there a rough overview. In short: GeDialog.Message is for UI messages and just like its NodeData.Message counter part instance specific. It is not meant to establish a binding between two dialog instances but to let Cinema 4D or elements in a UI tree communicate with the dialog ("button to dialog: I have been pressed"). What you can do, is set off a core event with c4d.SpecialEventAddd to then catch that core message in all other dialogs using GeDialog.CoreMessage. Note that the Python API does filter message streams, and unlike in C++, you cannot just "invent" a new message type, except for using c4d.SpecialEventAdd. But there you are limited to sending three integers in Python (in C++ the p1 and p2 arguments are meant to be pointers to arbitrary data). Cheers, Ferdinand PS: Yeah using the CPython API you can cast/wrap things (in order to use p1 and p2 actually in the manner they are intended to) but be aware that any C magic is not officially supported by us.
  • Sampling a point in space from a userdata Field List

    python
    7
    0 Votes
    7 Posts
    1k Views
    ferdinandF
    Hey @jenandesign, you can edit your postings, just click on the three dots button below a posting of yours. You will not be able to move a post like I can, but except for that have the same options as I do: [image: 1692289705372-46c3d9dd-ed4c-4fe4-a683-684eb5553f80-image-resized.png] Cheers, Ferdinand
  • How to obtain the path of a selected Asset in Asset Browser

    python 2023
    3
    0 Votes
    3 Posts
    694 Views
    E
    @ferdinand Thank you very much for your help, your code has been extremely useful to me. Cheers!
  • ShowBitmap() and image name

    sdk c++
    5
    1
    0 Votes
    5 Posts
    1k Views
    ferdinandF
    Hey @WickedP, Thank you for pointing it out. There was a problem with how the CSS of the plugin providing the solved feature, the forum CSS, and our styling CSS did mesh in the light skin. I fixed it by putting even more CSS on top of things - because who doesn't love a solid mess in the CSS PS: I am aware that the search feature could also still use some work under the dark skin. It is just not the highest priority when things are ugly but readable. Cheers, Ferdinand
  • 0 Votes
    5 Posts
    854 Views
    fwilleke80F
    @jana sorry, I forgot to flag it myself. All solved, thank you
  • Python plugin encryption

    python 2023 sdk
    3
    0 Votes
    3 Posts
    703 Views
    F
    Thank you very much!
  • How to Dynamically Change the Size of Dialog Window

    2023 python
    3
    2
    0 Votes
    3 Posts
    950 Views
    HerzogVonWieselH
    Thank you again @ferdinand ! Sad that resizing windows is not a possibility. Would've been nice to have the options pop up once you toggle the extra options on! Now I've implemented them as a modal dialogue so you can choose them and close it again. Thank you for your help!
  • Handling Treeview File Drag and Drop Events

    python c++ 2023
    3
    1 Votes
    3 Posts
    784 Views
    ferdinandF
    Hey @Dunhou, yeah, I already saw and fixed that in the course of answering this. Cheers, Ferdinand
  • How to apply PostEffect to Viewport in realtime?

    3
    0 Votes
    3 Posts
    462 Views
    M
    Thank you for the reply. I'll create a new topic
  • hud depth buffer?

    r19 2023 python
    6
    1
    0 Votes
    6 Posts
    1k Views
    ymoonY
    Added one more for... zip to remove the invisible points.
  • ProgressDialog and SetTitle()

    sdk c++
    3
    0 Votes
    3 Posts
    629 Views
    WickedPW
    Hi @i_mazlov The dialog/gui is open. It's a progress dialog that I use to run an export function. I did some more digging, and I believe I've solved it. I had to put the SetTitle() into the dialog's Timer() function. So, something like this: virtual void MyProgressDialog::Timer(const BaseContainer& msg) { // 'title' is a class-level string variable SetTitle(title); return ProgressDialog::Timer(msg); } Seems to work as expected. WP.
  • Message system isn't working in python effector

    python
    4
    1
    0 Votes
    4 Posts
    778 Views
    ferdinandF
    Hello @aghiad322, I have closed this thread as it has been answered. The task has been added to our internal task pool. However, since this is not a bug but a feature limitation, I have not marked this thread as to_fix as there is nothing to fix here. This does not mean that we will not do it, I have added the task for now to the task pool of a close by release. But we treat feature requests differently than bugs, and the task might therefore be postponed/pushed when we run out of time in that release. Cheers, Ferdinand
  • 0 Votes
    4 Posts
    815 Views
    J
    Hello @Thodos , without further questions or postings, we will consider this topic as solved by Friday, the 11th of august 2023 and flag it accordingly. Thank you for your understanding, Maxon SDK Group
  • Generator object's children visibility

    c++
    10
    0 Votes
    10 Posts
    2k Views
    J
    Hello @konradsawicki , without further questions or postings, we will consider this topic as solved by Friday, the 11th of august 2023 and flag it accordingly. Thank you for your understanding, Maxon SDK Group