dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Преобразование variant или safearray в список

DwgRuLispLib: Преобразование variant или safearray в список

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 28.11.2007, 21:33
DwgRuLispLib: Преобразование variant или safearray в список
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 34,500

Кулик Алексей aka kpblc вне форума Вставить имя

Код:
[Выделить все]
(defun _dwgru-conv-value-vla-to-list (value)
                                     ;|
*    Преобразование vlax-variant и vlax-safearray в обычный список.
*    Примеры вызова:
;; #1:
(setq point (vla-addpoint (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3d-point (getpoint))))
(_dwgru-conv-value-vla-to-list (vla-get-Coordinates point))	; '(1232.24 544.835 0.0)

;; #2:
(setq ent1 (vlax-ename->vla-object (entmakex '(list (0 . "LINE") (10 574.761 426.116 0.0) (11 1054.08 878.378 0.0))))
 ent2 (vlax-ename->vla-object (entmakex '((0 . "LINE") (10 967.833 561.795 0.0) (11 779.78 335.664 0.0)))))
(_dwgru-conv-value-vla-to-list (vla-IntersectWith ent1 ent2 acExtendNone))	; nil
(_dwgru-conv-value-vla-to-list (vla-IntersectWith ent1 ent2 acExtendBoth))	; '(1876.15 1654.04 0.0)
|;
  (cond
    ((= (type value) 'variant)
     (_dwgru-conv-value-vla-to-list (vlax-variant-value value))
     )
    ((= (type value) 'safearray)
     (if (>= (vlax-safearray-get-u-bound value 1) 0)
       (vlax-safearray->list value)
       ) ;_ end of if
     )
    (t value)
    ) ;_ end of cond
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 8606
 
Непрочитано 30.11.2007, 15:54
2 | 1 #21
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


kpblc, а чем тебе не нравится мой алгоритм с PICKSET???
Согласен, что у тебя короче, но ведь у меня быстрее почти на порядок!!!
Так что советую всё-таки такой вариант:
Код:
[Выделить все]
(defun _dwgru-conv-pickset-to-list (value / tab item)
  (repeat (setq tab  nil
                item (sslength value)
                ) ;_ end setq
    (setq tab (cons (ssname value (setq item (1- item))) tab))
    ) ;_ end repeat
  ) ;_ end defun
Евгений А. вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 30.11.2007, 16:04
#22
Кулик Алексей aka kpblc
Moderator

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


Ну не знаю... До этой фразы как-то замерами не занимался.
Проверил. Да, быстрее. Даже быстрее activex-вариантов. Убедил
---
Добавлено: проверку выполняю benchmark'ом, который Евгений Елпанов как-то выкладывал.
Код:
[Выделить все]
(defun test1 (value / tab item)
  (repeat (setq tab  nil
                item (sslength value)
                ) ;_ end setq
    (setq tab (cons (ssname value (setq item (1- item))) tab))
    ) ;_ end repeat
  (reverse tab)
  ) ;_ end of defun

(defun test2 (value)
  (vl-remove-if 'listp (mapcar 'cadr (ssnamex value)))
  ) ;_ end of defun

(defun test3 (/ res)
  (vlax-for blk
            (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (if (equal (vla-get-islayout blk) :vlax-true)
      (vlax-for ent blk
        (setq res (cons ent res))
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  (reverse res)
  ) ;_ end of defun

(defun test4 (doc / res)
  (vlax-for blk (vla-get-blocks doc)
    (if (equal (vla-get-islayout blk) :vlax-true)
      (vlax-for ent blk
        (setq res (cons ent res))
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  (reverse res)
  ) ;_ end of defun
И результаты:
Код:
[Выделить все]
_$ (BENCHMARK '((test1 (ssget "_X")) (test2 (ssget "_X")) (test3) (test4 (vla-get-ActiveDocument (vlax-get-acad-object)))))
Benchmarking .........Elapsed milliseconds / relative speed for 64 iteration(s):

    (TEST1 (SSGET "_X")).........................1469 / 3.61 <fastest>
    (TEST3)......................................3875 / 1.37
    (TEST4 (vla-get-ActiveDocument (vlax...).....3922 / 1.35
    (TEST2 (SSGET "_X")).........................5297 / 1 <slowest>
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.11.2007, 16:13
#23
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,481
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Цитата:
И теоретически их можно в DwgRuLibLisp закидывать. Или нет?
Надо бы оттестировать еще. Может оптимизировать чего получится.
Эта тема впринципе подходит. ТОлько немного подправить название.
Еще ходел уточнить, стоит ли делать проверки на тип в самих ф-циях?
Или если вызвал ф-цию нижнего уровня, убедись в соответствии аргументов?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 30.11.2007, 16:18
#24
Кулик Алексей aka kpblc
Moderator

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


Тут момент такой... Для начала - может, все же будем делать на каждую функцию отдельную тему? И искать проще будет...
Дальше. Хотя библиотека и для общего пользования, делать проверку соответствия типа внутри таких функций, которые могут вызываться тысячи (если не миллионы) раз, скорее всего, не надо. Кому захочется - сами свою "обертку" нарисуют.
---
Добавлено: теперь осталось "раздраконить" что ShaggyDoc показал насчет строковых преобразований И писать справку уже можно начинать
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.11.2007, 18:53
#25
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 9,698


Цитата:
Сообщение от VVA Посмотреть сообщение
Еще ходел уточнить, стоит ли делать проверки на тип в самих ф-циях?
Или если вызвал ф-цию нижнего уровня, убедись в соответствии аргументов?
В справке, в правилах создания написано. Хотя можно пообсуждать.

Прынцип:
а) Не проверять соответствие типов, если аргументы передаёт программист вызывающей функции. Он должен заботиться. Иначе свихнуться можно.
б) Проверять если аргументы могут передаваться обычным пользователем на уровне адаптации (названные в справке "функциями-макросами").
в) Обязательно проверять, если аргумент может быть разных типов.
ShaggyDoc вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Преобразование variant или safearray в список

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 253 01.11.2016 12:09
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Преобразование из Microstation в DWG или DXF Гость Прочее. Программное обеспечение 9 25.05.2012 08:49
Как сделать проекцию на ось или преобразование 3D в 2D tapych AutoCAD 6 25.11.2006 15:30
safearray и variant Apelsinov Программирование 4 03.12.2005 23:44

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы