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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Автоматическая загрузка dll-файла посредством Acaddoc.lsp

Автоматическая загрузка dll-файла посредством Acaddoc.lsp

Ответ
Поиск в этой теме
Непрочитано 27.10.2009, 12:01
Автоматическая загрузка dll-файла посредством Acaddoc.lsp
hwd
 
C, C++, C#
 
С-Пб.
Регистрация: 07.10.2009
Сообщений: 2,762

На сервере, в некотором каталоге "//aaa/bbb/ccc/ddd/eee/AcadLibs/" разместил файл Acaddoc.lsp со следующим содержимым:
Код:
[Выделить все]
;;;Исключаю возможность перезаписи метода S::STARTUP...
(setq S::STARTUP (append S::STARTUP HwdStartup))

(defun-q HwdStartup()
(princ "\nПроверка связи...")
(command "AcadLayoutsCountLoad")
)
;;;Подгружаю .Net библиотеку...
(defun c:AcadLayoutsCountLoad()
  (setq echo (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq fd (getvar "filedia"))
  (setvar "filedia" 0)
  (command "netload" "//aaa/bbb/ccc/ddd/eee/AcadLibs/AcadLayoutsCount.dll")
  (setvar "filedia" fd)
  (setvar "cmdecho" echo)
)
В диалоговом окне Options, на вкладке Files добавил путь "//aaa/bbb/ccc/ddd/eee/AcadLibs" и установил его первой строчкой.
Однако получаю две проблемы:
1. Не происходит автоматической загрузки файла Acaddoc.lsp, несмотря на то, что каталог поиска добавлен.
2. Не удаётся загрузить .Net библиотеку из командной строки. Даже если вручную установлю "filedia" в 0 и выполню команду netload, указав путь "//aaa/bbb/ccc/ddd/eee/AcadLibs/AcadLayoutsCount.dll" или же "//aaa/bbb/ccc/ddd/eee/AcadLibs/AcadLayoutsCount" (т.е. без расширения файла) - загрузки библиотеки не происходит.

В чем проблемы?
Просмотров: 12405
 
Непрочитано 17.03.2017, 12:01
#21
AID88


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


Boxa, отсюда скачал библиотеку для создания счетчика листов в файле https://sites.google.com/site/bushma...ov-v-dwg-fajle.
Здесь как раз обсуждалось, как с помощью лиспа подключить ее в автокад.
AID88 вне форума  
 
Непрочитано 17.03.2017, 12:19
| 1 #22
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


AID88, а Вас не смутила дата публикации этой библиотеки? Все таки октябрь 2011 года, это довольно давно.
Да и библиотека собрана под .NET 3.5 и автокад 2009, а Вы ее пытаетесь запустить на .NET 4.6 и акад 2017.
В общем в том виде в котором библиотека сейчас, она работать не будет, нужно пересобирать.
Boxa вне форума  
 
Непрочитано 17.03.2017, 12:25
#23
AID88


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


Boxa, вобщем жаль=)
AID88 вне форума  
 
Непрочитано 17.03.2017, 12:28
#24
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


попробуйте обратиться к автору, может он Вам поможет, он часто тут бывает.
Boxa вне форума  
 
Непрочитано 18.03.2017, 02:52
#25
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Рискую немного зайти в оффтоп, но раз уж я знаю ответ на вопрос, в который перетекла эта тема, то отпишусь. Набросал наскоро решение на лиспе, которое вроде бы (если все правильно понял), выполняет ту же функцию. Должно работать на любой версии Автокада, но мне удалось потестировать только на 2011-й и 2015-й.
В общем, вот код:
Код:
[Выделить все]
 (if (null *SHEETS-COUNT-MOD-REAC*) 
	(setq *SHEETS-COUNT-MOD-REAC*
		(vlr-object-reactor 
			(list (setq *LAYOUTS* (vla-get-Layouts (vla-get-ActiveDocument (vlax-get-acad-object)))))
			nil
			(list 
				'(:vlr-modified . sheets_count_modified)
			)
		)
	)
)

(defun sheets_count_modified (*LAYOUTS* data reac / i)
	(setq i -1)
	(vlax-for x *LAYOUTS* (setq i (1+ i)))
	(setvar "USERI1" i)
	(princ)
)
(sheets_count_modified *LAYOUTS* nil nil)
Добавляем его в автозагрузку и создаем в нужном месте поле: либо с формулой, которая указана на сайте по ссылке (%<\AcVar USERI1>%), либо в диалоговом окне создания поля по пути: Категория полей - Другое -> Имена полей - СистемнаяПеременная -> USERI1.

Теперь о том, как работает код. Он создает реактор на событие изменения семейства ЛИСТОВ. При добавлении или удалении листа (а также при открытии чертежа, если добавлен в автозагузку) он срабатывает (реагирует) и назначает указанной системной переменной значение актуального количества листов, эту переменную и подхватывает созданное поле. После обновления привычным способом поле содержит в себе цифру, соответствующую количеству листов в файле. Правда, как в коде по ссылке, не обрабатываются листы-черновики (имя которых начинается с "_"), но это несложно добавить, если понадобится.

Последний раз редактировалось skkkk, 18.03.2017 в 03:16.
skkkk вне форума  
 
Непрочитано 19.03.2017, 17:27
#26
Кулик Алексей aka kpblc
Moderator

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


Только постоянным его не делай: http://adn-cis.org/use-persisten-reactors.html
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.03.2017, 21:49
#27
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Кулик Алексей aka kpblc, спасибо за важное замечание и полезную статью.
Правильно ли я понимаю, что создав этот реактор (запустив код выше), проверив его на постоянность
Код:
[Выделить все]
(vlr-pers-p *SHEETS-COUNT-MOD-REAC*)
и получив nil, я могу быть уверен, что он непостоянный?
То есть, постоянным его надо именно сделать, а по умолчанию он живет, пока открыт файл?
skkkk вне форума  
 
Непрочитано 20.03.2017, 08:41
#28
Кулик Алексей aka kpblc
Moderator

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


Я бы принудительно их делал непостоянными:
Цитата:
Determines whether a reactor is persistent

(vlr-pers-p reactor)
Arguments
reactor
A VLR object.
Return Values
The specified reactor object, if it is persistent; nil, if the reactor is transient.
Examples
Make a reactor persistent:
_$ (vlr-pers circleReactor)
#<VLR-Object-Reactor>
Verify that a reactor is persistent:
_$ (vlr-pers-p circleReactor)
#<VLR-Object-Reactor>
Change the persistent reactor to transient:
_$ (vlr-pers-release circleReactor)
#<VLR-Object-Reactor>
Verify that the reactor is no longer persistent:
_$ (vlr-pers-p circleReactor)
nil
Кода автора я не помню, увы И сказать, делал он реакторы постоянными принудительно или они "сами такие получались", не смогу
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Автоматическая загрузка dll-файла посредством Acaddoc.lsp

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
Загрузка DWG файла из БД MS Access? Trifon Программирование 6 10.02.2011 08:49
СПДС, Автоматическая загрузка при открытии файла Vildar Прочее. Программное обеспечение 11 05.09.2008 16:58
Выполнение acaddoc.lsp - частичное отображение опций команды Автокада Makswell LISP 18 26.03.2008 18:35