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

    [Plugin] triangulateFaces.rb v1.2 20101120

    Scheduled Pinned Locked Moved Plugins
    97 Posts 21 Posters 109.1k Views 21 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.
    • jeff hammondJ Offline
      jeff hammond
      last edited by

      @tig said:

      It's broken... the UV mapping was CJP's but it still needs fixing...

      ah, ok..
      too bad πŸ˜„

      [fwiw - i can manually triangulate the sphere using and everything turns out ok.. i guess this script is doing something other than just drawing lines to cut quads in half?]

      dotdotdot

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

        @unknownuser said:

        @tig said:

        It's broken... the UV mapping was CJP's but it still needs fixing...

        ah, ok..
        too bad πŸ˜„

        [fwiw - i can manually triangulate the sphere using and everything turns out ok.. i guess this script is doing something other than just drawing lines to cut quads in half?]

        It triangulates the quads and tries to fix the UV mapping - obviously very badly !!!! CJP help! ❗

        TIG

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

          See this new script just for selected quad faces - it keeps UV mapping etc...
          http://forums.sketchucation.com/viewtopic.php?p=201025#p201025

          TIG

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

            @tig said:

            Known Issues: Back Materials are kept, but these Texture UVs cannot be re-used;
            there's a Ruby Console warning message if this problem is found...
            Solution: use the front faces only for textures IF you might be triangulating later.

            Why is it that you can't preserve the UVs of the backfaces?

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

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

              We tried [CJP+me] but we couldn't get it to work - any ideas on fixing the whole issue of triangulation and keep UV mapping to front and back faces would be appreciated...

              TIG

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

                hm... looking at the code:

                mesh=face.mesh(1)
                This will give you a PolygonMesh with only the FrontUV.

                mesh=face.mesh(3) will give you front and back.
                but you need to change this as well: uvs=mesh.uvs(true) true will give you set of front UVs, false will give you back UVs if you specified that in the .mesh method.

                I'm not quite sure I understand the purpose of this:
                outmesh = Geom::PolygonMesh.new faces.each{|f|outmesh.add_polygon(verts[f[0].abs-1],verts[f[1].abs-1],verts[f[2].abs-1])}
                Why create a new PolygonMesh? Rearranging the polygons?

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

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

                  This was CJP's code...
                  I've messed on with your ideas but can only get the front OR back UVs to work... how do I get both ? Here's the re-jigged code so far...

                  def triangulateFace(face)
                      mesh=face.mesh(3)
                      verts=mesh.points
                      ents=Sketchup.active_model.active_entities
                      mat=face.material
                      bac=face.back_material
                      face.erase!
                      grp=ents.add_group
                      grp.entities.add_faces_from_mesh(mesh)
                      grp.entities.each{|e|
                          if e.class==Sketchup;;Edge
                              e.smooth=false
                              e.soft=false           
                          elsif e.class==Sketchup;;Face
                            uva=verts.index(e.vertices[0].position)
                            uvb=verts.index(e.vertices[1].position)
                            uvc=verts.index(e.vertices[2].position)
                            if mat
                              uvsF=mesh.uvs(true)
                              e.position_material(mat, [verts[uva],uvsF[uva], verts[uvb],uvsF[uvb], verts[uvc],uvsF[uvc]], true)
                            end#if
                            if bac
                              uvsB=mesh.uvs(false)
                              e.position_material(bac,[verts[uva],uvsB[uva], verts[uvb],uvsB[uvb], verts[uvc],uvsB[uvc]], false)
                            end#if
                          end#if
                      }
                      grp.explode
                  end#def
                  

                  TIG

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

                    That bit of code seem to work.

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

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

                      @thomthom said:

                      That bit of code seem to work.

                      It does work for the back_material but it doesn't map the front material's uvs...
                      Try running it on a face with a hole in it and and materials front and back - both adjusted at angles/shear etc with Texture tool... Both materials are put back onto the now triangulated faces but the front material will be at its default settings...

                      I can't see how to do it πŸ˜•

                      TIG

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

                        Holes and sheared textures seems fine.

                        But, when I distort them, so the texture doesn't fit to a parallelogram, then it fails.
                        And that's excatly the conversation I've been having with Whaat a couple of days ago. That in order to sample textures which are distorted you need four points. Which leads to the question of PolygonMeshes: what do you do then, because if you just sample the UV from each point in the polygon you only get tree samples.

                        I wonder if PolygonMesh.uv_at(u,v) can be used though. The manual is not clear on this method. The description and example don't add up.

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

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

                          See what you mean - I had a distorted front face that failed...
                          if you have 4 ubs's how do we check ? πŸ˜•

                          TIG

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

                            I have some thoughts... πŸ’­
                            The original face's mesh has a number of points - 3 or more.
                            A texture usually has 3 uvs 'points'.
                            A distorted texture has 4 uvs 'points'.
                            How do these uvs 'points' relate to the mesh points ? If you give them the equivalent 'index' then they'll work until index=3...
                            A face made from the mesh always has 3 points, these relate to the mesh points in sets of 3 - but how do these tie back to the texture uvs 'points' ? The fourth one index=3 fails ???
                            How do we make an array to place the material that has this fourth pair of a 3D point and a uvs 'point' ? It must reflect the 'extra point' somehow ??

                            I shall sleep on it and see if the little-grey-cells come up with anything... ➑

                            TIG

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

                              For my UV plugins I have used the UVHelper to sample the points. What I did then was sample four points of the face's place - completely ignoring the face's vertices.

                              Maybe, for each face that's turned into a PolygonMesh, sample four points of the front and back. Then once converted into PolygonMesh, apply the sampled UV points to each of the polygon faces. That should work. All the created polygon faces are still on the old face's plane.

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

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

                                More ideas... let me sleep... zzzzzzzzzzzzz x πŸ’­

                                TIG

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

                                  def triangulateFace(face)
                                  ### if already a triangle leave alone...
                                   if face.vertices[3]
                                    mesh=face.mesh(3)
                                    ents=face.parent.entities
                                    mat=face.material
                                    bac=face.back_material
                                    ###
                                    p0=face.vertices[0].position
                                    p1=face.vertices[1].position
                                    p2=face.vertices[2].position
                                    p3=face.vertices[3].position
                                    ### get uvs
                                    tw=Sketchup.create_texture_writer
                                    uv_helperF=face.get_UVHelper(true,false,tw)
                                    uv_helperB=face.get_UVHelper(false,true,tw)
                                    uf0=uv_helperF.get_front_UVQ(p0)
                                    uf1=uv_helperF.get_front_UVQ(p1)
                                    uf2=uv_helperF.get_front_UVQ(p2)
                                    uf3=uv_helperF.get_front_UVQ(p3)
                                    ub0=uv_helperB.get_back_UVQ(p0)
                                    ub1=uv_helperB.get_back_UVQ(p1)
                                    ub2=uv_helperB.get_back_UVQ(p2)
                                    ub3=uv_helperB.get_back_UVQ(p3)
                                    ###
                                    grp=ents.add_group
                                    grp.entities.add_faces_from_mesh(mesh)
                                    grp.entities.each{|e|
                                      if e.class==Sketchup;;Edge
                                        e.smooth=false
                                        e.soft=false     
                                      elsif e.class==Sketchup;;Face
                                        if mat
                                          e.position_material(mat,[p0,uf0, p1,uf1, p2,uf2, p3,uf3], true)
                                        end#if
                                        if bac
                                          e.position_material(bac,[p0,ub0, p1,ub1, p2,ub2, p3,ub3], false)
                                        end#if
                                      end#if
                                    }
                                    face.erase!
                                    grp.explode
                                   end#if
                                  end#def
                                  

                                  Seems to me that this should work... but it doesn't - Thomthom, any ideas πŸ˜•

                                  TIG

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

                                    
                                    def triangulateFace(face)
                                    ### if already a triangle leave alone...
                                    if face.vertices[3]
                                      mesh=face.mesh(3)
                                      ents=face.parent.entities
                                      mat=face.material
                                      bac=face.back_material
                                      ###
                                    	# (TT)
                                    	# Instead sampling vertices we sample points of the face's plane.
                                    	# This is because we need four points, and some times a face only has tree vertices.
                                    	# And we also get the wrong result if any of the first four vertices are co-linear.
                                    	samples = []
                                    	samples << face.vertices[0].position			 # 0,0 | Origin
                                    	samples << samples[0].offset(face.normal.axes.x) # 1,0 | Offset Origin in X
                                    	samples << samples[0].offset(face.normal.axes.y) # 0,1 | Offset Origin in Y
                                    	samples << samples[1].offset(face.normal.axes.y) # 1,1 | Offset X in Y
                                      ### get uvs
                                      tw=Sketchup.create_texture_writer
                                    	# (TT)
                                    	uv_helper=face.get_UVHelper(true,true,tw) # (TT) Only need one UV Helper
                                    	xyz = []
                                    	uv_f = []
                                    	uv_b = []
                                    	samples.each { |position|
                                    		# XYZ 3D coordinates
                                    		xyz << position
                                    		# UV 2D coordinates
                                    		# Front
                                    		uvq = uv_helper.get_front_UVQ(position)
                                    		uv_f << flattenUVQ(uvq)
                                    		# Back
                                    		uvq = uv_helper.get_back_UVQ(position)
                                    		uv_b << flattenUVQ(uvq)
                                    	}
                                      ###
                                      grp=ents.add_group
                                      grp.entities.fill_from_mesh(mesh, true, 0) # (TT) Adds the mesh without soft/smooth edges. (and faster)
                                      grp.entities.each{|e|
                                        next unless e.class==Sketchup;;Face
                                          if mat
                                    		# (TT)
                                    		# Position texture.
                                    		pts = []
                                    		(0..3).each { |i|
                                    			pts << xyz[i]
                                    			pts << uv_f[i]
                                    		}
                                            e.position_material(mat,pts, true)
                                          end#if
                                          if bac
                                    		# (TT)
                                    		# Position texture.
                                    		pts = []
                                    		(0..3).each { |i|
                                    			pts << xyz[i]
                                    			pts << uv_b[i]
                                    		}
                                            e.position_material(bac,pts, false)
                                          end#if
                                      }
                                      face.erase!
                                      grp.explode
                                    end#if
                                    end#def
                                    # (TT)
                                    # Get UV coordinates from UVQ matrix.
                                    def flattenUVQ(uvq)
                                    	return Geom;;Point3d.new(uvq.x / uvq.z, uvq.y / uvq.z, 1.0)
                                    end
                                    
                                    

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

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

                                      Thanks to CPhillips's inciteful ideas I have now made a 'joint' script called 'triangulateFaces.rb' which is attached. It uses CPhillips's triangulateFace(face) code [with a slight TIG addition for back_materials] and the TIG Plugin triangulateFaces(face_array)...
                                      Originally 2009 (c) CPhillips* then (c) TIG** THEN (c) ThomThom ***
                                      Script: triangulateFaces.rb
                                      Code Usage: triangulateFace(face)*
                                      Result: it triangulates a face... all Texture UVs are kept.
                                      Plugin Usage: triangulateFaces(faces_array)**
                                      Result: it triangulates faces in a selection...
                                      v1.0
                                      First Release: Def Code 'mesh' idea by CPhillips*,
                                      retained back_materials added by TIG [failed] ###,
                                      Plugin parts by TIG**. 20090729
                                      v1.1
                                      Rewritten entirely by TIG... THEN completely corrected by Thomthom (TT)!***
                                      It now retains all Texture mapping successfully. 20091203
                                      v1.2
                                      Triangulated faces with 4 sides glitch fixed using intersection.
                                      Get the latest version from here http://sketchucation.com/pluginstore?pln=triangulateFaces

                                      TIG

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

                                        Here's v1.1 http://forums.sketchucation.com/viewtopic.php?p=175613#p175613
                                        β˜€
                                        Thanks to Thomtom's knowledge of uvs mapping etc it now successfully triangulates any face [even with holes like Swiss Cheese] and keeps the front AND back uv texture mapping as it was ! Thanks!

                                        TIG

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

                                          Hi TIG,

                                          Would it be possible for the plugin to triangulate faces with a more "even" or "regular" triangles? After this topic, I thought maybe pre-triangulating the face on the ramp would spare some extra hand-work but it seems that the plugin triangulates the faces just exactly the same way native SU does when autofolding.


                                          TriangulateFaces.jpg


                                          TriangulateFaces.skp

                                          Gai...

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

                                            @gaieus said:

                                            Hi TIG,
                                            Would it be possible for the plugin to triangulate faces with a more "even" or "regular" triangles? After this topic, I thought maybe pre-triangulating the face on the ramp would spare some extra hand-work but it seems that the plugin triangulates the faces just exactly the same way native SU does when autofolding.

                                            TriangulateFaces uses the built-in SUp mesh making methods, which presumably match the auto-fold ones, hence the similarity.
                                            You might have noticed that my ExtendEdgesByRails script does produce a neat set of faces as that can't use the mesh methods directly but has to make up its own...
                                            Using EEbyRails is a MUCH simpler way of making a curved ramp - I've attached an example...EEbyRailsSimpleRamp1.pngEEbyRailsSimpleRamp2.pngEEbyRailsSimpleRamp.skp

                                            TIG

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 4
                                            • 5
                                            • 1 / 5
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement