|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Ввод данных по умолчанию
Регистрация: 22.01.2010
Сообщений: 311
|
||
Просмотров: 8743
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Цитата:
Можно. Например, в специальном файле настроек, или в реестре.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
Т.е. в общем про файл, представляю как писать, как считывать, а вот где его лучше хранить? И про реестр даже и представления нет.
__________________
Почему все вдруг становятся умными, когда уже не надо? |
||||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Алексей,
я хотел выяснить, есть ли у лиспа встроенные функции сохранения значений по умолчанию. Реализация этого с помощью глоб. переменных или внешнего файла не составит, наверное, труда, просто для начала хотел выяснить, нет ли чего-нибудь стандартного. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Это штатные функции, но пользоваться ими я не рекомендую.
Это запись и чтение в acadxxxx.cfg, т.е. в INI-файл. Вроде бы хорошо, но беда в том, что это запись в файл самого AutoCAD, да ещё конкретной версии. А приличные приложения никак не должны ничего трогать в файлах и папках AutoCAD. Для Autodesk ничего не стоило в этих функциях ввести ещё один аргумент - полное имя файла. Тогда бы были предоставлены большие возможности. В том числе по обмену данными с любыми другими программами. Но они хотят привязывать всё к своему продукту. Цитата:
Хранить все пользовательские файлы нужно только там, где допускается в Windows, т.е. где-то в c:\Documents and Settings\<%user_name%>\Local Settings\Application Data\<%firm_name%>\<%app_name%>\ или подобных местах в соответствующем месте разных версий Windows. Конкретное имя "соответствующего места" выяснять во время работы, конечно программно, так как оно может быть разным. Не умея этого делать с файлами лучше не связываться. Цитата:
Для работы с реестром в LISP есть все необходимые функции из серии vl-registry-xxxx. Работать с ними можно сразу, но тут надо подумать, как именно хранить данные, например как сохранять список. Главное - тоже хранить не где попало, а в правильной ветке, т.е. в HKEY_CURRENT_USER\\<%firm_name%>\\<%app_name%> |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Как говорится, сугубо и трегубо ИМХО...
Разве файл обязательно должен быть именно текстовый? На данный момент средств обработки (хоть mdb, хоть xml) в лиспе достаточно. Но, учитывая распространение 64-разрядных систем, эти средства надо тщательно тестировать, поэтому использование текстовых файлов наиболее удобно. Все-таки, я думаю, реестр не самое лучшее место для хранения данных. Особенно таких, которые часто меняются. Кроме того, в реестре, по-моему, невозможно сохранить число типа 12.98. Да и с булевыми переменными там не все гладко. При хранении данных в файлах путь типа Цитата:
Код:
ИМХО - лучше закидывать в HKCU\Software\FirmName\AppName. ShaggyDoc никогда не допускает таких промахов, поэтому мне интересно - почему не используется подключ Software?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
![]() Файл, конечно может быть и не текстовый. Тогда сложностей будет на порядок больше, а зачем - если речь всего лишь про данные по умолчанию. А вот другие, важные данные, например прова пользователей, можно и в БД хранить. Реестр или файл - обычный спор. Реестр я привел в пример потому, что есть штатные функции. А для INI их надо поискать или сочинить. В реестр можно и любой тип данных сохранить, но работая с ним из LISP лучше преобразовывать в строку. Главное преимущество реестра - то, что его продвигает Microsoft. Именно за это чаще всего реестр не любят, а делают файлы - "назло мамке шею мыть не буду". Соответственно и функциональная поддержка, ведь никто низкоуровневыми функциями туда не лезет. Изменится система хранения - в программах ничего не надо менять. С файлами тоже проблемы могут быть при неправильном использовании - права доступа, владельцы и прочее. Это все надо учитывать. Но автор ветки правильно задумался о сохранении данных по умолчанию в принципе. В ruCAD сделано так: 1. Есть две функции - для записи и для чтения любых данных. 2. В начале любой программы (функции) восстанавливаются сохраненные данные. 3. В конце программы сохраняются данные. 4. В момент любого ввода всегда есть значение по умолчанию. Это значительно облегчает работу. Сами функции: Код:
Если завтра я захочу хранить данные не в реестре, а в XML, то перепишу эти функции, не трогая сотни других функций и программ. Пример использования в программе рисования ряда колонн блоками условных обозначений: Цитата:
Пролет=6.00, Количество=1. Точка начала ряда [Пролет/Количество]<Выход>:П Выбираем опцию Пролет и вводим другое значение: Пролет <6.0>:9 Снова запрос: Пролет=9.00, Количество=1. Точка начала ряда [Пролет/Количество]<Выход>:К Выбираем опцию Количество: Количество [Указать]<1.00>:6 И снова запрос: Пролет=9.00, Количество=6. Точка начала ряда [Пролет/Количество]<Выход>: Указываем точку начала ряда и получаем запрос: Направление ряда: После указания точки направления рисуется заданное количество колонн с заданным шагом. И, до пустого ввода, повторяется запрос уже с новыми значениями по умолчанию: Пролет=9.00, Количество=6. Точка начала ряда [Пролет/Количество]<Выход>: При запуске этой программы в другом сеансе работы будут использоваться значения 9.0 и 6. Причем, если посмотреть внимательно, то при единицах чертежа "мм" пролет будет 9000.0, а при единицах "м" - 9.0 |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Впрочем, если жить на необитаемом острове, то можно и во всех user* что-то сохранять. |
|||
![]() |
|
||||
Цитата:
п.с. подправил линк (не туда сначала указал). вдогонку: Цитата:
Далее простенький пример: Некоторый xml-файл (структура абсолютно любая): ![]() Из указанного выше xml-файла извлечём, к примеру, значение атрибута Value такого элемента MyVariable, атрибуту Name которого присвоено значение var2 (т.е. грубо говоря - реализуем фильтрацию нужного нам контента): ![]() Всё до безобразия просто.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 21.09.2010 в 18:39. |
||||
![]() |
|
||||
> gomer
Интересное решение, правда оно не очень удобно, если нужно, чтобы с этим файлом настроек работало иное внешнее приложение - для него придётся писать свой парсер. Так же не удобно, если в текстовый файл нужно записать какую-то информацию (не путать с настройками), которую должно будет затем обрабатывать всё то же внешнее приложение - те же грабли. Если бы это был xml, то такие парсеры уже написаны, и можно было бы сразу использовать уже существующий. Однако если такое взаимодействие не требуется, то для Lisp-программистов предложенный вариант c "Settings.lsp" возможно предпочтительней, чем использование xml. Нужно смотреть по ситуации. p.s.2 Помимо чтения нужно ведь ещё и модификацию значений выполнять - насколько удобно средствами lisp поменять значение 555 на 777? Что если структура данных должна быть более сложной (глубокая иерархическая структура) - насколько удобно средствами lisp вносить изменения в такие файлы (пусть даже это содержимое оформлено в виде сложного списка)? Как насчёт автоматической проверки структуры содержимого "Settings.lsp" на корректность (с точки зрения lisp содержимое может быть правильным, но с точки зрения структуры могут быть нарушения, если к примеру, кто-то подправлял их вручную)? В своём примере я могу добавить ещё один параметр, в котором укажу XSD-схему, по которой будет производиться проверка структуры файла на корректность, а вот как быть с этим в случае использования "Settings.lsp"? p.s.3 Возможно кого-нибудь заинтересует: В интернете можно найти информацию подобную этой и этой. Т.о. опытный Lisp-программист при желании с помощью всё того же Lisp'а сможет использовать в своей работе всё то, что предоставляет .net - т.е. доступ к самым передовым технологиям в любой сфере, имеющимся на сей день. Знание лишь одного, прикладного языка ограничивает возможности программиста. Если при этом использовать независимый от приложения язык, то в арсенале появляется "мощное оружие". Поскольку синтаксис AutoLisp и .Net-реализации Lisp схожи - освоение нового материала будет проходить значительно быстрее, чем если изучать язык с незнакомым синтаксисом (имхо).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 22.09.2010 в 23:05. |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
1. При желании 2. При умении написать дополнительное приложение. Вот у тебя как раз и показано использование своего приложения. У меня есть десяток LISP-функций для работы с XML, включая диалоговые - на них построено 90% интерфейса ruCAD. Для хранения и восстановления данных также есть функции: Код:
Хотя ничего не мешает Аутодеск включить подобные штатные функции. Ну, да ладно, шайтан с ними... "Ума-то нету" (С) Показанное gomer использование lisp-файла для хранения чего-то известно с самого начала существования LISP. Это часто используют. Недостатки указал hwd. Да и попробуйте динамически в такие файлы что-то писать. Да ещё чтобы было понятно и другим программам и человеку. Цитата:
Что касается места хранения всяких настроек, в том числе значений по умолчанию, то мне нравится подход реализованный в некоторых библиотеках. Там можно в одном месте выбрать опцию хранения (реестр, xml, ini) и все будет сохраняться там, где нравится, но в правильных местах, а не где попало. Ничто не мешает включить такой переключатель и в конечное приложение. |
|||
![]() |
|
||||
А вообще, от версии к версии, Autodesk добавляет в Lisp функционал? Например: библиотеки Auto\VisualLisp для 2009 и 2011 AutoCAD сильно отличаются друг от друга по составу?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Изменения и добавления связаны с изменениями в объектной модели AutoCAD. Но бездельники, "ответственные" за LISP в AutoCAD тут не при чем. Не их заслуга. А ведь добавить кое-что штатного и нужно, и просто. Тут и та же работа с XML (внутри-то AutoCAD она есть), и с INI. Или вызов функций из "обычных" DLL. Это же уровень курсовой работы для студента. Да хотя бы то, что в DOSLib уже 20 лет, как есть реализовано не могут включить. Жаба давит купить у автора. Про ублюдочные DCL-диалоги уж молчу. А обещали XAML... Уроды. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Жестко Вы с ними, но что правда то прада - ИХМО лисп давно заброшен, к сожалению.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
>ShaggyDoc
Вопрос такой: как вы у себя в ru-CAD организовываете хранение программных библиотек и их документирование? Исхожу из предположения, что всё собрано в одном месте (на сервере), а на локальных машинах - копии, периодически синхронизирующиеся с серверным содержимым. Далее у меня вариантов предположений три: 1. Библиотеки (dll/arx/lsp/fas/vla/ e.t.c.) разнесены по своим подкаталогам - в каждом каталоге своя библиотека + файл настроек (если нужно, т.е. файл ini/xml или др.) + доп. библиотеки, необходимые для работы основной (если нужно) + файл, документирующий библиотеку (в одном из форматов: xml/txt/doc или др.). Общий файл справки (по всем библиотекам в целом) создаётся либо вручную (сливанием всех doc/txt-файлов в один), либо генерируется автоматически, на основании тех xml-файлов справки, которые имеются в каталогах библиотек. 2. Всё указанное в п.1 размещается непосредственно в одном каталоге, не разнося содержимое по подкаталогам. 3. Иная реализация. Как вы отслеживаете такую ситуацию, когда после загрузки lisp-библиотеки "А", в составе которой определена некая функция "WWW", пользователь загружает lisp-библиотеку "Б", в составе которой определена одноимённая функция. После загрузки библиотеки "Б", её вариант одноимённой функции перезапишет тот, что был определён библиотекой "А" (если мне не изменяет память). У моих пользователей полно lisp-кода (от разных авторов), который они уже привыкли годами использовать, но если их не проверяя добавить в общий блок корпоративных библиотек, предназначенных для всеобщего использования, то могут возникнуть проблемы... По поводу отслеживания предполагаю следующие варианты: 1. Имеется некий текстовый файл (предположительно xml), в котором перечислены все lisp-функции, используемые в ru-CAD (с указанием файла, в котором она определена). Если получена новая библиотека, то вызывается команда, которая программно считывает из lsp-файла все определения функций (строки, начинающиеся с "(defun ", выполняет парсинг и сравнивает полученные имена с теми, список которых имеется в xml-файле, выводя результат работы в виде отчёта. Правда как быть с fas/vla - тут у меня предположений пока нет (можно в автокаде получить список имён лисп-функций до загрузки библиотеки и запросить его заново после оной, однако это поможет выявить лишь новые функции, а те, которые были переопределены не будут получены). 2. СмОтрите исходники и анализируете определения вручную. 3. Иное решение.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
![]() Поэтому кратко: 1. "Все учтено велики ураганом" (С). Все файлы лежат на своих местах, где полагается. 2. Никаких конфликтов имен и переопределения функций нет. Потому что есть система имен. Нетути у меня фукций с именами наподобие "dtr". Не будет даже конфликтов имен с любыми посторонними приложениями (хотя я и не регистрировал в Autodesck свои префиксы) - обойдутся. 3. Никаких фокусов с проверкой имен функций, а скорее имен команд (вот тут, теоретически, могут быть совпадения имен, хотя ни разу не встретилось) и делать не надо. Потому что каждая C:КОМАНДА состоит только из загрузки файла с уникальным именем функции или из вызова библиотечной функции с уникальным именем из памяти. Сами команды спрятаны в иллюстрированных XML-меню. В атрибутах его элементов и сидит LISP-код. ruCAD запускается из программы-стартера, которая делает нужные настройки. Никаких "левых" приложений там и не будет. Но, если они действительно нужны (бывает редко), в настройки ruCAD можно добавить и их загрузку. 4. "Документирование" заключается в том, что каждая отдельная функция лежит в отдельном файле, в соответствующей веточке каталога. Сборка файлов в одну откомпилированную fas-библиотеку осуществляется с помощью файла проекта. Перекомпилирование редко выполняется, года два уже не делал. Для работы с ними используется специальная программа ruSourceExplorer (лежит где-то в Download). Любой исходник в этой программе, помимо внутренних комментариев, может иметь внешние описания и иллюстрации - что эта функция или программа делает. И изо всего этого можно сделать HTML-файлы. И по каждой отдельной функции, и на библиотеку в целом. Если приспичит. А пользователь даже может во время выполнения команды и справку к ней "на лету" написать. Но это для любителей... |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
VBA. Многократный ввод данных и изменение положения объектов | Markiza-2010 | Программирование | 6 | 28.06.2010 02:30 |
Ввод данных в АВТОЛИСПе | vovkam | LISP | 3 | 19.06.2009 19:41 |
Почему выполненяется только 1 sql запрос к ADODB без использования базы данных по умолчанию? | Дима_ | Программирование | 8 | 26.02.2009 08:50 |
LISP - ввод данных | Torino | LISP | 4 | 02.08.2004 12:33 |