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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Записать список глобальных переменных в текстовый файл.

LISP. Записать список глобальных переменных в текстовый файл.

Ответ
Поиск в этой теме
Непрочитано 22.05.2013, 22:18 #1
LISP. Записать список глобальных переменных в текстовый файл.
Golem-iq
 
студент
 
Москва
Регистрация: 03.03.2012
Сообщений: 50

Есть LISP-программа. Она содержит некоторое количество методов, которые являются частью одного алгоритма. Понятное дело, что глобальные переменные объявляются и принимают значения только в ходе работы. Каким образом можно получить список глобальных переменных и их значения в определённый момент времени. А потом этот список записать в текстовый файл.
ЗЫ: Простите за возможно кривую формулировку

[Вопрос решён. Ответ в посте #3]

Последний раз редактировалось Golem-iq, 25.05.2013 в 18:19.
Просмотров: 11738
 
Непрочитано 25.05.2013, 08:43
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


записать не сложно, посмотри примеры функций
open, princ, close
Для записи небольших переменных, можно воспользоваться и реестром, это еще проще. Посмотри функции:
getenv, setenv
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 25.05.2013, 12:42
#3
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
записать не сложно, посмотри примеры функций
open, princ, close
Для записи небольших переменных, можно воспользоваться и реестром, это еще проще. Посмотри функции:
getenv, setenv
С "записать" проблем действительно нет. Я просто думал может есть готовая функция, которая скажем в *.cfg записывает уже всё сразу.
Переменные могут быть и достаточно большими (я так понял, что под размером здесь понимается количество элементов списка).

//-------------------------------------------------------------------

Собственно, представляю ниже моё решение поставленного вопроса (уверен есть нормальное решение, а не тот ужас, что получился у меня).

Шаг 1:
(Создайте в папке с активным документом папку "дерево". Программы обращаются к ней.)
Необходимо выделить из LISP-файла имена переменных и сохранить их в файл. Реализация выполнена с помощью языка Delphi. Среда Embarcadero RAD Studio XE2.


Код:
[Выделить все]
procedure TForm1.ButtonLoadLISPToMemoClick(Sender: TObject);
begin
 //MemoLoad.Lines.LoadFromFile('C:\Users\Администратор\документики\мои проекты\вентиляшка\lsp\osnova.lsp');
 MemoLoad.Lines.LoadFromFile(EditAdressLISP.Text);
 MemoWarning.Lines.Add('LISP файл загружен для обработки.');
end;

function PosKol(substr, str: string): integer;
var
  cnt, p: integer;
begin
  cnt := 0;
  while str <> '' do
  begin
    p := Pos(substr, str);
    if p > 0 then
      inc(cnt)
    else
      p := 1;
    Delete(str, 1, (p + Length(substr) - 1));
  end;
  Result := cnt;
end;

procedure TForm1.ButtonDeleteLISPClick(Sender: TObject);
var
 i, j, kolj, kol, p, pb : integer;
 buf : String;
begin
 kol := MemoLoad.Lines.Count;
 MemoLoadBuf.Visible := false; // фактически отключаем компонент для ускорения работы

 for i:= 0 to kol do
 begin
  buf := MemoLoad.Lines.Strings[i];  // текущая строка из Memo
  buf := TrimLeft(buf);              // удаляем пробелы в начале строки
  p := Pos('setq', buf);             // определяем позицую управляющего слова "setq". Оно должно быть 2, потому что первой идёт скобка
  if ((p <> 0) AND (Pos(';', buf) = 0)) then  // отметаем строки не содепжащие "setq" и закоментированные
  begin
   kolj := 0;  // сдвиг строк, будет использоваться далее

   if PosKol('(', buf) <> PosKol(')', buf) then // если setq задаёт значения для нескольких переменных в разных строках
   begin
    j := 1;
    while PosKol('(', buf) <> PosKol(')', buf) do // считаем на сколько строк распространяется setq
    begin
     buf := buf + ' ' + MemoLoad.Lines.Strings[i+j];
     j := j + 1;
    end;
    kolj := j - 1;   // количество строк, на которое распространяется setq
   end;

   for j := 0 to kolj do  // Начинаем обработку строки. Если setq распространяется на несколько строк, то включится счётчик
   begin
    buf := MemoLoad.Lines.Strings[i+j]; // Строки необходимо обрабатывать заново, потому что могли появится строки без setq
    buf := TrimLeft(buf);

    p := Pos('setq', buf);
    if Pos('setq', buf) = 0 then  // если в строке не оказалось управляющего слова "setq"
     p := -4;

    buf := Copy(buf, p + 5, Length(buf)); // удаляем setq и всё что до него из строки
    buf := TrimLeft(buf);

    if Pos(')', buf) <> 1 then // если это строка с закрывающей скобкой, нужно от неё избавиться
    begin
     p := Pos(' ', buf);     // ищем первый разделительный символ между именем переменной и его значением
                             // а так же проверяем строку, что бы она не оказалась "пустой"
     pb := Pos('(', buf);
     if (pb < p) AND (pb <> 0) then
      p := pb;

     pb := Pos('"', buf);
     if (pb < p) AND (pb <> 0) then
      p := pb;

     if p <> 0 then     // если строка не "пустая"
     begin
      buf := Copy(buf, 0, p-1);   // удаляем лишнее после имени переменной
      MemoLoadBuf.Lines.Add(buf); // добавляем имя переменной в Memo
     end;
    end;
   end;
  end;
 end;
 MemoWarning.Lines.Add('Имена переменных выделены.');

 // удаляем дубликаты и пустый значения и закоментированное в многострочных setq
 With MemoLoadBuf.Lines do
  begin
    for i := 0 to Count - 1 do
      for j := Count - 1 downto i+1 do
        if ((Strings[i]=Strings[j]) OR (Strings[j] = '') OR (Pos(';',Strings[j]) = 1)) then
          Delete(j);
  end;
 MemoWarning.Lines.Add('Дубликаты удалены.');

 MemoLoadBuf.Visible := true;  // "включаем" обратно Memo

 MemoLoad.Visible := false;   // Записываем результаты в основной Memo
 MemoLoad.Lines.Clear;
 MemoLoad.Lines.Add(IntToStr(MemoLoadBuf.Lines.Count)); // Дополнительно добавим количество переменных для удобства последующего считывания
 for i := 0 to MemoLoadBuf.Lines.Count do
  MemoLoad.Lines.Add(MemoLoadBuf.Lines.Strings[i]);
 MemoLoad.Visible := true;
 MemoWarning.Lines.Add('Список с именами переменных сформирован.');

end;

procedure TForm1.ButtonSaveLISPToFileClick(Sender: TObject);
begin
 MemoLoad.Lines.SaveToFile(EditAdress.Text + '\sp.ini');
 MemoWarning.Lines.Add('Файл sp.ini создан.');
end;


Здесь приведена вырезка из общего тела программы, что бы не запутаться. Сама программа доступна по ссылке ниже (поиск имён переменных только часть её).


Файл залит на сервер ВКонтакте, поэтому пришлось сменить расширение rar на png. Вам потребуется сделать обратное действие, что бы распаковать.
http://vk.com/doc11540956_186104324?...89d233f2cddc31


ШАГ 2
Необходимо считать имена переменных, получить их значения и записать пары (имя + значение) в файл. Реализация понятное дело на VisualLISP (иначе зачем мы вытаскивали имена переменных). Код представлен ниже.


Код:
[Выделить все]
 


;; Загрзука списка переменных / Получение значений / Запись полученного списка в файл
(defun c:LoadP(/ f pref kol i)
  ;; Загрузить список переменных
  (setq pref (strcat (getvar "DWGPREFIX") "дерево\\sp.ini"))
  (setq f (open pref "R"))
  (setq
        kol (atoi (read-line f))
    i 0
    sp-list nil
  ) ;_ setq
  (while (< i kol)
    (setq sp-list (reverse (cons (read-line f) (reverse sp-list))))

    (setq i (1+ i))
  ) ;_ while
  (close f)

  ;; Получить значения переменных
  (setq
        i 0
    spz-list nil   ; сюда запишутся переменные с непустым значением
    spzn-list nil  ; сюда запишутся переменные с пустым значением
  ) ;_ setq
  (while (< i kol)
    (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vl-doc-ref (list (nth i sp-list)))) )
      (progn
        (setq bufz (vl-doc-ref (nth i sp-list)))
        (if bufz
          (setq spz-list (reverse (cons (list (nth i sp-list) bufz) (reverse spz-list))))
      (setq spzn-list (reverse (cons (list (nth i sp-list) bufz) (reverse spzn-list))))
        ) ;_ if
      ) ;_ progn
    ) ;_ if
    
    (setq i (1+ i))
  ) ;_ while

 ;; Записать полученый выше список spz-list в файл spz.ini
  (setq pref (strcat (getvar "DWGPREFIX") "дерево\\spz.ini"))
  (setq f (open pref "W"))
  (setq
        i 0
    kol (length spz-list)
  ) ;_ setq

  (write-line (itoa kol) f)
  (while (< i kol)
    (write-line (strcat
          (chr 34)
          (car (nth i spz-list))
          (chr 34)
          " "
          (chr 34)
          (vl-princ-to-string (cadr (nth i spz-list)))
          (chr 34)
        ) ;_ strcat
                f) ;_ writeln

    (setq i (1+ i))
  ) ;_ while
  (close f)  
)



