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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Где хранить табличные промежуточные результаты

Где хранить табличные промежуточные результаты

Ответ
Поиск в этой теме
Непрочитано 28.05.2010, 18:07 #1
Где хранить табличные промежуточные результаты
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

День добрый.
Собственно, вопрос в теме. Списки - единственный способ хранения табличных данных в ходе работы программы в Автолиспе ?
Поделитесь опытом, плиз.
Просмотров: 5891
 
Непрочитано 28.05.2010, 19:11
#2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


Можно во внешнем файле...который создать на основе списка
Если можно, подробнее: что за данные и чем так плохи списки??
kp+ вне форума  
 
Автор темы   Непрочитано 28.05.2010, 20:19
#3
swkx


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


Самый большой недостаток списков - "непохожесть" работы с ними на работу с обычными таблицами в понятиях "запись"-поле" !!)))
А за много лет работы с базами данных определённые методы работы с таблицами уже въелись в мозги и они (мозги) не хотят привыкать к другим методам.
Кстати, тоже склоняюсь к мысли, что в некоторых случаях внешние текстовые файлы могут оказаться удобным подспорьем.
swkx вне форума  
 
Непрочитано 28.05.2010, 22:47
#4
Кулик Алексей aka kpblc
Moderator

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


Кто сказал про непохожесть? subst, assoc, vl-remove-if, vl-remove-if-not и т.п. - и вот оно, программерское счастие.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.05.2010, 22:58
#5
swkx


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


А я и не утверждаю, что списков и функций работы с ними недостаточно для достижения результата. Я просто хотел прояснить для себя, есть ли какой-нибудь альтернативный похожий механизм.
swkx вне форума  
 
Непрочитано 29.05.2010, 00:37
#6
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


vlax-safearray-get-element
vlax-safearray-put-element
Vov.Ka вне форума  
 
Непрочитано 29.05.2010, 06:37
#7
ShaggyDoc

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


Цитата:
Я просто хотел прояснить для себя, есть ли какой-нибудь альтернативный похожий механизм.
Самый большой недостаток программиста - попытка сделать "похожий" механизм, вместо того, чтобы освоить средства используемого языка.

При наличии времени его можно потратить бесполезно. Например, можно и на LISP написать аналоги Dataset для работы с табличными данными - навигация First, Next, Prev, GetFieldByName и т.п. Изнасиловать LISP и попытаться превратить его в Basic или что-то подобное. "Массивы" сделать. Но делать этого не стоит - LISP это язык обработки списков "от рождения".

Что касается хранения промежуточных результатов, то делать это можно как угодно. И в памяти, если "промежуток" не включает выход из AutoCAD, и в файлах.

Файлы могут быть любого вида. Например, можно хранить данные в "настоящей" базе данных, хотя бы Access. Но для работы с такой БД в LISP придется подключать механизмы ADO, а это довольно сложно.

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

Можно хранить и в универсальных текстовых форматах, например в XML.

Вот пример:
Код:
[Выделить все]
<?xml version="1.0" encoding="windows-1251" ?>
<table>
  <summaryinfo Title="РАСЧЕТНЫЕ ТЕПЛОВЫЕ ПОТОКИ" Subject="Система ruCAD - Autogenerate table" Author="Администратор" FromDWG="Создание таблиц.dwg"/>
  <title rows="2" height="29.8" ask_title="0">
    <columns count="7">
      <column_1 size="15.0" type="STRING" align="L"/>
      <column_2 size="60.0" type="STRING" align="L"/>
      <column_3 size="22.0" type="STRING" align="L"/>
      <column_4 size="22.0" type="STRING" align="L"/>
      <column_5 size="22.0" type="STRING" align="L"/>
      <column_6 size="22.0" type="STRING" align="L"/>
      <column_7 size="22.0" type="STRING" align="L"/>
    </columns>
    <row_1 height="11.0">
      <cell_1 text="Позиция|по|ген-|плану"/>
      <cell_2 text="Наименование|потребителя"/>
      <cell_3 text="Расчетный тепловой поток, МВТ"/>
      <cell_4 text="Расчетный тепловой поток, МВТ"/>
      <cell_5 text="Расчетный тепловой поток, МВТ"/>
      <cell_6 text="Расчетный тепловой поток, МВТ"/>
      <cell_7 text="Расчетный тепловой поток, МВТ"/>
    </row_1>
    <row_2 height="18.8">
      <cell_1 text="Позиция|по|ген-|плану"/>
      <cell_2 text="Наименование|потребителя"/>
      <cell_3 text="Отопление"/>
      <cell_4 text="Вентиляция"/>
      <cell_5 text="Горячее | водо- |снабжение"/>
      <cell_6 text="Техноло- |гические |нужды"/>
      <cell_7 text="Всего"/>
    </row_2>
  </title>
  <data rows="2">
    <row_1>
      <column_1 data="12"/>
      <column_2 data="Корпус 12"/>
      <column_3 data="20"/>
      <column_4 data="10"/>
      <column_5 data="20"/>
      <column_6 data="10"/>
      <column_7 data="80"/>
    </row_1>
    <row_2>
      <column_1 data="62"/>
      <column_2 data="Корпус 62"/>
      <column_3 data="10"/>
      <column_4 data="10"/>
      <column_5 data="10"/>
      <column_6 data="10"/>
      <column_7 data="10"/>
    </row_2>
  </data>
