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

Вернуться   Форум 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.
Просмотров: 11782
 
Непрочитано 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,844


Ну вообще-то сама идея загружать 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,844


"Откат" на какое-то состояние лично я реализовываю совсем другими методами
Получение списка глобальных (точнее, введенных) переменных можно получить и так:
Код:
[Выделить все]
(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,844


Цитата:
Сообщение от 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 вне форума  
 
Непрочитано 26.05.2013, 23:23
#21
Дима_

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
...Это одна страница кода.
А сколько "страниц кода" займет работа с ini на автолиспе?
Offtop: что ini это как-бы прошлый век+найти готовую функцию я думаю труда не составит... и самое главное зачем оно в задаче автора
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.05.2013, 23:37
#22
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
А сколько "страниц кода" займет работа с ini на автолиспе?
Не считал: http://autolisp.ru/2011/04/08/data-set-and-get-032/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.05.2013, 23:40
#23
Golem-iq

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


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

А "плохо" - это даже сама мысль об использовании глобальных для сохранения неких "алгоритмов". Нормальная программа должна быть изолирована в памяти от других. Данные, необходимые для работы в разных сеансах, должна хранить в правильном месте. В зависимости от характера и объема данных это может быть и реестр, и текстовый файл, и даже база данных. Но в правильных ветках реестра и в правильных каталогах ОС.
Не сразу почему то увидел данный Ваш ответ. Это фактически то что мне нужно! Чуть чуть подкорректировать данный LISP и всё супер! Огромная Вам благодарность за помощь!
Golem-iq вне форума  
 
Непрочитано 27.05.2013, 06:55
#24
ShaggyDoc

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


Цитата:
что ini это как-бы прошлый век+найти готовую функцию я думаю труда не составит... и самое главное зачем оно в задаче автора
Про "прошлый век" это Microsoft решила, когда отказалась от INI в Windows. Ну и пусть решила. "А мужики-то не знают" и пользуются. Есть просто подверженные моде -"сегодня ini не носят, носят xml".

Конечно, в конкретной задаче хранить данные можно множеством способов. И специфичных для LISP (записать список в файл "со скобками"), и универсальных - например просто список строк. Но при этом каждый раз писать код, разбирающий файл и знающий, в какой строке что записано.

Но всегда удобно иметь функции записи и чтения пар переменная-значение. Их можно применять тысячи раз, имея такие функции в резидентной библиотеке. При этом возможно работать и с данными, записанными другими программами, это важнее. Если сегодня это и не надо, завтра понадобится.

Можно и xml использовать. У меня есть функции (ru-xml-storage-read-string xml_name relative_path attrib_name default) и (ru-xml-storage-write-string xml_name relative_path attrib_name value). Тоже очень удобно, даже к БД в формате XML можно запрос делать.
ShaggyDoc вне форума  
 
Непрочитано 27.05.2013, 11:52
#25
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Есть просто подверженные моде -"сегодня ini не носят, носят xml".
возможно кто-то и следует "моде", но есть и такие, кто способен анализировать информацию и принимать решение в пользу XML на основе вполне аргументированных причин (и таких людей не мало), понимая преимущества xml над ini (и умея ими пользоваться). Правда для этого нужно разбираться в XML немного больше, чем просто уметь писать тэги.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 27.05.2013, 12:53
#26
ShaggyDoc

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


Цитата:
Правда для этого нужно разбираться в XML немного больше, чем просто уметь писать тэги.
А я и пользуюсь. У меня более 200 xml разного назначения. И даже XML-dataset есть, с запросами. Для этого надо не только тэги знать. Очень удобно для локальных БД, не связанных ни с какими движками. Но и от INI не отказываюсь, где это удобнее. Вот только тормозной MSXML не применяю - пусть остается верующим.
ShaggyDoc вне форума  
 
Непрочитано 27.05.2013, 13:23
#27
Дима_

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Но и от INI не отказываюсь, где это удобнее.
В моем представлении ini может удобней ну пожалуй когда пишешь ядро загрузки - чтоб из ассемблера парсинг написать (формат проще), чтоб он какой-нибудь конфигурационный файл посмторел, - когда библиотек нет, да коду будет поменьше. А в остальном это как-то врядли - по меньшей мере так-же - может быть обратный случай - когда с применением соотвествующий библиотек (или odbc драйверов) к xml на sql'е обратиться удобней иль как Вы сами указали из него dataset настроить. А для "тупого" получения списка пар ключ-значение - с использованием библиотек - по моему абсолютно по барабану.
з.ы. ну если только под словом "удобней" имееться в виду - уже через ini сделанно - и чего его менять - работает же.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 27.05.2013, 13:38
#28
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Вот только тормозной MSXML не применяю - пусть остается верующим.
Как правило, объёмы данных, хранимых мною в XML не превышают нескольких тысяч записей. Тормозов в работе не наблюдаю (и в MSXML в т.ч.). Для очень больших объёмов лучше использовать СУБД, и не важно, используется ли MSXML, XmlLite или др. Религия тут не при чём, тут нужно просто голову включать и смотреть, в какой ситуации что целесообразней использовать (при этом не забывая заглядывать на пару шагов вперёд).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 27.05.2013 в 14:03.
hwd вне форума  
 
Непрочитано 27.05.2013, 18:19
#29
ShaggyDoc

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


Цитата:
Тормозов в работе не наблюдаю (и в MSXML в т.ч.).
Ну, если "слаще морковки" ничего не едал... Скорость в процентах по отношению к самому быстрому. Проверяется открытие, чтение, запись, сохранение.

Тест 1. Файл размером 10 МБ.

MSXML: 756%
Xerces XML: 600%
ADOM XML: 549%
NativeXML: 193%
JanXML: 100%

Тест 2. Файл размером 5 Кб.

MSXML: 2000 %
ECXML: 300 %
Native XML: 200 %
MVRB XML: 200 %
JANXML: 100 %

Тест 3. Файл размером 1,75 МБ.

MSXML: 820 %
Native XML: 515 %
MVRB XML: 285 %
JAN XML: 100 %

Про всякие глюки (46 официальных версий MSXML) уже и не говорю.
ShaggyDoc вне форума  
 
Непрочитано 27.05.2013, 18:30
#30
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


@ShaggyDoc,

В минутах\секундах оно было бы более понятно. Проценты в данном случае - это некоторый аналог сферического коня в вакууме: вроде какие-то цифры показаны, а как это проецируется по времени (разброс) - не понятно. Кроме того, под разные технологии ваш код может быть написан по разному: например хорошо написан под Delphi, но не очень хорошо под .NET. Это нужно смотреть конкретные данные и конкретный код.

UPD
Если реально есть желание, то можно выложить в общий доступ некоторые XML файлы данных, подлежащих обработке и оговорить набор операций, которые необходимо выполнить. Затем, написав разные варианты решения, выложить их исходный и машинный код, дабы каждый мог ознакомиться с исходниками и запустив их на своей машинке, сравнить скорость обработки.

Например, на том же .NET работу с XML можно выполнять с использованием такой старой технологии как DOM, либо использовать LINQ to XML. Кроме того, можно воспользоваться распараллеливанием вычислений (PLINQ), что даст прирост скорости на многопроцессорных машинках. Т.о., на данный момент времени, трактовать ваши результаты, не видя ваших данных и исходников - весьма сомнительное (в плане непредвзятости) занятие.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 27.05.2013 в 18:58.
hwd вне форума  
 
Непрочитано 23.04.2018, 15:39
#31
tujn08


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


Чего-то я не понял как использовать : "(defun get-all-global-vars"rs"
Мне тоже стало интересно получить пользовательские переменные и их содержимое.
tujn08 вне форума  
 
Непрочитано 24.04.2018, 22:10
#32
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


А я вообще не понимаю всех этих городушек. Объявляешь в лиспе список нужных переменных и печатаешь их себе из лиспа когда хочешь и куда хочешь.
koMon вне форума  
 
Непрочитано 25.04.2018, 07:52
#33
tujn08


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


Спортивный интерес просто.
Я получил нужный результат так:
1. сохранил список (atoms-family 1) до программы
2. отработал программу
3. сохранил список (atoms-family 1) после программы
4. (member)- ом сравнивал/печатал на экран отличия

ИТОГО: пользовательские переменные есть, тип и содержимое (кроме функций) получить нет проблем.

И тут я подумал:
а можно ли содержимое функций получить? думаю, что нет.
tujn08 вне форума  
Ответ
Вернуться   Форум 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