Впринципе всё. Запись в файл была сделана временно. В дальнейшем запись будет вестить в свойства чертежа (_dwgprops -> Прочие).
Комментарии приветсвуются.

Последний раз редактировалось Golem-iq, 26.05.2013 в 00:14. Причина: Вопрос решён.
Golem-iq вне форума  
 
Непрочитано 25.05.2013, 23:01
#4
Кулик Алексей aka kpblc
Moderator

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


Ну вообще-то сама идея загружать Lisp из-под Delphi как-то лично мне не очень.
Во-вторых, совсем необязательно существуют глобальные переменные: необходимые данные можно запросто передавать параметрами.
В-третьих, для получения именно глобальных переменных есть такая функция в лиспе, как atoms-family. В 99% случаев ее достаточно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.05.2013, 00:13
#5
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну вообще-то сама идея загружать Lisp из-под Delphi как-то лично мне не очень.
Во-вторых, совсем необязательно существуют глобальные переменные: необходимые данные можно запросто передавать параметрами.
В-третьих, для получения именно глобальных переменных есть такая функция в лиспе, как atoms-family. В 99% случаев ее достаточно.
Благодарю за помощь.
1. LISP грузится как текстовый файл и используется только для выделения имён переменных используемых в этом LISP'е. Как локальных, так и глобальных. (Для меня конечно желательно выделять только глобальные, но пока что это не реализовано. Оставим на свободное время в будущем)
2. Если честно не совсем понял. Если суть вопроса "Почему я записываю значения только переменных", то ответ "Необходимо дать возможность пользователю делать откат к некоторой точке построения алгоритма. И для возврата мне необходимо помнить значения переменных на данный момент". Каждая такая точка это отдельный файл *.dwg.
3. Жаль раньше о ней не узнал... Возникает вопрос. Вот такая конструкция:
(atoms-family 1)
возвращает очень много всего. Как из этого всего выделить имена переменных, которые были заданы в определённом LISP'е ? Мне кажется это на уровне шаманства
Просто мне нужны имена и значения переменных именно из LISP'а записывать. Нет смысла записывать сотню других.
Golem-iq вне форума  
 
Непрочитано 26.05.2013, 00:19
#6
Кулик Алексей aka kpblc
Moderator

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


"Откат" на какое-то состояние лично я реализовываю совсем другими методами
Получение списка глобальных (точнее, введенных) переменных можно получить и так:
Код:
[Выделить все]
(defun get-all-global-vars (/ get-all-global-vars:start get-all-global-vars:end)
  (setq get-all-global-vars:start (atoms-family 1))
  ;; Здесь выполнение алгоритмы
  (setq get-all-global-vars:end
         (vl-remove-if
           (function
             (lambda (x)
               (or (member
                     x
                     '("GET-ALL-GLOBAL-VARS" "GET-ALL-GLOBAL-VARS:START" "GET-ALL-GLOBAL-VARS:END")
                     ) ;_ end of member
                   (member x get-all-global-vars:start)
                   ) ;_ end of or
               ) ;_ end of LAMBDA
             ) ;_ end of function
           (mapcar (function strcase) (atoms-family 1))
           ) ;_ end of vl-remove-if
        ) ;_ end of setq
  ;; Здесь уже со списком get-all-global-vars:end делаем все что угодно
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.05.2013, 00:50
#7
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
"Откат" на какое-то состояние лично я реализовываю совсем другими методами
Получение списка глобальных (точнее, введенных) переменных можно получить и так:
Код:
[Выделить все]
(defun get-all-global-vars (/ get-all-global-vars:start get-all-global-vars:end)
  (setq get-all-global-vars:start (atoms-family 1))
  ;; Здесь выполнение алгоритмы
  (setq get-all-global-vars:end
         (vl-remove-if
           (function
             (lambda (x)
               (or (member
                     x
                     '("GET-ALL-GLOBAL-VARS" "GET-ALL-GLOBAL-VARS:START" "GET-ALL-GLOBAL-VARS:END")
                     ) ;_ end of member
                   (member x get-all-global-vars:start)
                   ) ;_ end of or
               ) ;_ end of LAMBDA
             ) ;_ end of function
           (mapcar (function strcase) (atoms-family 1))
           ) ;_ end of vl-remove-if
        ) ;_ end of setq
  ;; Здесь уже со списком get-all-global-vars:end делаем все что угодно
  ) ;_ end of defun
Всегда поражало, какие интересный методы у тебя выходят!

Потестил этот код, чуть изменив его для примера. Добавил задание переменных.

Код:
[Выделить все]
 
(defun get-all-global-vars (/)
  (setq get-all-global-vars:start (atoms-family 1))
  ;; Здесь выполнение алгоритмы
  (setq i1 "1" i2 "2" i3 "3" i4 "4")
  (setq i5 (strcat i1 "+" i4))
  ;;--------
  (setq get-all-global-vars:end
         (vl-remove-if
           (function
             (lambda (x)
               (or (member
                     x
                     '("GET-ALL-GLOBAL-VARS" "GET-ALL-GLOBAL-VARS:START" "GET-ALL-GLOBAL-VARS:END")
                     ) ;_ end of member
                   (member x get-all-global-vars:start)
                   ) ;_ end of or
               ) ;_ end of LAMBDA
             ) ;_ end of function
           (mapcar (function strcase) (atoms-family 1))
           ) ;_ end of vl-remove-if
        ) ;_ end of setq
  ;; Здесь уже со списком get-all-global-vars:end делаем все что угодно
  ) ;_ end of defun

Выявилась одна интересная особенность. Если у переменной на момент срабатывания метода значение было не nil, то она не добавится в список get-all-global-vars:end.
К примеру при первом запуске функции получим ("I5" "I4" "I3" "I2" "I1"). А при втором и последующих nil. По моему это довольно странно. Можно ли как-то изменить, что бы и при последующих запусках "непустые" переменные тоже добавлялись?
Golem-iq вне форума  
 
Непрочитано 26.05.2013, 01:13
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Golem-iq Посмотреть сообщение
Необходимо дать возможность пользователю делать откат к некоторой точке построения алгоритма. И для возврата мне необходимо помнить значения переменных на данный момент"
Или Вам двойка по лиспу, или несоответствие Вашего преподователя. Во первых этот вариант сосвсем не в 100% случаев будет работать (т.к. состояние vla объектов Вы в файл не запишите), во вторых просто изучите базовые понятие лиспа, а то Ваш подход это лечение зубов через ж**у.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.05.2013, 01:21
#9
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Golem-iq Посмотреть сообщение
Можно ли как-то изменить, что бы и при последующих запусках "непустые" переменные тоже добавлялись?
У меня на такое мозгов не хватает Особенно сейчас, когда во мне булькает уже два литра пива...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.05.2013, 01:30
#10
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У меня на такое мозгов не хватает Особенно сейчас, когда во мне булькает уже два литра пива...
Ахахах )) Удачного продолжения вечера! Во мне вчера булькало )

