Script Python pour Rhino 8 qui ajoute une pastille sur tous les objets d'un calque spécifique, y compris les blocks et objets à l'intérieur de blocks. Utile lorsque l'on a des objets intégrés dans des sucessions de blocks et que l'on n'arrive plus à les retrouver ...
Le script est adaptable également pour qui chercher à calculer les centres de tous les objets d'une scène, y compris ceux à l'intérieurs de blocks.
#! python 3
import rhinoscriptsyntax as rs
import Rhino
def dotIt(obj,centroid):
objLayer = rs.ObjectLayer(obj)
if objLayer == targetLayer:
rs.AddTextDot("Here!",centroid)
def getBlockOrigin(block):
irefObj = rs.coercerhinoobject(block)
idef = irefObj.InstanceDefinition
blockOrigin = irefObj.InsertionPoint
return blockOrigin
def getCentroid(obj): #cannot be directly applied to a block
bb=rs.BoundingBox(obj)
if bb:
centroid = ((bb[0]+bb[6])/2)
return centroid
def loopBlock(block, origin):
blockOrigin = getBlockOrigin(block) + origin
blockCentroid = origin + getCentroid(block)
dotIt(block,blockCentroid)
objectsInBlock = rs.BlockObjects(rs.BlockInstanceName(block))
for obj in objectsInBlock:
if rs.ObjectType(obj) != 4096: #is not a block
objCentroid = blockOrigin + getCentroid(obj)
dotIt(obj,objCentroid)
else:
loopBlock(obj, blockOrigin)
targetLayer = rs.GetLayer()
objs = rs.AllObjects(include_lights=False, include_grips=False)
if objs:
for obj in objs:
if rs.ObjectType(obj) == 4096: #is a block
loopBlock(obj, Rhino.Geometry.Point3d.Origin)
else:
dotIt(obj,getCentroid(obj))
else:
print("Could not select all objects.")
rs.Redraw()