Issue: InstanceDefinitions.Purge() sets .IsDeleted flag unexpectedly

Hi,

I am experiencing issues with deleting InstanceDefinitnions
When I call InstanceDefinitions.Purge() on a definition with IsDeleted = True:

  1. the .IsDeleted flag gets set to False unexpectedly
  2. 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()

Hi @timcastelijn,

Purging an instance definition does not removed from the table (array), as this would cause stuff that references instance definitions indices to break. Rather, the instance definition’s component model information is invalidated.

That said, InstanceDefinitionTable.GetList should ignore purged, or invalid instance definitions.

– Dale

1 Like

RH-91598 is fixed in Rhino 8 Service Release 29

1 Like