• Login
sketchucation logo sketchucation
  • Login
๐Ÿค‘ SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

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 9 Nov 2018, 18:14

    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
    • T Offline
      TIG Moderator
      last edited by 9 Nov 2018, 18:24

      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 9 Nov 2018, 18:29

        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
        • T Offline
          TIG Moderator
          last edited by 9 Nov 2018, 18:38

          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 9 Nov 2018, 18:41

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

            1 Reply Last reply Reply Quote 0
            • M Offline
              ManuelB
              last edited by 9 Nov 2018, 19:25

              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
              • T Offline
                TIG Moderator
                last edited by 9 Nov 2018, 19:52

                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 9 Nov 2018, 19:52

                  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
                  • T Offline
                    TIG Moderator
                    last edited by 9 Nov 2018, 19:55

                    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 10 Nov 2018, 14:42

                      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
                      • T Offline
                        TIG Moderator
                        last edited by 10 Nov 2018, 15:25

                        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 10 Nov 2018, 16:41

                          @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
                          • T Offline
                            TIG Moderator
                            last edited by 10 Nov 2018, 18:31

                            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
                            1 / 1
                            • First post
                              10/13
                              Last post
                            Buy SketchPlus
                            Buy SUbD
                            Buy WrapR
                            Buy eBook
                            Buy Modelur
                            Buy Vertex Tools
                            Buy SketchCuisine
                            Buy FormFonts

                            Advertisement