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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp. Оптимизация кода

AutoLisp. Оптимизация кода

Ответ
Поиск в этой теме
Непрочитано 20.10.2011, 16:08 #1
AutoLisp. Оптимизация кода
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, помогите оптимизировать код. Он очень долго думает в следующих кусках:

Код:
[Выделить все]
(command "line" tvstav1 tvstav2 "")
	      (setq l0 (ssget "L"))
              (command "change" l0 "" "P" "la" layer "" "")
	      (command "line" tvstav2 tvstav31 "")
	      (setq l0 (ssget "L"))
              (command "change" l0 "" "P" "la" layer "" "")
	      (command "line" tvstav2 tvstav32 "")
      	      (setq l0 (ssget "L"))
              (command "change" l0 "" "P" "la" layer "" "")
	      (command "line" tvstav31 tvstav32 "")
      	      (setq l0 (ssget "L"))
              (command "change" l0 "" "P" "la" layer "" "")
	      (command "line" tvstav3 tvstav4 "")
      	      (setq l0 (ssget "L"))
              (command "change" l0 "" "P" "la" layer "" "")
При этом постоянно появляется надпись Unknown command P1 - имя моей команды

И еще я взрываю блоки и восстанавливаю их цвет:

Код:
[Выделить все]
(vl-cmdf "_explode" name "")
          (setq l1 (ssget "p"))
          (vl-cmdf "_chprop" l1 "" "la" layer "" "")
Здесь те же тормоза и надписи с неизвестной командой... тормоза критические, вместо 5-10 секунд код работает пару минут, а то и больше...
Просмотров: 4399
 
Непрочитано 20.10.2011, 16:16
1 | #2
gomer

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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Друзья, помогите оптимизировать код.
entmake, entlast, entmod вместо того ужаса, что у вас
gomer вне форума  
 
Автор темы   Непрочитано 20.10.2011, 16:51
#3
Zaghim


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


Т.е. так:

Код:
[Выделить все]
(command "line" tvstav1 tvstav2 "")
	      (setq l0 (entget (entlast)))
	      (setq l0 (subst (cons 8 layer) (assoc 8 l0) l0))
	      (entmod l0)
Zaghim вне форума  
 
Непрочитано 20.10.2011, 17:00
1 | #4
gomer

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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Т.е. так:
такой вариант тоже подтормаживать будет, даже с обнуленной cmdecho
gomer вне форума  
 
Автор темы   Непрочитано 20.10.2011, 17:03
#5
Zaghim


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


А как тогда сделать правильно?
Кстати при расчленении такой вариант вообще не катит, потому что он не линию выбирает, а атрибуты в блоке и меняет их цвет
Zaghim вне форума  
 
