Тема: Работа программы в неактивном документе

Кто знает объясните такую штуку.
Приведённый кусок кода преобр. строки в верхний регистр.
S - объект selectionset содержащий строки (объекты)

  (vlax-for n s
    (vla-put-TextString n (strcase (vla-get-TextString n) nil))
    (vla-Update n)
  )

Если выполнить его в активном чертеже весь процесс занимает меньше секунды (200 строк). Но вот если это применить к неактивному документу, раз в 10 дольше.

Re: Работа программы в неактивном документе

А второй документ был уже загружен?

Re: Работа программы в неактивном документе

Yes of cose. В том-то и вопрос, что именно эта часть работает очень медленно в неактивном документе и практически моментально в активном.

Re: Работа программы в неактивном документе

Тут можно долго теоретизировать. Попробуйте замерять время выполнения функций. Я специально выложил timechek.arx:
http://www.maestrogroup.com.ua/support/timecheck.zip
Принцип использования такой:
1) перед измеряемой функцией (timecheck_start)
2) после измеряемой функции
(setq msecs (timecheck_stop))
3) msecs - время в миллисекундах (real)
P.S. Подозреваю, что основная задержка в (vla-Update) на неактивном документе.

Re: Работа программы в неактивном документе

Поэкспериментировал даже так

  (vlax-for n s)

время измерял предложенной функцией
В активном документе 10 мСек
в неактивном 9000

Re: Работа программы в неактивном документе

> Alexander
Однако! Тогда очевидно неэффективный доступ к selectionset содержащий объекты неактивного документа. sad Возможно идет временое переключение того документа в активное состояние, а затем обратно для при выборе каждого объекта в selectionset. Не знаю...

Re: Работа программы в неактивном документе

А если экспериментировать без (vlax-for n s) ?
в неактивном будет сильно отличаться от 9000?

Re: Работа программы в неактивном документе

Для эксперимента я слепил ф-цию которая
ничего кроме (vlax-for n s) не делает, просто открывает
файл и выполняет (vlax-for n s) или не открывает
а получает указатель на уже открытый.

Re: Работа программы в неактивном документе

Приношу извинения, нужно было сразу выложить
функцию да лень было убирать всё лишнее, что не относится к вопросу.

(defun opa (active
            /
            ACAD_APPLICATION
            ACTIVE_DOCUMENT
            DOC
            DOCS
            MODEL_SPACE
            NAMFIL
            S
            SS
            flag
           )
  (vl-load-com)
  (setq acad_application (vlax-get-acad-object))
  (setq docs (vla-get-documents acad_application))
  (if active
    (setq doc (vla-get-activedocument acad_application))
    (progn
      (setq namfil (getfiled "opa" "c:\\" "" 4))
      (setq doc (vl-catch-all-apply 'vla-open (list docs namfil)))
    ) ;_ end of progn
  ) ;_ end of if
  (setq ss (vla-get-selectionsets doc))
  (vlax-for item ss
    (if (= (vla-get-name item) "s")
      (setq flag t)
    ) ;_ end of if
  ) ;_ end of vlax-for
  (if flag
    (vla-delete (vla-item ss "s"))
  ) ;_ end of if
  (setq s (vla-add ss "s"))
  (vla-select
    s
    acselectionsetall
    nil
    nil
    (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 0)) '(0))
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbvariant '(0 . 0))
      '("TEXT")
    ) ;_ end of vlax-safearray-fill
  ) ;_ end of vla-select
  (princ "\nСтрок в чертеже:")
  (print (vla-get-count s))
  (vlax-for n s)
  (princ)
) ;_ end of defun

Re: Работа программы в неактивном документе

Это следствие того, что lisp-функции выполняются в контексте документа... В цикле vlax-for постоянно переключат контекст между этими двумя документами... Это видно даже по перемигиванию статусной строки AutoCAD... Увы... Такая реализация...
P.S. Небольшой оффтопик. Когда-то при переходе с AutoCAD R12(R13 DOS) на AutoCAD R14 я писал программу, которая выполняла перекодировку dwg-файлов из dos-866 в window-1251. Она перекодировала не только текстовые примитивы, но и наименования блоков, слоев, расширенные данные и т.д., и т.п. - все что только можно было придумать)
Эта программа, реализованная на ObjectARX, обрабатывала целые каталоги с *.dwg-файлами, не загружая их в редактор AutoCAD. Скорость работы меня впечатлила - ни один из чертежей, а их размеры доходили до десятка мегабайт, не перекодировался дольше 5 секунд.
Вывод: такие вещи нужно делать на ObjectARX.

Re: Работа программы в неактивном документе

> Александр Ривилис
Тогда, может быть лучше, переключиться между документами один раз туда и один раз обратно...
Правда, надо будет создавать скрипт или как-то подругому передавать управление, но наверняка скорость можно поднять.

Re: Работа программы в неактивном документе

Неа. Так не получится. Еще раз - lisp-функция выполняется в контексте документа, а не в контексте приложения. Как только активным становится другой документ, работа функции приостанавливается до момента переключения обратно в тот документ, из которого она была запущена. Поэтому (IMHO) цикл vlax-for работает так (если объекты принадлежат другому документу):
1) переключение в документ, в котором содержится объект.
2) выполнение действия, заданного для него
3) возврат в "свой" документ.
И так для всех объектов из selectionset.
Передать управление lisp-программе из другого документа нельзя (она не будет работать до момента, когда тот документ станет активным).
P.S.: Обратите внимание, что в (ssget) можно выбирать только примитивы из активного документа.

Re: Работа программы в неактивном документе

> Александр
Ривилис

Вывод: такие вещи нужно делать на ObjectARX.

На изучение С++ уйдёт много времени, которого нет.
Это тот случай когда можно использовать и VBA.