• Login
sketchucation logo sketchucation
  • Login
ℹ️ GoFundMe | Our friend Gus Robatto needs some help in a challenging time Learn More

Reload component script - anyone have one

Scheduled Pinned Locked Moved Developers' Forum
21 Posts 13 Posters 3.1k 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.
  • T Online
    TIG Moderator
    last edited by 1 Jan 2010, 18:23

    No existing tool but - you could write a simple script that opens all files in a selected folder [pick one skp it a folder to run] and imports a pre-specified tree-component and then changes all instances of another component [found by its name] with that new component...
    Can you be more specific and I'll outline a tool for it...

    TIG

    1 Reply Last reply Reply Quote 0
    • Z Offline
      zzm
      last edited by 1 Jan 2010, 21:05

      Thanks for the ideas. I really wish I knew ruby a little better so I could write it. Here is more detail.

      1. Select a folder that has 300 skp files
      2. Find all components named "tree1.skp" (for example) would be nice to be able to change the name, but I could always tweak the code
      3. Replaces all "tree1.skp" with "tree2.skp" in all files. Open, save, and closes files.

      Basically what happen is that I used a tree for 300 files and realize now that I would like it to have a taller trunk. So running a ruby would be faster than opening all the files.

      1 Reply Last reply Reply Quote 0
      • J Offline
        jim smith
        last edited by 1 Jan 2010, 22:19

        Zack,

        Maybe I am misunderstanding your problem but if you right click a component, pick reload and pick another component, all instances are replaced.

        Jim

        "Out of clutter find simplicity,
        from discord find harmony,
        In the middle of difficulty lies opportunity"
        Albert Einstein

        1 Reply Last reply Reply Quote 0
        • G Offline
          Gaieus
          last edited by 1 Jan 2010, 22:24

          He wants to do this in hundreds of skp files and too lazy to open them one-by-one (no wonder) 😲

          Gai...

          1 Reply Last reply Reply Quote 0
          • M Offline
            MartinRinehart
            last edited by 2 Jan 2010, 14:45

            @zzm said:

            I have 300 skp files that I want to open and replace a tree with a different tree.

            I've written a plugin-like Ruby, DOStalk.rb. It lets you issue MSDOS-type commands in the Ruby Console window. For instance,

            dir '*.skp'

            lists all the models in the current directory.

            I bring this up because there is also a change command:

            change '*.skp'

            This calls process() for each file in the specified list. The default process() reports that it is processing each file in the Ruby Console.

            Now we need a process() that swaps components. TIG?

            Here's my DOStalk, very early version. Do not bury it in Plugins. Put it in some convenient directory where you can load it in the Ruby Console. load '/convenient/dir/DOStalk.rb'. (Choose something easier to type than "/convenient/dir".)

            Edit: Ooops! Forgot to add:

            
            # DOStalk.rb - emulates a few MSDOS commands'
            # Copyright 2010, Martin Rinehart
            
            $dos_talk_pmode = false 
            
            =begin
            In program mode, the dir function returns a list of file names. Otherwise, it displays the list in the Ruby Console.
            =end
            
            def dir( *args )
            
                if args.length() == 0
                    return Dir;;pwd()
                end
                
                list = Dir;;glob( args[0] )
                list.sort!()
                
                if $dos_talk_pmode 
                    return list
                else
                    for f in list do puts f end
                    puts
                end # if pmode
                
            end # dir()
            
            def cd( path )
                Dir;;chdir( path )
            end
            
            def change( path )
                list = Dir;;glob( path )
                for f in list do process( f ) end
            end
            
            def del( path )
                delete( path )
            end
            
            def delete( path )
                list = Dir;;glob( path )
                for f in list do File;;delete( f ) end
            end
            
            def ldt()
                load __FILE__
            end
            
            def md( path )
                mkdir( path )
            end
            
            def mkdir( path )
                Dir;;mkdir( path )
            end
            
            def process( pathname )
                puts 'processing(  "' + pathname + '" )'
            end
            
            def rd( path )
                rmdir( path )
            end
            
            def rmdir( path )
                Dir;;rmdir( path )
            end
            
            # end of DOStalk.rb
            
            

            Author, Edges to Rubies - The Complete SketchUp Tutorial at http://www.MartinRinehart.com/models/tutorial.

            1 Reply Last reply Reply Quote 0
            • Chris FullmerC Offline
              Chris Fullmer
              last edited by 2 Jan 2010, 16:37

              Yeah, but does that let him open all 300, replace a component, and then close them. And do it all automated? The point is that its tiresome to do that over 300 models if you have to do an action manually for each model.

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

              1 Reply Last reply Reply Quote 0
              • M Offline
                MartinRinehart
                last edited by 2 Jan 2010, 19:54

                Here's a start.

                I don't know how to find the component to delete. Do you have to cruise through entities looking for Component and then check name. Any less tedious way? I also don't know how to import a component. Looked at Model.import() but that doesn't seem quite right. I was looking for something that let me position the component. Having to position 300 new components would be a big improvement for zzm, but hardly optimal.

                zzm: by proceeding with this discussion you certify that your files are fully backed up and that you know, understand and will abide by all the terms and conditions of Murphy's Law.

                
                def zzm( )
                
                    list = Dir;;glob( '*.skp' )
                    
                    if list.length == 0
                        UI.messagebox( 'Found no SketchUp models (*.skp).' )
                        return
                    end
                    
                    ret = UI.messagebox( 'There are ' + list.length().to_s() + 
                        ' files. Proceed?', MB_OKCANCEL )
                    return if ret == 2 # CANCEL
                    
                    prompts = ['Name of component to delete; ',
                        'Name of component to import; ']
                    defaults = ['deleteme', 'importme']
                    UI.inputbox( prompts, defaults, 'Delete/Import Box' )
                
                    for fn in list do
                        file = Sketchup.open_file( fn )
                        UI.messagebox( fn + ' opened.' )
                
                        # do the work here
                
                        
                    end
                    
                end
                
                

                I'm gone for the day.

                Author, Edges to Rubies - The Complete SketchUp Tutorial at http://www.MartinRinehart.com/models/tutorial.

                1 Reply Last reply Reply Quote 0
                • thomthomT Offline
                  thomthom
                  last edited by 2 Jan 2010, 20:04

                  Importing an external component: model.definitions.load http://code.google.com/apis/sketchup/docs/ourdoc/definitionlist.html#load
                  Position the component: Entities.add_instance(definition, transform) - just copy the transformation of the instance you replace.

                  @martinrinehart said:

                  I don't know how to find the component to delete. Do you have to cruise through entities looking for Component and then check name. Any less tedious way?

                  If you have it's name, then it's easy: model.definitions['definitionName']

                  I think the code would be something like this:

                  
                  newDef = model.definitions.load(path_to_new_component)
                  oldDef = model.definitions['definitionName']
                  oldDef.instances.each { |old_inst|
                    t = old_inst.transformation
                    ents = old_inst.parent.entities
                    ents.add_instance(newDef, t)
                    old_inst.erase!
                  }
                  
                  

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

                  1 Reply Last reply Reply Quote 0
                  • honoluludesktopH Offline
                    honoluludesktop
                    last edited by 3 Jan 2010, 07:20

                    This is a great plugin, especially for landscape visulization.

                    1 Reply Last reply Reply Quote 0
                    • thomthomT Offline
                      thomthom
                      last edited by 4 Jan 2010, 09:31

                      Moved this topic to the Developer section of the forum.

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

                      1 Reply Last reply Reply Quote 0
                      • S Offline
                        sahi
                        last edited by 4 Jan 2010, 19:23

                        It is my experiment.
                        Prompt me if that not so.

                        1. we choose a file (this will be a folder )
                        2. We enter the name of component
                        3. we choose a component in which and will replace

                        Attention!!!! Attention!!!! Attention!!!! before the use backup folder
                        menu "Plugins >> reload_component"
                        reload_component2.rb

                        1 Reply Last reply Reply Quote 0
                        • S Offline
                          SLOf1Fan
                          last edited by 28 Apr 2010, 21:03

                          For some reason I have recently found that right-clicking a residence model in my site model to update the revised component does not work. I get the usual pop-up stating the component has been added and asks if I'd like to replace, however when I click yes, nothing happens. It used to open the file folder so I can select the replacement folder. Please help.

                          1 Reply Last reply Reply Quote 0
                          • T Offline
                            Technical Ben
                            last edited by 22 Mar 2011, 15:19

                            Sorry to post in an old thread. But I'm looking for something similar to this.
                            Just a hobby project, but I would really like a tool that checked for updates to components for me.

                            So, I have a large file separated into separate components, these are save in a folder (such as Floor 1, Floor 2, Floor 3 etc). These are constructed into one big model (Such as "House"). I would like a script that automatically loaded up the components from file, when I opened the main project. I thought Sketchup did this automatically, but I have to click "reload" and each component separately. 😞

                            1 Reply Last reply Reply Quote 0
                            • honoluludesktopH Offline
                              honoluludesktop
                              last edited by 23 Mar 2011, 04:29

                              Select Window > components, right click the component you want to change in the component's window, then "select instances", again right click the component in the component's window, and "reload", "yes", and find the .skp you want.

                              1 Reply Last reply Reply Quote 0
                              • T Online
                                TIG Moderator
                                last edited by 23 Mar 2011, 09:18

                                My old XrefManager does do this BUT you need to have added the items as an 'Xref'... It is long overdue an update, but does list components that have changed externally and then allows you to reload them...

                                TIG

                                1 Reply Last reply Reply Quote 0
                                • T Offline
                                  Technical Ben
                                  last edited by 24 Mar 2011, 23:19

                                  Thanks honoluludesktop.
                                  I'll have to do that, and force myself not to amend objects in the wrong file.

                                  1 Reply Last reply Reply Quote 0
                                  • B Offline
                                    BigAl
                                    last edited by 15 Aug 2013, 18:58

                                    I'm using Thom Thom's lines of code below to batch replace a series of proxy components with hi-res versions.
                                    newDef = model.definitions.load(path_to_new_component)
                                    oldDef = model.definitions['definitionName']
                                    oldDef.instances.each { |old_inst|
                                    t = old_inst.transformation
                                    ents = old_inst.parent.entities
                                    ents.add_instance(newDef, t)
                                    old_inst.erase!
                                    }
                                    To speed this process up I'd like to add a conditional test before this code such that the code to replace Component A with Component B only runs if Component A already exists within the model. Otherwise skip to the next component in the list.
                                    Does such code or similar already exist somewhere?
                                    Any help greatly appreciated.

                                    1 Reply Last reply Reply Quote 0
                                    • Dan RathbunD Offline
                                      Dan Rathbun
                                      last edited by 16 Aug 2013, 00:30

                                      It looks like it already does that.

                                      Meaning ComponentA's defintion's instances collection is iterated, and the statements within the curly delimited block are run if the collection has any references pointing at instances that have been placed within the model.

                                      IF the instances collection is empty, then the iteration loop is exited without running the block.

                                      ❓

                                      I'm not here much anymore.

                                      1 Reply Last reply Reply Quote 0
                                      • B Offline
                                        BigAl
                                        last edited by 16 Aug 2013, 18:05

                                        Thanks Dan,
                                        I hadn't noticed that behaviour before. Initially being only interested in getting a couple of components into the model it wasn't an issue and I would always have the proxies in the model to check that the swap worked ok.
                                        Looking at this again it looks like the components are all loaded into the file in turn. When I repeat ThomThom's text as below only Comp4 gets deleted if not required to replace comp3 (being the last to be loaded). Comp2 get left behind.

                                        newDef = model.definitions.load("J:/Comp2.skp")
                                        oldDef = model.definitions['Comp1']
                                        oldDef.instances.each{|old_inst|old_inst.definition=newDef
                                        t = old_inst.transformation
                                        ents = old_inst.parent.entities
                                        ents.add_instance(newDef, t)
                                        old_inst.erase!
                                        }
                                        newDef = model.definitions.load("J:/Comp4.skp")
                                        oldDef = model.definitions['Comp3']
                                        oldDef.instances.each{|old_inst|old_inst.definition=newDef
                                        t = old_inst.transformation
                                        ents = old_inst.parent.entities
                                        ents.add_instance(newDef, t)
                                        old_inst.erase!
                                        }

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

                                        Advertisement