Архитектору и проектировщику|Тепло- и звукоизоляция URSA.RU
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Использование (command "_.erase") или (vla-erase)

Использование (command "_.erase") или (vla-erase)

Ответ
Поиск в этой теме
Непрочитано 04.04.2019, 18:33 #1
Использование (command "_.erase") или (vla-erase)
nynokne
 
Регистрация: 17.02.2014
Сообщений: 50

Добрый день.
Есть файл с кучей примитивов. Через ssget получаю набор из ненужных текстов (порядка 700 штук), которые хочу удалить.

Вариант решения задачи №1:

Код:
[Выделить все]
 (setq set_TextDelete (ssget "_X" (list '(0 . "TEXT") '(50 . 0) (cons 8 LayerDelete))))
    (sssetfirst nil set_TextDelete)
    (vl-cmdf "_.erase")
700 объектов удаляет за 1-2 секунды.

Вариант решения задачи №2:

Код:
[Выделить все]
 (setq set_TextDelete (ssget "_X" (list '(0 . "TEXT") '(50 . 0) (cons 8 LayerDelete))))
     (sssetfirst nil set_TextDelete)
     (ssgetfirst)
     (setq vla_name (vla-get-ActiveSelectionSet acdoc))
     (vla-erase vla_name)
Те же 700 объектов удаляет за 30-40 секунд.

Вариант решения задачи №3:
Код:
[Выделить все]
        (setq set_TextDelete (ssget "_X" (list '(0 . "TEXT") '(50 . 0) (cons 8 LayerDelete))))
		(setq n (sslength set_TextDelete))
		(setq i 0)
			(while (< i n)
				(setq NameDelObj (ssname set_TextDelete i))
				(entdel NameDelObj)
				(setq i (1+ i))
		         );end while
Опять 30-40 секунд обработки.

Разница колоссальная.
Вопрос: я что-то делаю неправильно во втором и третьем вариантах, или действительно обычная команда _.erase на столько быстрее? В коде программы хотелось бы от vl-cmdf избавиться.
Просмотров: 1126
 
Непрочитано 04.04.2019, 19:20
1 | #2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,754


Тебе надо удалять только в текущем пространстве, без захода внутрь блоков?

----- добавлено через ~12 мин. -----
Попробуй такие варианты:
Код:
[Выделить все]
 (vl-load-com)
(defun entdel-selset (layer / selset sysvar)
  (setq sysvar (mapcar (function (lambda (x / tmp)
                                   (if (setq tmp (getvar (car x)))
                                     (progn (setvar (car x) (cdr x)) (cons (car x) tmp))
                                     ) ;_ end of if
                                   ) ;_ end of LAMBDA
                                 ) ;_ end of function
                       '(("sysmon" . 0) ("regenmode" . 0))
                       ) ;_ end of mapcar
        ) ;_ end of setq
  (if (setq selset (ssget "_X" (list '(0 . "TEXT") '(50 . 0.) (cons 8 layer))))
    (progn (foreach ent ((lambda (/ tab item)
                           (repeat (setq tab  nil
                                         item (sslength selset)
                                         ) ;_ end setq
                             (setq tab (cons (ssname selset (setq item (1- item))) tab))
                             ) ;_ end of repeat
                           ) ;_ end of LAMBDA
                         )
             (entdel ent)
             ) ;_ end of foreach
           (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acallviewports)
           ) ;_ end of progn
    ) ;_ end of if
  (foreach item sysvar (setvar (car item) (cdr item)))
  ) ;_ end of defun
(defun vla-erase-selset (layer / selset sysvar)
  (setq sysvar (mapcar (function (lambda (x / tmp)
                                   (if (setq tmp (getvar (car x)))
                                     (progn (setvar (car x) (cdr x)) (cons (car x) tmp))
                                     ) ;_ end of if
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                       '(("sysmon" . 0) ("regenmode" . 0))
                       ) ;_ end of mapcar
        ) ;_ end of setq
  (if (setq selset (ssget "_X" (list '(0 . "TEXT") '(50 . 0.) (cons 8 layer))))
    (progn (foreach ent (mapcar (function vlax-ename->vla-object)
                                ((lambda (/ tab item)
                                   (repeat (setq tab  nil
                                                 item (sslength selset)
                                                 ) ;_ end setq
                                     (setq tab (cons (ssname selset (setq item (1- item))) tab))
                                     ) ;_ end of repeat
                                   ) ;_ end of lambda
                                 )
                                ) ;_ end of mapcar
             (vla-erase ent)
             ) ;_ end of foreach
           (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acallviewports)
           ) ;_ end of progn
    ) ;_ end of if
  (foreach item sysvar (setvar (car item) (cdr item)))
  ) ;_ end of defun
(defun vla-erase-x (layer / adoc sysvar regen)
  (setq adoc   (vla-get-activedocument (vlax-get-acad-object))
        layer  (strcase layer)
        sysvar (mapcar (function (lambda (x / tmp)
                                   (if (setq tmp (getvar (car x)))
                                     (progn (setvar (car x) (cdr x)) (cons (car x) tmp))
                                     ) ;_ end of if
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                       '(("sysmon" . 0) ("regenmode" . 0))
                       ) ;_ end of mapcar
        ) ;_ end of setq
  (foreach blk_def ((lambda (/ res)
                      (vlax-for item (vla-get-layouts adoc) (setq res (cons (vla-get-block item) res)))
                      res
                      ) ;_ end of lambda
                    )
    (vlax-for ent blk_def
      (if (and (= (vla-get-objectname ent) "AcDbText")
               (equal (vla-get-rotation ent) 0. 1e-3)
               (wcmatch (strcase (vla-get-layer ent)) layer)
               ) ;_ end of and
        (vla-erase ent)
        ) ;_ end of if
      ) ;_ end of vlax-for
    ) ;_ end of foreach
  (foreach item sysvar (setvar (car item) (cdr item)))
  (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acallviewports)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.04.2019, 09:31
#3
nynokne


 
Регистрация: 17.02.2014
Сообщений: 50


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Попробуй такие варианты:
Спасибо. Работает.
Теперь надо разбираться, как это работает))
nynokne вне форума  
 
Непрочитано 05.04.2019, 09:43
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,754


Какой оказался самым быстрым? Ну так, для интересу
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.04.2019, 09:55
#5
nynokne


 
Регистрация: 17.02.2014
Сообщений: 50


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Попробуй такие варианты:
Подскажи, как из первых двух твоих вариантов убрать регенерацию модели?
Всё работает, как надо, но если эти коды запустить в цикл, экран моргает бешенно.
Я убрал строку:
Код:
[Выделить все]
 (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acallviewports)
Но это не помогло.

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Какой оказался самым быстрым? Ну так, для интересу
Я не пробовал 3-ий, так как вообще не понимаю, что в нём написано))
1-ый и 2-ой на тех же 700 объектах работают 6-7 секунд.
nynokne вне форума  
 
Непрочитано 05.04.2019, 10:13
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,754


Цитата:
Сообщение от nynokne Посмотреть сообщение
если эти коды запустить в цикл
А зачем их в цикл-то запускать?
В третьем варианте выполняется элементарная последовательность: получаем указатели на пространства модели и листов, проходим по их составу, и уничтожаем объекты.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.04.2019, 10:21
#7
nynokne


 
Регистрация: 17.02.2014
Сообщений: 50


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А зачем их в цикл-то запускать?
Это вопрос для понимания, что вообще происходит в программе. Мало ли пригодится. Не понимаю, почему в принципе регенерация происходит))
nynokne вне форума  
 
Непрочитано 05.04.2019, 11:01
1 | #8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,754


Это, как мне кажется, уже особенность самого ACAD'a. Если я правильно понимаю, при отключении авторегенерации ACAD просто собирает количество обновлений и, как только это количество превышает некоторое пороговое значение, выполняется принудительное обновление графической области.
Как один из вариантов - принудительно показать область, к примеру, точек (0. 0.) (0.1 0.1), выполнить программу, а потом вернуть обратно.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2019, 11:18
1 | #9
koMon


 
Регистрация: 26.09.2017
Сообщений: 407


Цитата:
Сообщение от nynokne Посмотреть сообщение
В коде программы хотелось бы от vl-cmdf избавиться.
Код:
[Выделить все]
 (setq set_TextDelete (ssget "_X" (list '(0 . "TEXT") '(50 . 0) (cons 8 LayerDelete))))
(vla-erase (vla-get-activeselectionset (vla-get-ActiveDocument (vlax-get-acad-object))))
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Использование (command "_.erase") или (vla-erase)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
МенюГео в AutoCad 2017 не показывает отклонение при использование команды гео отклонения proko Прочее. Программное обеспечение 1 16.01.2018 21:52
МГН: Допустимо ли в многоквартирных жилых домах использование лифта с габаритами кабины 2,1 х 1,1 м со входом по короткой стороне? fadeaway Архитектура 6 15.01.2016 17:15
Использование цвета при выводе документации на печать Stayer-47 Прочее. Архитектура и строительство 4 24.12.2015 18:05
Философия разработки (использование макрообъектов) Sleekka Программирование 2 23.08.2013 15:00
Размещение здания на участке под коммерческое использование, расстояние к границе участка ValenDz Архитектура 13 27.02.2011 13:42