для Димы_: Я вроде написал, что каждая точка в построении алгоритма это отдельный файл *.dwg. Лично я себе представляю, что данный файл и хранит сведения об объектах.
LISP я изучаю по книгам и форумам. К сожалению моя кафедра не располагает человеком со знаниями по LISP'у. Но нужен результат. Поэтому "крутись, как хочешь".
Зачем столько негатива? Не проще было бы объяснить в чём косяки? Или Вы никогда не учились, а уже родились со всем объёмом ваших знаний?
Golem-iq вне форума  
 
Непрочитано 26.05.2013, 02:03
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Golem-iq Посмотреть сообщение
Зачем столько негатива?
Перед тем как что-то делать ну, видимо, совсем не в знакомой Вам области я бы или посмотрел как подобное делают другие, или бы спросил. Скажите Вы видели где-нибудь, хоть что-ли бы подобное Ваше реализации? Или Вы считаете, что функция отката, это настолько что-то то уникальное? Я, наспор, буду приводить Вам подряд 100 алгоритмов об которые, каждый Ваш следующий "парсер" (искатель переменных) будет "обламываться" - повертье просто на слово - не отловите Вы НИКАКИМ образом оброзованные программой "переменные", без физического запуска алгоритма (причем с заходом во все его ветки, которых в случае самогенерирующегося кода может быть бесконечное множество). Про vla объекты это не только состовляющие dwg файла, это например открытое приложение excel в котором табличка с данными, или html страница...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 26.05.2013, 02:42
#12
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Перед тем как что-то делать ну, видимо, совсем не в знакомой Вам области я бы или посмотрел как подобное делают другие, или бы спросил. Скажите Вы видели где-нибудь, хоть что-ли бы подобное Ваше реализации? Или Вы считаете, что функция отката, это настолько что-то то уникальное? Я, наспор, буду приводить Вам подряд 100 алгоритмов об которые, каждый Ваш следующий "парсер" (искатель переменных) будет "обламываться" - повертье просто на слово - не отловите Вы НИКАКИМ образом оброзованные программой "переменные", без физического запуска алгоритма (причем с заходом во все его ветки, которых в случае самогенерирующегося кода может быть бесконечное множество). Про vla объекты это не только состовляющие dwg файла, это например открытое приложение excel в котором табличка с данными, или html страница...
Не видел смысла расписывать, потому что вопрос ставился о другом, но теперь нужно. Примерно опишу общую задачу.
Пользователь работает с AutoCAD и имеет две вкладки.
В первой вкладке подряд расположены кнопки шагов алгоритма. Каждая кнопка просит пользователя ввести какие-либо данные и на основе этих данных делает расчёты и возможно что-то "чертит".
На второй вкладке 3 кнопки: "создать новую ветку", "создать новую точку", "перейти к точке №". По нажатию на кнопку "создать новую точку" текущий документ сохраняется в специальную папку, располагающуюся в папке с этим документом. Дополнительно в свойства этого документа записываются имена переменных и их значений. Данное действие происходит между шагами алгоритма из вкладки 1. То есть в данный момент не может быть открыт Excel, html не используется. По кнопке "создать новую ветку" так же создаётся точка, но в новой ветке относительно текущей точки. Таким образом формируется дерево.
И что значит "не отловите Вы НИКАКИМ образом образованные программой "переменные", без физического запуска алгоритма". Переменные уже "висят" в памяти после выполнения шага алгоритма. У некоторых после очередного шага алгоритма из вкладки 1 уже есть некоторое значение не nil. И зная имена переменных, можно получить их значения.
Вы говорите, что мой код мягко говоря ужасен (есть другое слово). В этом я не спорю. Без хорошего опыта разработки, он таким и останется. Если у Вас есть дельные предложения относительно его улучшения или же примеры данной тематики, ну так поделитесь ими. По моему мнению одними лишь словами "у тебя всё ужасно" и "работать не будет" не обойтись.
Golem-iq вне форума  
 