Непрочитано 20.10.2011, 17:04
1 | #6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Код:
[Выделить все]
 (entmakex (list '(0 . "LINE") (cons 10 tvstav1) (cons 11 tvstav2) (cons 8 layer)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.10.2011, 17:40
1 | #7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Ради интереса проверил на скорость

Код:
[Выделить все]
 
(BenchMark
  '(
    (progn
     (command "line" tvstav1 tvstav2 "")
     (setq l0 (ssget "L"))
     (command "change" l0 "" "P" "la" layer "")
     (command "line" tvstav2 tvstav31 "")
     (setq l0 (ssget "L"))
     (command "change" l0 "" "P" "la" layer "")
     (command "line" tvstav2 tvstav32 "")
     (setq l0 (ssget "L"))
     (command "change" l0 "" "P" "la" layer "")
     (command "line" tvstav31 tvstav32 "")
     (setq l0 (ssget "L"))
     (command "change" l0 "" "P" "la" layer "")
     (command "line" tvstav3 tvstav4 "")
     (setq l0 (ssget "L"))
     (command "change" l0 "" "P" "la" layer "")
    )

    (mapcar
     '(lambda (pt1 pt2)
        (entmakex
          (list
            '(0 . "LINE")
            (cons 8 layer)
            (cons 10 pt1)
            (cons 11 pt2)
          ) ;_ end of list
        ) ;_ end of entmakex
      ) ;_ end of lambda
     (list tvstav1 tvstav2 tvstav2 tvstav31 tvstav3)
     (list tvstav2 tvstav31 tvstav32 tvstav32 tvstav4)
    ) ;_ end of mapcar
   )
) ;_ end of BenchMark
Результат
Код:
[Выделить все]
_$ 
Benchmarking ...............Elapsed milliseconds / relative speed for 4096 iteration(s):

    (MAPCAR (QUOTE (LAMBDA (PT1 PT2) (EN...).......1141 / 268.56 <fastest>
    (PROGN (COMMAND "line" TVSTAV1 TVSTA...).....306422 / 1 <slowest>
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Непрочитано 20.10.2011, 17:50
1 | #8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Ну если совсем "упираться" можно еще ' на function заменить - еще пару тактов отыграем - хотя и так не плохо вышло.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.10.2011, 09:13
#9
Zaghim


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


А как быть с блоком? Попробуйте взорвать блок с атрибутами...как выловить нужное, обойдя атрибуты? P.S. в самом блоке только отрезок...
Zaghim вне форума  
 
Непрочитано 21.10.2011, 10:18
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Тогда надо просто вытащить из блока отрезок - без "фейерверков", vla-CopyObjects - в справке по автокад тебе в помощь.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.10.2011, 11:16
#11
Zaghim


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


В справке искомая комбинация не найдена... можно хоть какой-то пример кода?
Zaghim вне форума  
 
Непрочитано 21.10.2011, 11:50
1 | #12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Zaghim Посмотреть сообщение
В справке искомая комбинация не найдена...
справка по VBA->object model->document->CopyObject - как использовать объектную модель в автолиспе - ищи на форуме - 500 раз уже расписанно.
p.s. при желании можно и без vla - (cdr (assoc -2 (tblsearch "block" "blockname"))) - ссылка на первый элемент блока "blockname", то есть, например, (entmakex (entget ...)) создаст его в начале координат (относительно точки вставки блока) - откуда его уже можно "перетащить" на нужное место, или через entget- прямо "на месте" померить и пр.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 21.10.2011 в 11:57.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.10.2011, 12:42
#13
Zaghim


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


Окей, щас попробуем...

Разобрался...но получается немного не то...
Блок динамический... т.е. я выдергиваю оттуда линию и она действительно рисуется вначале координат, но рисуется линия по умолчанию. Например длина лини в блоке 100, а на деле она 4000...
Может быть можно как-то по другому?
Хотя можно ведь выдернуть длину блока и его угол, а потом линию подредактировать...так?

Последний раз редактировалось Zaghim, 21.10.2011 в 13:40.
Zaghim вне форума  
 
Непрочитано 21.10.2011, 16:06
#14
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


найди динамические свойства, отвечающие за длину отрезка - они вытягиваются через объектную модель

GetDynamicBlockProperties

поищи на форуме поиском - там и коды есть
Frigate вне форума  
 
Автор темы   Непрочитано 21.10.2011, 17:47
#15
Zaghim


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


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


Задача усложнилась. Теперь внутри блока может быть все, что угодно и как быть ума не приложу(((

Последний раз редактировалось Zaghim, 27.10.2011 в 17:00.
Zaghim вне форума  
 
Непрочитано 29.10.2011, 19:07
#16
Кулик Алексей aka kpblc
Moderator

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


Без проверок:
Код:
[Выделить все]
 (vl-load-com)

(defun get-block-contents (ent / def res _kpblc-conv-vla-to-list)
                          ;|
*    Получение состава блока
*    Параметры вызова:
	ent		указатель на вхождение блока (ename или vla).
*    Возвращает список vla-примитивов блока.
*    Примеры вызова:
(get-block-contents (car (entsel "\nВыберите блок")))
|;
  (defun _kpblc-conv-vla-to-list (value / res) ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;  (cond ((listp value) (mapcar (function _kpblc-conv-vla-to-list) value))
          ((= (type value) 'variant) (_kpblc-conv-vla-to-list (vlax-variant-value value)))
          ((= (type value) 'safearray)
           (if (>= (vlax-safearray-get-u-bound value 1) 0)
             (_kpblc-conv-vla-to-list (vlax-safearray->list value))
             ) ;_ end of if
           )
          ((and (= (type value) 'vla-object) (vlax-property-available-p value 'count))
           (vlax-for sub value (setq res (cons sub res))) ;_ end of vlax-for
           )
          (t value)
          ) ;_ end of cond
    ) ;_ end of defun
  
  (cond ((and ent
              (= (type ent) 'ename)
              (= (cdr (assoc 0 (entget ent))) "INSERT")
              ) ;_ end of and
         (setq res (get-block-contents (vlax-ename->vla-object ent)))
         )
        ((and ent (= (type ent) 'vla-object) (wcmatch (vla-get-objectname ent) "*BLOCK*"))
         (if (equal (vla-get-isxref (setq def (vla-item (vla-get-blocks (vla-get-document ent)) (vla-get-name ent))))
                    :vlax-false
                    ) ;_ end of equal
           (setq res (cons ((lambda (/ _lst) (vlax-for subent def (setq _lst (cons subent _lst))) (reverse _lst)))
                           (_kpblc-conv-vla-to-list (vla-getattributes ent))
                           (_kpblc-conv-vla-to-list (vla-getconstantattributes ent))
                           ) ;_ end of cons
                 ) ;_ end of setq
           ) ;_ end of if
         )
        ) ;_ end of cond
  res
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.10.2011, 09:58
#17
Zaghim


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


Алексей, отработало буквально за доли секунды, но некоторые блоки не разбились. Сейчас выясню почему
Zaghim вне форума  
 
Непрочитано 31.10.2011, 11:03
#18
Кулик Алексей aka kpblc
Moderator

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


Так они не должны разбиваться-то, у меня нет explode...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.10.2011, 11:14
#19
Zaghim


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


Хм...т.е. я просто получаю список всего внутри блока? А как потом это нарисовать...с вижуал лиспом вообще не дружу
Zaghim вне форума  
 
Непрочитано 31.10.2011, 11:20
#20
Кулик Алексей aka kpblc
Moderator

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


Стоп, ничего не понял. У тебя уже есть блок, есть его состав. Чего ты хочешь рисовать? И зачем?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp. Оптимизация кода

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какими средствами пользуются программисты при создании кода AutoLISP Малявка Разное 4 22.10.2009 12:46
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? lexluther LISP 1 12.08.2009 08:37
Сбои AutoLIsp кода и методы борьбы. sialiv AutoCAD 11 25.04.2009 23:45
Как из Delphi запустить программу на AutoLISP Valery LISP 1 23.09.2005 20:51
LISP - оптимизация кода Torino LISP 7 02.08.2004 14:17