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

    Faces area in a group ?

    Scheduled Pinned Locked Moved Developers' Forum
    15 Posts 7 Posters 1.8k 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.
    • M Offline
      Matt666
      last edited by

      De rien mon initiateur de Ruby 😉

      Frenglish at its best !
      My scripts

      1 Reply Last reply Reply Quote 0
      • T Offline
        todd burch
        last edited by

        Personally, I'd call that a bug in the #area method if it is not taking the scaling factor into consideration.

        1 Reply Last reply Reply Quote 0
        • Didier BurD Offline
          Didier Bur
          last edited by

          Hi Todd,
          You know, groups are almost like component instances, they are stored in the model like "internal definitions" and a group is like an unique occurence of its definition, with or without a transformation applied. This is where the 'group' object in SU is wrong defined IMHO.
          It's a shame we can't apply a transformation to a face, this will solve quickly the problem. I've written Face::transform myself, but for some unknown reason it sometimes raises an error "points are not coplanar" when applying the method to the edges of the face. Go figure...

          PS: great presentation at 3DBC, but perhaps you need a little bit more training with the compo spray ?

          DB

          1 Reply Last reply Reply Quote 0
          • Didier BurD Offline
            Didier Bur
            last edited by

            @AdamB: just let me call you the ruby wizard Voilà, c'est touT !

            DB

            1 Reply Last reply Reply Quote 0
            • AdamBA Offline
              AdamB
              last edited by

              (FWIW I'd say face.area giving objects space area is the correct behaviour.)

              But people, this is all the wrong approach. You don't want to be building geometry, you just want to run through each face in the object and scale the area by the transformation. The trick is to project the scaling into the face's basis frame.

              So the code in my book is:

              def objectsurfacearea(container, xform)
              
              	total = 0
              	for ent in container.entities
              		next unless ent.kind_of? Sketchup;;Face	
              
              		# get face basis frame	
              		normal = ent.normal
              		binormal = Geom;;Vector3d.new(normal.y,normal.z,normal.x)
              		tangent = (normal * binormal).normalize
              		
              		areascale = (xform * binormal).length * (xform * tangent).length
              
              		total += ent.area * areascale
              	end
              
              	return total
              end
              
              

              So you'd do:
              objectsurfacearea(mygroup, mygroup.transformation)

              or

              objectsurfacearea(myinstance.definition, myinstance.transformation)

              Voila! C'est tous.

              Adam

              Developer of LightUp Click for website

              1 Reply Last reply Reply Quote 0
              • AdamBA Offline
                AdamB
                last edited by

                @didier bur said:

                Voilà, c'est touT !

                Enfin! Apres vingt ans avec une epouse Francais, plus ca change avec mon Franglais..

                Developer of LightUp Click for website

                1 Reply Last reply Reply Quote 0
                • Didier BurD Offline
                  Didier Bur
                  last edited by

                  @unknownuser said:

                  une epouse FrancaisE

                  En effet, en effet... 🤣

                  DB

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

                    Sweet! Just what I needed. 😄
                    How does it handle nested scaled groups/components? Do y ou have to add up the total transformation?

                    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
                      kat
                      last edited by

                      Hey thanks a lot AdamB for your super professional approach!
                      Finally found what I was looking for, now my code works fantasticly.

                      I did some additional reading about the Frennet-Serret/TNB frame but I don't really understand everything.
                      If I get it wel, the normal(N) is perpendicular to the face, the tangent(T)'touches' the face and de binormal(B) is perpendicular to both normal and tangent. But then how do you know on which side of the face formed by N and T, is B? I don't get the
                      @unknownuser said:

                      tangent = (normal * binormal)
                      multiplication. Isn't B supposed to be the cross product of N and T?
                      And why is gives
                      @unknownuser said:

                      (xform * binormal).length * (xform * tangent).length
                      

                      you the scale factor?

                      Could you give me some extra matematical information about this?
                      I would like to understand why this code works,

                      thanks, kat

                      1 Reply Last reply Reply Quote 0
                      • AdamBA Offline
                        AdamB
                        last edited by

                        @kat said:

                        I don't get the
                        tangent = (normal * binormal)
                        multiplication. Isn't B supposed to be the cross product of N and T?

                        Makes no odds. Binormal and tangent both lie in the plane.

                        @kat said:

                        And why is gives

                        @adamb said:

                        (xform * binormal).length * (xform * tangent).length

                        you the scale factor?

                        I'm taking the unit vectors in the plane of the face and transforming them by the Group transform which may scale them. Getting the length in the binormal and tangent direction allows me to figure out how much to scale the area of the face accounting for the transform.

                        Adam

                        Developer of LightUp Click for website

                        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