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

    Texture from url?

    Scheduled Pinned Locked Moved Developers' Forum
    39 Posts 10 Posters 5.6k Views 10 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.
    • TIGT Offline
      TIG Moderator
      last edited by

      My 'vbs' method means you don't actually need a web-dialog running at all.
      You can download images from a url with it [on PC] irrespective of what the Ruby script is doing or has as an interface... πŸ˜•

      TIG

      1 Reply Last reply Reply Quote 0
      • J Offline
        Jim
        last edited by

        @tig said:

        [on PC]

        Exactly.

        The most beneficial result from this thread would be a cross-platform download library which could be used for images or anything, really.

        Hi

        1 Reply Last reply Reply Quote 0
        • TIGT Offline
          TIG Moderator
          last edited by

          But the original inquiry was 'for PC' ?
          A pure Javascript version can't work [?] - because of security issues there is no plain 'save' - only 'save_as', to you ensure you know what's going on with downloading things off the www onto your PC...
          The 'vbs' method will work for PC - there's probably an equivalent AppleScript [type] method for the MAC... but I can't see how a 'cross-platform' version might work πŸ˜•
          Java is inherently 'limited' as I said...

          TIG

          1 Reply Last reply Reply Quote 0
          • J Offline
            Jim
            last edited by

            @tig said:

            A pure Javascript version can't work [?]

            I think it can. There is no save or save as in JavaScript. You can save to disk using JavaScript, but there isn't a cross-platform solution. On Windows, you would use a FileSystem activex object. The same scripting host that rtuns the .vbs can run .js also.

            But, the XHR is available on all (important) browser platforms. So a cross-platform solution is to use a WebDialog, fetch the file using the XHR, then pass it to the ruby plugin for saving to disk.

            This small library is a good example of using a XHR cross-platform:
            http://code.google.com/p/microajax/

            
            if (window.ActiveXObject)
            return new ActiveXObject('Microsoft.XMLHTTP');
            else if (window.XMLHttpRequest)
            return new XMLHttpRequest();
            return false;
            
            

            Hi

            1 Reply Last reply Reply Quote 0
            • TIGT Offline
              TIG Moderator
              last edited by

              What's this then ?
              <a href="java script&#058;void(0);" onclick="document.execCommand('SaveAs',true,'http://fileden.com/somefolder/some file.mp3');">download</a>
              There's just not a 'Save' version ???

              TIG

              1 Reply Last reply Reply Quote 0
              • J Offline
                Jim
                last edited by

                I've never heard of "execCommand" before, but I'd be surprised if it were cross-platform. If it existed, we probably wouldn't be having this discussion.

                Hi

                1 Reply Last reply Reply Quote 0
                • TIGT Offline
                  TIG Moderator
                  last edited by

                  Perhaps a MAC users could confirm...

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • B Offline
                    ben.doherty
                    last edited by

                    While the JS debate rages, I've been playing with what can be done with ruby (being single-minded/stubborn/lazy)

                    I've updated my !loadpaths file to match dan's latest http://forums.sketchucation.com/viewtopic.php?f=180&t=29412&hilit=load+path#p257058
                    and when I try a couple of things I get this response:
                    require 'net/http' Error: #<LoadError: C:/ruby186/lib/ruby/1.8/net/protocol.rb:21:inrequire': No such file to load -- socket>
                    C:/ruby186/lib/ruby/1.8/net/protocol.rb:21
                    require 'date/format'
                    true`

                    Any ideas on why net/http fails, but date/format works?

                    I'm sure it will take some clever file management, and refresh cycle control etc, but it'd be cool to be able to specify a url to get a texture from. That'd open up a load of opportunities for data vis etc.

                    1 Reply Last reply Reply Quote 0
                    • J Offline
                      Jim
                      last edited by

                      That means it couldn't find the file (socket.so) in the load path.

                      For a short-term solution, you could try to copy socket.so to the Plugins folder.

                      Hi

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

                        @jim said:

                        I've never heard of "execCommand" before, but I'd be surprised if it were cross-platform. If it existed, we probably wouldn't be having this discussion.

                        It's HTML 5 me thinks. And seems Microsoft may have added a bunch of standard CommandIDs without getting them approved by the web community (as usual.) The spec implies browser specific IDs should have a prefix like "IE-", but MS has been doing this 'arm-twisting' for years.

                        See: http://www.w3.org/TR/html5/author/dom.html#execCommand

                        MSDN: http://msdn.microsoft.com/en-us/library/ms536419(v=VS.85).aspx
                        and MS' command IDS: http://msdn.microsoft.com/en-us/library/ms533049(v=VS.85).aspx
                        ~

                        I'm not here much anymore.

                        1 Reply Last reply Reply Quote 0
                        • B Offline
                          Ben_M
                          last edited by

                          Hello!

                          Has anyone made any progress on a simple, cross platform solution to this in the past few months?

                          Thanks,

                          Ben

                          1 Reply Last reply Reply Quote 0
                          • V Offline
                            Viskiz
                            last edited by

                            I solved in on Windows platform.
                            In my script installation I included ruby lib files needed for http, so users will have them after installing script.
                            The code followed in script:

                            $LOAD_PATH << File.join(MY_PLUGIN_HOME, "bin", "rblib")
                            Sketchup::require 'uri'
                            Sketchup::require 'net/http'

                            Installer for MAC OS should have different ruby library files I think. I haven't MAC yet, so I can't tell any more. Let me know if you solve it.

                            1 Reply Last reply Reply Quote 0
                            • J Offline
                              Jim
                              last edited by

                              You may be interested in this plugin effort - downlod files plugin using the cUrl library.

                              Hi

                              1 Reply Last reply Reply Quote 0
                              • K Offline
                                kaas
                                last edited by

                                Digging up this old thread because I'm trying to do almost the same as the OP. Since the last post in this topic, Ruby has been updated so I'm hoping its more simple now.

                                I have been trying several methods. This code saves the image in the local documents folder so I could pick it up there etc.

                                require 'net/http'
                                Net;;HTTP.start("www.google.nl") do |http|
                                    resp = http.get("/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png")
                                    open("googlelogo_color_272x92dp.png", "wb") do |file|
                                        file.write(resp.body)
                                    end
                                end
                                puts "Done"
                                

                                Problem is, my images need a different type of url. Something like:
                                https://url/coordinates/?key=1234abc&index=0
                                This sort of link doesn't work in the code above.

                                Another method I'm trying is loading the image in a webdialog and then grabbing it from Ruby.

                                The test html code (the url could easily replaced with the actual https code) is:

                                <!DOCTYPE html>
                                <html><head></head><body>
                                <img id ="webimage" src = "https://www.google.nl/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">
                                </body></html>
                                

                                And to grab the image in ruby:
                                img = @wd.get_element_value('webimage')

                                Of course this doesn't work because the image isn't a value. I'm stuck.

                                Anyone has a suggestion? That would be very welcome.

                                1 Reply Last reply Reply Quote 0
                                • TIGT Offline
                                  TIG Moderator
                                  last edited by

                                  Something like this should work:

                                  require('open-uri')
                                  fail = false
                                  url = "http://www.google.nl/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
                                  file = File.join(Dir.pwd, File.basename(url))
                                  begin
                                  	download = open(url)
                                  rescue Exception => error
                                  	puts "#{error}"
                                  	fail = true
                                  end
                                  unless fail
                                  	begin
                                  		File.delete(file) ### in case it exists
                                  	rescue
                                  		###
                                  	end
                                  	begin
                                  		IO.copy_stream(download, file)
                                  	rescue Exception => error
                                  		puts "#{error}"
                                  	end
                                  end
                                  
                                  

                                  It should work with a 'php' formatted URL, but remember that then you need to parse out the file name another way. Perhaps [assuming 'key=' gives the file name] split the URL at '?', then take [1], then split at '&', then find the array element starting "key=", then split that at '=' and then [1] is the file name given by 'key=' ?
                                  I also saved the downloaded image file in the 'current directory', but you can of course choose any other folder you want...

                                  TIG

                                  1 Reply Last reply Reply Quote 0
                                  • K Offline
                                    kaas
                                    last edited by

                                    Thanks for the reply TIG. Your code does download a file but when trying to open it I get:
                                    Decode Error! Invalid or unsupported PNG file

                                    Edit:
                                    I was also trying with net/http. It does work with simple files but the actual https request still fails.

                                    1 Reply Last reply Reply Quote 0
                                    • K Offline
                                      kaas
                                      last edited by

                                      In case someone runs into the same question. It seems to work now.

                                      require 'net/http'
                                      require 'tempfile'
                                      
                                      uri = URI('https://www.google.nl/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png')
                                      
                                      model = Sketchup.active_model
                                      materials=model.materials
                                      m = materials.add "Test Color"
                                      loc = ''
                                      
                                      begin
                                      	request = Net;;HTTP;;Get.new uri
                                      	Net;;HTTP.start(uri.host, uri.port,
                                        ;use_ssl => uri.scheme == 'https') do |http|
                                      	  http.request(request)
                                      	  response = http.request request # Net;;HTTPResponse object
                                      		file = Tempfile.new(['foo','.png'], Dir.tmpdir, 'wb+')
                                      	  begin
                                      			file.binmode
                                      			file.write(response.body)
                                      			file.flush
                                      			loc = file.path.gsub("/", '\\\\\\')
                                      	  ensure
                                      			file.close
                                      	  end
                                      	end
                                      rescue Exception => e  
                                        puts e.message 
                                      end
                                      
                                      m.texture = loc
                                      m.texture.size = [m.texture.image_width.to_m, m.texture.image_height.to_m]
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • D Offline
                                        driven
                                        last edited by

                                        for completeness you need a conditional for osx

                                        
                                         loc = file.path if Sketchup.platform == ;platform_osx 
                                        

                                        john

                                        learn from the mistakes of others, you may not live long enough to make them all yourself...

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

                                          When a image is loaded as a web page resource, it is present in the "Temporary Internet files" folder. But some security settings might prevent the copying of a file from there to a trusted local folder.

                                          Anyway:
                                          require "FileUtils"

                                          then try the copy method.

                                          See: http://ruby-doc.org/stdlib-2.0.0/libdoc/fileutils/rdoc/index.html

                                          I'm not here much anymore.

                                          1 Reply Last reply Reply Quote 0
                                          • K Offline
                                            kaas
                                            last edited by

                                            John and Dan, good suggestions. Thanks

                                            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