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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Visual LISP: Почему перебор объектов в SelectionSet неактивного документа происходит очень медленно?

Visual LISP: Почему перебор объектов в SelectionSet неактивного документа происходит очень медленно?

Ответ
Поиск в этой теме
Непрочитано 12.03.2015, 12:43 #1
Visual LISP: Почему перебор объектов в SelectionSet неактивного документа происходит очень медленно?
Shourick
 
Регистрация: 12.03.2015
Сообщений: 9

Здравствуйте!
Немного предыстории. Надо было в активном чертеже (destination) размещать информацию, находящуюся в другом чертеже (source). Для этого в destination запускалась программа. Эта программа выбирала все объекты в source, в их свойствах искалась нужная информация. Собраная таким образом информация размещалась в destination.
Задержка на перебор всех объектов в насыщенных (~ 15000 объектов) чертежах занимала до 10 сек. Объектов, которые содержат интересующую информацию, в десятки раз меньше, чем общее количество объектов. Я решил уменьшить количество объектов для перебора, и модифицировал программу, чтобы она создавала с использованием фильтра selectionset в source и перебор происходил для меньшего числа объектов. Изменил, запускаю, и о ужас! Задержка увеличилась в десятки раз.
Прикладываю упрощённый код для двух вариантов. Может кто-нибудь подсказать как всё-таки уменьшить время перебора объектов. Проверку типа объекта при переборе по первому варианту не предлагать .
Код:
[Выделить все]
 (defun c:iva1 (/)
  (vlax-for dwg	(vla-get-documents (vlax-get-acad-object))
    (if	(= (vla-get-name dwg) "1.dwg")
      (setq doc dwg)
    )
  )
  (setq t1 (getvar "date"))
  (vlax-for layout (vla-get-layouts doc) (vlax-for x (vla-get-block layout)))
  (alert (rtos (- (getvar "date") t1) 1 5))
)

(defun c:iva2 (/)
  (vlax-for dwg	(vla-get-documents (vlax-get-acad-object))
    (if	(= (vla-get-name dwg) "1.dwg")
      (setq doc dwg)
    )
  )
  (setq	fttype	   (vlax-make-safearray vlax-vbinteger '(0 . 0))
	ftdata	   (vlax-make-safearray vlax-vbvariant '(0 . 0))
	docselsets (vla-get-selectionsets doc)
  )
  (vlax-safearray-fill fttype '(0))
  (vlax-safearray-fill ftdata '("LINE"))
  (vlax-for x docselsets
    (if	(= (vla-get-name x) "TESTSEL")
      (vla-delete x)
    )
  )
  (setq	selset (vla-add docselsets "TESTSEL")
	t1     (getvar "date")
  )
  (vla-select selset acselectionsetall nil nil fttype ftdata)
  (vlax-for x selset)
  (vla-delete selset)
  (alert (rtos (- (getvar "date") t1) 1 5))
)
Просмотров: 4289
 
Непрочитано 12.03.2015, 13:41
#2
Кулик Алексей aka kpblc
Moderator

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


Ну, во-первых, совсем необязательно создавать SelectionSet. Работать с неактивным документом можно по-разному (как пример: http://autolisp.ru/2010/04/08/procee...tive-document/). Во-вторых, я не вижу никакого резона ни в формировании набора, ни (тем более) в его выделении. В-третьих, можно выполнить и просто формирование vla-указателей на примитивы и к ним применить vla-CopyObjects.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.03.2015, 14:07
#3
Shourick


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В-третьих, можно выполнить и просто формирование vla-указателей на примитивы
C этого места по-подробнее, пожалуйста. Набор и формировался, чтобы получить перечень определённых объектов, свойства которых необходимо использовать в дальнейшем.
Shourick вне форума  
 
Непрочитано 12.03.2015, 14:19
#4
Кулик Алексей aka kpblc
Moderator

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


Как пример, допиливай сам:
Код:
[Выделить все]
 (defun get-all-objects (doc objname / res)
                       ;|
*    Получение списка vla-указателей на объекты указанного документа
*    Параметры вызова:
  doc      vla-указатель на обрабатываемый документ
  objname  маска имени объекта
*    Обработка производится только для пространства модели.
*    Пример вызова:
(get-all-objects (vla-get-activedocument (vlax-get-acad-object)) "AcDbLine") ; выбрать отрезки
(get-all-objects (vla-get-activedocument (vlax-get-acad-object)) "*Polyline") ; выбрать полилинии любого типа
(get-all-objects (vla-get-activedocument (vlax-get-acad-object)) "*spline") ; выбрать сплайны любого типа
|;
  (vlax-for ent (vla-get-modelspace doc)
    (if (wcmatch (strcase (vla-get-objectname ent)) (strcase objname))
      (setq res (cons ent res))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (reverse res)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.03.2015, 14:53
#5
Shourick


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


А как быть с этим?
Цитата:
Сообщение от Shourick Посмотреть сообщение
...Проверку типа объекта при переборе по первому варианту не предлагать .
Проверка в оригинале программы таки присутствует.
Может быть подскажешь как из набора без vlax-for или vlax-map-collection сделать saffearray для vla-copyobjects? Или какой-нибудь другой способ скопировать selectionset из одного чертежа в другой. Только чтобы без перебора.

Последний раз редактировалось Shourick, 12.03.2015 в 15:30.
Shourick вне форума  
 
Непрочитано 12.03.2015, 16:25
#6
Кулик Алексей aka kpblc
Moderator

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


Shourick, я практически гарантирую, что 90% потерь времени у тебя уходит на формирование набора. Можешь взять для интересу код отсюда и погоняй на предмет "что быстрее".
Чем фильтрация-то не устраивает? Быстро, дешево, сердито.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.03.2015, 08:05
#7
Shourick


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
...Чем фильтрация-то не устраивает? Быстро, дешево, сердито.
Алексей, на перебор нескольких десятков тысяч объектов (даже при условии фильтрации ненужных) тратиться около 6 секунд времени, учитывая что интересующих объектов в десятки раз меньше, хотелось сократить эту задержку.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
... я практически гарантирую, что 90% потерь времени у тебя уходит на формирование набора...
Алексей, откуда такая уверенность? Прежде чем такое писать, может стоило потратить пять минут, и проверить как обстоит дело в реальной жизни?
Именно на перебор объектов в SelectionSet неактивного документа тратится колоссальное время. Вопрос изначально был как раз про это. Извини, если неясно выразился.
Для справки у меня установлен AutoCAD 2014, вдруг такие проблемы только в нём?

Для пущей чистоты эсперимента я немного изменил код и проверил время для активного и неактивного документов.
Код:
[Выделить все]
 (defun c:iva1 (/ dwg doc t1 ms)
  (vlax-for dwg	(vla-get-documents (vlax-get-acad-object))
    (if	(= (vla-get-name dwg) "1.dwg")
      (setq doc dwg)
    )
  )
  (setq	ms (vla-get-modelspace doc)
	t1 (getvar "date")
  )
  (vlax-for x ms)
  (alert (strcat "The total number of objects: "
		 (itoa (vla-get-count ms))
		 "\n"
		 "Time: "
		 (rtos (* 86400 (- (getvar "date") t1)) 2 2)
		 "s."
	 )
  )
)

(defun c:iva2 (/ dwg doc fttype ftdata docselsets selset t1)
  (vlax-for dwg	(vla-get-documents (vlax-get-acad-object))
    (if	(= (vla-get-name dwg) "1.dwg")
      (setq doc dwg)
    )
  )
  (setq	fttype	   (vlax-make-safearray vlax-vbinteger '(0 . 0))
	ftdata	   (vlax-make-safearray vlax-vbvariant '(0 . 0))
	docselsets (vla-get-selectionsets doc)
  )
  (vlax-safearray-fill fttype '(0))
  (vlax-safearray-fill ftdata '("LINE"))
  (vlax-for x docselsets
    (if	(= (vla-get-name x) "TESTSEL")
      (vla-delete x)
    )
  )
  (setq selset (vla-add docselsets "TESTSEL"))
  (vla-select selset acselectionsetall nil nil fttype ftdata)
  (setq t1 (getvar "date"))
  (vlax-for x selset)
  (alert (strcat "The total number of \"LINE\" objects: "
		 (itoa (vla-get-count selset))
		 "\n"
		 "Time: "
		 (rtos (* 86400 (- (getvar "date") t1)) 2 2)
		 "s."
	 )
  )
  (vla-delete selset)
)

Для активного документа:
Перебор всех объектов:
Нажмите на изображение для увеличения
Название: All-active.PNG
Просмотров: 53
Размер:	17.3 Кб
ID:	145661

Перебор только отрезков:
Нажмите на изображение для увеличения
Название: Lines-active.PNG
Просмотров: 45
Размер:	18.3 Кб
ID:	145662

А вот для неактивного документа:
Перебор всех объектов:
Нажмите на изображение для увеличения
Название: All-inactive.PNG
Просмотров: 43
Размер:	13.0 Кб
ID:	145663

Перебор только отрезков:
Нажмите на изображение для увеличения
Название: Lines-inactive.PNG
Просмотров: 50
Размер:	10.8 Кб
ID:	145664

Алексей, что по этому поводу можешь сказать?

Пока нет решения с SelectionSet я сохраняю данные в список, и потом ищу только в списке, а обращение к другому документу происходит только если данные не найдены в списке.

Последний раз редактировалось Shourick, 13.03.2015 в 08:24.
Shourick вне форума  
 
Непрочитано 13.03.2015, 09:03
#8
Кулик Алексей aka kpblc
Moderator

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


Файл предоставь. И критерии отбора примитивов.
У меня достаточно много работы выполнялось и выполняется с неактивным документом, так что не могу сказать, что мои утверждения совсем уж беспочвенны.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.03.2015, 09:15
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Недавно на болоте обсуждалась похожая проблема, правда для текущего чертежа... так вот вариант выбора объектов с фильтрами оказался самым долгим... так что возможно проблема в создании набора, а не в выборе объектов
gomer вне форума  
 
Непрочитано 13.03.2015, 09:16
#10
Кулик Алексей aka kpblc
Moderator

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


Добавлю: использовать cdate для оценки скорости выполнения кода - ИМХО не фонтан ни разу. Для примера:
Код:
[Выделить все]
 (vl-load-com)

(defun ssget-lines ()
  (sslength (ssget "_X" '((0 . "LINE") (67 . 0))))
  ) ;_ end of defun

(defun ssget-all ()
  (sslength (ssget "_X" '((67 . 0))))
  ) ;_ end of defun

(defun vla-lines (/ lst)
  (vlax-for item (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
    (if (wcmatch (strcase (vla-get-objectname item)) "*DBLINE")
      (setq lst (cons item lst))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (length lst)
  ) ;_ end of defun

(defun vla-all-lst (/ lst)
  (vlax-for item (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
    (setq lst (cons item lst))
    ) ;_ end of vlax-for
  (length lst)
  ) ;_ end of defun

(defun vla-all ()
  (vla-get-count (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  ) ;_ end of defun
Результаты выполнения (взял чуть ли не первый попавшийся документ):
Код:
[Выделить все]
 _$ (ssget-lines)
4960
_$ (ssget-all)
16385
_$ (vla-lines)
4960
_$ (vla-all-lst)
16385
_$ (vla-all)
16385
И результаты сравнения через benchmark (выполняется в ACAD2009x64, один запуск):
Код:
[Выделить все]
 _$ (BENCHMARK '(SSGET-ALL SSGET-LINES VLA-ALL VLA-ALL-LST VLA-LINES))
Benchmarking ....................Elapsed milliseconds / relative speed for 131072 iteration(s):

    SSGET-ALL.......1076 / 1.04 <fastest>
    VLA-LINES.......1077 / 1.04
    SSGET-LINES.....1092 / 1.03
    VLA-ALL-LST.....1092 / 1.03
    VLA-ALL.........1123 / 1.00 <slowest>
_$ (BENCHMARK '(SSGET-ALL SSGET-LINES VLA-ALL VLA-ALL-LST VLA-LINES))
Benchmarking ....................Elapsed milliseconds / relative speed for 131072 iteration(s):

    VLA-LINES.......1076 / 1.01 <fastest>
    VLA-ALL.........1077 / 1.01
    SSGET-ALL.......1092 / 1.00
    SSGET-LINES.....1092 / 1.00
    VLA-ALL-LST.....1092 / 1.00 <slowest>
_$ (BENCHMARK '(SSGET-ALL SSGET-LINES VLA-ALL VLA-ALL-LST VLA-LINES))
Benchmarking ....................Elapsed milliseconds / relative speed for 131072 iteration(s):

    SSGET-ALL.......1295 / 1.12 <fastest>
    SSGET-LINES.....1388 / 1.04
    VLA-ALL-LST.....1420 / 1.02
    VLA-LINES.......1435 / 1.01
    VLA-ALL.........1450 / 1.00 <slowest>
----- добавлено через ~4 мин. -----
Если идти через ObjectDBX, то ssget отправляется лесом. Сравниваем только функции vla-all, vla-all-lst, vla-lines:
Код:
[Выделить все]
 _$ (BENCHMARK '(VLA-ALL VLA-ALL-LST VLA-LINES))
Benchmarking ....................Elapsed milliseconds / relative speed for 131072 iteration(s):

    VLA-ALL.........1358 / 1.13 <fastest>
    VLA-ALL-LST.....1389 / 1.10
    VLA-LINES.......1529 / 1.00 <slowest>
_$ (BENCHMARK '(VLA-ALL VLA-ALL-LST VLA-LINES))
Benchmarking ....................Elapsed milliseconds / relative speed for 131072 iteration(s):

    VLA-LINES.......1450 / 1.04 <fastest>
    VLA-ALL-LST.....1467 / 1.03
    VLA-ALL.........1514 / 1.00 <slowest>
Кстати, разницу в 1% лично я не считаю критичной. Вот постоянное превышение в 10% и более - это уже серьезно...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.03.2015, 10:18
#11
Shourick


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


Алексей, в приведённых тобой тестах нет ни одного сравнения скорости перебора примитивов во всём чертеже и только в SelectionSet.
Постараюсь объяснить свой вопрос. Я не отлавливаю блох. Разница в скорости перебора 30000 и 1000 примитивов для активного чертежа в 8 раз (см. мои скриншоты) для меня является поводом для рассмотрения более быстрого метода. А разница работы метода для активного и неактивного чертежа в тысячи! раз послужила для меня поводом начать это обсуждение.
Shourick вне форума  
 
Непрочитано 13.03.2015, 10:31
#12
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Shourick Посмотреть сообщение
Разница в скорости перебора 30000 и 1000 примитивов для активного чертежа в 8 раз (см. мои скриншоты)
У меня разница не больше 4-5% (см.отчеты выполнения). Shourick, еще раз говорю - образец файла-источника, файла-получателя копий объектов и критерии выбора объектов в студию! Будет предмет обсуждения - будет и о чем говорить.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.03.2015, 12:53
#13
Shourick


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


Алексей, я весьма огорчён, что такой заслуженный товарищ не понимает забыл разницыу между (eval function) и (eval (function)).
Ты скорость работы функций всегда так проверяешь, или только для меня исключение сделал?
Попробуй так:
(BENCHMARK '((SSGET-ALL) (SSGET-LINES) (VLA-ALL) (VLA-ALL-LST) (VLA-LINES)))
Может быть после этого ты меня наконец услышишь и поверишь?
Кстати, и автор BENCHMARK рекомендует имя функций заключать в скобки.
У меня результат получился вот такой:
При следующем соотношении примитивов в чертеже:
(SSGET-ALL)
39203

(SSGET-LINES)
1667


Скорость выбора и перебора оказалась вот такой (только в _main переменную boundary до 1 уменьши, а то результат до конца недели будешь ждать) :

(BENCHMARK '((SSGET-ALL) (SSGET-LINES) (VLA-ALL) (VLA-ALL-LST) (VLA-LINES)))
Elapsed milliseconds / relative speed for 32 iteration(s):

(VLA-ALL)............16 / 4101.81 <fastest>
(SSGET-LINES).......936 / 70.12
(SSGET-ALL)........1950 / 33.66
(VLA-ALL-LST)......3400 / 19.30
(VLA-LINES).......65629 / 1.00 <slowest>

Вот результаты сравнения с использованием SelectionSet (переменную boundary вернул в 1000):

(BENCHMARK '((iva1)(iva2)))
Elapsed milliseconds / relative speed for 32 iteration(s):

(IVA2)......1404 / 9.71 <fastest>
(IVA1).....13634 / 1.00 <slowest>

Нажмите на изображение для увеличения
Название: All-active-new.PNG
Просмотров: 15
Размер:	13.1 Кб
ID:	145687
Нажмите на изображение для увеличения
Название: Lines-active-new.PNG
Просмотров: 15
Размер:	14.4 Кб
ID:	145688
Результат вполне себе коррелируется.

Сам файл:
1.dwg

Может быть всё-таки перейдём к сути вопроса?

Последний раз редактировалось Shourick, 13.03.2015 в 14:13.
Shourick вне форума  
 
Непрочитано 13.03.2015, 14:37
#14
Кулик Алексей aka kpblc
Moderator

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


Тьфу, черт... Запарка, сорри.
Попробовал (немного изменив коды) пару моментов.
Код:
[Выделить все]
 _$ (repeat 3 (BENCHMARK '((vla-all-odbx conn) (vla-lines-odbx conn) (iva1 conn) (iva2 conn))))
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (IVA1 CONN).................812 / 112.89 <fastest>
    (VLA-ALL-ODBX CONN).........827 / 110.84
    (VLA-LINES-ODBX CONN)......2371 / 38.66
    (IVA2 CONN)...............91666 / 1 <slowest>
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (VLA-ALL-ODBX CONN)..........796 / 135.8 <fastest>
    (IVA1 CONN)..................842 / 128.38
    (VLA-LINES-ODBX CONN).......2387 / 45.28
    (IVA2 CONN)...............108093 / 1 <slowest>
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (VLA-ALL-ODBX CONN)..........796 / 154.79 <fastest>
    (IVA1 CONN)..................827 / 148.98
    (VLA-LINES-ODBX CONN).......2371 / 51.96
    (IVA2 CONN)...............123209 / 1 <slowest>


Код:
[Выделить все]
 _$ (repeat 3 (BENCHMARK '((vla-all-odbx conn) (vla-lines-odbx conn) (iva1 conn))))
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (IVA1 CONN)................795 / 3 <fastest>
    (VLA-ALL-ODBX CONN)........827 / 2.89
    (VLA-LINES-ODBX CONN).....2387 / 1 <slowest>
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (VLA-ALL-ODBX CONN)........796 / 3.02 <fastest>
    (IVA1 CONN)................796 / 3.02
    (VLA-LINES-ODBX CONN).....2403 / 1 <slowest>
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (IVA1 CONN)................811 / 3.02 <fastest>
    (VLA-ALL-ODBX CONN)........812 / 3.02
    (VLA-LINES-ODBX CONN).....2449 / 1 <slowest>


Вариант в SelectionSet приходится исключать
Код:
[Выделить все]
 _$ (repeat 3 (BENCHMARK '((vla-all-odbx conn) (vla-lines-odbx conn) (iva1 conn))))
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (IVA1 CONN)................796 / 2.59 <fastest>
    (VLA-ALL-ODBX CONN).......1544 / 1.33
    (VLA-LINES-ODBX CONN).....2059 / 1 <slowest>
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (IVA1 CONN)................748 / 2.63 <fastest>
    (VLA-ALL-ODBX CONN)........780 / 2.52
    (VLA-LINES-ODBX CONN).....1966 / 1 <slowest>
Benchmarking ...Elapsed milliseconds / relative speed for 1 iteration(s):

    (VLA-ALL-ODBX CONN)........811 / 2.38 <fastest>
    (IVA1 CONN)................811 / 2.38
    (VLA-LINES-ODBX CONN).....1934 / 1 <slowest>

Можно было бы, конечно, добавить еще и вариант "сначала все получить, а потом через vl-remove-if вычистить ненужное", но его скорость совсем низкая.
Здесь conn - список, содержащий точечную пару '("obj" .<Указатель на документ>)
Код:
[Выделить все]
 (defun vla-all-odbx (connection / lst)
  (vlax-for item (vla-get-modelspace (cdr (assoc "obj" connection)))
    (setq lst (cons item lst))
    ) ;_ end of vlax-for
  (length lst)
  ) ;_ end of defun

(defun vla-lines-odbx (connection / lst)
  (vlax-for item (vla-get-modelspace (cdr (assoc "obj" connection)))
    (if (wcmatch (strcase (vla-get-objectname item)) "*DBLINE")
      (setq lst (cons item lst))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (length lst)
  ) ;_ end of defun

(defun vla-lines-odbx-after (connection)
  (vlax-for item (vla-get-modelspace (cdr (assoc "obj" connection)))
    (setq lst (cons item lst))
    ) ;_ end of vlax-for
  (length
    (vl-remove-if-not (function (lambda (x) (wcmatch (strcase (vla-get-objectname x)) "*DBLINE"))) lst)
    ) ;_ end of length
  ) ;_ end of defun

(defun iva1 (connection / dwg doc t1 ms lst)
  (setq doc (cdr (assoc "obj" connection))
        ms  (vla-get-modelspace doc)
        t1  (getvar "date")
        ) ;_ end of setq
  (vlax-for x ms
    (setq lst (cons x lst))
    ) ;_ end of vlax-for
  (length lst)
;;;  (princ (strcat "The total number of objects: "
;;;                 (itoa (length lst))
;;;                 "\n"
;;;                 "Time: "
;;;                 (rtos (* 86400 (- (getvar "date") t1)) 2 2)
;;;                 "s."
;;;                 ) ;_ end of strcat
;;;         ) ;_ end of alert
  ) ;_ end of defun

(defun iva2 (connection / dwg doc fttype ftdata docselsets selset t1 lst)
  (setq doc        (cdr (assoc "obj" connection))
        fttype     (vlax-make-safearray vlax-vbinteger '(0 . 0))
        ftdata     (vlax-make-safearray vlax-vbvariant '(0 . 0))
        docselsets (vla-get-selectionsets doc)
        ) ;_ end of setq
  (vlax-safearray-fill fttype '(0))
  (vlax-safearray-fill ftdata '("LINE"))
  (vlax-for x docselsets
    (if (= (vla-get-name x) "TESTSEL")
      (vla-delete x)
      ) ;_ end of if
    ) ;_ end of vlax-for
  (setq selset (vla-add docselsets "TESTSEL"))
  (vla-select selset acselectionsetall nil nil fttype ftdata)
  (setq t1 (getvar "date"))
  (vlax-for x selset
    (setq lst (cons x lst))
    ) ;_ end of vlax-for
;;;  (princ (strcat "The total number of \"LINE\" objects: "
;;;                 (itoa (vla-get-count selset))
;;;                 "\nLength by lst: "
;;;                 (itoa (length lst))
;;;                 "\n"
;;;                 "Time: "
;;;                 (rtos (* 86400 (- (getvar "date") t1)) 2 2)
;;;                 "s."
;;;                 ) ;_ end of strcat
;;;         ) ;_ end of alert
  (vla-delete selset)
  (length lst)
  ) ;_ end of defun

Я ответил на вопрос?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.03.2015, 15:19
#15
Shourick


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тьфу, черт... Запарка, сорри.
Бывает...

Повторюсь. Вопрос был про замедление перебора объектов SelectionSet в неактивном чертеже. Ответа пока не прозвучало . В активном чертеже при существенной разнице общего количества объектов и объектов, подлежащих анализу, выигрыш от использования SelectionSet есть.
Складывается ощущение, что AutoCAD обращается к SelectionSet неактивного чертежа через какой-то дополнительный интерфейс.
У меня, например, иконка чертежа в трае начинает моргать.
Нажмите на изображение для увеличения
Название: acad.jpg
Просмотров: 29
Размер:	203.0 Кб
ID:	145705
Shourick вне форума  
 
Непрочитано 13.03.2015, 15:23
#16
Кулик Алексей aka kpblc
Moderator

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


В порядке оффтопа.
Лично мне SelectionSet через ActiveX как-то не нравится. На интуитивном уровне. В принципе можно написать проверку: если передаваемый указатель эквивалентен текущему чертежу, использовать SelectionSet, в противном случае - использовать другие методы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Visual LISP: Почему перебор объектов в SelectionSet неактивного документа происходит очень медленно?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Аттестация в Минрегионе по негосударственной экспертизе Людмила Охр Прочее. Архитектура и строительство 350 14.02.2015 17:50