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

    Find the global position of a Vertex in a Group/Component

    Scheduled Pinned Locked Moved Developers' Forum
    25 Posts 6 Posters 4.7k Views 6 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.
    • thomthomT Offline
      thomthom
      last edited by

      Adam, that code returns the transformation of all the copies of that instance? But no way to track back a single path to the model, like you get with PickHelper?

      Thomas Thomassen β€” SketchUp Monkey & Coding addict
      List of my plugins and link to the CookieWare fund

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

        @gbabcock said:

        From there you can walk UP the hierarchy of ComponentInstances

        Well, not quite... πŸ˜•

        The Parent of a ComponentInstance is a ComponentDefinition, which can exist in more than one ComponentInstance (for example, if you have multiple instances of a Component that has nested Components). So you can't even walk up the hierarchy of ComponentInstances. 😑

        But walking down works well! My use case is where I have selected a Group/Component (but not opened it) and need the global position of every Vertex. With limited testing performed, this code seems to give an accurate position report:

        #get vertices
        def Start
        	#get vertices
        	verts=[] #initialize vertices array
        	trans_h=[] #initialize transformation array use to store hierarchy of transformations
        	verts=createVerticesArray(sel,trans_h,verts)
        end
        
        def createVerticesArray(sel,trans_h,verts)
        	sel.each{|ent|
        		if (ent.is_a? Sketchup;;Group) || (ent.is_a? Sketchup;;ComponentInstance)
        			trans_h.push(ent.transformation) #push the Group/Component tranformation onto the array
        			ents=ent.definition.entities #get the entities in this Group/Component instance
        			verts=createVerticesArray(ents, trans_h, verts) #recurse
        		elsif (ent.is_a? Sketchup;;Edge)
        			ent.vertices.each{|vert| #begin analysis of vertices in this edge
        					puts vert if @debugFFD
        				#get global position of the vertex by applying the hierarchy of transformations
        				v_gpos=vert.position #returns local Point3d position of vertex
        					puts v_gpos if @debugFFD
        				flat_t=flatten(trans_h) #get the flattened transformation for the hierarchy
        					puts flat_t if @debugFFD
        				v_gpos.transform! flat_t #transform the vertex to get the global position
        				vert.set_attribute("vert","gpos",v_gpos)
        				verts.push(vert)
        			}		
        		end
        	}
        	#verts now contains redundant verts. remove duplicates.
        	verts.uniq!			
        	return verts
        end
        
        #thanks to Adam for the idea!
        def flatten(trans_h) #returns a flattened transformation from an array of transformations for the instance hierarchy
        	flat_t=Geom;;Transformation.new #create an entity transformation object
        	
        	#apply the hierarchy of transformations to the entity transformation
        	trans_h.each{|t|
        		flat_t=flat_t* t
        	}
        	return flat_t
        end
        
        

        It performs well too, though I'm sure it could be improved. I have used it on a component with ~8400 entities and 1720 vertices, and get the results back in 0.25 seconds consistently.

        Glenn

        Glenn

        1 Reply Last reply Reply Quote 0
        • D Offline
          dburdick
          last edited by

          Interesting thread. I'm trying to do figure out how to apply transformations to SU mesh objects for exporting. The object.transform! method seems to only perform rotation and scaling but not translation (e.g. the delta movement along the x, y, and z axis). I see that the transform matrix does indeed contain the translation values in the last row (row 4) of the matrix. Why doesn't the transform! method also perform the translation? Is this a bug or a feature?

          1 Reply Last reply Reply Quote 0
          • thomthomT Offline
            thomthom
            last edited by

            Never had any problems with translation and .tranform!.
            Maybe post a code snippet? (though in a new thread - as we're moving towards a new topic)

            Thomas Thomassen β€” SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 Reply Last reply Reply Quote 0
            • K Offline
              kwalkerman
              last edited by

              one small correction to the code posted by Glenn: after calling createVerticesArray on line 14, add the line:

              trans_h.pop

              otherwise, if there are multiple sub-components in the entities collection, you will take into account the transformation of any entity that came before.

              Otherwise, great code, very useful.

              Thanks!

              --
              Karen

              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