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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ACAD-2002. Глюк начальной загрузки ЛИСП?

ACAD-2002. Глюк начальной загрузки ЛИСП?

Ответ
Поиск в этой теме
Непрочитано 29.08.2005, 16:24 #1
ACAD-2002. Глюк начальной загрузки ЛИСП?
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 202

Всем привет!

Сегодня, отлаживая программу, наткнулся на непонятный
глюк - если установить SDI=1 (однооконный режим), то
перестают автоматически загружаться файлы acad.lsp
и acaddoc.lsp, если открывать файлы через "список ранее
открывавшихся файлов", тот, что появляется внизу меню
"Файл".

Выглядит это вот как:

делаем файл acad.lsp со строкой
(princ "000000")(princ " \n")

и делаем файл acaddoc.lsp со строкой
(princ "111111")(princ " \n")

Входим в АКАД, открываем любой файл (любым способом)
и видим внизу строки:

000000
111111

т.е. все, как доктор прописал. Через меню "Файл->Открыть"
или кнопочку "Открыть" на панели открываем разные файлы.
Все прекрасно, "нулики" и "единички" бодро появляются внизу
экрана. Но стоит только выбрать файл из "запомненного"
Автокадом списка файлов, как появляется сообщение:

Команда: Неизвестная команда "S::STARTUP". Для вызова справки нажмите F1.

(Только вместо  символ, чем-то напоминающий твердый
знак, ASCII-128)

И все... Такое сообщение будет выдаваться на каждый вновь
открываемый файл (уже независимо, каким способом), пока
не закроешь Актокад.

Видимо, Автокад "навешивает" некие действия на пункты
"запомненных файлов"...

Вопрос стандартный - это лечится?
__________________
Счастливо, Алексей!
Просмотров: 8287
 
Непрочитано 29.08.2005, 17:15
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Вообще то ACAD.LSP и должен загружатся 1 раз за сеанс работы, а не в каждый чертёж. В каждый чертёж он загружается только если системная переменная ACADLSPASDOC=1. Может где то тут заморочка?

А если не секрет скажи зачем делаешь SDI=1? Я вот как то никак немогу найти применение однодокументному режиму. Прости интересно как это можно использовать?
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 29.08.2005, 18:11
#3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 202


Привет!

> В каждый чертёж он загружается только если системная переменная
> ACADLSPASDOC=1.

Да не, все комбинации с LISPINIT и ACADLSPASDOC я перепробовал
еще до того, как послать свое сообщение. Естественно, вслед
за acad.lsp игнорируется и acaddoc.lsp

Едитственное с чем не игрался, так это с файлом acad2002.lsp.

> А если не секрет скажи зачем делаешь SDI=1?

Я пишу программу, которой будет пользоваться целый отдел.
В отделе есть любители "однооконного" режима. Объясняют
свою привязанность они просто: если открыть несколько копий
АКАД и в каждый загрузить по чертежу, то переключаться между
ними, щелкая по появившимся "кнопкам" на панели задач Windows
удобнее, чем каждый раз лазить в меню "Окно" одной-единственной
копии АКАД и переключать чертежи там.

Ну а мне приходится учитывать все пристрастия пользователей...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 29.08.2005, 18:15
#4
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 202


Привет!

> В каждый чертёж он загружается только если системная переменная
> ACADLSPASDOC=1.

Да не, все комбинации с LISPINIT и ACADLSPASDOC я перепробовал
еще до того, как послать свое сообщение. Естественно, вслед
за acad.lsp игнорируется и acaddoc.lsp

Едитственное с чем не игрался, так это с файлом acad2002.lsp.

> А если не секрет скажи зачем делаешь SDI=1?

Я пишу программу, которой будет пользоваться целый отдел.
В отделе есть любители "однооконного" режима. Объясняют
свою привязанность они просто: если открыть несколько копий
АКАД и в каждый загрузить по чертежу, то переключаться между
ними, щелкая по появившимся "кнопкам" на панели задач Windows
удобнее, чем каждый раз лазить в меню "Окно" одной-единственной
копии АКАД и переключать чертежи там.

Ну а мне приходится учитывать все пристрастия пользователей...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 29.08.2005, 21:21
#5
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,151


