Как вы поняли, код, присутствующий в файле acaddoc.lsp
, будет оцениваться только при запуске чертежа, поэтому значение вашей переменной *LayoutCount*
будет правильным только в момент, когда чертеж впервые открыт.
Одним из возможных способов обойти это может быть использование Visual LISP Reactor для обновления значения этой переменной после определенных действий.
Например, вы можете использовать Miscellaneous Reactor следующим образом для обновления значения переменной при изменении активного макета:
(
(lambda ( )
(vl-load-com)
(foreach grp (vlr-reactors :vlr-miscellaneous-reactor)
(foreach rtr (cdr grp)
(if (= "layoutcount-reactor" (vlr-data rtr))
(vlr-remove rtr)
)
)
)
(vlr-set-notification
(vlr-miscellaneous-reactor "layoutcount-reactor"
'(
(:vlr-layoutswitched . layoutswitched-callback)
)
)
'active-document-only
)
(defun layoutswitched-callback ( rtr arg )
(setq *layoutcount* (length (layoutlist)))
)
(layoutswitched-callback nil nil)
(princ)
)
)
Скопируйте приведенный выше код в acaddoc.lsp
, и переменная *layoutcount*
будет определена при запуске чертежа и будет обновляться каждый раз при изменении активного макета.
Кроме того, нет необходимости удалять Model
из списка, возвращаемого функцией layoutlist
, так как эта функция возвращает только список макетов Paperspace.
Однако недостатком использования глобальных переменных для предоставления этой информации является то, что глобальная переменная будет определена в пространстве имен документа только во время активного сеанса AutoCAD, и ее потребуется переопределять для каждого сеанса<. /сильный>.
Таким образом, если один из ваших коллег или третье лицо откроет файл чертежа, если они также не запустили код, найденный в вашем acaddoc.lsp
, переменная *layoutcount*
не будет определена, и, следовательно, поле не будет отображаться правильно.
Таким образом, альтернативой является использование того факта, что выражение поля может фактически ссылаться на любое свойство ActiveX, а не только на те, которые отображаются в диалоговом окне команды FIELD
.
Я демонстрирую эту технику на своем приложении Layout Field, которое позволяет вам создать выражение поля, ссылающееся на Count
свойство коллекции макетов.
Этот подход имеет несколько преимуществ:
- Содержимое чертежа не зависит от какого-либо внешнего кода.
- Системная переменная
CTAB
не указана, что означает, что команда DATAEXTRACTION
выведет правильную информацию, а не одно и то же значение для каждого макета.
person
Lee Mac
schedule
11.08.2019