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

    Add image to GUI [SOLVED]

    Scheduled Pinned Locked Moved PYTHON Development
    10 Posts 0 Posters 994 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 06/01/2015 at 07:52, xxxxxxxx wrote:

      Two questions regarding image in the UI.

      1. Do I need to register every image I use in UI (I mean get it's IDs from pluginCafe)? As I am using only one image, can I use Plugins ID?
      2. I am using this method of adding image. However, I feel like I am doing it wrong, as it looks like a button (gets highlighted once mouse over). What would be the correct way of adding image (not button) to the UI?

        
        
      BITMAP_ID = 100001;   
      buttonimage = c4d.bitmaps.BaseBitmap()                         #We need an instance of BaseBitmap class to use an image   
      buttonimage.InitWith(os.path.join(dir, "res", "logo.png"))     #The location where the button image exists   
      gui.RegisterIcon(BITMAP_ID, buttonimage)   
        
      bc = c4d.BaseContainer()   
      bc.SetLong(c4d.BITMAPBUTTON_ICONID1, BITMAP_ID)   
      self.AddCustomGui(200, c4d.CUSTOMGUI_BITMAPBUTTON, "Image", c4d.BFH_CENTER | c4d.BFV_CENTER, 100, 100, bc)   
      

      Million thanks.

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

        On 06/01/2015 at 10:54, xxxxxxxx wrote:

        I prefer using image files stored in my plugin's folders instead of registering them.
        Mainly because there's a finite number of available registration numbers. And it feels like I'm wasting them if I use them for images.

            dir, file = os.path.split(__file__)           #Gets the plugin's directory   
          resFolder = os.path.join(dir, "res")          #Adds the res folder to the path  
          image = os.path.join(resFolder,'myimage.jpg') #The specific image in the res folder to use  
          bmp.InitWith(image)                           #Apply it to the button
        

        -ScottA

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

          On 06/01/2015 at 12:03, xxxxxxxx wrote:

          Yes, that's a really good point Scott. In this case there's no need to register it? Right?

            
          gui.RegisterIcon(BITMAP_ID, buttonimage)   
          

          However, what about adding that image to GUI? Any thoughts on that?

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

            On 06/01/2015 at 12:53, xxxxxxxx wrote:

            There might be a case where registering the image is the only way.
            But for things like bitmap buttons. You should be able to store them in your plugin folders and use file paths.

            This example is not a plugin. It's a script  that points to an image on your desktop.
            But it's the same principle as using your res folder (or any folder you want)  to store images in plugins:

            import c4d,os  
            from c4d import gui,bitmaps  
              
            MY_BITMAP_BUTTON = 1003  
              
            class MyDialog(c4d.gui.GeDialog) :  
              
              def CreateLayout(self) :  
                    
                  self.SetTitle("My Python Dialog")  
              
                  self.GroupBegin(0, c4d.BFH_SCALEFIT|c4d.BFH_SCALEFIT, 1, 1, "Bitmap Example",0)  
              
                  bc = c4d.BaseContainer()                            #Create a new container to store the button image   
                  fn = c4d.storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP) #Gets the desktop path  
                  path = os.path.join(fn,'myimage.jpg')               #The path to the image    
                  bc.SetFilename(MY_BITMAP_BUTTON, path)              #Add this location info to the conatiner  
                  self.myBitButton=self.AddCustomGui(MY_BITMAP_BUTTON, c4d.CUSTOMGUI_BITMAPBUTTON, "Bitmap Button", c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, 30, 30, bc)  
                  self.myBitButton.SetImage(path, False)             #Add the image to the button   
              
                  self.GroupEnd()  
                  return True  
              
              #Do something when the button is pressed  
              def Command(self, id, msg=None) :  
                  if id==MY_BITMAP_BUTTON:  
                     print "Hello"    
                
                  return True   
              
            if __name__=='__main__':  
              dlg = MyDialog()  
              dlg.Open(c4d.DLG_TYPE_ASYNC, defaultw=100, defaulth=100)
            

            -ScottA

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

              On 06/01/2015 at 13:05, xxxxxxxx wrote:

              this is how i did it with my buffer booster plugin:

              class BANNER(c4d.gui.GeUserArea) :
                  def __init__(self) :
                      self.bmp = c4d.bitmaps.BaseBitmap()
                  
                  def GetMinSize(self) :
                      self.width = 300 ####WIDTH OF YOUR IMAGE FILE
                      self.height = 85 ####HEIGHT OF YOUR IMAGE FILE
                      return (self.width, self.height)
                  
                  def DrawMsg(self, x1, y1, x2, y2, msg) :
                      path = os.path.join(os.path.dirname(__file__), "res", "logo.png")
                      result, ismovie = self.bmp.InitWith(path)
                      x1 = 0
                      y1 = 0
                      x2 = self.bmp.GetBw()
                      y2 = self.bmp.GetBh()
                      if result == c4d.IMAGERESULT_OK:
                          self.DrawBitmap(self.bmp, 0, 0, self.bmp.GetBw(), self.bmp.GetBh(), x1, y1, x2, y2, c4d.BMP_NORMALSCALED | c4d.BMP_ALLOWALPHA)
                
              class bufferBoosterModal(gui.GeDialog) :
                
                  LOGO = BANNER()
                  
                  def CreateLayout(self) :
                      #logo group
                      self.GroupBegin(0, c4d.BFH_CENTER | c4d.BFV_CENTER, cols=1)
                      self.GroupBorderNoTitle(c4d.BORDER_NONE)
                      self.GroupBorderSpace(0, 0, 0, 20)
                      self.AddUserArea(1, c4d.BFV_CENTER | c4d.BFV_CENTER)    
                      self.AttachUserArea(self.LOGO, 1)
                      self.GroupEnd()
                      # end logo group
              
              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 07/01/2015 at 06:33, xxxxxxxx wrote:

                Hi,
                as there is no GUI element with the sole purpose to display images, we'd also recommend to go the GeUserArea road. Thanks charlesR, for already posting a nice example.

                I'd like to add two thoughts on the initial questions:

                1. If you want to register you images as icons, then, yes, all IDs need to be unique IDs to be retrieved from PluginCafe. A plugin ID used for something else may not be reused for an icon.

                2. The button behavior of a BITMAPBUTTON can be disabled. Like so (assuming the code from the first post) :

                bc.SetBool(c4d.BITMAPBUTTON_BUTTON, False)
                

                Note: This does not disable the "mouse over" highlighting. This could be worked around by having an image without transparency and button size matching the image size (the effect will still be there, but should not be visible).

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

                  On 07/01/2015 at 07:14, xxxxxxxx wrote:

                  Yes indeed, solution provided by charlesR is really useful. Thank you Charles.

                  Andreas, yes, I had image with transparency, that's why I was getting "mouseOver" effect. Disabling BITMAPBUTTON did not work in that case.

                  And thanks for clarifying the registration of image icons.

                  Thanks a bunch for all of you.

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

                    On 07/01/2015 at 07:18, xxxxxxxx wrote:

                    Tomas,
                    maybe I didn't put this clearly enough.
                    By setting BITMAPBUTTON_BUTTON to false you can disable the button behavior, not the mouse over. So when it is set to false, clicking the image will no longer have any effect.

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

                      On 07/01/2015 at 14:25, xxxxxxxx wrote:

                      No no, you are right. I understood you from the first try:) That's my English is getting my my way of communication:)

                      Anyways, All is working now, thanks to Charles.

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

                        On 07/01/2015 at 15:05, xxxxxxxx wrote:

                        YAY I helped! YAY! Glad i could help out Tomas.

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