Непрочитано 26.05.2013, 12:55
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Если программы с ленты 1 - Ваши, то просто не используйте глобальные переменные для передачи данных между (а, например, сразу свойства файлов). Если они чужие - то бросьте эту идею и сохраняйте просто состояние файла (что там сохранит, и не перезатрет ли эти данные другой лисп - это совсем не факт). В "состоянии" программы есть еще куча чего, что может изменить лисп программа - системные настройки, реестр, реакторы... Заверните кнопки в стандартные метки отмены (vla-startundomark ... vla-endundomark), если они еще не завернуты и сохраняйте файлы - все остальное, если программы не Ваши - неработающая чушь для не непонимающей в этом деле коммисии .
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 26.05.2013, 13:08
#14
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Если программы с ленты 1 - Ваши, то просто не используйте глобальные переменные для передачи данных между (а, например, сразу свойства файлов). Если они чужие - то бросьте эту идею и сохраняйте просто состояние файла (что там сохранит, и не перезатрет ли эти данные другой лисп - это совсем не факт). В "состоянии" программы есть еще куча чего, что может изменить лисп программа - системные настройки, реестр, реакторы... Заверните кнопки в стандартные метки отмены (vla-startundomark ... vla-endundomark), если они еще не завернуты и сохраняйте файлы - все остальное, если программы не Ваши - неработающая чушь для не непонимающей в этом деле коммисии .
Благодарю за совет.
Golem-iq вне форума  
 
Непрочитано 26.05.2013, 16:59
1 | #15
ShaggyDoc

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


То, что в исходном вопросе "записать список глобальных в файл" решено в Autocad в файле acadinfo.lsp. Команда acadinfo. Выгружает все глобальные "символы" и их значения в текстовый файл. Очень любопытная картина получается. Посмотреть support\acadinfo.lsp полезно, чтобы узнать, как это делается. Заодно подумать, и решить "буду делать хорошо, и не буду плохо".

А "плохо" - это даже сама мысль об использовании глобальных для сохранения неких "алгоритмов". Нормальная программа должна быть изолирована в памяти от других. Данные, необходимые для работы в разных сеансах, должна хранить в правильном месте. В зависимости от характера и объема данных это может быть и реестр, и текстовый файл, и даже база данных. Но в правильных ветках реестра и в правильных каталогах ОС.
ShaggyDoc вне форума  
 
Непрочитано 26.05.2013, 18:35
#16
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Можно еще использовать функции
acet-ini-get / acet-ini-set
тоже работает безотказно
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 26.05.2013, 18:57
#17
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Можно еще использовать функции
acet-ini-get / acet-ini-set
тоже работает безотказно
Я так понял, что данные команды описаны в файлах acetutil.arx, acetutil*.fas ? Но найти их почему то не могу.
Ещё прочитал, что это вроде как то к Express Tools относится.
Можете дать ссылки на файлы или сказать где найти? Судя по описанию http://www.afralisp.net/archive/lisp/acet-utils.htm это то что нужно.
Golem-iq вне форума  
 
Непрочитано 26.05.2013, 20:04
#18
ShaggyDoc

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


Цитата:
Я так понял, что данные команды описаны в файлах acetutil.arx, acetutil*.fas ? Но найти их почему то не могу
Зачем они тебе? Чтобы мучиться с совместимостью ARX и версий AutoCAD? Ты же пишешь на Delphi, вот и используй TIniFile - всё равно в итоге к функциям WinAPI обращается.
Можно и на Lisp функции написать (да просто найти, для работы именно с INI).

Кстати, именно в LISP можно в файл сохранить именно выражение ("программу") в виде текста, а потом прочитать и сразу присвоить значения или что угодно сделать.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 26.05.2013, 21:00
#19
Golem-iq

студент
 
Регистрация: 03.03.2012
Москва
Сообщений: 50


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Зачем они тебе? Чтобы мучиться с совместимостью ARX и версий AutoCAD? Ты же пишешь на Delphi, вот и используй TIniFile - всё равно в итоге к функциям WinAPI обращается.
Можно и на Lisp функции написать (да просто найти, для работы именно с INI).

Кстати, именно в LISP можно в файл сохранить именно выражение ("программу") в виде текста, а потом прочитать и сразу присвоить значения или что угодно сделать.
Delphi используется только для того что бы выделить имена переменных из текста, которым является код LISP программы (По хорошему это тоже нужно было бы сделать на LISP'е).
А вот найти альтернативы двум посоветованным командам чего-то я не подумал. Сейчас начну искать. Думаю статья Алексея http://autolisp.ru/2011/02/25/data-set-and-get-031/ мне поможет разобраться, что к чему и куда копать
Благодарю за стоящий совет!
Golem-iq вне форума  
 
Непрочитано 26.05.2013, 23:08
#20
ShaggyDoc

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


Цитата:
Delphi используется только для того что бы выделить имена переменных из текста
Delphi можно использовать для того, чтобы создать COM-сервер для LISP с любыми необходимыми функциями, которые ему недоступны в штатной версии. В том числе для работы с Ini. Это одна страница кода.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Записать список глобальных переменных в текстовый файл.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать данные в файл, находящийся на удалённом компьютере? Makswell Программирование 10 09.07.2015 09:05
Как выдать список переменных (setvar) в текстовый файл Кларисса AutoCAD 6 03.06.2013 13:20
вывод координат из автокада в текстовый файл antonio_k AutoCAD 7 20.03.2009 14:02
вставка строки в существующий текстовый файл Victorovich Программирование 10 20.06.2008 16:42
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47