Цитата:
В отделе есть любители "однооконного" режима. Объясняют
свою привязанность они просто: если открыть несколько копий
АКАД и в каждый загрузить по чертежу, то переключаться между
ними, щелкая по появившимся "кнопкам" на панели задач Windows
удобнее, чем каждый раз лазить в меню "Окно" одной-единственной
копии АКАД и переключать чертежи там.
Установи им DwgStrip от DotSoft'а (скачивается с dotsoft.com совершенно за бесплатно), чтобы они переключали чертежи, щелкая по вкладкам типа layout-ных. И будет им щастье. да и тебе тоже, потому как хлопот меньше.
Лентяй вне форума  
 
Непрочитано 29.08.2005, 23:23
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,274
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от ===AAA===
если открыть несколько копий
АКАД и в каждый загрузить по чертежу, то переключаться между
ними, щелкая по появившимся "кнопкам" на панели задач Windows
удобнее, чем каждый раз лазить в меню "Окно" одной-единственной
копии АКАД и переключать чертежи там.
Такой дикий способ они могли придумать только на больную голову.
Во-первых, неизбежны конфликты при запуске нескольких копий одной и той же версии AutoCAD - они будут использовать одни и те же ветки в регистратуре. Это может быть не заметно до поры, но когда аукнется - мало не покажется.
Во-вторых, при такой системе в памяти будет висеть сразу несколько ядер AutoCAD. У них что на PC память безразмерная? :-)
Александр Ривилис вне форума  
 
Непрочитано 29.08.2005, 23:56
#7
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,429
<phrase 1=


Цитата:
Во-вторых, при такой системе в памяти будет висеть сразу несколько ядер AutoCAD. У них что на PC память безразмерная?
Я конечно не сторонник такого метода работы, но разве windows не использует повторно уже загруженные процессы?
зы. Я тоже не люблю реестр и всяко разно его обзываю
zamtmn вне форума  
 
Непрочитано 30.08.2005, 00:15
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,274
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от zamtmn
Я конечно не сторонник такого метода работы, но разве windows не использует повторно уже загруженные процессы?
зы. Я тоже не люблю реестр и всяко разно его обзываю
Использует лишь отчасти. Я для интереса запустил несколько AutoCAD 2002 - каждый дополнительно(!) прихватывает по 25Мб. При моем 1Гб RAM вроде и не много, а если у пользователя всего 256Mб их которых сразу при старте системы 128Мб занято... Так что много это или мало - вопрос сложный. А registry я называю регистратурой хотя бы по тому, что такой перевод дает словарь. А переводчики от Microsoft мне не указ! :-D
Александр Ривилис вне форума  
 
Непрочитано 30.08.2005, 00:59
#9
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


Открывать много одиночных сессий автокада довольно геморойно уж извините за прямоту. А лезть в ОКНО для перехода из одного чертежа в другой тоже не сахар, попробуйте друзья прижать большим пальцем левой рулки CTRL а уцазательным постукивать по TAB, и посмотрите как все просто. :-)
Startrek вне форума  
 
Автор темы   Непрочитано 30.08.2005, 05:36
#10
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 202


Всем привет!

Памяти на тех машинах по 512Мб.
CTRL-TAB это, конечно, хорошо...

Но это "косвенный" метод обхода глюка. Хотелось бы услышать
что-то вроде:

а) Да, это известная проблема, лечится так-то...
б) Да, это известная проблема, она устранена в версии X.Y...
в) Да ничего у нас не глючит - это твой АКАД кривой!
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 30.08.2005, 07:07
#11
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 202


Всем привет!

Очередная "информация к размышлению".
Увы, это все-таки глюк АКАД-а.

Делаем просто - в начало файла acaddoc.lsp пишем:
(setq indsob"DRM-S")
(princ indsob)(princ " \n")

далее идут всякие проверки и вызовы (load).

В одном из этих вызываемых файлов есть (S:STARTUP),
содержащая лишь строку (princ "\nПривет-start!").

Устанавливаем SDI=1, входим в любой файл. Все О'К.
Начинаем "щелкать" по "запомненным" файлам. 2-3
щелчка (иногда и дольше - систему пока не выяснил)
все нормально. Но вот на одном из щелчков получаем
знакомое сообщение:

Команда: Неизвестная команда "S::STARTUP". Для вызова справки нажмите F1.

Ага! С этого момента начинаем "щелкать" исключительно
по первому из "запомненных" файлов, т.е. фактически
"перезагружаем" текущий рисунок. Сделаем это 5-6 раз.
А теперь смотрим лог:
===========================================================
Команда:
Открывается файл формата AutoCAD 2000.
Подстановка [simplex.shx] вместо [ru-s.shx].
Выполняется регенерация модели.

Команда:
Команда: Неизвестная команда "S::STARTUP". Для вызова справки нажмите F1.

Команда:
Открывается файл формата AutoCAD 2000.
Подстановка [simplex.shx] вместо [ru-s.shx].
Выполняется регенерация модели.

Команда:
Команда:
Открывается файл формата AutoCAD 2000.
Подстановка [simplex.shx] вместо [ru-s.shx].
Выполняется регенерация модели.

Команда:
Команда:
Открывается файл формата AutoCAD 2000.
Подстановка [simplex.shx] вместо [ru-s.shx].
Выполняется регенерация модели.

Команда:
Команда:
Открывается файл формата AutoCAD 2000.
Подстановка [simplex.shx] вместо [ru-s.shx].
Выполняется регенерация модели.

Команда:
Команда:
Открывается файл формата AutoCAD 2000.
Подстановка [simplex.shx] вместо [ru-s.shx].
Выполняется регенерация модели.

Команда:
Команда: (princ S::startup)
nilnil

Команда: DRM-S

Загружается Super-Dream...
Утилиты меню AutoCAD загружены.
Привет-start!
Привет-start!
Привет-start!
Привет-start!
Привет-start!
Команда:
===========================================================

Обратите внимание на реакцию системы на невинную команду
(princ S::startup)

Т.е. АКАД добросовестно загружал каждый раз файлы, но
(s::startup) не выполнял, а "хранил в заначке".
И радостно выполнил ее 5 раз.

Ваши комментарии?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 30.08.2005, 09:41
#12
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


> ===AAA===
Я честно говоря вообще (s::startup) вообще никогда не использую, да и ACADDOC.LSP тоже теперь не использую. Обычно пишу ЛИСП-файл меню с расширением *.mnl. Там сначала (load ......) а, затем исполняется несколько функций (..........), в основном это проверки параметров сохранённых в словарях и установка некоторых глобальных переменных. Вроде такое положение дел пока устраивает, хотя у тебя могут быть какие нибудь тонкости.

В *.mnl-файлах есть ещё и большой плюс. У продвинутых пользователей ACADDOC.LSP часто что нибудь содержит и при переносе на другие компы это вызывает сложности. А *.mnl-файлы привязаны к соответствующему меню лезть туда обычно никому не надо. Загрузил один раз меню и дальше всё работает.
{Smirnoff} вне форума  
 
Непрочитано 30.08.2005, 09:44
#13
Кулик Алексей aka kpblc
Moderator

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


Глюк этот связан именно с s::startup (imho) - процедура пытается выполниться, когда еще не весь кад "активизирован", т.е. не все библиотеки подгружены.
Выход: попробовать процедуру выполнять в отдельном файле, а в acad.lsp в самом конце просто прописать (load "myfile.lsp"). В файле myfile в конце напрямую вызвать команду. Нечто вида:
Код:
[Выделить все]
;;; acad.lsp :
;;; Стандартные команды
(load "myfile.lsp")
;;; Конец файла acad.lsp

;;; myfile.lsp:
(defun c:apploader()
); _end of defun

