sketchucation logo sketchucation
    • Login
    โ„น๏ธ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Subtract the selection of edges

    Scheduled Pinned Locked Moved Developers' Forum
    13 Posts 2 Posters 7.9k Views 2 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.
    • M Offline
      ManuelB
      last edited by

      Hello, ๐Ÿ˜„

      I am a beginner in ruby and I need your help to write a method.

      For example:

      • I draw a cube.

      • I select all. (The faces and edges of my cube are selected.)

      How to write a simple code that allows you to subtract the edges of the selection?

      Thanks for your help

      Manual

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

        When you say, '...subtract the edges...' what do you expect you'll end up with.
        If you mean 'erase', then everything will vanish, because the deleted edges will no longer support the faces.

        There are lots of possibilities - like making the edges 'hidden' whilst keeping the related faces etc, BUT you need to be more specific about what you really mean and what you hope to achieve...

        If you simply want to 'collect' all of the selected edges, ignoring faces etc, then you use:

        edges = Sketchup.active_model.selection.grep(Sketchup;;Edge)
        

        Then that new array [named ' edges'] includes all preselected edges.

        TIG

        1 Reply Last reply Reply Quote 0
        • M Offline
          ManuelB
          last edited by

          Hello TIG,

          I just want to deselect the edges to keep only the selected faces.
          I hope it's more understandable now.

          Thank you

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

            OK

            Here's one way to reduce a selection to include just its faces...

            model = Sketchup.active_model
            ss = model.selection
            faces = ss.grep(Sketchup;;Face)
            ss.clear
            ss.add(faces)
            

            To explain...
            You make a reference to the model.
            You make a reference to the model's selection.
            You grep the model's selection to collect just its faces.
            You clear the model's selection.
            You add the faces to the model's selection.

            Now your preselected entities only include ' faces'...

            I guess this is where you need to be ?

            TIG

            1 Reply Last reply Reply Quote 0
            • M Offline
              ManuelB
              last edited by

              Yes it's exactly that TIG. ๐Ÿ‘
              I thank you very much!

              1 Reply Last reply Reply Quote 0
              • M Offline
                ManuelB
                last edited by

                I just realized that there is a problem!

                My ultimate goal is to write a code that explodes a component and then selects all the faces.

                To explode a component I use this method:

                Sketchup.send_action 21111
                

                To select faces, I use your TIG method.

                All works well if I use these codes in 2 steps.

                If I want to combine the 2 codes in the same method, nothing works! ๐Ÿ˜ฎ

                
                Sketchup.send_action 21111
                model = Sketchup.active_model
                ss = model.selection
                faces = ss.grep(Sketchup;;Face)
                ss.clear
                ss.add(faces)
                
                

                Do you know what for and how to get around the problem?

                Thank you

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

                  I wouldn't rely on send_action, the numerical ones only apply on PCs anyway.
                  How about this.

                  model = Sketchup.active_model
                  ss = model.selection
                  compo = ss.grep(Sketchup;;ComponentInstance)[0]
                  if compo
                    exs = compo.explode # array of all entities resulting from the explode.
                    faces = exs.grep(Sketchup;;Face)
                    ss.clear
                    ss.add(faces)
                  else #no compo selected
                    UI.messagebox("You must preselect a component-instance !")
                  end
                  

                  To explain...
                  You make a reference to the model, then its selection.
                  You grep the selection and take the first 'hit' on a component-instance
                  Unless there is a preselected instance you get an error message.
                  If there is a ' compo' it is exploded [and the results collected], and the selection changes to include only the faces in that.
                  If you want to process the exploded faces further there's no need to 'select' them, because 'faces' is already an array list of them - so for example, to make them all 'Red' you could omit the ss.add(faces) and instead add faces.each{|f| f.material = 'Red' } ???

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • M Offline
                    ManuelB
                    last edited by

                    I tried this code and it still does not work:

                    array = []
                    mod = Sketchup.active_model
                    sel = mod.selection 
                    sel.grep(Sketchup;;ComponentInstance).each do |s|
                      s.definition.entities.grep(Sketchup;;Face).each do |f| 
                        array << f
                      end
                      s.explode
                    end
                    sel.add(array)
                    p array  
                    
                    

                    The "Entity Info" window indicates that faces are selected, while on the SketchUp scene nothing is selected.

                    It's too strange for me!

                    Thanks for your help.

                    Manuel

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

                      In your example, posted before my last one, the code will fail because when you explode the instance any reference to the definition's own faces will be lost - but the explode itself returns an array of the new faces that have resulted from the explode...

                      TIG

                      1 Reply Last reply Reply Quote 0
                      • M Offline
                        ManuelB
                        last edited by

                        Thank you TIG, your method works perfectly. ๐Ÿ‘

                        @tig said:

                        In your example, posted before my last one, the code will fail because when you explode the instance any reference to the definition's own faces will be lost - but the explode itself returns an array of the new faces that have resulted from the explode...

                        I understand! Your code is a perfect example of how to recover faces after the explode method.

                        @tig said:

                        I wouldn't rely on send_action, the numerical ones only apply on PCs anyway.

                        I did not know! This can then cause problems in other methods that I have written.
                        How will you "copy / paste in place" a component being selected without using "send_action"?

                        I do not know how to do otherwise than this method:

                        
                        Sketchup.send_action CMD_COPY
                        Sketchup.send_action 21939
                        
                        

                        Thanks for your help.

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

                          http://ruby.sketchup.com/Sketchup.html#send_action-class_method
                          List the common 'strings' and also the PC only send_actions.

                          However, some are 'missing'...

                          These are still undocumented - some might be obsolete too...

                          copy:
                          cut:
                          editDelete:
                          getCurrentView:
                          getModels:
                          newDocument:
                          openDocument:
                          paste: [BUT there's NOT a pasteInPlace: ! To do that you must somehow replicate the selected entities and add them to the current context, applying a suitable transformation etc]
                          placeModel:
                          printDocument:
                          saveDocument:
                          select3dTextTool:
                          selectionZoomExt:
                          shareModel:
                          uploadComponent:
                          viewShowGuides:

                          These are also broken on MAC - or at least they were...

                          getModels:
                          getPhotoTexture:
                          shareModel:
                          uploadComponent:

                          TIG

                          1 Reply Last reply Reply Quote 0
                          • M Offline
                            ManuelB
                            last edited by

                            @tig said:

                            http://ruby.sketchup.com/Sketchup.html# ... ass_method
                            List the common 'strings' and also the PC only send_actions.

                            Yes I saw indeed!

                            Before coming to post my questions I did some research and I found all the "send_actions" in this TOPIC.

                            To avoid problems, I prefer not to use "send_actions".

                            How can you copy the faces and edges of a component and paste in place them on the outside of the component ?

                            Code is very complicated for me to write without the "send_actions".

                            Thank you

                            Manuel

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

                              This isn't a method, but an outline of a process...

                              You have a component-instance.

                              From that instance you can get the component-definition.
                              You can then add a new instance of that into the same entities-context as the original instance, using a copy of the original's transformation.
                              Now you can process that new instance.

                              For example, you can explode it get a reference to everything, then erase everything that's not an edge - e.g. faces, text, dims, and nested groups and instances.
                              Now you have the edges.

                              If you'd like a group containing just those edges...

                              Once you have the component-definition, you first add a new empty group into the same entities-context.
                              You can now make a reference to the group.entities context and then add the new instance into that new context, explode and trim the array of entities, to finally leave only the desired edges inside the group.
                              Now you have the required edges inside your group.
                              [Remember that you can rename that container group etc as desired]

                              TIG

                              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