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

    Export images: how to?

    Scheduled Pinned Locked Moved Developers' Forum
    14 Posts 5 Posters 728 Views 5 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.
    • Didier BurD Offline
      Didier Bur
      last edited by

      Hi,
      Is there a way (like the texturewriter for materials) to export images that are used in a model as images (not as materials or textures) ?

      I have a model with embeded images in it and I don't have the images files on the disk (image.path=nil), and I want to export them by script (I know I can do it manually πŸ˜‰ )
      Thanks in advance,

      DB

      1 Reply Last reply Reply Quote 0
      • Chris FullmerC Offline
        Chris Fullmer
        last edited by

        Hmm, can you insert one, explode it and then get its material? I really do not know if that is possible. Or perhaps can you get the entities from an image, and find the material used and export it?

        Is it not listed in the textures in the model?

        Lately you've been tan, suspicious for the winter.
        All my Plugins I've written

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

          @didier bur said:

          Hi,
          Is there a way (like the texturewriter for materials) to export images that are used in a model as images (not as materials or textures) ?

          Yea.. well the API says..

          TextureWriter#load
          http://code.google.com/apis/sketchup/docs/ourdoc/texturewriter.html#load
          1st arg entity A face, image, component instance, group, or layer to load.

          .. and TextureWriter#write
          http://code.google.com/apis/sketchup/docs/ourdoc/texturewriter.html#write
          1st arg entity A face, image, component instance, group, or layer to write.
          You will need to generate sequential filenames and append them to a pathstring of your choice, probably from the index of the images array:

          images=[]
          Sketchup.active_model.definitions.each {|e|
            images.push(e) if e.class==(Sketchup;;Image) 
          }
          path='C;//some/path/to/folder'
          ext='png' # or 'tiff' or 'jpg' etc.
          tw=Sketchup;;TextureWriter.new
          images.each_with_index {|img,i|
            tw.load(img)
            tw.write(img,File.join(path,"%s%04d.%s" % ['img',i,ext]))
          }
          tw=nil if tw.count==0
          
          

          The above assumes the TextureWriter removes them from the tw object as they are written out. (I've never used this class so... test.)
          [as always wrap in a method, inside a module, inside your toplevel module namespace]

          EDIT: if you want your filenames to begin 'img0001.png' then change i to i+1 in the tw.write line.

          I'm not here much anymore.

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

            That assumes the source file for the Image is present at the computer the script is being run at.

            You can iterate all the Image definitions as Dan demonstrated, but I'd then dig into the entities of the Image's definition (they are components after all) and find the Face. Then you can extract it with the TextureWriter and be 100% sure it'll work.

            The material you obtain is not in the list in SketchUp's material browser, nor do you get it listed if you do a .each on model.materials. But you can get them all if you iterate by index, because model.material.count returns the number of normal material and image materials.

            Here's a snipped from a WIP plugin that let the user set teh opacity of Images:

            
              # Context menu
              UI.add_context_menu_handler { |context_menu|
                model = Sketchup.active_model
                sel = model.selection
                
                if sel.single_object? && sel.first.is_a?(Sketchup;;Image)
                  menu = context_menu.add_submenu('Opacity')
                  (0..100).step(10) { |i|
                    menu.add_item("#{i}%") { self.image_opacity(i) }
                  }
                  menu.add_separator
                  menu.add_item('Custom') {
                    
                    result = UI.inputbox( ['Percent Opacity; '], [self.get_image_opacity], 'Set Image Opacity' )
                    if result
                      opacity = result[0]
                      opacity = 0 if opacity < 0
                      opacity = 100 if opacity > 100
                      self.image_opacity(opacity)
                    end
                  }
                end
              }
            
              # Modifies the selected Image's transparancy
              def self.image_opacity(opacity = 0)
                image = Sketchup.active_model.selection.first
                definition = get_definition(image)
                face = definition.entities.select{|e|e.is_a?(Sketchup;;Face)}.first
                face.material.alpha = opacity / 100.0
              end
              
              def self.get_image_opacity
                image = Sketchup.active_model.selection.first
                definition = get_definition(image)
                face = definition.entities.select{|e|e.is_a?(Sketchup;;Face)}.first
                face.material.alpha * 100.0
              end
            
            

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

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

              Here my simple script that extracts all of the model's images' image-files into a special folder [Extracted Images] in the model's folder, or if the model is unsaved in the user's home directory.
              To use type extractimages in the Ruby Console...extractimages.rb

              TIG

              1 Reply Last reply Reply Quote 0
              • Didier BurD Offline
                Didier Bur
                last edited by

                Hi,
                Thank you all for resolving my problem. With a mix of all ideas and code, I'll do it ! 😍

                DB

                1 Reply Last reply Reply Quote 0
                • Didier BurD Offline
                  Didier Bur
                  last edited by

                  Yessssssssss,

                  Here is my snippet to export images out of a model, assumed these images are NOT used as textures or materials, and if the original images are NOT present at their respective pathes on the disk:

                  def exportEmbeddedImages()
                  @model=Sketchup.active_model
                  @images={}
                  @model.definitions.each { |e| @images[e]=e.name if e.image? }
                  #@tw=Sketchup;;TextureWriter.new seems buggy because when write_all is called,
                  # got the error "<wrong argument type (expected Sketchup;;TextureWriter)>"
                  @tw= Sketchup.create_texture_writer 
                  
                  	@images.each_key do |idef|
                  		# find the corresponding face in each definition of image
                  		idef.entities.each { |e| @f=e if e.typename=="Face"}
                  		#retrieve texture of face and load it in texturewriter
                  		if @f
                  			#puts @f,@f.material.texture.filename
                  			@tw.load(@f,true)
                  		end
                  	end
                  # set the path as needed
                  @tw.write_all("c;\\images",false)
                  end
                  

                  Thank you all for your help !

                  DB

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

                    @unknownuser said:

                    
                    > #@tw=Sketchup;;TextureWriter.new seems buggy because when write_all is called,
                    > # got the error "<wrong argument type (expected Sketchup;;TextureWriter)>"
                    > @tw= Sketchup.create_texture_writer
                    > 
                    

                    Sketchup::TextureWriter.new is not even documented. All examples from Google use Sketchup.create_texture_writer

                    Sidenote:
                    if e.typename=="Face"
                    That is slow -because it compares strings.

                    if e.is_a?(Sketchup::Face)
                    This is much faster.

                    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:

                      @didier bur said:

                      @tw=Sketchup::TextureWriter.new seems buggy because when @tw.write_all is called, got the error
                      <wrong argument type (expected Sketchup::TextureWriter)>
                      Sketchup::TextureWriter.new is not even documented. All examples from Google use Sketchup.create_texture_writer

                      Sorry.. noticed that (it was late, too tired to go looking for the constructor.)
                      After fiddling around I think that .new is undefined, and calling it just calls Class.new, and certain things in the instance do not get initialized.

                      I'm not here much anymore.

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

                        @didier bur said:

                        Here is my snippet to export images out of a model ...

                        a couple of questions:

                        (1) why? @images={} and not @images=[]
                        (why use a Hash when an Array should do?)
                        You'd also need to change @images.each_key to @images.each

                        (2) when you use tw.write_all,

                        • how does Sketchup name the files for those images that had no name?* what format does Sketchup write the images in?
                          (the original format or all TIIF?)

                        I'm not here much anymore.

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

                          @dan rathbun said:

                          @didier bur said:

                          Here is my snippet to export images out of a model ...

                          a couple of questions:
                          (1) why? @images={} and not @images=[]
                          (why use a Hash when an Array should do?)
                          You'd also need to change @images.each_key to @images.each
                          (2) when you use tw.write_all,

                          • how does Sketchup name the files for those images that had no name?* what format does Sketchup write the images in?
                            (the original format or all TIIF?)

                          I agree that an array [] and .each would be the best solution.

                          The texturewriter names the images from their textures' image-path-name - even if it no longer exists as a file - ALL textures will have an image-path. The tw also adjusts the exported file's name, making spaces into underscores and removing all other punctuation - e.f. C:\images\my+image 123-4.jpg becomes myimage_1234.jpg: should this result in two exported images with the same name the later ones have a numerical suffix added so ../my+image 123-4.jpg and ../my-image 123-4.jpg would export as myimage_1234.jpg and myimage_12341.jpg etc. The exported images take the format of the original, deduced from the name's suffix - jpg/png/tif etc.......

                          TIG

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

                            @tig said:

                            I agree that an array [] and .each would be the best solution.

                            I assumed it was part of a larger piece of code since it used instance variables.

                            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

                              @didier bur said:

                              @Dan: - I didn't even know that an image could have no name...

                              Well TIG says it always has an image.path
                              .. I was going by what you said in the 1st post. You said your image.path=nil ??

                              @TIG: Great answers! I asked because the API is vague. Your info should go into the API TextureWriter.write_all description, most definately.

                              I'm not here much anymore.

                              1 Reply Last reply Reply Quote 0
                              • Didier BurD Offline
                                Didier Bur
                                last edited by

                                @thomthom: correct, I need the names for another purpose, along with the associated definition. (su2pov)

                                @Dan: - I didn't even know that an image could have no name... How can this occur (each image has a path (with a file name at the end) ❓ image.path=nil occured only one time with an old model and I cannot reproduce this, so I think I made an error whan typing code in the console or something like that...
                                - tw exports at the original format.

                                DB

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

                                Advertisement