(c:apploader)
;;; Конец файла myfile.lsp
Подчеркиваю : МНОГО РАЗ ИМХО и без проверок.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.08.2005, 10:02
#14
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Вот у меня появилась идея насчёт твоего глюка. В принципе (s::startup) нет надобности использовать если в ней не содежится (COMMAND которые не могут работать до полной инициализации чертежа. А может у тебя есть (COMMAND до (s::startup) :?: и в этом вся фигня?
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 30.08.2005, 10:33
#15
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 202


Привет!

Эх, если бы все было так просто....

То kpblc

Да так и делается. Вот цепочка вызовов (load).

acaddoc.lsp -> setup.a2k -> start.a2k

и вот в этом-то последнем и определена (s::startup)

То Fantomas

Нет, "командов" нет ни "до" ни "после" s::startup. Они же
там просто не работают :-)

Собственно говоря, и сама S::startup написана ради "коммандов".
Это определения (при необходимости, переопределения)
текстовых стилей, _purge, показ слайдов с "новостями" и т.п.

Вся эта "богадельня" прекрсно работала в версиях 10,12,14
да и в 2002 при SDI=0 тоже работает нормально.

Глюк проявляется только при выборе файлов из "ранее запомненных"
при SDI=1
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 30.08.2005, 10:39
#16
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
показ слайдов с "новостями" и т.п.
Круто там всё у тебя!

А от SDI=1 надо по моему уходить. А может для "непокорных" написать функцию с реактором на изменение SDI? Он только SDI=1, а она ему бац SDI=0 и слайд страшный-страшный с подвешенным за одно место автокадчиком
{Smirnoff} вне форума  
 
Непрочитано 30.08.2005, 11:24
#17
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Вот набросал тебе такую функцию с реактором. Поставь KillSDI в автозагрузку. Как только пользователь попытается сделать SDI=1, она вернет SDI=0 и выведет предупреждение.
Код:
[Выделить все]
(defun KillSDI(/ isFlag reaLst sdiRea)
  (vl-load-com)
  (if(= 1(getvar "SDI"))
    (setvar "SDI" 0)
    ); end if
  (setq isFlag nil)
  (if(setq reaLst(vlr-reactors))
    (progn
      (foreach rea reaLst
	(if(equal "KillSDI"(vlr-data(cadr rea)))
	  (setq isFlag T)
	  ); end if
	); end foreach
      ); end progn
    ); end if
  (if(not isFlag)
    (setq sdiRea
	   (vlr-sysvar-reactor '"KillSDI"
	     '((:vlr-sysVarChanged . ReturnSDI))))
    ); end if
  (princ)
  ); end of KillSDI


  (defun ReturnSDI(Reactor Arg /)
    (if(= 1(getvar "SDI"))
      (progn
      (setvar "SDI" 0)
      (alert "SDI variable now again equal 0!
             \n Don't change this variable!!!")
      ); end progn
      ); end if
    (princ)
    ); end of ReturnSDI
{Smirnoff} вне форума  
 
Непрочитано 30.08.2005, 11:58
#18
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Забыл одну строчку. Собственно говоря:
Код:
{Smirnoff} вне форума  
 
Непрочитано 30.08.2005, 13:52
#19
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,103


Алексей, многие твои проблем в том, что ты упорно держишься за устаревшие технологии. SDI тому пример. Сделать удобный переход между документами можно разными способами. Есть, например, бесплатная утилита

http://www.activedwg.com/Downloads/CxDocBar16.zip

где-то рядом должен валяться и CxDocBar15.zip

которая делает у окон "закладки", по которым удобно переключаться.

Что касается S::STARUP, то от нее надо избавляться. Это "наследие мрачных времен". Как ее запускает Автокад, никто точно не знает. А если нужна собственная обязательная функция, выполняемая каждый раз, напиши ее сам и вызывай на выполнение тогда, когда нужно. Можно и в acaddoc.lsp прописать, и в mnl. Хоть куда. Но ты будешь точно знать, что и почему происходит.

Заодно разыщи и прибей все S::STARTUP, где бы они не встретились.

Причины сбоев могут быть в том, что сейчас LISP-функции не являются более списками, которые можно было на лету модифицировать. А S::STARTUP как раз была, возможно единственной такой функцией. Все другие одноименные функции переопределяют друг друга по мере объявлений. А S::STARTUP, скорее всего, внутри Автокада пытается себя модернизировать, путем добавления нового кода. По крайней мере так было задумано. Таинственный значок, наверное, и есть "трупик" предыдущей STARTUP. Он же теперь двоичный код, а не список, как было в R14.

Чтобы функция могла модифицироваться, ее надо объявлять через defun-q. То есть (defun-q S::STARTUP ...

А "свою" STARTUP добавлять так (см. справку)

Цитата:
The internal implementation of defun changed in AutoCAD 2000. This change will be transparent to the great majority of AutoLISP users upgrading from earlier versions of AutoCAD. The change only affects AutoLISP code that manipulated defun definitions as a list structure, such as by appending one function to another, as in the following code:
Код:
[Выделить все]
(append s::startup (cdr mystartup))
Подробнее см. пример в \Sample\VisualLISP\External\blackboard.lsp
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 30.08.2005, 15:17
#20
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 202


Привет, Сергей!

Рад видеть, ты мое мыло получил?

>Что касается S::STARUP, то от нее надо избавляться. Это "наследие мрачных времен".

Да еще каких мрачных :-) Однако, как я от нее избавлюсь,
мне же при старте (command'ы) выполнять надо...

(defun-q s::startup) проблему не решила.

Устаревшие технологии, да - признаю. Но увы, пока у меня
цель "по-быстрому", пока есть время, переписать старые
наработки...

Я тут еще один глючок нарыл при работе со скриптами -
глаза на лоб! Но пока не буду его озвучивать, нужно покопать
поглубже.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ACAD-2002. Глюк начальной загрузки ЛИСП?

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

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