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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как можно оптимизировать код для его более скорстной отработки?

как можно оптимизировать код для его более скорстной отработки?

Ответ
Поиск в этой теме
Непрочитано 17.07.2011, 20:11 #1
как можно оптимизировать код для его более скорстной отработки?
mamuk
 
Сургут
Регистрация: 06.05.2010
Сообщений: 248

доброго вечера! делаю код для импорта координат, сама программка отрабатывает свое назначение, но работает очень долго при импорте большого количества точек, это видать связано с командным способом вставки блоков, и после вставки блоков задумывается на некотрое время, это видимо из-за метки отката? как можно обойти данное неудобство? код также записывает данные (отметка) в атрибут блока "ALTITUDE" перед этим ещет его в боке. в блоке 7 атрибутов.
Код:
[Выделить все]
 ; Импорт координат      
(defun c:import_coord (/ file lst handle res i xyz  ixyz  nab ename_attr attr sp_attr)
  (setvar "dimzin" 0)
  (setq os_m (getvar "osmode"))
  (setvar "osmode" 0)
    (setq file (getfiled "Файл с исходными данными" "" "txt" 4))
               (setq handle (open file "r"))
                (while (setq str (read-line handle))
                  (setq res (cons str res))
                    )
                   (close handle)
                    (setq handle nil)
  (setq i -1)
                        (repeat (length res)
              (setq i (1+ i))
              (setq xyz (vl-list->string (subst '32 '44 (vl-string->list (nth i res)))))
              (setq name (cons (substr xyz 1 (vl-string-position 32 xyz)) name))
              (setq ixyz (cons  (read (strcat "(" xyz ")" )) ixyz))
              )
 
  (vl-cmdf "_.insert" "test" "0.0,0.0"  "" "" "" "_.explode" "_l")
  (setq p -1)
 (repeat (length ixyz)
    (setq p (1+ p))
(vl-cmdf "_insert" "OTRLF"  (cdr (nth p ixyz)) "" "" "")
  (setq nab (entlast))
                   (setq ename_attr (entnext nab))
 (while (/= attr "ALTITUDE")
 (setq ename_attr (entnext ename_attr))
    (setq attr (cdr(assoc 2 (entget ename_attr))))
   )
     (setq sp_attr (entget ename_attr))
  (entmod (subst (cons 1 (rtos (car (reverse(nth p ixyz))) 2 2)) (assoc 1 sp_attr) sp_attr))
   (setq attr nil)
   (entmake (append '((0 . "TEXT")(100 . "AcDbEntity") (67 . 0) (410 . "Model") 
(8 . "имена") (100 . "AcDbText") (40 . 1.0)  
(50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11 0.0 0.0 
0.0) (210 0.0 0.0 1.0) (100 . "AcDbText")(62 . 122)(73 . 0)) (list(cons 1 (nth p name))) (list(cons 10 (mapcar '+ '(0.5 0.5 0.0)   (cdr (nth p ixyz)))))))
      )
  (command "_Undo" "_M")
  (setvar "osmode" os_m)
 
  )
Просмотров: 2775
 
Непрочитано 17.07.2011, 20:33
1 | #2
gomer

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


Попробуй vla-InsertBlock и vla-Explode
gomer вне форума  
 
Автор темы   Непрочитано 18.07.2011, 09:32
#3
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


т.е. для более быстрой работы кода командные методы необходимо исключать, и спользовать activex? Спасибо!
mamuk вне форума  
 
Непрочитано 18.07.2011, 09:48
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Примитив "Text" ты создаешь entmake'ом, точно так же можно создавать примитив "Insert" (вместо "_insert" "OTRLF" ...)
Код:
[Выделить все]
(defun Insert (pt Nme)
  (entmakex (list (cons 0 "INSERT")
                  (cons 2 Nme)
                  (cons 10 pt))))
entmake и block/insert
Вот еще пример как entmake'ом создать и вставить блок
Пример vla-insertblock см insrot.lsp
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 02.08.2011, 07:23
#5
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


попробовал через vla-InsertBlock примерно также отрабатывает, попробую через entmake
mamuk вне форума  
 
Непрочитано 02.08.2011, 20:16
#6
Li6-D


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


Функция nth редко применяется при обработке списков. С пользой для дела можно заменить фрагмент:
Код:
[Выделить все]
(setq i -1)
(repeat (length res)
  (setq i (1+ i))
  (setq xyz (vl-list->string (subst '32 '44 (vl-string->list (nth i res)))))
  (setq name (cons (substr xyz 1 (vl-string-position 32 xyz)) name))
  (setq ixyz (cons  (read (strcat "(" xyz ")" )) ixyz))
)
на следующий:
Код:
[Выделить все]
(foreach xyz res
  (setq xyz (vl-list->string (subst '32 '44 (vl-string->list xyz)))
        name (cons (substr xyz 1 (vl-string-position 32 xyz)) name)
        ixyz (cons  (read (strcat "(" xyz ")" )) ixyz)
) )
Аналогичным образом можно заменить и следующую функцию repeat.
Переменную name надо сделать локальной (иначе она будет "пухнуть" с каждым исполнением программы),
a xyz можно убрать из списка локальных переменных команды (она внутренняя для функции foreach).
Вообще предполагаю, что последовательность while->repeat(или foreach)->repeat(или foreach) можно заменить одним циклом while.
При этом сократится как количество переменных, так и объем данных в них хранимых.
Li6-D вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как можно оптимизировать код для его более скорстной отработки?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание форм и шрифтов для AutoCAD Shoorup AutoCAD 6 25.01.2013 17:43
как в автокаде можно раздробить 3dfaces на более мелкие части? карандаш AutoCAD 5 25.07.2009 14:09
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46