Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    right click menu?

    Scheduled Pinned Locked Moved PYTHON Development
    13 Posts 0 Posters 981 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      On 09/09/2014 at 11:23, xxxxxxxx wrote:

      That code is for a GeDialog. But you're using it in a CommandData class.
      The CommandData class is only used to give you a way to launch the GeDialog from the menu. So you need to write your gizmo code for a GeDialog class.

      Put this code in your script manager and run it.
      Then RMB click in the dialog and select an item from the popup list. And it will put what you selected in the textbox.
      This is a script example. But works the same way in plugins.

      import c4d  
      from c4d import gui  
        
      class CustomDialog(c4d.gui.GeDialog) :  
        
        def CreateLayout(self) :  
            self.AddEditText(2222, c4d.BFH_CENTER, initw=120, inith=15)  
            return True  
          
        def Message(self, msg, result) :  
        
            if msg.GetId() == c4d.BFM_INPUT:  
                 if msg.GetLong(c4d.BFM_INPUT_CHANNEL)==c4d.BFM_INPUT_MOUSERIGHT:  
                       
                     #Put in your code which will be executed upon a RMB click  
                     entries = c4d.BaseContainer()  
                     entries.SetString(1000, 'Item 1')  
                     entries.SetString(1001, 'Item 2')  
                     entries.SetString(0, "")             #Using a 0 Adds a separator  
                     entries.SetString(1003, 'Item 3')  
                       
                     popupGizmo = c4d.gui.ShowPopupDialog(cd=None, bc=entries, x=c4d.MOUSEPOS, y=c4d.MOUSEPOS)                   
                     popupText = entries.GetString(popupGizmo)  
                     self.SetString(2222, popupText)  
                  
            return c4d.gui.GeDialog.Message(self, msg, msg)      
        
      def main() :  
        myDialog = CustomDialog()  
        myDialog.Open(dlgtype=c4d.DLG_TYPE_MODAL_RESIZEABLE, pluginid=1000001, defaultw=150, defaulth=100, xpos=-1, ypos=-1)  
          
      if __name__=='__main__':  
        main()
      

      -ScottA

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 09/09/2014 at 11:25, xxxxxxxx wrote:

        Sweet!!! That'll help start me down the path! Thanks again!

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 09/09/2014 at 22:41, xxxxxxxx wrote:

          So how would I incorporate this into a plugin?

          Here's what I have so far, but I just keep getting the default c4d right click menu:

            
          import c4d   
          from c4d import plugins   
          import os   
            
          class PipelineDialog(c4d.gui.GeDialog) :   
            
              def CreateLayout(self) :   
                  self.SetTitle("c4d Pipeline")   
                  self.AddEditText(2222, c4d.BFH_CENTER, initw=120, inith=15)   
            
          class Pipeline(c4d.plugins.CommandData) :   
            
              dialog = None   
            
              def Init(self, op) :   
                  return True   
            
              def Message(self, type, data) :   
                  return True   
            
              def Execute(self, doc) :   
                  if self.dialog is None:   
                      self.dialog = PipelineDialog()   
                  return self.dialog.Open(dlgtype=c4d.DLG_TYPE_ASYNC, pluginid=PLUGIN_ID, defaultw=400, defaulth=160)   
            
          if __name__ == '__main__':   
              bmp = c4d.bitmaps.BaseBitmap()   
              dir, file = os.path.split(__file__)   
              fn = os.path.join(dir, "res", "Icon.tif")   
              bmp.InitWith(fn)   
              print "Position Cloner loaded."   
              result = plugins.RegisterCommandPlugin(PLUGIN_ID, "c4d pipeline_part", 0, bmp, "c4d pipeline", Pipeline())   
          
          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 10/09/2014 at 08:52, xxxxxxxx wrote:

            Hmmm. That's a good question.
            I can't find anywhere in the SDK how to tell C4D to shut off the RMB stuff.
            Normally these popups are used in Tool plugins and this is not an issue.

            I'm not sure if it's possible to use the RMB with a GeDialog.
            You might have to use a keyboard key instead. Or possibly a qualifier key with the RMB.
            It's an annoying limitation for sure.

            -ScottA

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 10/09/2014 at 10:27, xxxxxxxx wrote:

              Well, what I think might work instead is to have a select box with a series of buttons beneath. Essentially "buttonizing" the menu beneath. I only have a few functions that I need.    Is there a way to create something similar to this?

              http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select_multiple

              I'm originally an HTML guy so I usually think of things from that angle.   Just FYI I'm trying to create an asset manager similar to this: http://openpipeline.cc/

              So all I would need is a list of files where one could be selected so I can perform my actions on the selected list item. Is there a way to make selectable list items like that?

              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 10/09/2014 at 11:27, xxxxxxxx wrote:

                That's a linkbox gizmo.
                In C4D it's called this: CUSTOMGUI_LINKBOX

                This gizmo is not available in the Python SDK. Only in the C++ SDK.
                I know how to create the gizmo itself. But the functions for populating it are not available in the Python version of the SDK. Or at least AFAIK.

                NiklasR. wrote a gizmo like this using the UserArea class.
                I can't remember off hand where it is. But you might find it by searching the archives. Or by contacting him directly.

                -ScottA

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  On 10/09/2014 at 11:57, xxxxxxxx wrote:

                  Oh BTW:
                  There does seem to be one way to shut off the RMB click thing.
                  And that's to make the GeDialog modal.

                    
                  return self.dialog.Open(dlgtype=c4d.DLG_TYPE_MODAL, pluginid=PLUGIN_ID, defaultw=200, defaulth=150, xpos=-1, ypos=-1)
                  

                  Of course the down side of this is that the user has to close the dialog before they can do anything in the scene. And they won't be able to dock the dialog in the UI.
                  But if that's not a deal breaker. Then using a modal dialog should work.

                  -ScottA

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    On 06/10/2014 at 09:44, xxxxxxxx wrote:

                    I've been playing around with this some more and have discovered that you I can't detect any type of click in an ASYNC dialog. Is there no way to detect a click at all using ASYNC?

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

                      On 06/10/2014 at 09:48, xxxxxxxx wrote:

                      I found this and think it might be able to solve the problem but have no idea how to implement it. Any suggestions?
                      [URL-REMOVED]


                      [URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.

                      1 Reply Last reply Reply Quote 0
                      • H Offline
                        Helper
                        last edited by

                        On 06/10/2014 at 10:41, xxxxxxxx wrote:

                        I figured it out!!!

                        Turns out ASYNC only runs along with script execution, so if you need to continually poll the input you need to run it as a command plugin NOT a script. From my understanding a script is only listening to input as its running, but a plugin is continually listening for input while the dialog is open. I figured I could just build as a script and then port over to a plugin format, but that is NOT the case.

                        https://developers.maxon.net/forum/topic/6134/6370_py-scriptmng--geuserarea-disappears

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post