• Login
sketchucation logo sketchucation
  • Login
๐Ÿ”Œ Quick Selection | Try Didier Bur's reworked classic extension that supercharges selections in SketchUp Download

Soften-Edges using by ruby

Scheduled Pinned Locked Moved Developers' Forum
23 Posts 7 Posters 4.2k Views 7 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.
  • T Offline
    TIG Moderator
    last edited by 15 Sept 2010, 08:13

    @thomthom said:

    @tig said:

    Make an array of the selected edges [or of the edges within selected groups etc].
    Iterate through those edges and test it they have >1 face.

    The native soft+smooth tool doesn't soft+smooth any edges that is connected to more or less than 2 faces.

    OK just adjust the code so that it's a edge.faces[1] and not edge.faces[2] test...***

    To work on a group's edges

    
    ###... add this into the mix...
    groups=[]
    ss.to_a.each{|e|groups << e if e.class==Sketchup;;Group}
    groups.each{|group|
      group.entities.to_a.each{|e|
        if e.class==Sketchup;;Edge and e.faces.length==2 ###***
          e.soft=true
          e.smooth=true
        end#if
      }
    }
    ### ???
    
    

    TIG

    1 Reply Last reply Reply Quote 0
    • B Offline
      baldaman
      last edited by 28 Sept 2011, 21:01

      Dear TIG, I tried to edit you code in order to be able to choose the smooth angle but I didn't succeed.
      WHat am I doing wrong?

      
      def ss()
      model=Sketchup.active_model
      ss=model.selection
      ### You can assemble any collection of edges
      ### Here it's from the model's current selection
      edges=[]
      ss.to_a.each{|e|
         edges << e if e.class==Sketchup;;Edge
         e.entities.each{|ee|edges << ee if e.class==Sketchup;;Edge}if e.class==Sketchup;;Group
      }
      edges.each{|edge|
         if edge.faces[1]
      ang=edge.faces[0].normal.angle_between(edge.faces[1].normal)
           edge.soft=true if ang.radians >= 45.0
           edge.smooth=true if ang.radians >= 45.0
         end
      }
      end#def
      
      
      1 Reply Last reply Reply Quote 0
      • T Offline
        TIG Moderator
        last edited by 28 Sept 2011, 21:51

        I haven't tested it but it looks OK - except I'd have used
        edge.soft=true if ang >= 45.degrees edge.smooth=true if ang >= 45.degrees
        rather than
        edge.soft=true if ang.radians >= 45.0 edge.smooth=true if ang.radians >= 45.0
        There's a type in the group part use ee NOT e...
        e.entities.each{|ee|edges << ee if **ee**.class==Sketchup::Edge}if e.class==Sketchup::Group
        But but ought to work ?
        If you get it to 'puts' edges and ang.radians etc as it iterates through what is shown in the Ruby Console ??

        TIG

        1 Reply Last reply Reply Quote 0
        • B Offline
          baldaman
          last edited by 28 Sept 2011, 22:33

          Here is the code and the result,
          I tried with different angles.
          If I choose 90ยฐ nothing is smoothed neither soften.


          ss.jpg

          1 Reply Last reply Reply Quote 0
          • B Offline
            baldaman
            last edited by 28 Sept 2011, 22:35

            Oups, here is the code

            
            def ss()
            model=Sketchup.active_model
            ss=model.selection
            ### You can assemble any collection of edges
            ### Here it's from the model's current selection
            edges=[]
            ss.to_a.each{|e|
               edges << e if e.class==Sketchup;;Edge
               e.entities.each{|ee|edges << ee if ee.class==Sketchup;;Edge}if e.class==Sketchup;;Group
            }
            edges.each{|edge|
            ang=edge.faces[0].normal.angle_between(edge.faces[1].normal)
               if edge.faces[1]
                 edge.soft=true if ang >= 45.degrees
                 edge.smooth=true if ang >= 45.degrees
               end
            }
            end#def
            
            
            
            1 Reply Last reply Reply Quote 0
            • T Offline
              TIG Moderator
              last edited by 28 Sept 2011, 22:42

              The angle between adjacent faces on the cylinder's curve is 360/numsegs = 15 degrees for 24 segements so that is less than 45 degrees so they won't be smoothed !
              I suspect you want to smooth edges that are NOT >= 45.degrees - so reverse the logic of the test to
              edge.soft=true if ang < 45.degrees edge.smooth=true if ang < 45.degrees
              and then 'sharp' edges will be kept 'solid' but edges with faces with similar normals will get smoothed
              So a right-angle arris stays sharp and a nearly flat surface gets smoothed...
              ๐Ÿ˜’

              TIG

              1 Reply Last reply Reply Quote 0
              • B Offline
                baldaman
                last edited by 28 Sept 2011, 23:04

                ๐Ÿ˜ณ ๐Ÿ˜ณ ๐Ÿ˜ณ
                ... I am soooo stupid!
                Thank you very much, it works perfectly.
                Thank you very much master TIG

                1 Reply Last reply Reply Quote 0
                • T Offline
                  TIG Moderator
                  last edited by 29 Sept 2011, 08:07

                  That's OK ๐Ÿ˜‰
                  I should have spotted the error in your logic earlier too ๐Ÿ˜ฎ

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • artmusicstudioA Offline
                    artmusicstudio
                    last edited by 14 Oct 2013, 06:49

                    hello,
                    this piece of code is very helpful.
                    in my case this works:

                    SMOOTH LEFT

                    model=Sketchup.active_model
                    ss=group20.entities

                    You can assemble any collection of edges

                    Here it's from the model's current selection

                    edges=[]
                    ss.to_a.each{|e|
                    edges << e if e.class==Sketchup::Edge
                    e.entities.each{|ee|edges << ee if e.class==Sketchup::Edge}if e.class==Sketchup::Group
                    }
                    edges.each{|edge|
                    if edge.faces[1]
                    edge.soft=true
                    edge.smooth=true
                    end
                    }

                    BUT THIS ONE (smoothing with angle limit)
                    model=Sketchup.active_model
                    ss=group20.entities

                    You can assemble any collection of edges

                    Here it's from the model's current selection

                    edges=[]
                    ss.to_a.each{|e|
                    edges << e if e.class==Sketchup::Edge
                    e.entities.each{|ee|edges << ee if ee.class==Sketchup::Edge}if e.class==Sketchup::Group
                    }
                    edges.each{|edge|
                    ang=edge.faces[0].normal.angle_between(edge.faces[1].normal)
                    if edge.faces[1]
                    edge.soft=true if ang < 45.degrees
                    edge.smooth=true if ang < 45.degrees
                    end
                    }

                    is quit by following:

                    VAR. 0.1 k
                    load '01.rb'
                    Error: #<NoMethodError: undefined method normal' for nil:NilClass> C:/Program Files (x86)/Google/Google SketchUp 8/Plugins/01.rb:1516:in draw_stairs'
                    C:/Program Files (x86)/Google/Google SketchUp 8/Plugins/01.rb:1515:in each' C:/Program Files (x86)/Google/Google SketchUp 8/Plugins/01.rb:1515:in draw_stairs'
                    C:/Program Files (x86)/Google/Google SketchUp 8/Plugins/01.rb:973:in `each'

                    any idea about the "normal" problem?

                    thanx stan

                    1 Reply Last reply Reply Quote 0
                    • T Offline
                      TIG Moderator
                      last edited by 14 Oct 2013, 09:10

                      Recast:

                      edges.each{|edge|
                      ang=edge.faces[0].normal.angle_between(edge.faces[1].normal)
                      if edge.faces[1]
                        edge.soft=true if ang < 45.degrees
                        edge.smooth=true if ang < 45.degrees
                      end
                      }
                      

                      as

                      edges.each{|edge|
                      if edge.faces[1]
                        ang=edge.faces[0].normal.angle_between(edge.faces[1].normal)
                        edge.soft=true if ang < 45.degrees
                        edge.smooth=true if ang < 45.degrees
                      end
                      }
                      

                      because in YOUR version you are trying to get the normal of ALL edge's faces even if an edge doesn't have any faces ! Or if the face only has one face YOUR version fails when it can't find the normal of the non-existent second face !

                      TIG

                      1 Reply Last reply Reply Quote 0
                      • artmusicstudioA Offline
                        artmusicstudio
                        last edited by 14 Oct 2013, 19:04

                        YEAP!

                        smooth like a sup of tea with milk on a sunny afternon......

                        smoothing works perfect , thanx a lot ("again what learned", as we say here in bavaria)

                        lost a ot of time today with fighting again coordinate systems, whatever i do, the elements don't place themselves sometimes , where i expect them to, it seems, that within groups and components the time & space works different sometimes.....
                        stan

                        1 Reply Last reply Reply Quote 0
                        • G Offline
                          glro
                          last edited by 15 Oct 2013, 17:50

                          @tig said:

                          @thomthom said:

                          @tig said:

                          Make an array of the selected edges [or of the edges within selected groups etc].
                          Iterate through those edges and test it they have >1 face.

                          The native soft+smooth tool doesn't soft+smooth any edges that is connected to more or less than 2 faces.

                          OK just adjust the code so that it's a edge.faces[1] and not edge.faces[2] test...***

                          To work on a group's edges

                          
                          > ###... add this into the mix...
                          > groups=[]
                          > ss.to_a.each{|e|groups << e if e.class==Sketchup;;Group}
                          > groups.each{|group|
                          >   group.entities.to_a.each{|e|
                          >     if e.class==Sketchup;;Edge and e.faces.length==2 ###***
                          >       e.soft=true
                          >       e.smooth=true
                          >     end#if
                          >   }
                          > }
                          > ### ???
                          > 
                          

                          it works for groups, but not for components...
                          is it possible?

                          1 Reply Last reply Reply Quote 0
                          • T Offline
                            TIG Moderator
                            last edited by 15 Oct 2013, 21:12

                            Assuming ss=Sketchup.active_model.selection...

                            defns=[]
                            ss.grep(Sketchup;;ComponentInstance).each{|e|defns << e.definition}
                            defns.uniq!
                            defns.each{|defn|
                              defn.entities.grep(Sketchup;;Edge).each{|e|
                                if e.faces.length==2
                                  e.soft=true
                                  e.smooth=true
                                end
                              }
                            }
                            

                            or something similar...

                            TIG

                            1 Reply Last reply Reply Quote 0
                            • G Offline
                              glro
                              last edited by 16 Oct 2013, 07:08

                              @tig said:

                              Assuming ss=Sketchup.active_model.selection...

                              defns=[]
                              > ss.grep(Sketchup;;ComponentInstance).each{|e|defns << e.definition}
                              > defns.uniq!
                              > defns.each{|defn|
                              >   defn.entities.grep(Sketchup;;Edge).each{|e|
                              >     if e.faces.length==2
                              >       e.soft=true
                              >       e.smooth=true
                              >     end
                              >   }
                              > }
                              

                              or something similar...

                              yes...it works

                              this will save me time, since i noticed that some components edges come back visible in my models, for unknown reason...

                              now with just one clic, the problem is solved

                              thank you

                              1 Reply Last reply Reply Quote 0
                              • T Offline
                                TIG Moderator
                                last edited by 16 Oct 2013, 15:42

                                The unexpected reversion of smoothed edges to solid is a known bug.
                                Never save when in a edit session. Even an auto-save can trigger this, so never stay inside an edit session for longer than you need to...

                                TIG

                                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