</table>
Здесь описана таблица вместе с шапкой, колонками и данными. Средствами LISP из этих данных строится таблица в AutoCAD - со всем требуемым оформлением. Если это версия, умеющая работать с объектами Table - таблица будет создана как объект, а если это древняя версия AutoCAD - таблица будет нарисована "черточками и буковками".

Только для LISP можно было бы эти данные хранить в текстовом файле в виде списка или, например, в CSV. Но таблицы удобно обрабатывать в "гуевых" программах, поэтому применен заведомо избыточный формат XML. Это позволяет другим программам обрабатывать таблицу как базу данных.

Благодаря универсальности формата используется одна внешняя программа, обрабатывающая любые таблицы и одна LISP-функция, строящая любые таблицы. Если бы формат данных был узко-специальный, потребовалось бы много разных программ, но работающих чуть быстрее.

Так что вопрос "где и как" следует решать самостоятельно в зависимости от задач - банально, но это так.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 29.05.2010, 09:31
#8
swkx


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


Vov.ka

Я обратил внимание на безопасные массивы, но нигде мне на глаза не попался наглядный пример работы с ними, чтобы их пощупать.

ShaggyDoc

Спасибо за обстоятельный ответ. Правда, меня пытались обвинить в попытке изобретения велосипеда Ничего подобного! Повторяю - хотел знать все имеющиеся механизмы хранения информации, которая нужна только на время выполнения программы.
swkx вне форума  
 
Непрочитано 29.05.2010, 09:45
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от swkx Посмотреть сообщение
Где хранить табличные промежуточные результаты
Однозначно в памяти, это быстрее всего... И без вариантов... Список или безопасный массив... но список предпочтительнее...
Код:
[Выделить все]
(nth iCol (nth iRow lstTable))
где
lstTable - таблица в виде списка
iRow - номер строки ячейки
iCol - номер столбца
gomer вне форума  
 
Автор темы   Непрочитано 29.05.2010, 09:54
#10
swkx


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


gomer

очень похоже на то, что я пытаюсь нащупать
только приведите, плиз, пример самого списка lstTable
swkx вне форума  
 
Непрочитано 29.05.2010, 10:18
#11
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Код:
[Выделить все]
(setq
lstTable
(list
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
)
MyCell (nth 5 (nth 0 lstTable)) ; ячейка в последнем ряду верхней строчки
)
Вот вам матрица 5х5, таблица с 5 строками и 5 столбцами
Формируется такой список с помощью цикла repeat и функций cons, append

Последний раз редактировалось gomer, 29.05.2010 в 11:40.
gomer вне форума  
 
Автор темы   Непрочитано 29.05.2010, 10:44
#12
swkx


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


gomer

спасибо. наглядно и абсолютно понятно

Тогда идём дальше: есть список точек ((N1 x1 y1 z1) (N2 x2 y2 z2)...(Nn xn yn zn)), где N - номер точки (целое число), x,y,z-координаты. Как мне получить список точек по некому условию, например все точки, у которых x=10 и 3<=z<=10 ?
Или, может быть, для этой цели список должен быть вида
((N1 (x1 y1 z1)) (N2 (x2 y2 z2)) ... ) ??
swkx вне форума  
 
Непрочитано 29.05.2010, 11:02
#13
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Цитата:
Сообщение от gomer Посмотреть сообщение
Код:
[Выделить все]
(setq
lstTable
(list
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
'(0 1 2 3 4 5)
)
MyCell (nth 0 (nth 5 lstTable)) ; ячейка в последнем ряду верхней строчки
)
Вот вам матрица 5х5, таблица с 5 строками и 5 столбцами
Формируется такой список с помощью цикла repeat и функций cons, append
gomer - вы слишком усердно следите за "грамотностью" написания имён переменных, что о смысле и правильности самого кода начисто позабыли .
MyCell (nth 0 (nth 5 lstTable)) - даст ошибку, так как шестой строки тута нету , и это не "ячейка в последнем ряду верхней строчки", а первое значение в шестой строке !

