Schöck
Показать сообщение отдельно
Непрочитано 06.01.2007, 12:59 #1
Видео в AutoCAD 2007 и LISP
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 721

Вот здесь все началось http://dwg.ru/forum/viewtopic.php?p=111899#111899

В 2007 Автокаде есть возможность записывать видео неподвижных объектов. С помощью Лиспа эти объекты можно расшевелить, но есть одна проблема. Во время записи анимации лисп-функцию можно запустить только реактором(я создал реактор правой кнопки мыши) и никак больше и нельзя запустить запись видео из лисп. Например для вращения шестерней нужен длинный цикл, но вся беда в том что запись приостанавливается и ожидает когда цикл закончится, я пробовал даже бесконечный цикл.

вот максимум чего удалось достичь:
Надо запустить команду _anipath закрыть окно просмотра и чтобы получить эффект вращения шестерней надо постоянно щелкать правой кнопкой мыши. Файл с шестернями в архиве.

Код:
[Выделить все]
;загрузка библиотечных функций
(load "LibFunctionsSamoCAD.fas" "Приложение \"LibFunctionsSamoCAD.fas\" не найдено")

;определение указателей объектов и необходимых данных

(setq sh1point (list 0.0 0.0 0.0))
(setq sh2point (list 1285.8870 0.0 0.0))

(setq sh1obj
       (nth 0 (ename-or-vla-ssget-lst-samocad nil (ssget "_X" (list (cons 8 "Слой1")(cons 0 "3Dsolid"))) T));библиотечная возвращает список с указателями
)

(setq sh2obj
       (nth 0 (ename-or-vla-ssget-lst-samocad nil (ssget "_X" (list (cons 8 "Слой2")(cons 0 "3Dsolid")) ) T)))

(setq obj
       (nth 0 (ename-or-vla-ssget-lst-samocad nil (ssget "_X" (list (cons 8 "Слой3")(cons 0 "3Dsolid")) ) T)))

;функция вращения шестерней

(defun rotsh (angSh1 angSh2)
    (vla-rotate sh1obj (vlax-3d-point sh1point) (deg->rad-samocad angSh1))
    (vla-rotate sh2obj (vlax-3d-point sh2point) (deg->rad-samocad angSh2))

  (vla-update sh1obj)
  (vla-update sh2obj)
  (princ)

  )
;;;(rotsh 10.0 -5.0)


(setq mousereactor (vlr-mouse-reactor nil (list '(:vlr-beginrightclick . mousefun))))


(defun mousefun (a b)
  (rotsh 10.0 -5.0)
  (princ)
    )
также пробовал делать реактор на камеру, но не смотря на то что во время записи камера движется по заданной траектории те модифицируется, событий для реактора всеравно не происходит.

Вобщем надо сделать так, чтобы лиспфункция запускалась циклично, не прерывая и не приостанавливая текущих операций. Например былобы неплохо еслибы существовал реактор на системную переменную CDATE, обычный SysvarReactor почемуто на нее не реагирует.
Или же на худой конец сам создаваемый видеофайл является документом стороннего приложения, значит на этот видеофайл можно получить VLAуказатель, и поставить на него реактор, хотя наврядли этот объект будет сообщать реактору о своих изменениях без применения метода(vla-update).

А еще лучше былобы отыскать недокументированную возможность или функцию записи, тоесть создать лисп-функцию примерно такого тиапа
(record [видеопараметры] [положение камеры] [путь создаваемого видеофайла])
наверняка это можно сделать.
И выполнять такую функцию в цикле с модификациями объектов, правда в итоге получится куча видеофайлов, но их можно будет сшить какойнибудь программой.
[ATTACH]1168077586.rar[/ATTACH]
Просмотров: 5920
 
Размещение рекламы