Удаление больших объемов объектов из модели

Здравствуйте,
подскажите пожалуйста, почему так получается, что использование в коде lisp вместо:

(if ss_outlines
(progn
(command "_.ERASE" ss_outlines "")
(princ (strcat "\nУдалено: " (itoa (sslength ss_outlines))))
))

программного метода entdel:

(if ss_outlines

(progn
(setq i 0)
(repeat (sslength ss_outlines)
(entdel (ssname ss_outlines i))
(setq i (1+ i))
)
(princ (strcat "\nУдалено: " (itoa (sslength ss_outlines))))
))

замедляет удаление объектов?

По-видимому, разница объясняется тем, что командным методом удаляется вся группа, а энтделом удаляются объекты один за другим. Если командным методом начать удалять объекты по очереди, а не группой, результат будет, очевидно, ровно наоборот другой.

Предложил бы использовать метод erase. Протестировал код на 200к объектов. Стандартная команда удалить выполняется за 20с. Удаление группы через activeX приблизительно за 30с. Медленнее, конечно, но может и подойти

(vl-load-com)
(defun c:test_delete_group ( / doc nab)
  (setq nab (ssget))
  (if (not nab) (exit))
  (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  (setq vl-nab (vla-get-ActiveSelectionSet doc))
  (vla-Erase vl-nab)
  (prin1)
)
  

Позволю себе слегка побурчать :wink:
Метки начала и конца отмены забыты. И, возможно, преобразовав набор в список элементов, скорость изменится.
P.S. М.б., regenmode поменять еще? Ну и восстановить ее обратно потом, естественно :wink:

Надеялся, что прокатит без бурчания)))
Что интересно, отмена команды работает вполне себе ожидаемым образом, несмотря на отсутствие меток. Кроме того, это не рабочий код, а идея использования группового метода по отношению к объектам в наборе.

Спасибо,
проверю сейчас vla-Erase
Уже думаю вынести процедуру выбора и удаления набора в dll (nanocad c#), подгружать затем в lisp

Работать неохота…

(vl-load-com)

(defun c:erase-selset (/ selset adoc sysvars) 
  (if 
    (= 
      (type 
        (setq selset (vl-catch-all-apply 
                       (function 
                         (lambda () 
                           (ssget "_:L")
                         )
                       )
                     )
        )
      )
      'pickset
    )
    (progn 
      (vla-startundomark 
        (setq adoc (vla-get-activedocument 
                     (vlax-get-acad-object)
                   )
        )
      )
      (setq sysvars (vl-remove 
                      nil
                      (mapcar 
                        (function 
                          (lambda (x / value) 
                            (if (setq value (getvar (car x))) 
                              (progn 
                                (setvar (car x) (cdr x))
                                (cons (car x) value)
                              )
                            )
                          )
                        )
                        '(("cmdecho" . 0)
                          ("menuecho" . 0)
                          ("nomutt" . 1)
                          ("regenmode" . 0)
                         )
                      )
                    )
      )

      (vl-catch-all-apply 
        (function 
          (lambda () 
            (foreach ent 
              (mapcar 
                (function vlax-ename->vla-object)
                ((lambda (/ tab item) 
                   (repeat 
                     (setq tab  nil
                           item (sslength selset)
                     )
                     (setq tab (cons (ssname selset (setq item (1- item))) tab))
                   )
                 ) 
                )
              )
              (vla-erase ent)
            )
          )
        )
      )

      (foreach item sysvars 
        (setvar (car item) (cdr item))
      )
      (vla-endundomark adoc)
    )
    (princ "\nNothing selected")
  )
  (princ)
)

Если есть возможность сравнить по скорости, было бы интересно узнать результаты :wink:

похоже та же скорость (не быстро сек 20-30 у меня тоже)
Нужно оптимизировать выбор объектов еще - вынести может в dll

Предположу, что удаление группой всяко будет быстрее, чем удаление по объектам. Независимо от способа реализации (командный, лисп или шарп).
А удаление группы на большом количестве объектов будет плюс-минус одинаковым, т.к. все методы под капотом содержат старые добрые плюсы.
В варианте ActiveX меня больше всего напрягает неудобство манипуляций с наборами в части добавления объектов (если свойства ActiveSelectionset недостаточно), хотя во всем остальном видится наиболее рациональным подходом: достаточно быстро, универсально, платформо-независимо.