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

    Getting the material of a face not directly assigned...

    Scheduled Pinned Locked Moved Developers' Forum
    12 Posts 4 Posters 341 Views 4 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.
    • F Offline
      fizgig
      last edited by

      I know I can use the face.material.name to find the name of the material currently assigned to that face but what if there is no material assigned to it and the material of the group is currently being applied in its place? Can I somehow detect that instead?

      1 Reply Last reply Reply Quote 0
      • Chris FullmerC Offline
        Chris Fullmer
        last edited by

        You can detect if there is a material applied to the group/component. Then if a face material is "nil", you know that it has the group.component material applied to it.

        group_mat = my_group.material.name

        That should do the trick!

        Chris

        Lately you've been tan, suspicious for the winter.
        All my Plugins I've written

        1 Reply Last reply Reply Quote 0
        • F Offline
          fizgig
          last edited by

          Good point. Trouble is I often have the face within a group within a group within a group... I suppose I could write a function to keep going backward if worse comes to worse. Just wondering if there's a better way.

          1 Reply Last reply Reply Quote 0
          • Chris FullmerC Offline
            Chris Fullmer
            last edited by

            ahh I see. True. But I tihnk that is how it has to be done. You will need to check the parent.material of entity with material==nil. And do that backwards until the parent is the active model. And the first parent with a material applied is the one that is actively showing on the face. If no parent has a material applied, then the face is actually displaying as the default material. But that is a little bit of a pain.

            Chris

            Lately you've been tan, suspicious for the winter.
            All my Plugins I've written

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

              
              def nestedfacematerial(face)
               ### face is the face being looked at...
               model=Sketchup.active_model
               mat=face.material
               if face.parent!=model and not mat
                parent=face.parent.instances[0]
                if not parent.class==Sketchup;;Group
                  puts "Face.parent... is not a Group - can't continue."
                  return nil
                end#if
                ### It can't work on Components as each Instance could have a different
                ### Material and we can't tell which Instance the Face is in as it's 
                ### in the Definition's Entities - but a Group should be unique ?
                while not mat=parent.material
                  parent=parent.parent.instances[0]
                  if parent==model
                    mat=nil
                    break
                  end#if
                end#while
               end#if
              ### mat = material
               if mat
                 if face.parent!=model
                   puts "Face.parent...material.name = "+mat.name
                 else
                   puts "Face.material.name = "+mat.name
                 end#if
               else
                 puts "Face.material = nil"
               end#if
               return mat
              end#def
              
              

              It's limited to a Face in (nested) Groups, which should be unique; a Face in a Definition will fail because it is different - each Instance could have a different Material but we can't tell which particular Instance the Face in question is in as that Face actually resides in the Definition and not the Instance that has the Material.

              TIG

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

                Groups have instances like Components. If you make a group and copy it around, they all share the same definition, but each group instance can have different colour. So the problem is the same.
                Also - groups some times get their .parent reference wrong. Need extra check to make sure you have the right one.

                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:

                  Groups have instances like Components. If you make a group and copy it around, they all share the same definition, but each group instance can have different colour. So the problem is the same.
                  Also - groups some times get their .parent reference wrong. Need extra check to make sure you have the right one.

                  I agree... that's why I said Group 'should' be unique ! It could use 'make_unique' on it ? This is another right mess...

                  TIG

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

                    It could, but I wouldn't do that. Some people might rely on the group copies.

                    Really wish they'd cleared up the all the problems with the API and groups...

                    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

                      The whole ideas is that Groups are unique but Components can have multiple Instances either by Copy or Inserted from a Browser etc...

                      You cannot Insert a Group from a Browser and the Copy of a Group should be made unique in the process of making that Copy - there should never be group.definition.instances[1] - though I know there can be !!!

                      It is a bad habit to use Copies of a Group to allow editing of multiple versions later - that is what Components are for !

                      Groups shouldbe a collection of things that separates those things from others - like Geometry - nothing more...

                      TIG

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

                        None the less, I all too often come across models where groups have been copied multiple times across a model. As long as they retain their definition to be the same I can use my Selection Toys plugin to convert them into components.

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

                        1 Reply Last reply Reply Quote 0
                        • F Offline
                          fizgig
                          last edited by

                          😄

                          You guys are illustrating why I was looking for a shortcut. The face in question that I want to see the material of can possibly be inside a group inside a component instance inside a group and so forth. This makes it challenging to do what I want to do.

                          Not a big deal for me, I can solve my particular problem by going another route that doesn't require my knowing the inherited face material. It wont be as elegant but it will solve the problem I'm working on.

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

                            Why not have a method that picks a face and returns its material. If it's nil and it's not in the model then the picked point could also return the 'container' - i.e. group or component and it's material - if it's not nil then that's the nil face's material too... Your 'pick-helper' can return two values ?

                            TIG

                            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