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

    Application Development Exploding Component Instances

    Scheduled Pinned Locked Moved Developers' Forum
    16 Posts 5 Posters 3.2k 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.
    • TIGT Offline
      TIG Moderator
      last edited by

      Sadly your code example is poorly formatted, making it hard to read...

      However, here are a few observations that might be related.
      With v2017, when you explode a container all of the references you might have had to entities within that container are lost - all IDs are refreshed.
      The ents=container.explode will return an array of exploded entities [and often more besides] - all with new references - so therefore you will need to re-search that array to get the needed references to any resultant 'containers' etc...

      TIG

      1 Reply Last reply Reply Quote 0
      • N Offline
        NoahT
        last edited by

        @tig said:

        Sadly your code example is poorly formatted, making it hard to read...

        Sorry, first time testing out code posting on here. I tried to fix it a bit but it's formatting oddly. Basically, the first part is a ton of filters to select certain component instances, then there is a loop to just explode these.

        @tig said:

        However, here are a few observations that might be related.
        With v2017, when you explode a container all of the references you might have had to entities within that container are lost - all IDs are refreshed.
        The ents=container.explode will return an array of exploded entities [and often more besides] - all with new references - so therefore you will need to re-search that array to get the needed references to any resultant 'containers' etc...

        I'm not sure I follow you here. Are you saying that I will need to re-search the entities after exploding? I am having trouble with the speed of exploding/freezing during exploding, not finding the entities after. Am i stuck with a slow exploding process or are there some tricks to speed it up?

        Thanks, for feedback and further clarification.

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

          If you want to explode all instances in the current entities context - either the model or during an edit of a group etc, do something like the following...

          def exploder()
            model=Sketchup.active_model
            ents=model.active_entities
            es = ents.grep(Sketchup;;ComponentInstance)
            while es[0]
              es.each{|e| e.explode }
              es = ents.grep(Sketchup;;ComponentInstance)
              ### add this to re-explode any instances resulting from the explosion...
            end
          end
          
          

          Note the optional extra 'es = ' in the while loop - to exploded previously nested instances, but if that is NOT needed change it to 'es = []' at the end of the exploding... OR remove the whole 'while...end' and add the explode block immediately after setting 'es' the first time.

          TIG

          1 Reply Last reply Reply Quote 0
          • TNTDAVIDT Offline
            TNTDAVID
            last edited by

            Hello, ☀

            I want to explode a list of nested components inside groups or components through their definitions.

            m=Sketchup.active_model
            s=m.selection
            sel=m.definitions.each{|d|s.add d.instances if d.name=~/#{"Sophie"}/}
            sophie=ents.grep(Sketchup;;ComponentInstance)
            sophie.each{|e| e.explode }
            

            With this code I select all "Sophie" in my SketchUp models and explode all the "Parents" components of "Sophie".

            How to explode "Shophie" without modifying the parent components?

            And how to explode the definition "Chris" at the same time as "Shophie"?

            Thank you in advance for your help.

            David

            [b:8wt9py2i]* Nouveau !!![/b:8wt9py2i] Découvrez notre nouveau Plugin [url=http://www.composant-dynamique.com/:8wt9py2i][color=#40FF00:8wt9py2i]C[/color:8wt9py2i][color=#77FF00:8wt9py2i]l[/color:8wt9py2i][color=#ADFF00:8wt9py2i]i[/color:8wt9py2i][color=#E4FF00:8wt9py2i]c[/color:8wt9py2i][color=#FFDB09:8wt9py2i]k[/color:8wt9py2i][color=#FF921B:8wt9py2i]-[/color:8wt9py2i][color=#FF492E:8wt9py2i]C[/color:8wt9py2i][color=#FF0040:8wt9py2i]u[/color:8wt9py2i][color=#ED2577:8wt9py2i]i[/color:8wt9py2i][color=#DA49AD:8wt9py2i]s[/color:8wt9py2i][color=#C86EE4:8wt9py2i]i[/color:8wt9py2i][color=#AD77FF:8wt9py2i]n[/color:8wt9py2i][color=#8965FF:8wt9py2i]e[/color:8wt9py2i] [color=#4040FF:8wt9py2i]2[/color:8wt9py2i][/url:8wt9py2i], pour créer vos cuisines 3D !

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

              As usual you are making it more complicated that it needs to be - and the reference 'ents' appears from nowhere too !
              Try this approach...

              name="Sophie" # or ="Chris" etc to make it reusable...
              model=Sketchup.active_model
              matches=model.definitions.each.find_all{|d| d.name =~ /#{name}/ }
              matches.each{|match| match.instances.each{|i| i.explode } }
              

              This matches "Sophie", "Sophie#1", "Sophie#2" etc
              But it'll also match "My_Sophie" !
              If you want just the start "Sophie" etc use d.name =~ /^#{name}/
              or d.name =~ /^#{name}$/ for exactly "Sophie".
              Although if you want an exact match use d.name == name
              or even simpler ?
              match=model.definitions[name] ### then use match.instances... if match

              It does not remove the now unused "Sophie" definition[s] from the model's definitions list !
              If you want to do this, then run your code inside a model.start_operation(... model.commit_operation block, and after exploding the instances of ' match' use
              use match.entities.clear! - this will 'empty' the definition and when thr operation is committed SketchUp's Garbage-Collection removes the empty definition from the model's list...

              TIG

              1 Reply Last reply Reply Quote 0
              • TNTDAVIDT Offline
                TNTDAVID
                last edited by

                Bonjour TIG,

                Avec votre code:

                name="Sophie"
                model=Sketchup.active_model
                matches=model.definitions.each.find_all{|d| d.name =~ /#{name}/ }
                matches.each{|match| match.instances.each{|i| i.explode } }
                

                j’obtiens le message d'erreur suivant dans la console ruby:

                Error; #<LocalJumpError; no block given>
                <main>;2;in `each'
                <main>;2;in `<main>'
                -e;1;in `eval'
                nil
                

                Comment corriger cette erreur ?

                Merci

                [b:8wt9py2i]* Nouveau !!![/b:8wt9py2i] Découvrez notre nouveau Plugin [url=http://www.composant-dynamique.com/:8wt9py2i][color=#40FF00:8wt9py2i]C[/color:8wt9py2i][color=#77FF00:8wt9py2i]l[/color:8wt9py2i][color=#ADFF00:8wt9py2i]i[/color:8wt9py2i][color=#E4FF00:8wt9py2i]c[/color:8wt9py2i][color=#FFDB09:8wt9py2i]k[/color:8wt9py2i][color=#FF921B:8wt9py2i]-[/color:8wt9py2i][color=#FF492E:8wt9py2i]C[/color:8wt9py2i][color=#FF0040:8wt9py2i]u[/color:8wt9py2i][color=#ED2577:8wt9py2i]i[/color:8wt9py2i][color=#DA49AD:8wt9py2i]s[/color:8wt9py2i][color=#C86EE4:8wt9py2i]i[/color:8wt9py2i][color=#AD77FF:8wt9py2i]n[/color:8wt9py2i][color=#8965FF:8wt9py2i]e[/color:8wt9py2i] [color=#4040FF:8wt9py2i]2[/color:8wt9py2i][/url:8wt9py2i], pour créer vos cuisines 3D !

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

                  Sorry, I hadn't tested it.
                  Here is the corrected code:

                  name="Sophie" # or ="Chris" etc to make it reusable...
                  model=Sketchup.active_model
                  matches=model.definitions.find_all{|d| d.name =~ /#{name}/ }
                  matches.each{|match| match.instances.each{|i| i.explode } }
                  

                  I had an errant '.each' in it, when the '.find_all' was all that is needed...

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • TNTDAVIDT Offline
                    TNTDAVID
                    last edited by

                    Wonderful it works very well! ☀

                    To explode several definitions, I simply did this:

                    name=['Sophie','CUBE']
                    model=Sketchup.active_model
                    matches=model.definitions.find_all{|d| d.name =~ /#{name}/ }
                    matches.each{|match| match.instances.each{|i| i.explode } }
                    

                    [b:8wt9py2i]* Nouveau !!![/b:8wt9py2i] Découvrez notre nouveau Plugin [url=http://www.composant-dynamique.com/:8wt9py2i][color=#40FF00:8wt9py2i]C[/color:8wt9py2i][color=#77FF00:8wt9py2i]l[/color:8wt9py2i][color=#ADFF00:8wt9py2i]i[/color:8wt9py2i][color=#E4FF00:8wt9py2i]c[/color:8wt9py2i][color=#FFDB09:8wt9py2i]k[/color:8wt9py2i][color=#FF921B:8wt9py2i]-[/color:8wt9py2i][color=#FF492E:8wt9py2i]C[/color:8wt9py2i][color=#FF0040:8wt9py2i]u[/color:8wt9py2i][color=#ED2577:8wt9py2i]i[/color:8wt9py2i][color=#DA49AD:8wt9py2i]s[/color:8wt9py2i][color=#C86EE4:8wt9py2i]i[/color:8wt9py2i][color=#AD77FF:8wt9py2i]n[/color:8wt9py2i][color=#8965FF:8wt9py2i]e[/color:8wt9py2i] [color=#4040FF:8wt9py2i]2[/color:8wt9py2i][/url:8wt9py2i], pour créer vos cuisines 3D !

                    1 Reply Last reply Reply Quote 0
                    • D Offline
                      driven
                      last edited by

                      sometime it's worth writing 'visual code' to see how the ruby works...

                      click to see gif...
                      to_go.gif

                      this is based on Tigs example

                      def explode_named(*args)       
                      	model = Sketchup.active_model
                      	defs = model.definitions
                      	sel    = model.selection
                      	view = model.active_view 
                      	names = Regexp.union(args)
                      	matches = defs.find_all{|d| d.name =~ names }
                      	model.start_operation('Explode Inards')
                      	matches.each{|match| 
                           match.instances.each{|i|
                      		sel.add(i)
                      		view.refresh
                      		sleep 0.2
                      		i.explode
                      		}
                      	}
                        defs.purge_unused
                        model.commit_operation #
                      end
                      
                      
                      

                      to run

                      explode_named("Sophie","Chris")
                      

                      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
                      • TNTDAVIDT Offline
                        TNTDAVID
                        last edited by

                        Really perfect your solution driven! 👍 👍 👍

                        Thank you

                        [b:8wt9py2i]* Nouveau !!![/b:8wt9py2i] Découvrez notre nouveau Plugin [url=http://www.composant-dynamique.com/:8wt9py2i][color=#40FF00:8wt9py2i]C[/color:8wt9py2i][color=#77FF00:8wt9py2i]l[/color:8wt9py2i][color=#ADFF00:8wt9py2i]i[/color:8wt9py2i][color=#E4FF00:8wt9py2i]c[/color:8wt9py2i][color=#FFDB09:8wt9py2i]k[/color:8wt9py2i][color=#FF921B:8wt9py2i]-[/color:8wt9py2i][color=#FF492E:8wt9py2i]C[/color:8wt9py2i][color=#FF0040:8wt9py2i]u[/color:8wt9py2i][color=#ED2577:8wt9py2i]i[/color:8wt9py2i][color=#DA49AD:8wt9py2i]s[/color:8wt9py2i][color=#C86EE4:8wt9py2i]i[/color:8wt9py2i][color=#AD77FF:8wt9py2i]n[/color:8wt9py2i][color=#8965FF:8wt9py2i]e[/color:8wt9py2i] [color=#4040FF:8wt9py2i]2[/color:8wt9py2i][/url:8wt9py2i], pour créer vos cuisines 3D !

                        1 Reply Last reply Reply Quote 0
                        • TNTDAVIDT Offline
                          TNTDAVID
                          last edited by

                          **Dirven, I chose to use your method that works well.

                          When components are exploded with dynamic materials, the textures will apply to the basic geometry.

                          Thus the rendering engines can easily manage the maping coordinates to make beautiful 3D renderings.

                          In the case of Click-Cuisine 2:

                          Each piece of furniture can contain between 10 and 50 components to explode, so for a kitchen with 25 modules it takes 2 minutes of loading.

                          I set the value "sleep", to "0" to go faster but that is insufficient.

                          Is it possible to execute code faster or activate the SketchUp progress bar?

                          Thank you**

                          [b:8wt9py2i]* Nouveau !!![/b:8wt9py2i] Découvrez notre nouveau Plugin [url=http://www.composant-dynamique.com/:8wt9py2i][color=#40FF00:8wt9py2i]C[/color:8wt9py2i][color=#77FF00:8wt9py2i]l[/color:8wt9py2i][color=#ADFF00:8wt9py2i]i[/color:8wt9py2i][color=#E4FF00:8wt9py2i]c[/color:8wt9py2i][color=#FFDB09:8wt9py2i]k[/color:8wt9py2i][color=#FF921B:8wt9py2i]-[/color:8wt9py2i][color=#FF492E:8wt9py2i]C[/color:8wt9py2i][color=#FF0040:8wt9py2i]u[/color:8wt9py2i][color=#ED2577:8wt9py2i]i[/color:8wt9py2i][color=#DA49AD:8wt9py2i]s[/color:8wt9py2i][color=#C86EE4:8wt9py2i]i[/color:8wt9py2i][color=#AD77FF:8wt9py2i]n[/color:8wt9py2i][color=#8965FF:8wt9py2i]e[/color:8wt9py2i] [color=#4040FF:8wt9py2i]2[/color:8wt9py2i][/url:8wt9py2i], pour créer vos cuisines 3D !

                          1 Reply Last reply Reply Quote 0
                          • D Offline
                            driven
                            last edited by

                            it's basically TIG's code + a couple of tweaks, I made it 'visualised' to help you 'see' what's happening because I find it useful myself...

                            none of these are needed at all and the code will run faster...

                            
                                  sel.add(i)
                                  view.refresh
                                  sleep 0.2
                            

                            so either comment them out or delete them for 'production code'...

                            any 'progress bar' will add even more overhead and can only slow the progress more...

                            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
                            • TNTDAVIDT Offline
                              TNTDAVID
                              last edited by

                              The loading time decreased from 2 minutes to 4 seconds. 👍

                              Thanks Driven

                              [b:8wt9py2i]* Nouveau !!![/b:8wt9py2i] Découvrez notre nouveau Plugin [url=http://www.composant-dynamique.com/:8wt9py2i][color=#40FF00:8wt9py2i]C[/color:8wt9py2i][color=#77FF00:8wt9py2i]l[/color:8wt9py2i][color=#ADFF00:8wt9py2i]i[/color:8wt9py2i][color=#E4FF00:8wt9py2i]c[/color:8wt9py2i][color=#FFDB09:8wt9py2i]k[/color:8wt9py2i][color=#FF921B:8wt9py2i]-[/color:8wt9py2i][color=#FF492E:8wt9py2i]C[/color:8wt9py2i][color=#FF0040:8wt9py2i]u[/color:8wt9py2i][color=#ED2577:8wt9py2i]i[/color:8wt9py2i][color=#DA49AD:8wt9py2i]s[/color:8wt9py2i][color=#C86EE4:8wt9py2i]i[/color:8wt9py2i][color=#AD77FF:8wt9py2i]n[/color:8wt9py2i][color=#8965FF:8wt9py2i]e[/color:8wt9py2i] [color=#4040FF:8wt9py2i]2[/color:8wt9py2i][/url:8wt9py2i], pour créer vos cuisines 3D !

                              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