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

    Find and replace multiple components?

    Scheduled Pinned Locked Moved Newbie Forum
    sketchup
    30 Posts 9 Posters 12.1k Views 9 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

      OK

      Let's consider this...
      The original component is named [let's say] "DC" - so its unique-ified siblings are named DC#1, DC#2 etc...
      So we can search the model's definitions for matching 'patterns' and replace their instances...
      The naming has to be logical, and all instances the same...

      
      model=Sketchup.active_model
      defns=model.definitions
      name="DC" # perhaps you'd use an inputbox to get this 'name' ?
      defn=defns[name]
      dcs=defns.find_all{|d| d.name =~ /^#{name}#/ }
      # note how 'name' starts the match-pattern and has a following #
      model.start_operation("Un-unique #{name}", true) # one-step undo
      puts "Un-unique #{name}"
      dcs.each{|d|
        p d.name # to see their names listed in the Ruby Console
        d.instances.each{|i| i.definition = defn }
        # replace with original
      }
      model.commit_operation
      puts "Done"
      
      

      This works within nested components etc...
      You could check that the geometry/size etc of the instance of the original defn matches the instance of the to-be-un-uniqued definition, but that requires more convoluted code...

      TIG

      1 Reply Last reply Reply Quote 0
      • A Offline
        antioche
        last edited by

        Many thanks for the quick feedback, TIG!
        Seems to make a lot of sense. Not able to test right now (deadline looming on another project) but will test and feedback.

        Teebs

        1 Reply Last reply Reply Quote 0
        • T Offline
          tenquin
          last edited by

          Olá TIG!
          Boa tarde!
          Obrigado pelo retorno.

          Desculpe se não soube me expressar corretamente, na verdade preciso que o plugin troque todos os componentes que tem um parâmetro específico, no caso o parâmetro "modeloptions=portas inferiores"

          Desde já agradeço.


          Esses seriam os parâmetros de exemplo


          Essa seria o componente a ser trocado, sendo que teria que manter as dimensões lenx, leny, lenz e posições x,y,z....


          Essas seriam as portas de troca e estariam em uma biblioteca...

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

            @tenquin

            Yes, that's nothing like it !

            You could try editing the code...

            
            ###....
            dcs.each{|d|
              next unless d.get_attribute("dynamic_attributes", "modeloptions", "") == "portas inferiores"
              # this skips if it's not that type of dc ???
              p d.name # to see their names listed in the Ruby Console
              d.instances.each{|i| i.definition = defn }
              # replace with original
            }
            ###...
            
            

            TIG

            1 Reply Last reply Reply Quote 0
            • T Offline
              tenquin
              last edited by

              Obrigado mais uma vez TIG!

              Vou estudar mais um pouco e tentar fazer,
              sou novo em programação mas vou tentar até conseguir. rsrs

              👍

              1 Reply Last reply Reply Quote 0
              • T Offline
                tenquin
                last edited by

                @tig said:

                OK

                Let's consider this...
                The original component is named [let's say] "DC" - so its unique-ified siblings are named DC#1, DC#2 etc...
                So we can search the model's definitions for matching 'patterns' and replace their instances...
                The naming has to be logical, and all instances the same...

                
                > model=Sketchup.active_model
                > defns=model.definitions
                > name="DC" # perhaps you'd use an inputbox to get this 'name' ?
                > defn=defns[name]
                > dcs=defns.find_all{|d| d.name =~ /^#{name}#/ }
                > # note how 'name' starts the match-pattern and has a following #
                > model.start_operation("Un-unique #{name}", true) # one-step undo
                > puts "Un-unique #{name}"
                > dcs.each{|d|
                >   p d.name # to see their names listed in the Ruby Console
                >   d.instances.each{|i| i.definition = defn }
                >   # replace with original
                > }
                > model.commit_operation
                > puts "Done"
                > 
                

                This works within nested components etc...
                You could check that the geometry/size etc of the instance of the original defn matches the instance of the to-be-un-uniqued definition, but that requires more convoluted code...

                Olá TIG

                Desculpe minha insistência.
                Há alguns meses conversamos sobre o código acima, que faz um script que substitui componentes.
                Ainda não consegui fazer com que funcionasse, criei um componente com nome DC e copiei e colei o código no console Sketchup,mas não obtive resultado.
                Estou me dedicando a Ruby, mas mesmo depois de ler o livro Automatic Skechup, não consegui identificar o que está errado...

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

                  What results do you get ?
                  The Ruby Console will show errors and output.

                  You are looking for a component definition name, NOT a component instance name.
                  They are different things.
                  The component's name is displayed in the Components Browser.
                  Instances can have different names from their definition - this shown in Entity info - if it's selected...

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • T Offline
                    tenquin
                    last edited by

                    @TIG

                    Obrigado mais uma vez por responder.
                    Não retorna nenhum erro, porém nenhum resultado também. Segue uma imagem.

                    Script.JPG

                    Minha intenção é buscar os componentes por atributos dinâmicos ao invés de por nome, se poder me dá uma luz de como ficaria o código assim eu agradeço, se não, depois tentarei editar o código para se adequar ao que desejo.

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

                      What else do you expect ?
                      You have 1 component definition named 'DC'.
                      If you had more using that name pattern - e.g. 'DC#1', DC#2' etc.
                      Then DC would prevail !

                      The code is working just fine - but your model has got nothing in it to be processed !

                      TIG

                      1 Reply Last reply Reply Quote 0
                      • T Offline
                        tenquin
                        last edited by

                        Perdão TIG.
                        Você tem razão, eu não estava sabendo usar o código corretamente.
                        Agora me parece que está funcionando.
                        Obrigado

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

                          @tig said:

                          IF you name your components logically then a script in the form swapcomponents("-aaa","-bbb") is straightforward - and quite simple - I can talk you through it... Once you have something working vis the Ruby Console it#s easy enough to add a menu item and dialog, even a toolbar and so on...

                          First off - make a logical component-naming strategy/
                          Then write is a simple step-sheet explaining how you'd like to use the new tool... e.g.

                          I select various cabinets where I want to swap one type of door [and drawer] for another.
                          I activate the new tool tell it what code to find and what code to replace it with... and it automatically finds equivalent doors [and drawers] in the model [or perhaps SKPs in folder[s]] in ../Components/.
                          It then uses/loads them and replaces the current component instance with the required definition.
                          A dialog reports what's been changed and/or any errors.
                          It is one step undo-able.
                          For example always name doors 'Door-WWW-HHH-FINISH-CODE' and then all we have to do is swap components with the same base but a new FINISH and/or CODE - In the input you could type Door*-Oak-A and in the output type Door*-Maple-A and all doors code A would change from 'Oak' to 'Maple'; or Door*-A >>> Door*-B would swap from code A to code B - if there were no Oak versions of code B doors then the closing dialog tells you!
                          On a more global system *-A >>> *-B tries to swap all type A 'fitments' to type B.
                          If things are 'nested' - components inside groups etc then it's more tricky but not impossible...
                          You could also swap ironmongery from Handle-*-A >>> Handle-*-B.
                          See the schema ?

                          TIG can I ask you to post an example of this code here? Thanks.

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

                            You quoted my example of a step sheet...

                            Please outline exactly what you want to do - what to find by a pattern-match and how to rename them etc...

                            This thread have been around for a decade !
                            So what you want to do needs to be specified very precisely...

                            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