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

    Plugin search help -- combining lines

    Scheduled Pinned Locked Moved Newbie Forum
    sketchup
    29 Posts 7 Posters 1.1k 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.
    • A Offline
      agamemnus
      last edited by

      A problem with that script is that it does not seem to always dig inside groups/components correctly and misses some lines. πŸ˜•

      Edit: tried this.... doesn't work. I have a feeling I am missing something.

      Edit 2: Used "if (e.class != Sketchup::Face)" instead of
      "if (e.class == Sketchup::Group)"... why does one work and not the other? (the == group one doesn't seem to hit?) Also... any better solutions here? This is the best I could cobble up..

      
      require 'sketchup.rb'
      # (c) Carlo Roosen 2004
      
      def repair_broken_lines (eparent)
        total = 0
        trunk = Array.new
        ss = eparent.entities
        #search all edges in selection set
        for e in ss
          if (e.kind_of?(Sketchup;;Edge))
            p=e.parent
            #take both vertices 
            for v in e.vertices 
              #take all edges connected to v (including e)
              es=v.edges
              #when two edges are connected
              if (es.length==2)
                vec1 = es[0].line[1]
                vec2 = es[1].line[1]
                #and both are in the same direction
                if (vec1.parallel?(vec2))
                  #then the two lines can be repaired
                  #this is done by generating a new line from the vertex to a random point
                  l = p.entities.add_line (v.position, Geom;;Point3d.new(3.45,6.78,9.12))
                  #and put that line in a trunk
                  trunk.push(l)
                end
              end
            end
      	else
      	 if (e.class != Sketchup;;Face)
      	  total += repair_broken_lines (e) 
      	 end
      	end
        end
      
        #erase all lines in trunk
        total += trunk.length
        for l in trunk
          l.erase!
        end
        return total
      end
      
      def repair_broken_lines_recurse
      
       total = 0;
       m = Sketchup.active_model;
       
       # Define everything as one undo operation.
       m.start_operation "Repair Broken Lines"
       total = repair_broken_lines (m)
       UI.messagebox ("#{total} lines repaired")
       m.commit_operation
      end
      
      
      selection=Sketchup.active_model.selection
      if( not file_loaded?("repair_broken_lines.rb") )
          UI.add_context_menu_handler do |context_menu| 
              if selection.count>1
                 context_menu.add_item("Repair Broken Lines") { repair_broken_lines_recurse }
              end
          end
      end
      
      UI.menu("Plugins").add_item("Repair Broken Lines") { repair_broken_lines_recurse }
      
      file_loaded ("repair_broken_lines.rb")
      
      
      1 Reply Last reply Reply Quote 0
      • TIGT Offline
        TIG Moderator
        last edited by

        Here's my working version...

        ### Original idea (c) Carlo Roosen 2004
        ### Modified (c) TIG 2011 
        ### Now also repairs edges inside groups/instances in selection...
        ###
        require 'sketchup.rb'
        ###
        class Repair_broken_lines
         def initialize(ents=nil)
          model=Sketchup.active_model
          lines_to_go=[]
          if not ents
            $total_repair_broken_lines=0
            ss=model.selection.to_a
            begin
              model.start_operation("Repair Broken Lines",true)
            rescue
              model.start_operation("Repair Broken Lines")
            end
          else
            ss=ents
          end#if
          #check all edges in selection set OR entities passed as argument
          ss.each{ |e|
            if e.kind_of?(Sketchup;;Edge) #take both vertices 
              e.vertices.each{ |v| #take all edges connected to v (including e)
                es=v.edges #when two edges are connected
                if es.length==2
                  vec1=es[0].line[1]
                  vec2=es[1].line[1] #and both are in the same direction
                  if vec1.parallel?(vec2) #then the two lines can be repaired
                    #make a new line from that vertex to a random point
                    pt=Geom;;Point3d.new(1+rand, 1+rand, 1+rand)
                    nline=e.parent.entities.add_line(v.position, pt)
                    lines_to_go << nline if nline and nline.valid?
                  end#if
                end#if
              }#end v
            elsif e.kind_of?(Sketchup;;Group)
              Repair_broken_lines.new(e.entities.to_a)
            elsif e.kind_of?(Sketchup;;ComponentInstance)
              Repair_broken_lines.new(e.definition.entities.to_a)
            end#if
          }#end e
          if not $total_repair_broken_lines
            $total_repair_broken_lines=lines_to_go.length
          else
            $total_repair_broken_lines=$total_repair_broken_lines + lines_to_go.length
          end#if
          lines_to_go.each{ |e| e.erase! if e.valid? }#erase all lines_to_go
          if not ents
            model.commit_operation 
            UI.messagebox("#{$total_repair_broken_lines} Lines Repaired.")
          end#if
         end#def initialize
        end#class
        ###
        if not file_loaded?(File.basename(__FILE__))
          if $submenu4 # TIG menus
            $submenu4.add_item("Repair Broken Lines [Selection]"){ Repair_broken_lines.new() }
          else
            UI.menu("Plugins").add_item("Repair Broken Lines [Selection]"){ Repair_broken_lines.new() }
          end
        end
        file_loaded(File.basename(__FILE__))
        ###
        
        

        TIG

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

          Thanks. Looks like you made total_repair_broken_lines a global. That makes more sense than to create a useless stack as I did. I didn't want to create a stack either but I didn't want to create a global, and I am not 100% familiar with Ruby/am a bit forgetful. I did some searching now though and I see that @@ is class scope, so how about @@ instead of $?

          If the code stays here people won't be able to find it very easily. How about re-releasing this plugin, as well as that "default face" snippet you made earlier for me, in the plugins forum?

          Also: another problem I noticed is that it tries to repair lines that aren't repairable, like curve endings and single lines. (attached)

          
              ### Original idea (c) Carlo Roosen 2004
              ### Modified (c) TIG 2011
              ### Now also repairs edges inside groups/instances in selection...
              ###
              require 'sketchup.rb'
              ###
              class Repair_broken_lines
              def initialize(ents=nil)
                model=Sketchup.active_model
                lines_to_go=[]
                if not ents
                  @@total_repair_broken_lines=0
                  ss=model.selection.to_a
                  begin
                    model.start_operation("Repair Broken Lines",true)
                  rescue
                    model.start_operation("Repair Broken Lines")
                  end
                else
                  ss=ents
                end#if
                #check all edges in selection set OR entities passed as argument
                ss.each{ |e|
                  if e.kind_of?(Sketchup;;Edge) #take both vertices
                    e.vertices.each{ |v| #take all edges connected to v (including e)
                      es=v.edges #when two edges are connected
                      if es.length==2
                        vec1=es[0].line[1]
                        vec2=es[1].line[1] #and both are in the same direction
                        if vec1.parallel?(vec2) #then the two lines can be repaired
                          #make a new line from that vertex to a random point
                          pt=Geom;;Point3d.new(1+rand, 1+rand, 1+rand)
                          nline=e.parent.entities.add_line(v.position, pt)
                          lines_to_go << nline if nline and nline.valid?
                        end#if
                      end#if
                    }#end v
                  elsif e.kind_of?(Sketchup;;Group)
                    Repair_broken_lines.new(e.entities.to_a)
                  elsif e.kind_of?(Sketchup;;ComponentInstance)
                    Repair_broken_lines.new(e.definition.entities.to_a)
                  end#if
                }#end e
                if not @@total_repair_broken_lines
                  @@total_repair_broken_lines=lines_to_go.length
                else
                  @@total_repair_broken_lines=@@total_repair_broken_lines + lines_to_go.length
                end#if
                lines_to_go.each{ |e| e.erase! if e.valid? }#erase all lines_to_go
                if not ents
                  model.commit_operation
                  UI.messagebox("#{@@total_repair_broken_lines} Lines Repaired.")
                end#if
              end#def initialize
              end#class
              ###
              if not file_loaded?(File.basename(__FILE__))
                if $submenu4 # TIG menus
                  $submenu4.add_item("Repair Broken Lines [Selection]"){ Repair_broken_lines.new() }
                else
                  UI.menu("Plugins").add_item("Repair Broken Lines [Selection]"){ Repair_broken_lines.new() }
                end
              end
              file_loaded(File.basename(__FILE__))
              ###
          
          

          circle.skp

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

            You are right about setting the variable to 'class' using @@ rather than 'global' with $ - it's much safer - I was churning that out rather too quickly... πŸ˜’
            The 'trick' to force broken edges into one only works on plain edges.
            With an edge that's part of a curve it can't... for you next step why not see if you can find all edges that are co-linear [it already does that and if one is part of a curve then remember all of the curves edges in an array and then explode the curve, immediately remake the curve leaving out the one edge you want to heal. Then it will heal back into its co-linear mate... It just needs a test in the iterated loops... πŸ€“
            When 'we' get it 'perfect' then 'we' could issue a joint 3-way update... πŸ˜‰

            TIG

            1 Reply Last reply Reply Quote 0
            • Rich O BrienR Online
              Rich O Brien Moderator
              last edited by

              You mean 4-way

              Download the free D'oh Book for SketchUp πŸ“–

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

                @unknownuser said:

                You mean 4-way

                Like "Additional semi-humorous material supplied by Rich O'Brien." πŸ˜‰

                TIG

                1 Reply Last reply Reply Quote 0
                • Rich O BrienR Online
                  Rich O Brien Moderator
                  last edited by

                  If you mean that 'Disconbobulator' isn't a good name for a plugin then so be it. It may not be a impressive as 'Quadrilateralizer' but its close!

                  Download the free D'oh Book for SketchUp πŸ“–

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

                    @unknownuser said:

                    If you mean that 'Disconbobulator' isn't a good name for a plugin then so be it. It may not be a impressive as 'Quadrilateralizer' but its close!

                    I wanted something to explain what it did in the name. RickW's 'Windowizer' makes Windows, my 'Latticeizer' makes Lattices and 'DeBabelizer' translates text [Babelfish/TowerOfBabel etc]... When you make triangles out of a face you 'Triangulate' it BUT when you make a face into quadrilaterals you don't say you 'Quadrilateralate' it [that was an early alternative name!]; an '-izer' ending suggest 'doing' so 'Quadrilateralizer' it became... 'Quadrilateralizer' gets 635 hits on Google, 235 of them when it's combined with 'TIG' - strangely most are Chinese πŸ˜’ πŸ˜‰

                    TIG

                    1 Reply Last reply Reply Quote 0
                    • GaieusG Offline
                      Gaieus
                      last edited by

                      Well, at least (here, on the forums) we do not have to pronounce that quadri... plugin.

                      Back in Mountain View in 2008, I even had issues with the Protractor tool (certainly Rich will chime in with some ideas about drinking less the night before and such I am sure)
                      πŸ˜’

                      Gai...

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

                        @tig said:

                        You are right about setting the variable to 'class' using @@ rather than 'global' with $ - it's much safer - I was churning that out rather too quickly... πŸ˜’
                        The 'trick' to force broken edges into one only works on plain edges.
                        With an edge that's part of a curve it can't... for you next step why not see if you can find all edges that are co-linear [it already does that and if one is part of a curve then remember all of the curves edges in an array and then explode the curve, immediately remake the curve leaving out the one edge you want to heal. Then it will heal back into its co-linear mate... It just needs a test in the iterated loops... πŸ€“
                        When 'we' get it 'perfect' then 'we' could issue a joint 3-way update... πŸ˜‰

                        Ummm, maybe later. 😲 Doesn't need to be perfect...

                        Anywayz ... here is another problem: a set of connected lines were 2 of them are said to be repaired, but never are. I attached the model. I think the tolerance is too low perhaps?


                        aline.skp

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

                          The edges in the 'line' are not co-linear, the first two edges' vectors differ noticeably and the rest diverge even more... Vector3d(0.0104132, 0.999946, 0) and Vector3d(0.0101495, 0.999948, 0)... so they won't be joined by Sketchup into one edge no matter how hard you try - but you could of course 'weld' them into a 'curve'......

                          TIG

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

                            @tig said:

                            The edges in the 'line' are not co-linear, the first two edges' vectors differ noticeably and the rest diverge even more... Vector3d(0.0104132, 0.999946, 0) and Vector3d(0.0101495, 0.999948, 0)... so they won't be joined by Sketchup into one edge no matter how hard you try - but you could of course 'weld' them into a 'curve'......

                            Yeah, I see...but.... the plugin says they are... or thinks they are...

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

                              @agamemnus said:

                              @tig said:

                              The edges in the 'line' are not co-linear, the first two edges' vectors differ noticeably and the rest diverge even more... Vector3d(0.0104132, 0.999946, 0) and Vector3d(0.0101495, 0.999948, 0)... so they won't be joined by Sketchup into one edge no matter how hard you try - but you could of course 'weld' them into a 'curve'......

                              Yeah, I see...but.... the plugin says they are... or thinks they are...
                              I expect that's because the 'parallel?' test for vectors returns true but Sketchup itself still won't join the lines as they are not co-linear...
                              We could replace the test with something else as the two vectors are clearly not equal - perhaps comparing them as arrays - so v1.to_a==v2.to_a returns false [correctly] even when v1.parallel?(v2) returns true !!

                              TIG

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

                                @tig said:

                                I expect that's because the 'parallel?' test for vectors returns true but Sketchup itself still won't join the lines as they are not co-linear...
                                We could replace the test with something else as the two vectors are clearly not equal - perhaps comparing them as arrays - so v1.to_a==v2.to_a returns false [correctly] even when v1.parallel?(v2) returns true !!

                                I see... so it's really a Sketchup bug. "parallel" is built-in, (right?), but it doesn't have the same precision as the main program, which is a decently-sized oversight.

                                In terms of comparing them as arrays: that's probably slower, but it might have the same comparison as the main program. (I don't know)

                                I'm not entirely sure how Sketchup does precision anyhow... floats (32 or sometimes64 bit numbers with decimal points)? Really big integers masquerading as floats? Some weird combination? There's a big difference... two string representations of a float will often look different but actually have the same float value. I suspect something like that is happening here.

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

                                  Bump!

                                  I'm going to forget that TIG's code/solution existed in 2 months and re-post my question... ❗

                                  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