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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать изменяемое имя переменной.

Как создать изменяемое имя переменной.

Ответ
Поиск в этой теме
Непрочитано 10.06.2014, 18:50 #1
Как создать изменяемое имя переменной.
iiscienceii
 
Регистрация: 30.05.2014
Сообщений: 20

Подскажите стоит такая задача. В цикле определенной количество раз отрисовуется идин итот же элемент. И каждый последующий элемент должен быть присвоен переменной element_N. Где N номер построеного элемента. Например
(setq element_1 (entlast))
(setq element_2 (entlast))
..........................................
(setq element_N (entlast))
Просмотров: 9797
 
Непрочитано 10.06.2014, 18:51
#2
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,604


Массив?
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 10.06.2014, 19:22
#3
Дима_

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


Формально в автолиспе такое можно сделать - но я даже не буду говорить как, ибо даю 100% гарантию, что Вы пытаетесь что-то простое сделать через **** неправильно. Какова общая задача.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.06.2014, 22:06
#4
iiscienceii


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


Задача заключается в следующем. Написаная мной програма считает стоимость спроектированной столешницы из искуственного камня исходя из площади изделия(например для кухни). Но само изделие может иметь несколько вырезов (под мойку или варочную поверхность или еще под што либо. Необходимо отрисовывать каждый вырез и присваевать ему имя (как описано выше) дальше определяем площади каждого выреза по очеред и вычитаем их площади из общей площади изделия. В итоге окончательно получаем итоговую площадь изделия и стоимость его.
iiscienceii вне форума  
 
Непрочитано 10.06.2014, 22:14
#5
Дима_

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


И зачем тебе городить переменные с разными именами. Заноси в ассоциативный список например - '((название площадь координата ...)).
Попробуй сам понять для чего тебе в данной задачи такая сущность как имя переменной да еще и однотипное (element_1,.._2...) - в них нет никакого смысла.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.06.2014, 22:20
#6
iiscienceii


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


Ух ты. Я вроди и програмирую в AutoLispe уже с 3 года, но не системно и не постоянно. Однако тако (ассоциативный список) еще не умею. Я так понял это обычный масив, где в строке записывается имя объекта и его площадь, правильно???
iiscienceii вне форума  
 
Непрочитано 10.06.2014, 22:27
#7
Дима_

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


Цитата:
Сообщение от iiscienceii Посмотреть сообщение
Я вроди и програмирую в AutoLispe уже с 3 года
Прости друг - но по моему это не самые твои плодородные годы - т.к. массивов в автолиспе нет (есть vla представления массива с которым он кое-как умеет работать). Я не знаю что тебе больше подойдет в твоей задаче, но как один из вариантов - это ассоциативный список - то есть список списков, у которого каждый элемент начинается с "ключа"), в твоем случае это может быть например имя "отверстия", либо какое-либо другое уникальное ключевое свойство. Для работы с ними предусмотрены функции assoc и subst + стандартные вещи для работы с обычными списками.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 11.06.2014, 09:33
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от iiscienceii Посмотреть сообщение
Однако тако (ассоциативный список) еще не умею.
После приобретения навыков работы с ассоциативным списком можно обратить внимание на Расширенные данные + LDATA. Расширенные данные позволяют с помощью функции ssget быстро выбрать нужные примитивы. Возможно, не нужен даже ассоциативный список (так как площадь - это свойсто, но нужно будет разобраться что такое набор. Почитать и попробовать можно здесь с #27 по #41
Цитата:
Команда: (vlax-dump-Object(setq obj(vlax-ename->vla-object(car(entsel)))) t)
Выберите объект: ; IAcadLWPolyline: Интерфейс AutoCAD для работы с компактными
полилиниями.
; Значения свойств:
; Application (RO) = #<VLA-OBJECT IAcadApplication 0000000140d28e28>
; Area (RO) = 1000.44
; Closed = -1
; ConstantWidth = 0.0
; Coordinate = ...Индексированное содержимое не выводится...
; Coordinates = (147.228 110.362 188.58 110.362 188.58 134.555 ... )
; Document (RO) = #<VLA-OBJECT IAcadDocument 0000000026d45280>
; Elevation = 0.0
; Handle (RO) = "76"
; HasExtensionDictionary (RO) = 0
; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000000002924fc28>
; Layer = "0"
; Length (RO) = 131.09
Площадь и периметр можно так же узнать командой ПЛОЩАДЬ (_AREA)
Вычесленные значения хранятся в соотвествующих переменных AREA и PERIMETER. Получение сведений о площади и свойствах массы
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.06.2014, 22:38
#9
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


... нет, но почему то же человек выбрал именно такой путь решения ....
что то вроде
(setq i -1)
(while (< n 10)
(setq (read (strcat "element" (itoa (setq n (1+ n))))) (entlast))
)
интересно, а как такой человек чай, например, заваривает...
kakt00z вне форума  
 
Непрочитано 12.06.2014, 00:33
#10
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


Команда: (set (read(strcat "d" "4")) 56)
56
Команда: (setq (read(strcat "d" "4")) 56)
; ошибка: синтаксическая ошибка
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 12.06.2014, 13:16
#11
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


Цитата:
Сообщение от nolte Посмотреть сообщение
; ошибка: синтаксическая ошибка
пардон, писал дома, не проверил. конечно set
kakt00z вне форума  
 
Непрочитано 16.06.2014, 20:12
#12
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от iiscienceii Посмотреть сообщение
Подскажите стоит такая задача. В цикле определенной количество раз отрисовуется идин итот же элемент. И каждый последующий элемент должен быть присвоен переменной element_N. Где N номер построеного элемента. Например
(setq element_1 (entlast))
(setq element_2 (entlast))
..........................................
(setq element_N (entlast))
Ты сам видишь, проблема в том чтобы при записи включить вычисляемое значение в имя переменной. Как только добьёшся, появится аналогичная проблема чтения этих переменных. То же самое можно добиться простым списком:

перед циклом создаем пустой список: (setq spisok nil)

В цикле пополняем список: (setq spisok(append spisok(list(entlast))))

После цикла извлекаем 5-й элемент списка: (nth 4 spisok) 4 потому, что счет с нуля,
т.е. первый элемент: (nth 0 spisok) , другие номера аналогично.

Последний раз редактировалось 480725, 19.06.2014 в 01:49.
480725 вне форума  
 
Непрочитано 16.06.2014, 20:35
#13
Дима_

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


Цитата:
Сообщение от 480725 Посмотреть сообщение
(setq spisok(append spisok(entlast)))
Это первая конструкция за которую надо оторвать руки лишить доступа к компьютеру.
Цитата:
Сообщение от 480725 Посмотреть сообщение
После цикла извлекаем 5-й элемент списка: (nth 4 spisok)
За эту можно вначале попросить пояснить почему в качестве индексации элемента списка выбран его порядковый номер, затем скорее всего опять-таки, лишить доступа до сдачи экзамена по теоретической части.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.06.2014, 22:43
#14
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Это первая конструкция за которую надо оторвать руки лишить доступа к компьютеру.

За эту можно вначале попросить пояснить почему в качестве индексации элемента списка выбран его порядковый номер, затем скорее всего опять-таки, лишить доступа до сдачи экзамена по теоретической части.
А как вы собирались делать коды у однородных элементов ассоциативных списков?
М.б., типа, "название площадь координата-1" .. "название площадь координата-N", или запрашивать в диалоге как подписать очередной (entlast)?

Человек обратился с вопросом. Скорее всего он просто некорректно поставлен и его бы устроило создание набора данных и извлечение из него примитивов по номеру. И первоначальная формулировка вопроса, и буквальный ответа, который прислал kakt00z подталкивают к тому, чтобы советовать работу со списком (в конкретной задаче набор данных лучше, но список универсальнее), Ассоциативный список автор вопроса не понимает, а сами списки ему вроде знакомы, хоть он и называет их массивом. Так в данном случае ни в каком ассоциативном списке и нет никакой нужды ни по сути, ни методически, т.к. речь идет только о помощи человеку максимально просто решить поставленную им задачу. По поводу комментариев к чужим сообщениям - вы просто, похоже, переутомились стучать своим молотком, за все посещения форума мне еще ни разу не попадались столь откровенные проявления, мягко говоря, неуважения как в ваших 2 последних сообщениях в этой теме. Или в Питере сейчас это принято? Среди Продуманов?
480725 вне форума  
 
Непрочитано 17.06.2014, 23:19
#15
Дима_

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


Цитата:
Сообщение от 480725 Посмотреть сообщение
за все посещения форума мне еще ни разу не попадались столь откровенные проявления, мягко говоря, неуважения как в ваших 2 последних сообщениях в этой теме
Это чем-же я Вас так "откровенно неуважаю"? Вы даете совет человеку в виде кода который 1 - просто не будет работать - да да Ваша конструкция (setq spisok(append spisok(entlast))) просто не "переварит" транслятор автолиспа если есть хоть 1 примитив в чертеже, 2 - является "алгоритмичиеским некоректным" т.к. даже в исправленном виде использоовать для добавления одного элемента append, да еще и в цикле логарифмически увеличивает время выполнения, ну и по мелочи - учите использовать список как массив (nth для справки будет cdr'ить список до обнуления аргумента индекса), (setq spisok nil), (nth 0 spisok) - это тоже показатель "уровня". И как Вы считаете надо коментировать если во всех примерах приведенных Вами содержатся либо синтаксические, либо алгоритмические ошибки. По предыдущему посту, да я действительно считаю, что три года изучения автолиспа прошли в очень "сыром" виде, о чем собственно и пишет сам автор, Вас насколько я помню, даже заинтересовало как он чай заваривает - я при этом не сомневаюсь - что "с чаем" у него все в порядке - но Вы в отличие от автора, который спрашивает как сделать правильно, пишите делаете так, при том даже не удосужившись проверить будет-ли оно работать, не говоря уже о том, что предложенным Вами вариант мягко говоря спорен и в моем личном понимании не далеко ушел от создания "кучки однотипноназванных" переменных.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.06.2014, 10:02
#16
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


То что код работать не будет я увидел, а вот эти "перлы" проглядел:
Цитата:
Сообщение от Дима_ Посмотреть сообщение
(setq spisok nil), (nth 0 spisok) - это тоже показатель "уровня"

480725, рано пытаешься советы давать другим по программированию на лиспе. Ну а уж если так невтерпеж, то будь готов к такой критике. Она еще довольно мягкая, уж поверь
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 20.06.2014 в 09:14.
Do$ вне форума  
 
Непрочитано 19.06.2014, 02:41
#17
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Это чем-же я Вас так "откровенно неуважаю"? Вы даете совет человеку в виде кода который 1 - просто не будет работать - да да Ваша конструкция (setq spisok(append spisok(entlast))) просто не "переварит" транслятор автолиспа если есть хоть 1 примитив в чертеже, 2 - является "алгоритмичиеским некоректным" т.к. даже в исправленном виде использоовать для добавления одного элемента append, да еще и в цикле логарифмически увеличивает время выполнения, ну и по мелочи - учите использовать список как массив (nth для справки будет cdr'ить список до обнуления аргумента индекса), (setq spisok nil), (nth 0 spisok) - это тоже показатель "уровня". И как Вы считаете надо коментировать если во всех примерах приведенных Вами содержатся либо синтаксические, либо алгоритмические ошибки. По предыдущему посту, да я действительно считаю, что три года изучения автолиспа прошли в очень "сыром" виде, о чем собственно и пишет сам автор, Вас насколько я помню, даже заинтересовало как он чай заваривает - я при этом не сомневаюсь - что "с чаем" у него все в порядке - но Вы в отличие от автора, который спрашивает как сделать правильно, пишите делаете так, при том даже не удосужившись проверить будет-ли оно работать, не говоря уже о том, что предложенным Вами вариант мягко говоря спорен и в моем личном понимании не далеко ушел от создания "кучки однотипноназванных" переменных.
Спасибо, опечатку исправил заменил (setq spisok(append spisok(entlast))) на (setQ spisok(appenD spisok(list (entlast)))) - впредь буду внимательнее..
Остальные рассуждения в цитируемом тексте прокомментирую на этот раз протестированным текстом программы. Цикл 9999 повторений занял ~ 7 секунд и создал список из 9999 элементов. В теме речь идет об отверстиях в столешнице (см. #4). Обычно их 2 - мойка и плита. В вопросе не формулируется необходимость разделять отверстия по назначению, но даже если бы такая необходимость существовала - никакого смысла в ассоциативном списке все равно не было бы т.к. никакой потребности раздельно извлекать "отверстие под мойку-N" т.е. отдельно нумеровать отверстия по назначению - из описания задачи не возникает. А если не ставить N -потеряется ассоциативность.
Привожу текст из файла, т.е. прошедший проверку (вместо отверстий строил отрезок):
(setQ spisok nil)
(Repeat 9999
(command "_Line" (list 0 0)(list 1 1)"")
(setQ spisok(appenD spisok(list (entlast))))
);repeat
(Princ (strcat"\nL="(itoa(length spisok)))); это проверка на предмет логарифмического увеличения
(Princ (nth 9998 spisok))
(prin1)

Результат (скопирован из текстового окна Автокада):
L=9999<Имя объекта: 7e55cad8>
PS Не смог найти в GOOGLE никаких данных про Логарифмическое увеличение - звучит красиво, но непонятно.. Разъясните, пожалуйста, заодно и
и как все-таки nth будет cdr'ить список до обнуления аргумента индекса, а то я пользуюсь этим оператором лет 10, значит немеренноее число списков заcdr'ил - их ведь надо будет как-то расcdr'ивать...

Последний раз редактировалось 480725, 19.06.2014 в 03:00.
480725 вне форума  
 
Непрочитано 19.06.2014, 11:24
#18
Дима_

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


Цитата:
Сообщение от 480725 Посмотреть сообщение
(setQ spisok(appenD spisok(list (entlast))))
);repeat
(Princ (strcat"\nL="(itoa(length spisok)))); это проверка на предмет логарифмического увеличения
я писал логарифмически увеличивает время выполнения
Цитата:
Сообщение от 480725 Посмотреть сообщение
как все-таки nth будет cdr'ить список до обнуления аргумента индекса,
Список, в отличие от массива, состоит из двух частей (если он не пустой) головы (то что мы получаем функцией car) и хвоста(cdr) - все. Весь остальной доступ формируется через эти функции. То есть когда Вы задаете (nth x ...) функция cdr'ит список x раз - поэтому в лиспе доступ по индексу практически не используеться в виду неэффективности (максимум '(X Y Z) координаты, причем прошу не путать индекс с порядком - то есть что за чем следует) - структуры формируются по иным правилам - в зависимости от задачи, но в любом случае подразумеваеться "однократная" пробежка по списку для формирования результата. Про append - логику функции append на лиспе можно выразить так (внутри лиспа на c++ написанно, алгоритмически то-же самое т.к. структура та-же):
Код:
[Выделить все]
 (defun my-append (lst1 lst2)
  ((lambda (frec) (frec (reverse lst1) lst2))
   (lambda (lst1 lst2)
     (if lst1
         (frec (cdr lst1) (cons (car lst1) lst2))
         lst2))))
то есть при каждом добавлении 1-го элемента в конец списка мы "пересчитываем" весь список. Списки всегда формировались функцией (cons ...) которая добавляет аргумент в начало списка за одну итерацию (результат, при необходимости, "переворачивается" в конце reverse'ом).
з.ы. то что за 10 лет пользования вы теорию даже не открывали - это очень грустно...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.06.2014, 21:36
#19
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Дима_ Посмотреть сообщение
я писал логарифмически увеличивает время выполнения
Список, в отличие от массива, состоит из двух частей (если он не пустой) головы (то что мы получаем функцией car) и хвоста(cdr) - все. Весь остальной доступ формируется через эти функции. То есть когда Вы задаете (nth x ...) функция cdr'ит список x раз - поэтому в лиспе доступ по индексу практически не используеться в виду неэффективности (максимум '(X Y Z) координаты, причем прошу не путать индекс с порядком - то есть что за чем следует) - структуры формируются по иным правилам - в зависимости от задачи, но в любом случае подразумеваеться "однократная" пробежка по списку для формирования результата. Про append - логику функции append на лиспе можно выразить так (внутри лиспа на c++ написанно, алгоритмически то-же самое т.к. структура та-же):
.
Главное - у списка есть голова. Это понятно. Дальше рассуждения усложняются и процесс их осмысления упирается в две неочевидные для оппонента потребности:
1) Хотелось бы знать, идет ли здесь речь об С++, Лиспе вообще или именно об Автолиспе, и являются ли изреченные здесь гипотезы плодом личных размышлений, или почерпнуты из каких-то официальных источников именно по Автолиспу.
2) Хотелось бы, что гораздо проще, проверить приведенную в цитате теорию на практике. (В этом вопросе наш спор хорошо иллюстрирует ссылка: http://ru.wikisource.org/wiki/%D0%94...D0%B8%D0%BD%29) Текст программы приводить не стану, просто повторяю ранее написанный набор команд, получаю 9999 линий, а затем второй программой в цикле выполняю 9999 раз (command"_erase"(nth(setq number(1+ number))spisok)"") - и линий больше нет

И этот цикл работает более чем в 10 раз быстрее чем первоначально опубликованный, т.е менее секунды. То ли чтение из списка идет быстрее запиcи, то ли команда _Erase быстрее команды _Line. Мне, собственно это по барабану. Реальные списки у меня до 10000 элементов не дотягивают, время обработки списков ни меня ни пользователей не напрягало никогда. (Наборы данных - другая песня, если надо анализировать буквально все примитивы в чертеже, например при обработке планов здания выполненных в Архикаде - тут доходило до 15 минут и приходилось писать на экране процент выполненного)
И последнее. Я второй раз подкрепляю свою точку зрения экспериментом на 9999 повторений. Хотелось бы узнать сколько времени займет извлечение 9999 значений из ассоциативного списка, и как его формировать в Автолиспе без append, не приведенной же в последнем сообщении функцией. Хотя бы для тех-же линий. Я думаю, эту дискуссию надо на форуме заканчивать, через личку можно провести сравнение именно по времени, время для описанной в теме задачи не критично. Про логарифмическое увеличение посмотрите ссылку:
https://www.google.ru/?gfe_rd=cr&ei=...B0%D0%B5%D1%82
если в поиск добавить время выполнения то результаты будут только более засоренными. Я попробую про это в личку написать, вдруг опять не догадаетесь...
480725 вне форума  
 
Непрочитано 19.06.2014, 23:48
#20
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Вместо ввода кучи букв уже давно самостоятельно проверил бы.
Для начала вот это в своем коде
Код:
[Выделить все]
(setQ spisok(appenD spisok(list (entlast))))
замени на
Код:
[Выделить все]
(setQ spisok (cons (entlast) spisok))
Command стоит оттуда выкинуть нафик. Для замера времени выполнения давным-давно есть функция для автолиспа (от Елпанова Евгения вроде). На форуме поиском ищется.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать изменяемое имя переменной.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно создать расчетную схему фундамента мельницы в Лире? tanaka Лира / Лира-САПР 15 27.02.2013 05:45
SolidWorks 2009 x64 SP4 значение переменной в заметке - как? Перенос переменной из детали в сборку - как? sommer78 SolidWorks 6 13.09.2012 13:00
LISP - как переменной присвоить бесконечно большое значение?(не поверите, такое возможно) cj_lex LISP 7 23.03.2012 20:25
Как в SCAD создать группу нагружений из загружений? МишаИнженер SCAD 1 21.08.2011 05:30
Перевод имени блока в имя переменной и обратно Supermax Программирование 11 14.12.2009 23:26