Hi,
I am experiencing issues with deleting InstanceDefinitnions
When I call InstanceDefinitions.Purge() on a definition with IsDeleted = True:
- the .IsDeleted flag gets set to False unexpectedly
- I expect the definition to be removed from the InstanceDefinitions table completely, but this does not seem to happen. (possibly I don’t understand intended behavior correctly?)
best regards,
Tim
#! python 3
import rhinoscriptsyntax as rs
import scriptcontext as sc
from Rhino.Geometry import Point3d, BoundingBox
X_SPACE = 1000
BOX_SIZES = [
((0,0,0), (200,300,400)),
((0,0,0), (500,600,700)),
]
def create_geometry():
boxes = []
for i, box_size in enumerate(BOX_SIZES):
bbox = BoundingBox(Point3d(*box_size[0]), Point3d(*box_size[1]))
corners = list(bbox.GetCorners())
box = rs.AddBox(corners)
boxes.append(box)
return boxes
def create_definitions(boxes):
idefs = []
for i, box in enumerate(boxes):
def_name = f"definition_{i}"
def_objects = [rs.coercerhinoobject(box)]
geometry = [obj.Geometry for obj in def_objects]
attrs = [obj.Attributes for obj in def_objects]
index = sc.doc.InstanceDefinitions.Add(def_name, "", Point3d.Origin, geometry,
attrs)
idef = sc.doc.InstanceDefinitions.GetList(False)[index]
idefs.append(idef)
return idefs
def create_new_scene():
rs.DocumentModified(False)
rs.Command("-New None EnterEnd", False)
def main():
create_new_scene()
boxes = create_geometry()
idefs = create_definitions(boxes)
# delete 1 instance
sc.doc.InstanceDefinitions.Delete(idefs[1]) # => sets IsDeleted flag?
print("len before purge ignoreDeleted=True:", len(sc.doc.InstanceDefinitions.GetList(True))) # => prints 1 as expected
print("len before purge ignoreDeleted=False:", len(sc.doc.InstanceDefinitions.GetList(False))) # => prints 2 as expected
# call Purge()
sc.doc.InstanceDefinitions.Purge(idefs[1].Index) # => expected to remove InstanceDefinition from idef table indefinetly?
print("len after purge ignoreDeleted=True:", len(sc.doc.InstanceDefinitions.GetList(True))) # => prints 2, expected 1
print("len after purge ignoreDeleted=False:", len(sc.doc.InstanceDefinitions.GetList(False))) # => prints 2, expected 1
for idef in sc.doc.InstanceDefinitions.GetList(False):
print('block_name', idef.Name, idef.IsDeleted)
if __name__ == '__main__':
main()