sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Download to Sketchup button

    Scheduled Pinned Locked Moved Developers' Forum
    29 Posts 4 Posters 4.3k Views 4 Watching
    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.
    • E Offline
      ericschimel
      last edited by

      Ok, so if I understand this correctly, the "add action callback" command needs to know what window the commands are coming from. So, when you create a web window, you name it. Naturally, the "add action callback" would need to have the same name as your window. That makes sense to me, if I am reading everything correctly.

      So, I went ahead and switched the name that Jim gave me as a filler name, and put my dialog name in, and it still doesn't work. In the Ruby console I am getting a "uninitialized constant" error.

      As far as wrapping stuff up in modules, I think I understand the concept of that, but at this point, I think its way over my head... πŸ˜„

      Here is the entire ruby script I am using:

      #-----------------------------------------------------------------------------
      
      require 'sketchup.rb'
      
      #-----------------------------------------------------------------------------
      
      def create_dialog
      
      	dlg = UI;;WebDialog.new("SketchThisNET", true, "", 1200, 800, 150, 150, true);
      	dlg.set_url "file;///C;/Users/Eric/Documents/SketchThis/TEST2.html"
      	dlg.show
      
      
      	
      	SketchThisNET.add_action_callback("download_model") { |dlg, args|
        Sketchup.active_model.definitions.load_from_url(args)
      }
      
      end
      
      if( not file_loaded?("SketchThisNET.rb") )
          add_separator_to_menu("Plugin")
          UI.menu("Plugin").add_item("SketchThis.NET") { create_dialog }
      
        toolbar = UI;;Toolbar.new "www.SketchThis.NET"
           # This toolbar icon simply displays Hello World on the screen
           cmd = UI;;Command.new("www.SketchThis.NET") { 
             create_dialog
           }
           cmd.small_icon = "SketchThisSmallIcon.png"
           cmd.large_icon = "SketchThisLargeIcon.png"
           cmd.tooltip = "www.SketchThis.NET"
           cmd.status_bar_text = "www.SketchThis.NET Toolbar"
           cmd.menu_text = "SketchThis"
           toolbar = toolbar.add_item cmd
           toolbar.show
      
      end
      
      #-----------------------------------------------------------------------------
      file_loaded("SketchThisNET.rb")
      
      

      -Eric
      http://plugin.sketchthis.net
      Sketchup Kitchen Design Plugin
      Custom Models

      1 Reply Last reply Reply Quote 0
      • Dan RathbunD Offline
        Dan Rathbun
        last edited by

        Eric, on you on a PC or a Mac?

        I'm not here much anymore.

        1 Reply Last reply Reply Quote 0
        • Dan RathbunD Offline
          Dan Rathbun
          last edited by

          @unknownuser said:

          As far as wrapping stuff up in modules, I think I understand the concept of that, but at this point, I think its way over my head...

          Ok.. homework assignment time. Your homework is to go and read this tutorial:
          Ruby User's Guide

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • E Offline
            ericschimel
            last edited by

            I am on both the PC and the Mac. I am mostly working on a PC though.

            So did I miss something obvious on my current situation, or will I find the answers in the users guide? πŸ˜„

            -Eric
            http://plugin.sketchthis.net
            Sketchup Kitchen Design Plugin
            Custom Models

            1 Reply Last reply Reply Quote 0
            • thomthomT Offline
              thomthom
              last edited by

              
              def create_dialog
              
                 dlg = UI;;WebDialog.new("SketchThisNET", true, "", 1200, 800, 150, 150, true);
                 dlg.set_url "file;///C;/Users/Eric/Documents/SketchThis/TEST2.html"
                 dlg.show
              
              
                 
                 SketchThisNET.add_action_callback("download_model") { |dlg, args|
                Sketchup.active_model.definitions.load_from_url(args)
              }
              
              end
              
              

              When you create your webdialog
              dlg = UI::WebDialog.new("SketchThisNET", true, "", 1200, 800, 150, 150, true);

              here, the variable dlg is your reference to the webdialog. This is what you must use to refer to the dialog.

              Later on when you do SketchThisNET.add_action_callback("download_model")
              This is incorrect. It should be dlg.add_action_callback("download_model")

              I take it that you tried to refer to the webdialog by using the title you assigned the webdialog window when you created it?

              Thomas Thomassen β€” SketchUp Monkey & Coding addict
              List of my plugins and link to the CookieWare fund

              1 Reply Last reply Reply Quote 0
              • thomthomT Offline
                thomthom
                last edited by

                @dan rathbun said:

                Well I asked because your path in this statement:
                dlg.set_url "file:///C:/Users/Eric/Documents/SketchThis/TEST2.html"
                is a mixture of a Mac path and a Windows path !

                ? That's a valid URI to a local file.
                When I have a file in my Documents folder and open it in Firefox, the path in the location bar is: file:///C:/Users/Thomas/Documents/test.html.

                Also, localhost is not required.

                Link Preview Image
                File URI scheme - Wikipedia

                favicon

                (en.wikipedia.org)

                Thomas Thomassen β€” SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund

                1 Reply Last reply Reply Quote 0
                • Dan RathbunD Offline
                  Dan Rathbun
                  last edited by

                  @thomthom said:

                  here, the variable dlg is your reference to the webdialog. This is what you must use to refer to the dialog.

                  True what Thomas says, but dlg is a local reference so when the method ends, Ruby may dispose of the object.

                  Eric, wrap your code in a module block as I showed you, AND rename all occurances of dlg to @dlg as Jim suggested. Then the object will persist, because it's an instance reference of module SketchTHIS.

                  The other issue you have is each time the menu or toolbar is used your calling SketchTHIS.create_dialog. You can add a nil test:
                  Inside the module:

                  def dlg
                    (defined? @dlg).nil? ? nil ; @dlg
                  end
                  

                  Then at the bottom of your code, where you define your UI::Command object, change the code between the curly braces from:
                  create_dialog
                  to:

                  if SketchTHIS.dlg.nil?
                    SketchTHIS.create_dialog
                  else
                    SketchTHIS.dlg.show
                  end
                  

                  Then move the menu separator and menu add item statements down below the statements for the toolbar (ie: after your UI::Command is defined,) and change the statement in the menu_add_item curly braces to cmd
                  That way both toolbar and menu item use the same code in the UI::Command object.

                  I'm not here much anymore.

                  1 Reply Last reply Reply Quote 0
                  • E Offline
                    ericschimel
                    last edited by

                    Ok, so here's what I've got (I think I've made some progress)

                    I followed Thomthoms suggestions, and of course they didn't work. (I am sure I am 100% at fault!) HOWEVER... I checked with the ruby console, and I found an error for "invalid model url"

                    ruby console.PNG

                    I had the model in the same directory as the web page, and I assumed that is where it would be looked for. However, it also occured to me that it might need to go in the same folder as the plugin, so I tried that, and still no dice...

                    The good news here (I think) is that I've got Sketchup and my web dialog talking to each other!

                    Here is the link I am using to try to send my model into Sketchup (the one that generates the "invalid model URL error)

                    <a href="#" onclick="window.location='skp:download_model@test.skp'">Download Model</a>

                    To Dan... Yes, I did copy the file locations right out of Firefox. Those URL's are going to acutlaly be on my webserver. They do work, why, I am not sure, but they do.

                    Also, about the module situation, after doing some more reading, I think I am starting to understand the benefit of making this into a module. I am not going to go there just yet because I just need to get this thing working, then I can worry about making it "neater".

                    As far as putting the plugin in a special directory, I want to do that, I am just trying to tackle one thing at a time. Great suggestions, and I WILL be following them, I am just trying not to let my head explode over what is probably a simple task for you Ruby pros! πŸ˜„

                    Thanks for all the help so far guys, I am really learning a lot!

                    -Eric
                    http://plugin.sketchthis.net
                    Sketchup Kitchen Design Plugin
                    Custom Models

                    1 Reply Last reply Reply Quote 0
                    • Dan RathbunD Offline
                      Dan Rathbun
                      last edited by

                      @unknownuser said:

                      ... I checked with the ruby console, and I found an error for "invalid model url"
                      Because the test your running is not how the plugin is going to run later. I made a comment in an earlier post (perhaps over at Google Groups,) about how the URL link would stay the same, EXCEPT for the skp filename. [see below]

                      But for simplicity of testing on your local machine, set up the following folders starting from your root directory (and yes, Windows doesn't care if a folder is named "www.sketchthis.net"):
                      C:/www.sketchthis.net/Downloads/Gallery/catagory
                      put test.skp in the catagory folder, along with it's test.png thumbnail
                      put the gallery.html (now called TEST2.html) webpage in the Gallery folder
                      the plugin ruby script should be in the Sketchup Plugins folder (for testing, later it can go in a subfolder called Plugins/SketchTHIS.)
                      Below, when you read the webbased URLs, for testing, replace "http://" with "file://C:/"

                      @unknownuser said:

                      I had the model in the same directory as the web page, and I assumed that is where it would be looked for.
                      No. Ruby always looks in the current Ruby working directory. Ruby does not use the Windows PATH environment variable.
                      Webpages are easiest if you use a <BASE> url tag, then they will start a file search from that. So plan on using a <BASE> tag in your Gallery webpage, and a Ruby Constant named BASEURL in your module, so it does not need to be passed back and forth. It CAN be passed once (so you have the option of moving things around on your website, without needing to redistribute the plugin.)

                      @unknownuser said:

                      ... However, it also occured to me that it might need to go in the same folder as the plugin, so I tried that, and still no dice...
                      No the plugin is client-side. The models will be in a Gallery subfolder on your website.

                      @unknownuser said:

                      ... Here is the link I am using to try to send my model into Sketchup (the one that generates the "invalid model URL error):

                      <a href="#" onclick="window.location='skp:download_model@test.skp'">Download Model</a>
                      OK the problem is, you will have 3 (three) parts to the URL: BASEURL, Catagory (a Gallery subfolder name,) and skp filename.

                      In your HTML <HEAD> section, you'd have this:
                      <BASE id='baseURL' href="http://www.sketchthis.net/Downloads/Gallery/"/>
                      In your HTML <BODY> tag, you'd have this:
                      <BODY id='body' onload="init();">
                      After your BODY end tag:
                      %(#804000)[</BODY>
                      <SCRIPT>]
                      %(#8000BF)[function init() {
                      window.location='skp:set_baseURL@'+document.getElementById('baseURL').href;
                      // any other init tasks
                      }]
                      %(#804000)[</SCRIPT>
                      </HTML>]
                      So the links (which will likely be thumbnail images rather than text <A> links,) would look like this:
                      <IMG href="catagory/test.png" onclick="window.location='skp:download_model@'+'catagory/test.skp'">Download Model test.skp</a>
                      It's also likely you'd want these IMG links to be auto generated by Javascript or PHP tags, from whatever model files are in a given catagory subfolder.

                      Then in your Ruby WebDialog SketchTHIS.create_dialog method:
                      You'd change the set_url:
                      EDIT: Change the entry point for the Gallery, for future freedom of changing website folder heirarchy, without needing to redistribute the plugin. The entry page is a small redirect page, which we'll call "go_gallery.html" that loads whatever the Gallery page is, from whatever it's current location is within the website. (Was hardcoded to a specific URL to "gallery.html")
                      @dlg.set_url('http://www.sketchthis.net/go_gallery.html')
                      You'd add another callback:
                      @dlg.add_action_callback('set_baseURL') { |dlg, args| SketchTHIS::BASEURL=args }
                      and change this callback:
                      EDIT: + (string concat) was << (string append), in error
                      @dlg.add_action_callback('download_model') { |dlg, args| modelURL = SketchTHIS::BASEURL + args Sketchup.active_model.definitions.load_from_url(modelURL) }

                      @unknownuser said:

                      To Dan... Yes, I did copy the file locations right out of Firefox. Those URL's are going to actually be on my webserver. They do work, why, I am not sure, but they do.
                      Well, FireFox has nothing to do with Sketchup WebDialogs (they use MSIE on PC, and Safari on Mac.) Client-side-like pathnames may not be best for server-side folder heirarchy. You already have a "Downloads" folder which can be the Gallery "top" folder, or as in the example above you can have a "Gallery" sub-folder of "Downloads", and in that the gallery.html webpage that gets loaded into the Sketchup WebDialog. Beneath that folder, can be catagorical folders holding skp models and their png thumbnails. The user would click on catagory buttons to see the image lists from the subfolders.

                      @unknownuser said:

                      Also, about the module situation, after doing some more reading, I think I am starting to understand the benefit of making this into a module. I am not going to go there just yet because I just need to get this thing working, then I can worry about making it "neater".
                      As far as putting the plugin in a special directory, I want to do that, I am just trying to tackle one thing at a time.
                      It's not about 'neatness' Eric, these things are fundamental, they need to be done at the start, not later, so you don't paint yourself in a corner, or have problems like your having.
                      As far as where the client-side plugin goes, you don't really have a choice because of how Sketchup works. It looks in the Plugins heirarchy for plugins. Users will NOT want you installing them anywhere else, most especially not in their User/Documents folder heirarchy.
                      So you WILL have a plugin registration script in the Plugins folder, that (if turned on by the user,) loads your plugin from the Plugins/SketchTHIS folder.

                      I'm not here much anymore.

                      1 Reply Last reply Reply Quote 0
                      • Dan RathbunD Offline
                        Dan Rathbun
                        last edited by

                        %(#4040FF)[EDITED PREVIOUS POST
                        @dlg.set_url
                        changed to load a redirect page called "go_gallery.html" [see codeblock]

                        @dlg.add_action_callback('download_model')
                        was changed because was << (string append) would result in the BASEURL being changed, and we want to use + (string concat) here as Ruby creates a new String object (with +) that modelURL will point to, while the constant BASEURL remains unchanged.]

                        code for "go_gallery.html"
                        goes in the root dir of website

                        <HTML>
                        <HEAD>
                        <BASE href="http://www.sketchthis.net/"/>
                        </HEAD>
                        <BODY onload="go();">
                        <SCRIPT>
                        function go() {
                          window.location="Downloads/Gallery/gallery.html"
                        }
                        </SCRIPT>
                        </BODY>
                        </HTML>
                        

                        I'm not here much anymore.

                        1 Reply Last reply Reply Quote 0
                        • Dan RathbunD Offline
                          Dan Rathbun
                          last edited by

                          @unknownuser said:

                          I am on both the PC and the Mac. I am mostly working on a PC though.

                          Well I asked because your path in this statement:
                          dlg.set_url "file:///C:/Users/Eric/Documents/SketchThis/TEST2.html"
                          is a mixture of a Mac path and a Windows path !

                          EDIT: I stand corrected! (Thanx to ThomThom!) I was unaware that Microsoft went and changed the standard foldernames in Vista (and later) Windows versions, to be more "Unix-like". (I and everyone I know, skipped Vista, and will be going from XP up to Win7, sometime later.)

                          On Windows, it should look like:
                          ENV['HOME']=ENV['USERPROFILE'] if RUBY_PLATFORM.include?('mswin') ENV['USER']=ENV['USERNAME'] if RUBY_PLATFORM.include?('mswin') dlg.set_url("file://localhost/#{ENV['HOME']}/My Documents/SketchThis/TEST2.html")
                          On Mac, HOME and USER are already set correctly, so path would be like:
                          dlg.set_url("file://localhost#{ENV['HOME']}/Documents/SketchThis/TEST2.html")

                          The difference (besides the folder names,) is that PC needs a '/' between localhost and the drive letter; the Mac path already begins with a '/'.

                          So to put it together into your code, use this snippet:

                          
                          if RUBY_PLATFORM.downcase.include?('mswin')
                            # on a PC
                            ENV['HOME']=ENV['USERPROFILE'] if ENV['HOME'].nil?
                            ENV['USER']=ENV['USERNAME'] if ENV['USER'].nil?
                            dlg.set_url("file;//localhost/#{ENV['HOME']}/My Documents/SketchThis/TEST2.html")
                          elsif RUBY_PLATFORM.downcase.include?('darwin')
                            # On Mac ; HOME and USER are already set correctly
                            dlg.set_url("file;//localhost#{ENV['HOME']}/Documents/SketchThis/TEST2.html")
                          else
                            UI.messagebox('Unsupported OS for Sketchup!',MB_OK)
                          end
                          
                          

                          Actually, your Plugin should be in a sub-directory of the Sketchup/Plugins folder.
                          So this would simplify things, like:

                          
                          plugpath=Sketchup.find_support_file('plugins')
                          if RUBY_PLATFORM.downcase.include?('mswin')
                            # on a PC
                            dlg.set_url("file;//localhost/#{plugpath]}/SketchTHIS/TEST2.html")
                          elsif RUBY_PLATFORM.downcase.include?('darwin')
                            # On Mac
                            dlg.set_url("file;//localhost#{plugpath]}/SketchTHIS/TEST2.html")
                          else
                            UI.messagebox('Unsupported OS for Sketchup!',MB_OK)
                          end
                          
                          

                          @unknownuser said:

                          So did I miss something obvious on my current situation, or will I find the answers in the users guide? πŸ˜„

                          Your not understanding the very basics of Ruby. Such as if you have a block of code, and I tell you to wrap it in a module called "SketchTHIS", I expect you to do this:

                          
                          module SketchTHIS
                           # the existing code you already have
                          end # module
                          

                          I'm not here much anymore.

                          1 Reply Last reply Reply Quote 0
                          • Dan RathbunD Offline
                            Dan Rathbun
                            last edited by

                            @thomthom said:

                            Also, localhost is not required.

                            It's not supposed to be, and Windows will strip it out, but John (driven) reported that on the Mac it was required, or the file could not be found.
                            So I am endevouring to get to a cross-platform way of doing things.

                            Eric is a very new newbie. Don't confuse him (anymore than he already is.) 🀣

                            Eric nevermind all this about local links, just put your plugin files in a subfolder of Sketchup/Plugins, as that's where any user would put it also.

                            @ThomThom: The path is still INVALID on the PC, either in Ruby, or in a Command Shell. Apparently FireFox is doing some path substring replacement behind the scenes. (I would consider it to be a bug in FireFox for the Windows edition.)
                            EDIT: I stand corrected! (Thanx to ThomThom!) I was unaware that Microsoft went and changed the standard foldernames in Vista (and later) Windows versions, to be more "Unix-like". (I and everyone I know, skipped Vista, and will be going from XP up to Win7, sometime later.)

                            I'm not here much anymore.

                            1 Reply Last reply Reply Quote 0
                            • Dan RathbunD Offline
                              Dan Rathbun
                              last edited by

                              A note on local testing for Eric.

                              You may need to add your "fake local local test urls" to the MSIE "Local Intranet Zone"

                              See this post by me about FirebugLite, for the steps:
                              http://forums.sketchucation.com/viewtopic.php?f=180&t=27183&p=239255#p239255

                              Your test URLS would be:
                              file://www.sketchthis.net/
                              etc.

                              Also, in the above examples, the "catagory" folder, is a temporary test folder. I could have called it "test" or "testcatagory". In the future the folders beneath "Gallery" would have real catagory names like "sinks", "stoves", "plumbing", "cabinets", etc.
                              But, the word catagory, would become the name of a javascript variable, holding the user's choice of catagory which would be a subfolder name, so the links would be modified slightly, from:
                              onclick="window.location='skp:download_model@'+'catagory/test.skp'"
                              to:
                              onclick="window.location='skp:download_model@'+catagory+'/'+skpfilename"

                              I'm not here much anymore.

                              1 Reply Last reply Reply Quote 0
                              • E Offline
                                ericschimel
                                last edited by

                                Thanks for the update. I haven't had a chance to try to implement this yet, hopefully I will in the next few days. I will certainly let you know how it all turns out!

                                -Eric
                                http://plugin.sketchthis.net
                                Sketchup Kitchen Design Plugin
                                Custom Models

                                1 Reply Last reply Reply Quote 0
                                • 1
                                • 2
                                • 2 / 2
                                • First post
                                  Last post
                                Buy SketchPlus
                                Buy SUbD
                                Buy WrapR
                                Buy eBook
                                Buy Modelur
                                Buy Vertex Tools
                                Buy SketchCuisine
                                Buy FormFonts

                                Advertisement