Gile,非常感谢你的贡献,几乎所有的都有一颗宝石! 你好,保罗,这可能相关,也可能不相关,但Acad数据库的问题是,在你可以使用它之前,它必须是“免费的”。也就是说,您不能擦除对象,除非它已被“提交”到数据库本身,因此您的事务必须完成,以使ObjectID可用于擦除实体。
原因在于Acad如何处理图形重绘和其他任务。比方说,当您平移或缩放时,会在整个数据库中查询视图截锥内的对象,并在每次重绘调用消息时重绘这些对象。
如果最后一个事务尚未提交,那么您可能会遇到相当于“竞争”的情况,即多个线程试图读取数据库,擦除对象也是如此,它们还不“正确”存在,因此会导致问题。在这种情况下,处理实体可能是一种解决方案,但是您仍然需要一些指向对象的指针(DBObjectCollection??).
我会将ObjectID存储在一个集合中,以便在提交创建临时对象的事务后使用,然后使用另一个事务来执行擦除工作。
使用存储的ObjectID列表来搜索绘图是最快的,请记住,您搜索的是内存数据库本身,而不是模型空间视图本身。迭代数据库,然后检查正确的肯定是缓慢的(额)。
事务在方案中并不昂贵,它们更像是一个“锁”包装对象,以确保您的方法对数据库具有完全访问权限,而其他人没有。
包装上述两个事务可能会导致相同的问题。即使您使用两个内部事务,主外部事务仍然控制着数据库,所以我猜您必须进行测试。
希望这能有所帮助,如果有任何明显的问题,我表示歉意,但这可能有助于其他人了解可能会出错的地方及其原因,干杯。
页:
1
[2]