|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Почему? После вызова (fun2) проверь значение value. Просто она внутри функции fun2 "перекрывается" локальной переменной. Это же базовые понятия - область видимости функций и переменных! Как делается локальный обработчик ошибок в лиспе? Да точно по такому же принципу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Ну, к примеру: http://www.sernam.ru/c_24.php и http://msdn.microsoft.com/ru-ru/library/1t0wsc67.aspx
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Вопрос знатокам VisualLisp по поводу команды begin_activex из поста #918.
Как правильнее: получать указатели на объекты (приложения, документа, пространств листа и модели) в каждом случае или хранить их в глобальных переменных? И второй вопрос по поводу загрузки lisp-функций. Насколько я понимаю основных вариантов два: загружать нужные файлы лисп непосредственно перед выполнением функции и загружать весь набор файлов с функциями при загрузке чертежа *.dwg. Кто как делает и почему?
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Тут ответ (по идее) не завязан на какой-то язык...
Указатели на документ, пространство модели, а также коллекции (например, коллекция слоев, или коллекция блоков), я думаю, лучше всего делать глобальными. Инициализировать при самом начале работы. По загрузке (если рассматривать некомпилированные коды) я вижу несколько вариантов: 1. Хранить все коды по принципу "один файл lsp = одно определение функции". 2. Все коды засовывать в один lsp-файл, который и подгружать 3. Каждый раз по новой прописывать определение нужных функций. У каждого из подходов есть свои плюсы и свои минусы...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Алексей, дилетантский вопрос: если в начале работы получить указатели на коллекции слоев, блоков, пространства модели, то будут ли они корректно восприниматься при добавлении новых слоев и т.д. или нужно будет заново их определять?
По поводу загрузки: прочитал твое эссе и не знаю, то ли оставить загрузку lisp-функций как она есть у меня сейчас (т.е. в каждом файле одна функция, при загрузке чертежа загружается функция, которая определяет все файлы с расширением lsp в указанном каталоге загружает их все подряд) или строить более сложную конструкцию на основе твоих функций. На данный момент все работает с моим топорным подходом, хотя там есть вложенные функции (например обработчик ошибок из "САПР на базе AutoCAD...", а там два или три уровня вложенности)
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Цитата:
![]() Создаем новый файл, в нем сразу (vl-load-com) и следом: Код:
Код:
Код:
Теперь насчет загрузки. Если (подчеркиваю - если!) у тебя AutoCAD до 2006 включительно (на 2007 не проверял); если у тебя в каждом lsp-файле только одна функция, которая не обращается к другим; или у тебя каждый lsp вручную засунут в автозагрузку,- то все, что я писал, становится неактуальным. Если же хотя бы одно из условий не соблюдается, то приходится изворачиваться. P.S. Что такое "вложенность" функций в твоем понимании? В моей интертрепации интерпретации - это определения локальных функций внутри основного кода. А у тебя?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
AutoCAD 2009.
В каждом файле одна функция. Загрузка организована посредством такой функции Код:
Код:
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Наверное, дело в том, что у меня используется около 700 функций, при этом глубина "вложенности" запросто может превысить 10 уровней. К примеру:
Функция _kpblc-ent-create-scheduletable вызывает около 200 служебных функций. Есть там одна _kpblc-xml-nodes-get-child-by-tag - вызывает _kpblc-conv-value-to-string, _kpblc-property-get и _kpblc-xml-nodes-get-child. Последняя обращается к _kpblc-xml-conv-nodes-to-list. Эта, в свою очередь,- к _kpblc-error-catch, _kpblc-property-get, _kpblc-error-print. При этом для того, чтобы вызвать эту функцию (точнее, передать корректные параметры), приходится еще десяток функций вызывать с такими же "хвостами". В таких случаях мне приходится отслеживать приоритет загрузки функций, чтобы потом при вызове _kpblc-ent-create-scheduletable не получить сообщение вида "_kpblc-xml-conv-nodes-to-list не определена".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Если не секрет, что делает _kpblc-ent-create-scheduletable?
В целом ясно. Пока проблем с загрузкой не возникает оставлю все как есть. И с функциями для работы с объектной моделью не буду велосипед изобретать, а возьму из ruCAD. Спасибо за разъяснения.
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
1. Исходные библиотечные функции находятся в отдельных LSP-файлах. Иногда в одном файле несколько родственных, хотя это отступление от концепции из-за лени автора. Всего таких функций около 2000. Все они записаны в файл проекта. 2. Из них компилируется один FAS. Размер примерно 600 кб. Этот файл автоматически загружается в каждый чертеж. Все библиотечные функции всегда доступны. Они обращаются друг друг к другу, но проблем не возникает, так как они всегда загружены в память одновременно. 3. Прикладные "программы" находятся в отдельных LSP и компилируются в отдельные FAS. Они используют только библиотечные функции и, иногда, какие-то функции, определенные в этом же файле. Но никогда из каких-то других. 4. Вызов "программ" осуществляется из меню AutoCAD, XML, с кнопок и т.п. При этом всегда в макрос вызова включается загрузка соответствующего FAS, или макрос вызывает библиотечную функцию. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
ShaggyDoc, такой вопрос: компиляция функций происходит непосредственно перед загрузкой в файл чертежа или отдельно (т.е. все написали, собрали в один проект, скомпилировали и пользуемся, а если нужно что-то изменить, то компилировать заново).
У меня то тоже вроде все сразу загружается (хотя может я что-то не так понимаю), но Алексей говорит, что критичен порядок загрузки и сложность в этом. И еще: есть вот такой файл Код:
Код:
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Цитата:
(setq *ru_acad-object* nil) - это как раз вызов функции вне тела. Сделал такой вызов для сброса указателя на объект во время процесса загрузки библиотеки. Затем, во время выполнения функции ru-obj-get-acad-object этот указатель восстановится. Такое "обниление" можно и не выполнять. Но тогда в памяти остаётся глобальная переменная, инициализированная при предыдущей загрузке библиотеки. Мало ли что я мог сделать потом - например присвоить глобальной *ru_acad-object* указатель на что-то другое, хотя бы ошибочно. Вот и страхуюсь. Чтобы после перегрузки указатель был правильный. |
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
Для особо непонятливых (для меня то бишь): если мы загружаем файл А с определением функции 1 (в которой содержится обращение к фун.2) и вызовом фун.1 до загрузки файла В с определением функции 2, то будут проблемы, а если в файле А нет вызова функции 1, только ее определение, то загружать файлы А и В можно в любом порядке, лишь бы загрузить оба. Правильно я понимаю?
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
1. Отделять загрузку от использования. То есть формировать библиотеку функций. В файлах библиотечных функций не должно быть никаких вызовов других функций. Кроме "штатных", например setq. В этом случае загрузка может выполняться в любом порядке, но до использования. Не забываем, что функции могут перегружаться, заменяя прежнее определение. Если при загрузке сразу что-то используется могут быть обращения к старой версии. Такие ошибки трудно найти. 2. Вызовы функций должны быть только после полной загрузки библиотеки. 3. Загрузку библиотеки надо делать автоматически, например в acaddoc.lsp. Вот пример такого файла из ruCAD - он сгенерирован программой-стартером из шаблона, в момент загрузки выглядит так (дополнил комментариями): Код:
|
|||
![]() |
|
||||
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218
|
ShaggyDoc, спасибо, теперь разобрался и уяснил.
__________________
www.saa-blogs.blogspot.com |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc, с помощью vla-wblock можно также изменить тип записываемого файла (например, Dxf) , или он будет всегда Dwg текущей настройки?
2. Код: Код:
![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
alex8888, я несколько раз перечитал вопрос, но так и не понял - ты про что спрашиваешь? Про vla-wblock или про vla-saveas?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Кулик Алексей aka kpblc,
прошу прощения за туманность. Ищу способ сохранить выбранные примитивы в файле Dwg и сохранить из в виде Dxf, причем самой ранней версии. Встал вопрос - или vla-wblock или vla-saveas. Первым пока не понял - возможно ли в принципе? А второй правильно создает файл, но тот почему то пустой, то есть я ничего не сохраняю кроме как просто пустой файл с нужным его типом. Offtop: Предыстория такая. Фирма, в которой мне доводится батрачить ![]() ![]() Но желательно бы до этого доковылять своими мозгами ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
vla-wblock сохраняет файл только в текущей версии. Не лечится.
vla-saveas по идее позволяет сохранить файл в формате R12. Что бы попытался сделать я: выбрать примитивы в текущем документе; создать новый документ (скорее всего, добавлением в коллекцию документов; ObjectDBX тут поможет как мертвому припарки) и через vla-CopyObjects выполняется копирование в сторонний файл. Потом этот файл и попытаться сохранить. P.S. Хотя я бы на твоем месте серьезно задумался о том, чтобы делать полноценную программную реализацию алгоритма оптимизации кроя листовых материалов, потом изучение DXF R12 и прямая запись нужных данных в файл. Голову, конечно, сломаешь (и не раз).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |