Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 37
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Старый 20.07.2008, 20:12 1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 2049483
 
Старый 27.07.2009, 19:28
#721
Aminka

проектировщик CТБ
 
Регистрация: 03.03.2009
Сообщений: 28


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По идее надо:

Cпасибо. В приложении - итог моей "деятельности", который, однако ж, глючит слегка, судя по лишней надписи nil и ""-пустому вводу в окне командных строк.


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


И еще вопрос - крайне не оригинальный, но что ж поделать - можно ли рисовать автокадовские таблицы с помощью автолиспа, но без использований объектных vla-.. функций? Хотелось бы информацию из файлика вывести в таблицу в автокаде, которая нормальная таблица, а не набор линий и текста)
Вложения
Тип файла: dwg
DWG 2007
Drawing2.dwg (55.9 Кб, 5217 просмотров)
Тип файла: lsp strktpoj05.LSP (11.4 Кб, 132 просмотров)
Aminka вне форума  
 
Старый 27.07.2009, 21:55
#722
Кулик Алексей aka kpblc
Moderator

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


"Навскидку". Замени (setq gr (ssget)) на (setq gr (ssget '((0 . "INSERT")))) - и будут выбираться только блоки. А если добавить сюда и имена блоков, станет совсем просто:
Код:
[Выделить все]
(setq gr (ssget '((0 . "INSERT") (2 . "дым,пламя,ручник,теплов")))))
И строка
Код:
[Выделить все]
(write-line (itoa Nizv) fileh)
меняется на
Код:
[Выделить все]
(write-line (vl-princ-to-string (sslength gr)) fileh)
Остальной код не смотрел, но там мест для упрощения достаточно много ИМХО.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 28.07.2009, 13:23
#723
Do$

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


Цитата:
Сообщение от Aminka Посмотреть сообщение
...Если будут идеи по тому, как сделать правильнее и красивее, буду благодарна))))...
То, что сразу бросилось в глаза:

Код:
[Выделить все]
;АККУРАТНО!!! при использовании блоков размером больше чем 600 на 600 нужно подправлять текст программы на 266й строке!

(defun c:strktpoj05
       (/ etaj Nizv i inc shl OBruchn OBdim OBtepl);в скобках указаны пременные
   (setq temp "y")  ;temp="y"-строковая переменная(да,Yes)
   (setq fname nil fileh nil) ;обнуляет две переменные
   (setq fname (getfiled "Output filename" "" "txt" 0));(getfiled "строка-запрос""путь" "расширение" "режим")Взятие имени файла
   (setq fileh (open fname "a"))
   (setq Nizv nil)
   (setq inc nil)
   (setq etaj nil)


   (setq shl nil)
Если переменные в списке локальных, то им при запуске функции автоматом nil присваевается, а при выходе из функции возвращается исходное значение.
(A1 B C1 C2 C3 DL DLINA DOPNUM FILEH FL1 FL2 FLAG_SEL_NEW FNAME GR J K N NB OBPLAM P PKP POLYL POM ROT SS SUM TEMP X XX XXX XXXX)
Эти переменные используются в каких то других функциях? Если нет - то их тоже правильнее внести в список... А может быть от многих из них постараться избавиться, переделав код...



Код:
[Выделить все]
(if (OR (/= fl1 T) (/= fl2 T)) (nentsel (strcat "\nВы ошиблись и выбрали лишнее или не те объекты." "\nДля продолжения - ENTER.")))
Я бы при вместо nentsel использовал alert

Код:
[Выделить все]
	
(if (OR (/= fl1 T) (/= fl2 T))
  (alert
        "\nВы ошиблись и выбрали лишнее или не те объекты."
  ) ;_ end of alert
) ;_ end of if
Когда увидел эту функцию удивился и полез в справочник
(gc)
Что делает? Зачем тут нужна? (Может действительно нужна, просто я с ней "не знаком")

(princ) после закрывающей функцию скобки не будет обрабатываться
Код:
[Выделить все]
);end of defun
(princ)
Do$ вне форума  
 
Старый 28.07.2009, 15:28
#724
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
(gc)
Что делает? Зачем тут нужна? (Может действительно нужна, просто я с ней "не знаком")
GC - garbage collection
Во времена 10 Автокада это было критично.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 28.07.2009, 16:36
#725
Aminka

проектировщик CТБ
 
Регистрация: 03.03.2009
Сообщений: 28


Относительно (gc). Без нее строка (setq dlina (+ dlina (getvar "PERIMETER"))) работать адекватно отказывалась. На попытку вытащить то. что лежит в "PERIMETER" акад ругался, хотя и писал в командном окне значения area и периметра. Почему, не имею понятия( После того, как не получилось кусок кода с подсчетом длины полилинии написать самой, подсмотрела ее в одной из готовых программ. Видимо, в свойстве "PERIMETER" что-то уже валялось..хотя это лишь мои догадки) Ну а в конце я ее решила добавить уже почитав, что она память подчищает.

Избавиться от лишних переменных можно. Просто написала кучу всяких разных переменных для наглядности и упрощения отладки, на четверть их сократить точно можно)) Что и обещаюсь сделать в ближайшее время.

Но вопрос с рисованием таблиц остается открытым. Если не будет лениво и у кого-то есть пример того, как вставлять таблицы без функций вида (Vl*-... ), киньте сюда, плз, буду разбираться на примере методом тыка и хэлпов. Если так не получится вставить табличку, то хоть напишите об этом))) Буду покупать тогда полищука и пытаться изучать (vl*). Если я правильно понимаю, то искать нужно то, как работает VLA-ADDTABLE?
Опять-таки, вопрос человека, весьма далекого от программирования, vl-функции, это ведь уже объектно-ориентированное программирование под автокад? В инете множество ссылок на VBA. Однако с автолиспом, работающим со списками, у них маловато общего. Стоит ли начинать лезть в VBA или хватит вполне Полищука?)) В общеМ, извиняйте блондинку за кучу вопросов дурацких, но инфы в инете слишком много и у меня глаза разбегаются и за что хвататься не очень понятно.

Последний раз редактировалось Aminka, 28.07.2009 в 18:44.
Aminka вне форума  
 
Старый 28.07.2009, 23:01
#726
Кулик Алексей aka kpblc
Moderator

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


Offtop: полищука покупать не надо. А вот книгу Н.Н.Полещука - можно и нужно
Теперь по делу (возможно, VVA меня поправит): создавать таблицу "просто так" не получится. Сначала надо создать или изменить стиль таблицы. Учитывая объем информации, хранимой в описании табличного стиля, я бы упирал именно на ActiveX-методы. Вставку таблицы и задание ей всех настроек (количество и ширина столбцов, высоты строк, границы ячеек, объединение ячеек и т.д.) - я бы тоже делал на ActiveX (то есть vla-* функциях).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 29.07.2009, 10:15
#727
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Нечего и нечем поправлять
Добавлю только, что как вариант можно создавать стиль таблицы так:
1. настроить ручками
2. Сохранить полученный список из словаря "ACAD_TABLESTYLE"
3. При необходимость entmakex' ом создавать.
Так было сделано здесь (см. table-style-make из #1)
Кстати, чтобы при активной работе с таблицами чтобы она не подтормаживала, не забывать включать/отключать свойство Regeneratetablesuppressed с его проверкой. Подробнее можно почитать здесь
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 29.07.2009, 14:52
#728
Do$

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


Все-таки не понятно, что конкретно эта функция делает (я про gc).
Если можно, на примерах обьясните, пожалуйста!
Do$ вне форума  
 
Старый 29.07.2009, 14:53
#729
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Do$, Ты ссылку в #724 читал?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 29.07.2009, 15:44
#730
Do$

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


Да, там описание в википедии про сборщик мусора в различных языках программирования.
Он удаляет ненужные данные, освобождает память.
Сперва я подумал, что после завершения работы программы ставим gc и всем неиспользуемым переменным nil присваевается. Попробовал - ничего подобного...
Пока писал ответ, пришла мысль: когда мы вводим новую переменную, в памяти выделяется какое-то место под нее. Даже если мы потом этой переменной nil присвоили, место под нее сохраняется. А gc подчищает как раз такие неиспользуемые зарезервированные участки памяти. Но это только мои фантазии

Последний раз редактировалось Do$, 29.07.2009 в 15:49. Причина: Неточно мысль выразил
Do$ вне форума  
 
Старый 29.07.2009, 16:24
#731
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Ну в общем где-то так и есть.
Код:
[Выделить все]
(setq a 10)
(setq a 5.6e12)
(setq a "Мама мыла раму")
(setq a (vla-get-activedocument (vlax-get-acad-object)))
В a хранится указатель на выделенный участок памяти.
Каждое присвоение в a требует разного объема памяти. Подчисткой таких хвостов как раз gc и занимается.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 29.07.2009, 16:58
#732
Do$

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


А какие-то критерии использования есть? Например - провел цикл присвоения одной и той же переменной разных значений - запускаем "мусорщика". У Полещука как то неопределенно описано применение, цитата: "когда работают большие приложения...". А как определить, большое приложение или нет?
А имеет ли смысл при нынешних объемах памяти вообще эту функцию использовать?
Do$ вне форума  
 
Старый 29.07.2009, 18:28
#733
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Do$, Мусорщик запускается автоматически. Самому вызывать не нужно. Я последний раз принудительно вызывал его в году эдак 1991-1993, когда был DOS (твой тезка ), Автокад 10 и очень мало памяти.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 29.07.2009, 20:46
#734
ShaggyDoc

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


В современных AutoCAD сборщик мусора вызывать не обязательно. Памяти обычно хватает. Но у меня он включен в стартовую функцию, которая вызвается во всех программах. Тем самым постоянно убирается грязь.

"Большие приложения" действительно расплывчатое понятие. Оно не связано с большим объемом кода. Иногда маленький "в строках", но плохо написанный код может привести к накоплению мусора. Вот здесь вызов (gc) поможет. Хотя лучше писать хороший код.

Более точно о gc знают только програмисты Autodesk, реализующие сборку мусора в AutoCAD.

А вот в AutoCAD-10 вызов (gc) был абсолютно необходим в любой чуть сложной программе. В отличие от Windows, где, в крайнем случае, добавится дисковая память, в DOS это было невозможно. Весь LISP работал в 64 Kb памяти, из них около 20 Kb занимал сам интерпретатор, а остальное делилось между пространством нодов и пространством строк. В пространстве нодов и размещаются переменные и их значения. При исчерпании этого пространства выполнялась автоматическая сборка мусора. Только она могла не успеть выполниться.

Сейчас, видимо, происходит что-то подобное, просто память измеряется уже другими единицами.

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

Серьезные программы без vmon и gc нельзя было написать. А теперь - можно. Если, конечно, аккуратно обращаться с переменными.
ShaggyDoc вне форума  
 
Старый 29.07.2009, 21:08
#735
Елпанов Евгений

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


Хотелось бы добавить, каждый вызов сборщика мусора занимает время, причем, не всегда хватает одного прохода, т.е. при троекратном вызове, результат может быть лучше, но занять в трое больше времени. Я тоже регулярно вызываю сборщик мусора, после создания и обнуления большого количества объектов или работы с огромными списками. Из своего опыта могу посоветовать, обратить внимание на несколько моментов:
1. Всегда планировать в какой момент вызвать сборщик мусора. Иногда выгоднее его вызвать несколько раз по ходу программы, а иногда один раз в конце или старте. Мой критерий - замеры скорости работы на реальных (больших) чертежах.
2. Заранее проверять, есть ли изменение в расходе памяти, если вызвать сборку мусора два три раза подряд.
3. Винда, не любит освобождать память сразу. Часто приходится ждать некоторое время. Хорошо помогает вложенный вызов. Как пример, сильно расходует память программа с вызовом
Код:
если сразу после вызова в коде поставить сборку мусора, результат может быть заметно хуже, чем если сделать дополнительную обертку
Код:
[Выделить все]
(defun test1 ()(test))
и после вызова
Код:
убрать мусор. Почему так работает не знаю, но несколько раз выручало. Единственная разница, винда освобождает память быстрее, иногда сразу.

ps. Наблюдения проводились в программах, занимающих во время выполнения несколько сотен мегов в оперативке. Вероятно, для маленьких задач, вызов сборщика мусора не актуален. Автокад, сам его регулярно вызывает. Другое дело, если лисп выполняется значительное время, например час или часы...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Старый 29.01.2010, 10:36
#736
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Давненько я тут не был
ЛИСП я так и не выучил, да и что знал – позабыл. Но причины на этот раз не в лени как у меня обычно бывало. Я трудился над развитием лиспа от VVA для расчета спецификаций из мтекстов SPEC5D, намеревался добавить функцию автоматической генерации ведомости расхода стали и даже немного получалось, но как это часто бывает: работа... Приехал к нам в страну новый сотовый оператор. Меня назначили ГИП-ом, и про мое увлечение пришлось забыть на год, да и навряд ли теперь удастся вернуться к этому…
Но недавно работа поостыла и я для начала решил обновить Акад и СПДС. Поставил 2010 + СПДС6. Теперь тестирую все что имел под 2009-й. И обнаружил что так прижившаяся в моем КБ добавка для генерации ведомости из выносок СПДС перестала работать. Потестил в Влайде, понял что глючит dwgru-get-spds-text-and-range представленный Кулик Алексей aka kpblc тут на посте 472. Списки в 2010-ом создаются некорректно .
Поможите люди добрые
__________________
Блог
Red Nova вне форума  
 
Старый 29.01.2010, 10:41
#737
Кулик Алексей aka kpblc
Moderator

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


6-го СПДС нет, так что я помочь не смогу. Может быть, "штатные" средства самой СПДС помогут (но не факт)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Старый 29.01.2010, 11:11
#738
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


А идей нет?
2009 + СПДС4
Цитата:
Command: (_dwgru-get-spds-text-and-range)

Select objects: 1 found

Select objects:
(("1" "Ш10 A500C, ш.150" 1))
2010 + СПДС6
Цитата:
Command: (_dwgru-get-spds-text-and-range)

Select objects: 1 found

Select objects:
((1))
Или может тебе что-то подскажет если я какие ни будь цитаты из Влайда валожу? Уж больно нужная вешь, придется обратно на 2009-й переходить, ох как не охота
Миниатюры
Нажмите на изображение для увеличения
Название: untitled.JPG
Просмотров: 125
Размер:	4.6 Кб
ID:	32624  
__________________
Блог
Red Nova вне форума  
 
Старый 29.01.2010, 12:14
#739
Кулик Алексей aka kpblc
Moderator

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


Цитаты помогут как мертвому припарки. Надо скачивать и ставить СПДС 6, а у меня сейчас скорость коннекта около 5 кбит/с.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Старый 29.01.2010, 12:46
#740
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Просто на сколько я помню ты первую версию вовсе без СПДС-а написал
Жаль что скачать не можешь. Отправил бы по почте в конверте, да наверное доходить долго будет, хотя идея...
теперь мне наверное предется на некоторое времяпреостановить использование 2010-го пока не сохранил важные файлы в 6-й версие СПДС, а-то потом не 4-м не открою если что...

У кого из программистов есть СПДС 6? HELP
__________________
Блог
Red Nova вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46