• Login
sketchucation logo sketchucation
  • Login
πŸ”Œ Quick Selection | Try Didier Bur's reworked classic extension that supercharges selections in SketchUp Download

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.
  • N Offline
    NatBridge
    last edited by 6 Oct 2010, 05:06

    Maybe you could just open the webdialog to the image url and screenshot it? (If it isn't bigger than the screen.)

    http://code.google.com/apis/sketchup/docs/ourdoc/webdialog.html#write_image

    1 Reply Last reply Reply Quote 0
    • B Offline
      ben.doherty
      last edited by 7 Oct 2010, 03:06

      That would probably work, but wouldn't win any prizes for elegance.
      Given that ruby can access things on the internet as part of it's core library does anyone have any idea how to point it at those standard libraries?

      1 Reply Last reply Reply Quote 0
      • T Offline
        TIG Moderator
        last edited by 7 Oct 2010, 10:36

        Here's a discreet way of downloading an image file from a url on Windows only - using vbs...

        strFileURL = "http://www.it1.net/images/it1_logo2.jpg"
        strHDLocation = "C;\Temp\it1_logo2.jpg"
        Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
        objXMLHTTP.open "GET", strFileURL, false
        objXMLHTTP.send()
        If objXMLHTTP.Status = 200 Then
          Set objADOStream = CreateObject("ADODB.Stream")
          objADOStream.Open
          objADOStream.Type = 1 'adTypeBinary
          objADOStream.Write objXMLHTTP.ResponseBody
          objADOStream.Position = 0    'Set the stream position to the start
          Set objFSO = Createobject("Scripting.FileSystemObject")
        If objFSO.Fileexists(strHDLocation) Then objFSO.DeleteFile strHDLocation
          Set objFSO = Nothing
          objADOStream.SaveToFile strHDLocation
          objADOStream.Close
          Set objADOStream = Nothing
        End if
        Set objXMLHTTP = Nothing
        

        Make a copy of this text in a file that's called say
        C:\Temp\urldownloader.vbs
        or another Temp folder etc...
        Change the first two lines of the text to be the url [I've used a known image_file simply to show that it works] and the folder+filepath to save that file to - in this example I put it into C:\Temp\ too using the same file_name...
        Now run it from within Ruby
        UI.openURL("C:\\Temp\\urldownloader.vbs")
        In Ruby wait till the file arrives - timeout after a while ?
        To tidy up you can delete the temp file...
        It works - I have run it successfully...

        TIG

        1 Reply Last reply Reply Quote 0
        • J Offline
          Jim
          last edited by 7 Oct 2010, 12:35

          @ben.doherty said:

          Is there an easy way to do this that is nice and easy and clean?

          Nothing is easy. πŸ˜†

          You have the right idea, but I think you may need to add more locations to make it complete. If you check the $LOAD_PATH of your installed Ruby, you'll find it has more locations than just those you listed. See Dan's post on the subject. We should have more success using the installed Ruby since we now have 1.8.6 in SketchUp and an installable 1.8.6

          Hi

          1 Reply Last reply Reply Quote 0
          • J Offline
            Jim
            last edited by 7 Oct 2010, 13:03

            @tig said:

            Here's a discreet way of downloading an image file from a url on Windows only - using vbs...

            VBScript will run in the WebDialog, so you could eliminate the external file. But I would still try to follow Thom's advice, use JavaScript, and pass the data to the Ruby plugin to save it on disk.

            Hi

            1 Reply Last reply Reply Quote 0
            • T Offline
              TIG Moderator
              last edited by 7 Oct 2010, 15:15

              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 7 Oct 2010, 15:34

                @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
                • T Offline
                  TIG Moderator
                  last edited by 7 Oct 2010, 15:47

                  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 7 Oct 2010, 16:04

                    @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
                    • T Offline
                      TIG Moderator
                      last edited by 7 Oct 2010, 17:53

                      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 7 Oct 2010, 18:11

                        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
                        • T Offline
                          TIG Moderator
                          last edited by 7 Oct 2010, 18:51

                          Perhaps a MAC users could confirm...

                          TIG

                          1 Reply Last reply Reply Quote 0
                          • B Offline
                            ben.doherty
                            last edited by 8 Oct 2010, 02:44

                            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 8 Oct 2010, 02:50

                              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 9 Oct 2010, 00:56

                                @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 12 May 2011, 15:07

                                  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 5 Jul 2011, 06:55

                                    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 5 Jul 2011, 08:26

                                      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 11 Mar 2016, 09:32

                                        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
                                        • T Offline
                                          TIG Moderator
                                          last edited by 11 Mar 2016, 12:46

                                          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
                                          • 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