swkx - храни так, как тебе ближе по смыслу. Для первого варианта можно так, например, сделать выборку (тут table - '((N1 x1 y1 z1) (N2 x2 y2 z2)...(Nn xn yn zn)):
Код:
[Выделить все]
(setq tab1       (VL-REMOVE-IF-NOT 
                         (FUNCTION 
                             (lambda (str /) 
                                 (and 
                                      (= (cadr str) 10) 
                                      (<= 3 (cadddr str) 10)
                                      )
                                  )
                              )
	               table
                           )
                    )

Последний раз редактировалось Евгений А., 29.05.2010 в 11:18.
Евгений А. вне форума  
 
Автор темы   Непрочитано 29.05.2010, 11:14
#14
swkx


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


Евгений, это вы зря

gomer cуть метода изложил, этого вполне достаточно
swkx вне форума  
 
Непрочитано 29.05.2010, 11:25
#15
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Не соласен, что зря! Вы тоже хотите ошибаться?
А если бы вы спросили - "что есть такое "список" в лиспе?", то вы уже давно получили бы подобный ответ и возможно без ошибок.
__________________________________
"Вы дурак или враг?" (И.В. Сталин)

Я 13 пост дописал для вас...
Евгений А. вне форума  
 
Автор темы   Непрочитано 29.05.2010, 11:34
#16
swkx


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


Ошибаться не хочу, но повторю - gomer своим ответом меня удовлетворил
Я знаю, что такое список, но не вполне освоился с методами работы с ними.
Теперь про приведённый вами код: я правильно понял, выборка формируется перебором всего списка и удалением из него элементов, не удовлетворяющих условию ?
Ваш код принципиально чем-нибудь отличается от структуры (foreach element table ...) ?
swkx вне форума  
 
Непрочитано 29.05.2010, 11:40
#17
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


>Евгений А.: Вы абсолютно правы!!! Просто голова с утра не работает... Писал на вскидку, без проверки...
Прошу прощения за дезинформацию у автора темы
Пост подправил
gomer вне форума  
 
Непрочитано 29.05.2010, 12:02
#18
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


swkx, так сохраняется последовательность, можно использовать внутренние локальные переменные, скорее всего работает быстрее (Всё-таки эта функция для этого и создана, но это уже на совести компилятора).
Евгений А. вне форума  
 
Автор темы   Непрочитано 29.05.2010, 12:09
#19
swkx


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


Понял. Меня интересовал именно самый быстрый способ получения выборки.

Тогда еще вопрос: как мне отсортировать мой список ((N1 x1 y1 z1) (N2 x2 y2 z2)...(Nn xn yn zn)) таким образом, чтобы точки располагались в порядке возрастания координаты z ?
swkx вне форума  
 
Непрочитано 29.05.2010, 12:26
#20
Кулик Алексей aka kpblc
Moderator

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


swkx, тебе лучше сюда: http://forum.dwg.ru/showthread.php?t=22894
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.05.2010, 12:50
#21
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


swkx, вот так должно получиться.
Код:
[Выделить все]
(setq tab2 (VL-sort table (FUNCTION (lambda (str1 str2 /) (< (cadddr str1) (cadddr str2))))))
а вообще правильно kpblc отправил...
Евгений А. вне форума  
 
Автор темы   Непрочитано 29.05.2010, 13:38
#22
swkx


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


был уже
swkx вне форума  
 
Непрочитано 29.05.2010, 16:07
#23
ShaggyDoc

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


Цитата:
Однозначно в памяти
Далеко не однозначно. В памяти можно хранить данные во время работы конкретной программы - это, конечно, самый быстрый способ.

Можно хранить в памяти во время перерывов в работе конкретной программы, но в одном сеансе работы с Автокадом. Но это уже нерациональное использование глобальных переменных, чреватое ещё и ошибками.

Но данные бывают разные. Рискну утверждать, что в бОльшей части случаев, для хранения промежуточных данных, следует использовать файлы или реестр. В зависимости от характера данных и их объема. И скорость доступа, как правило, не имеет особого значения - какая разница, сработает програма за 0.01 сек или 0.0001 сек.

Так что категорично утверждать не надо - всё зависит от конкретных условий задачи.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 29.05.2010, 23:55
#24
swkx


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


Думаю, что в моём случае скорость доступа как раз может оказаться критичным параметром. Речь идет о прокладке кратчайшего маршрута по множеству 3-мерных точек, что, в свою, очередь, сводится к анализу каждой точки и её соседей. Сколько будет таких вычислений -страшно представить, поэтому нужны самые скорострельные методы.
В принципе, я определился - буду работать со списками, если удастся перенастроить собственные мозги.
Большое спасибо всем откликнувшимся за помощь.
swkx вне форума  
 
Непрочитано 30.05.2010, 00:05
#25
Кулик Алексей aka kpblc
Moderator

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


Сильно подозреваю, что разговор идет про построение поверхности по результатам лазерного сканирования. Как бы то ни было, попробуй обратиться к Евгению Елпанову - он занимался этой проблемой. Но только учти, что человек он сейчас крайне занятой, и на быстрый ответ я бы не стал рассчитывать...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.05.2010, 00:15
#26
swkx


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


Кулик,

Спасибо за наводку, но с алгоритмом я надеюсь разобраться самостоятельно - уж больно интересная задачка. Это не поверхность, на чертеже должна быть одна из всех возможных 3D-полилиния с мин. длиной.
swkx вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Где хранить табличные промежуточные результаты



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59