That was my starting point for this script, then it occurred to me I could increase usability by seeking to replace Max's "select similar" with a more intelligent select similar script. I may have got a bit carried away... I ended up with the following functionality:
- When selecting element sub-objects
- will select other elements with the same number of faces
- When selecting geometry at the object-level, selects any/all of:
- matching size (good for chairs)
- matching ratio (good for uniformly scaled objects)
- same number of faces (good when above won't work)
- instances
- object colour (off by defualt)
- max's delect similar (off by defualt)
- When selecting non-geometry
- matching class (ex all omni lights or all point helpers or bones, etc)
-- MixeScript snippet: Select Similar -- selects other elements or objects similar to the current selection --USAGE -- select an object or an element of an editable poly -- check settings below -- run script -- new selection is made --SETTINGS FindBySimilarSize = true FindBySimilarRatio = true SimilarityTolerance = 0.005 -- higher tolerance selects more objects which are not quite so similar. must be less than 1. FindByMatchingFaceCount = true FindByInstances = true FindByMaxSelectSimilar = false -- false by defualt because this gets lots of stuff which isnt necessarily similar. FindByWireColor = false -- false by default since this may find lots of stuff DoNotSelectHidden = true ( obj = selection[1] if subobjectlevel == 4 or subobjectlevel == 5 then ( print "select matching elements" selectedfaces = polyop.getFaceSelection obj facecount = selectedfaces.numberset allfaces = obj.faces newselection = polyop.getFaceSelection obj discardedfaces = #{} for face in allfaces do ( if (newselection[face.index] == false and discardedfaces[face.index] == false) then ( -- we havent seen this face before. thiselement = polyop.getElementsUsingFace obj face if thiselement.numberset == facecount then ( --print "found a matching element" join newselection thiselement ) else ( join discardedfaces thiselement ) ) ) polyop.setfaceselection obj newselection redrawviews() ) else ( matchingobjs = #() append matchingobjs obj print "select matching objects" if superclassof(obj) == GeometryClass and classof(obj) != Biped_Object then ( --find geometry with matching bounding size OR face count if FindBySimilarSize or FindBySimilarRatio then ( originalrotation = obj.rotation originalposition = obj.position obj.rotation = (quat 0 0 0 0) XDimension = (obj.max.x - obj.min.x) YDimension = (obj.max.y - obj.min.y) ZDimension = (obj.max.z - obj.min.z) XZRatio = XDimension / ZDimension YZRatio = YDimension / ZDimension obj.rotation = originalrotation obj.position = originalposition max modify mode for checkobj in geometry do ( originalrotation = checkobj.rotation originalposition = checkobj.position checkobj.rotation = (quat 0 0 0 0) if FindBySimilarSize then ( if XDimension > ((checkobj.max.x - checkobj.min.x) * (1.0 - SimilarityTolerance)) and XDimension < ((checkobj.max.x - checkobj.min.x) * (1 / (1.0 - SimilarityTolerance))) and YDimension > ((checkobj.max.y - checkobj.min.y) * (1.0 - SimilarityTolerance)) and YDimension < ((checkobj.max.y - checkobj.min.y) * (1 / (1.0 - SimilarityTolerance))) and ZDimension > ((checkobj.max.z - checkobj.min.z) * (1.0 - SimilarityTolerance)) and ZDimension < ((checkobj.max.z - checkobj.min.z) * (1 / (1.0 - SimilarityTolerance))) then ( print (checkobj.name + " is a similarsize match") appendIfUnique matchingobjs checkobj ) ) if FindBySimilarRatio then ( checkXZRatio = (checkobj.max.x - checkobj.min.x) / (checkobj.max.z - checkobj.min.z) checkYZRatio = (checkobj.max.y - checkobj.min.y) / (checkobj.max.z - checkobj.min.z) if XZRatio > (checkXZRatio * (1.0 - SimilarityTolerance)) and XZRatio < (checkXZRatio * (1 / (1.0 - SimilarityTolerance))) and YZRatio > (checkYZRatio * (1.0 - SimilarityTolerance)) and YZRatio < (checkYZRatio * (1 / (1.0 - SimilarityTolerance))) then ( print (checkobj.name + " is a similarratio match") appendIfUnique matchingobjs checkobj ) ) checkobj.rotation = originalrotation checkobj.position = originalposition ) ) if FindByMatchingFaceCount and ((classof obj) == editable_poly or (classof obj) == editable_mesh) then ( for eachobj in geometry do ( if classof eachobj == editable_poly or classof eachobj == editable_mesh then ( if obj.faces.count == eachobj.faces.count then ( appendIfUnique matchingobjs eachobj ) ) ) ) if FindByWireColor then ( for eachobj in geometry do ( if eachobj.wirecolor == obj.wirecolor then ( appendIfUnique matchingobjs eachobj ) ) ) ) else ( --select all objects matching class for eachobj in $* do ( if classof eachobj == classof(obj) then ( appendIfUnique matchingobjs eachobj ) ) ) clearselection() if FindByMaxSelectSimilar then ( actionMan.executeAction 0 "40099" -- Selection: Select Similar ) if FindByInstances then ( InstanceMgr.GetInstances obj &instances selectmore instances ) selectmore matchingobjs if DoNotSelectHidden == true then ( currentselection = getcurrentselection() clearselection() for eachobj in currentselection do ( if eachobj.ishidden == false then (selectmore eachobj) ) ) ) )
Wow! I was trying to find this tolls for such a long time.
ReplyDeleteThanks!!