sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    โš ๏ธ Important | Libfredo 15.6b introduces important bugfixes for Fredo's Extensions Update

    From string to not a string

    Scheduled Pinned Locked Moved Developers' Forum
    9 Posts 2 Posters 2.2k 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.
    • renderizaR Offline
      renderiza
      last edited by renderiza

      Hi,

      I have this problem where I have a string that I want to use as a line of code(not sure what to call it).

      Here is my example...

      sumx = "v[0].position.x + v[1].position.x + v[2].position.x"

      I want sumx to solve that math equation...Is this possible

      
      model = Sketchup.active_model
      ents = model.active_entities
      sel = model.selection
      faces = sel.grep(Sketchup;;Face)
      @addx = ["v[0].position.x"]
      @addy = ["v[0].position.y"]
      @addz = ["v[0].position.z"]
      
      model.start_operation('csplit')
      
        faces.each do |face|
          v = face.vertices
          num = v.length
          i = 1
          
          while i < num  do
            @addx << " + v[#{i}].position.x"
            @addy << " + v[#{i}].position.y"
            @addz << " + v[#{i}].position.z"
            i += 1
          end
          
          ax = @addx * ","
          sumx = ax.delete ","
          
          ay = @addy * ","
          sumy = ay.delete ","
          
          az = @addz * ","
          sumz = az.delete ","
      
          cx = sumx # v[0].position.x + v[1].position.x + v[2].position.x ... 
          cy = sumy # v[0].position.y + v[1].position.y + v[2].position.y ...
          cz = sumz # v[0].position.z + v[1].position.z + v[2].position.z ...
          
          px = cx / num
          py = cy / num
          pz = cz / num
      
          v.each do |vertex|
            p1 = [px, py, pz]
            p2 = vertex
            line = ents.add_line p1,p2
          end
         
        end
        sel.clear
      model.commit_operation
      

      Thanks!

      [url=https://www.sketchupcode.com/:z3kqsidd]My Extensions ...[/url:z3kqsidd]

      1 Reply Last reply Reply Quote 0
      • renderizaR Offline
        renderiza
        last edited by

        Yay! ๐Ÿ˜

        Here is updated code...

        model = Sketchup.active_model
        ents = model.active_entities
        sel = model.selection
        faces = sel.grep(Sketchup;;Face)
        @addx = ["v[0].position.x"]
        @addy = ["v[0].position.y"]
        @addz = ["v[0].position.z"]
        
        model.start_operation('csplit')
        
          faces.each do |face|
            @addx.clear
            @addy.clear
            @addz.clear
            @addx = ["v[0].position.x"]
            @addy = ["v[0].position.y"]
            @addz = ["v[0].position.z"]
         
            v = face.vertices
            num = v.length
            i = 1
           
            while i < num  do
              @addx << " + v[#{i}].position.x"
              @addy << " + v[#{i}].position.y"
              @addz << " + v[#{i}].position.z"
              i += 1
            end
           
            ax = @addx * ","
            sumx = ax.delete ","
           
            ay = @addy * ","
            sumy = ay.delete ","
           
            az = @addz * ","
            sumz = az.delete ","
           
            cx = eval("#{sumx}") # v[0].position.x + v[1].position.x + v[2].position.x
            cy = eval("#{sumy}") # v[0].position.y + v[1].position.y + v[2].position.y
            cz = eval("#{sumz}") # v[0].position.z + v[1].position.z + v[2].position.z
           
            px = cx / num
            py = cy / num
            pz = cz / num
        
            v.each do |vertex|
              p1 = [px, py, pz]
              p2 = vertex
              line = ents.add_line p1,p2
            end
        
          end
          sel.clear
        model.commit_operation
        

        If you think the code can improve please let me know! ๐Ÿ‘

        [url=https://www.sketchupcode.com/:z3kqsidd]My Extensions ...[/url:z3kqsidd]

        1 Reply Last reply Reply Quote 0
        • Dan RathbunD Offline
          Dan Rathbun
          last edited by

          Lines 5,6,7,15,16 & 17 refer to array reference v before the reference is made.

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • renderizaR Offline
            renderiza
            last edited by

            Will this cause problem even if v on lines 5,6,7,15,16 & 17 is part of a string and not a variable?

            Thanks!

            [url=https://www.sketchupcode.com/:z3kqsidd]My Extensions ...[/url:z3kqsidd]

            1 Reply Last reply Reply Quote 0
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              When you ned to have an index var,... replace:

                  v = face.vertices
                  num = v.length
                  i = 1
                 
                  while i < num  do
                    @addx << " + v[#{i}].position.x"
                    @addy << " + v[#{i}].position.y"
                    @addz << " + v[#{i}].position.z"
                    i += 1
                  end
              

              ... with this (remember that module Enumerable is mixed into class Array) :

                  v = face.vertices
                  v.each_with_index {|vert,i|
                    @addx << " + v[#{i}].position.x"
                    @addy << " + v[#{i}].position.y"
                    @addz << " + v[#{i}].position.z"
                  }
              

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                @renderiza said:

                Will this cause problem even if v on lines 5,6,7,15,16 & 17 is part of a string and not a variable?

                NO.. you are correct. They are just a string char at that point.

                So my mistake. (you got me) ๐Ÿ˜ฎ

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • renderizaR Offline
                  renderiza
                  last edited by

                  @dan rathbun said:

                  NO.. you are correct. They are just a string char at that point.

                  So my mistake. (you got me) ๐Ÿ˜ฎ

                  My life is complete!!! ๐Ÿคฃ

                  @dan rathbun said:

                  ... with this (remember that module Enumerable is mixed into class Array) :

                      v = face.vertices
                  >     v.each_with_index {|vert,i|
                  >       @addx << " + v[#{i}].position.x"
                  >       @addy << " + v[#{i}].position.y"
                  >       @addz << " + v[#{i}].position.z"
                  >     }
                  

                  That is great! With your suggestion I now don't need to start with an array that has a value!

                  Here is updated code...

                  model = Sketchup.active_model
                  ents = model.active_entities
                  sel = model.selection
                  faces = sel.grep(Sketchup;;Face)
                  @addx = []
                  @addy = []
                  @addz = []
                  
                  model.start_operation('csplit')
                  
                    faces.each do |face|
                      @addx.clear
                      @addy.clear
                      @addz.clear
                  
                      v = face.vertices
                      num = v.length
                    
                      v.each_with_index {|vert,i|
                        @addx << " + v[#{i}].position.x"
                        @addy << " + v[#{i}].position.y"
                        @addz << " + v[#{i}].position.z"
                      }
                     
                      ax = @addx * ","
                      sumx = ax.delete ","
                     
                      ay = @addy * ","
                      sumy = ay.delete ","
                     
                      az = @addz * ","
                      sumz = az.delete ","
                     
                      cx = eval("#{sumx}")
                      cy = eval("#{sumy}")
                      cz = eval("#{sumz}")
                     
                      px = cx / num
                      py = cy / num
                      pz = cz / num
                  
                      v.each do |vertex|
                        p1 = [px, py, pz]
                        p2 = vertex
                        line = ents.add_line p1,p2
                      end
                  
                    end
                    sel.clear
                  model.commit_operation
                  

                  I appreciate your help as always Dan!!! ๐Ÿ’š

                  [url=https://www.sketchupcode.com/:z3kqsidd]My Extensions ...[/url:z3kqsidd]

                  1 Reply Last reply Reply Quote 0
                  • Dan RathbunD Offline
                    Dan Rathbun
                    last edited by

                    String manipulation is quite slow in Ruby.

                    How about doing it with no strings?

                      def csplit()
                        #
                        model = Sketchup.active_model
                        ents = model.active_entities
                        sel = model.selection
                        faces = sel.grep(Sketchup;;Face)
                        #
                        model.start_operation('csplit')
                          #
                          faces.each do |face|
                            #
                            sum = Geom;;Point3d.new(0,0,0)
                            #
                            verts = face.vertices
                            n = verts.size.to_f
                            # use API Geom;;Point3d.+ instance method;
                            verts.each {|v| sum += ORIGIN.vector_to(v.position) }
                            #
                            avg = Geom;;Point3d.new( sum.x/n, sum.y/n, sum.z/n )
                            #
                            verts.each {|v| ents.add_line( avg, v ) }
                            #
                          end # each face
                          #
                        model.commit_operation
                        #
                      rescue => e
                        #
                        puts "Error <#{e.class.name}; #{e.message} >"
                        puts e.backtrace if $VERBOSE
                        #
                        model.abort_operation
                        #
                      else # when no errors;
                        #
                        sel.clear
                        #
                      end # csplit()
                    

                    FIXED: (line 17) Geom::Point3d#+ cannot take a Geom::Point3d as an arg, even tho the API says it can. Replaced sum += v.position with: sum += ORIGIN.vector_to(v.position)

                    ๐Ÿ’ญ

                    I'm not here much anymore.

                    1 Reply Last reply Reply Quote 0
                    • renderizaR Offline
                      renderiza
                      last edited by

                      Dan Rathbun I can't thank you enough you sir are brilliant!

                      [url=https://www.sketchupcode.com/:z3kqsidd]My Extensions ...[/url:z3kqsidd]

                      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