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!
    πŸ›£οΈ Road Profile Builder | Generate roads, curbs and pavements easily Download

    [req] help with simple plugin

    Scheduled Pinned Locked Moved Plugins
    10 Posts 3 Posters 988 Views 3 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.
    • G Offline
      georglorenz
      last edited by

      Hi, I am new to ruby scripting and amazed by the possibilities. I am trying to write a simple script that distorts the geometry of all selected faces by a random amount.

      I first triangulate all selected faces with TIGs triangulateFaces that I call from within the script which works fine. Then I want to transform each vertices of every face by a random x,y,and z amount.

      with my limited programming experience I am so far unable to get it going. Here is what I thought:

      for f in faces
      for v in f.vertices
      v.position = v.position + [xrand,yrand,zrand]
      end #for
      end #for

      But that (and 23 other options I tried) does not work. Can anyone help me here?

      1 Reply Last reply Reply Quote 0
      • J Offline
        Jim
        last edited by

        It's a good thought, but as you found out - it doesn't work that way.

        To move vertices, faces, and edges you will need to go through the Entities collection.

        Something like should work:

        
        for f in faces
        for v in f.vertices
          tr = Geom;;Transformation.new(v.position + [xrand,yrand,zrand])
          Sketchup.active_model.entities.transform_entities(tr, v)
        end #for
        end #for
        

        Hi

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

          You will need a line the define xrand etc...
          Something like...
          xrand=10*rand
          and the same for yrand and zrand - the 10* give an offset between 0" and 10"...
          This only adds to the vertex position - you need another line transforming the vertices in the -ve, like
          xrand=-10*rand etc afterwards ?

          TIG

          1 Reply Last reply Reply Quote 0
          • G Offline
            georglorenz
            last edited by

            Ok. Thank you guys. Almost there. The main method works fine in the webconsole, but when I save it as a script it tells me: "distort.rb:42: parse error, expecting `kEND'", which I guess means that end end is missing in line 42 (before the menu).
            I seriously have no Idea why. Please help me!

            
            # gl_distort 
            
            require 'sketchup.rb'
            
            def GL_distort
            
            model = Sketchup.active_model
            entities = model.entities
            selection = model.selection
            
            prompts = ['Random Distortion Distance']
            defaults = [0.to_l]
            results = UI.inputbox prompts, defaults, 'Distance for random distortion;'
            distance = results [0]
            
            model.start_operation "Distort"
            
            selection.each do |e| 
            	if (e.is_a? Sketchup;;Face)	
               		for v in e.vertices
                       		xrand=(-distance/2)+distance*rand
                       		yrand=(-distance/2)+distance*rand
                       		zrand=(-distance/2)+distance*rand
                       		# puts(xrand, yrand, zrand)          
                       		vector = Geom;;Vector3d.new xrand,yrand,zrand
                       		tr = Geom;;Transformation.translation vector
                       		Sketchup.active_model.entities.transform_entities(tr, v)
                    	end #for
            	end #if
            end #do
            
            model.commit_operation
            
            end #main
            
            
            
            ### Menu ###
            
            if not file_loaded?(__FILE__)
            
              UI.menu("Plugins").add_item("Distort"){GL_distort}
            
            end #if
             
            
            file_loaded(__FILE__)
            
            
            
            1 Reply Last reply Reply Quote 0
            • TIGT Offline
              TIG Moderator
              last edited by

              Change from GL_distort to gl_distort a def must start with a lowercase letter...

              TIG

              1 Reply Last reply Reply Quote 0
              • G Offline
                georglorenz
                last edited by

                @tig said:

                Change from GL_distort to gl_distort a def must start with a lowercase letter...

                still the same error...

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

                  Changed every GL_distortto lowercase ?
                  Works fine for me...

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • G Offline
                    georglorenz
                    last edited by

                    @tig said:

                    Changed every GL_distortto lowercase ?
                    Works fine for me...

                    yes. both of them. thank you. I guess it has something to do with the "for v in e.vertices loop". If I take it out completely it parses fine. Can it be that something would not work in Sketchup 6? I am still running v6 on a mac. Strange thing is: it runs fine in the webconsole. Any idea how to resolve this?

                    Thanks for your time. G

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

                      This is my version that works fine in v7.
                      Try it in v6...#gl_distort.rb

                      TIG

                      1 Reply Last reply Reply Quote 0
                      • G Offline
                        georglorenz
                        last edited by

                        TIG: Thank you. It works. Don't ask me why. Your and my code are identical with the exception of a couple of blank lines. I checked that twice and then again. And side by side. And then again. And I have no idea. But it its working. πŸ˜„

                        I added input for xyz coordinates as you can see on the image. The crinkled surface was distorted only along the z axis, the top plane of the cube was distorted in three dimensions.

                        This is just for fun. Please use at your own risk and save before using. It crashed on me a couple of times already.

                        Thank you much for all your time. G


                        xyz_distort_examples.jpg


                        gl_xyzdistort.rb

                        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