I wanted to try and do a script which would report the layer locations of hidden objects in the document. I apparently have 120 locked/hidden in show selected, which is slowing down my document down when I run the command.
I couldn’t find anything in the python API
I know I’ll need rs.IsObjectHidden and rs.IsObjectLocked. Still counting down to my actual Python course in February…
Edit: Will AllObjects take into account locked and hidden objects?
all = rs.AllObjects()
hidden = []
layernames = []
for i in all:
testhidden = rs.IsObjectHidden(i)
if testhidden is True:
hidden.append(i)
else:
testhidden = False
for i in hidden:
layername = rs.ObjectLayer(i)
layernames.append(i)
print layername
When I print the lists, I get the “System GUID at … etc” prefix. So I can still make the data output clearer.
Seems to be more or less OK. I don’t get the “System GUID at…” here though when I print, just the name.
You can shorten your script considerably though (unless you want the intermediate results as well):
import rhinoscriptsyntax as rs
all_objs = rs.AllObjects()
layernames = set()
for obj in all_objs:
if rs.IsObjectHidden(obj): layernames.add(rs.ObjectLayer(obj))
if layernames:
for layername in layernames: print layername
else:
print "No hidden objects found!"
Why did I use set() for the layer names instead of a list[]? Well, if you have multiple objects hidden on the same layer, each object adds the same name to the list, so you will print the layer multiple times. Unlike a list, a set in Python is composed only of unique members, so there will be only one instance of a layer name in there even if multiple objects are hidden on the same layer. On the other hand a set is “unordered” so you cannot depend on the order the layer names will be printed like you might with a list.
Yeah that’s a lot better. I was doing quite a bit of intermediary printing to check.
all = rs.AllObjects()
hidden = []
layernames = []
for guid in all:
testhidden = rs.IsObjectHidden(guid)
if testhidden is True:
hidden.append(guid)
print "_hidden is " + str(hidden)
for l in hidden:
layername = rs.ObjectLayer(l)
layernames.append(layername)
print "hidden is " + str(hidden)
print "Last layername was " + str(layername)
print str(len(layernames)) + " items, " + "Layernames are " + str(layernames)
_hidden is [<System.Guid object at 0x0000000000000229 [d2691fe2-c89f-4fad-aab5-0ee158ad02b6]>
Yep mine will still be convoluted and long winded until I get better… but thank you!