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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1973997
 
Непрочитано 17.03.2015, 11:25
#2501
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
(ssget) без опций при активном выборе срабатывает как (ssget "_I")
Насклько я помню, не всегда: регулируется значением системной переменной PICKFIRST
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.03.2015, 11:35
#2502
Alexll


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


Владимир Сергеевич, огромное спасибо. Заработало.
Alexll вне форума  
 
Непрочитано 17.03.2015, 13:05
#2503
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Алексей, а как часто PICKFIRST ставят в "0"? В моем понимании, это чаще случается случайно по непонятным пользователям причинам и вызывает панику у них же.
Сам в нюансы работы ssget особо не вникал, использовал только с конкретными опциями и кучей фильтров.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 17.03.2015, 13:47
#2504
Кулик Алексей aka kpblc
Moderator

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


Vladimir_Sergeevich, это как карта ляжет...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.03.2015, 10:39
#2505
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Возник вопрос о граблях ActivX...
Читал умную книжку и вычитал, что "...нужно заботиться о выделении памяти..." (это было про создание безопасных массивов)...
По логике, потом ведь надо это пространство памяти освободить (вычистить) или автокад сам этим занимается?
И еще вопрос, на какой стадии надо начинать отслеживать/замерять объем памяти требуемой для программы, что бы все не рухнуло?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 18.03.2015, 10:45
#2506
Кулик Алексей aka kpblc
Moderator

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


В принципе в ACAD была функция (gc) - но ее вызов лично у меня никакого результата не давал. ACAD, как правило, сам занимается чисткой памяти.
Другой вопрос, что при обращении к сторонним приложениям надо принудительно эти приложения либо закрывать, либо релизить (см. vlax-release-object) для освобождения памяти основного процесса.
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
И еще вопрос, на какой стадии надо начинать отслеживать/замерять объем памяти требуемой для программы, что бы все не рухнуло?
ИМХО на стадии разработки алгоритма
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.03.2015, 10:52
#2507
gomer

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


(gc) была актуальна автокада до R10, R11
gomer вне форума  
 
Непрочитано 18.03.2015, 11:01
#2508
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ИМХО на стадии разработки алгоритма
Тут я не совсем четко сформулировал... допустим на начальных стадиях изучения Lisp я работал сугубо командными методами и спустя пол года подошел к программному методу. тут я думаю вообще можно особо не заморачиваться такими вещами (надеюсь я прав?). Последние пару лет потихоньку начинаю использовать объектные методы и вот тут, наверно, уже надо как то заглядывать вперед. Пока что у меня в арсенале точно нет таких, где бы я создавал safearray и прочие преобраозования типов.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
при обращении к сторонним приложениям надо принудительно эти приложения либо закрывать
это например, когда считываю .xlsx делаю (close "....")
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 18.03.2015, 11:07
#2509
Кулик Алексей aka kpblc
Moderator

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


При чтении *.xls* через Excel последовательность будет такова:
Создать указатель на объект MS Excel (может быть, его придется создавать)
Создать указатель на коллекцию Workbooks
Открыть документ
Создать указатель на WorkSheets
Создать указатель на WorkSheet
Прочитать данные
Освободить указатель на WorkSheet
То же, WorkSheets
То же, WorkBooks
То же, Excel

Ну, по крайней мере, примерно так: я с Excel напрямую уже давненько не работал, подробностей не помню
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.03.2015, 11:09
#2510
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,053


и не забывать разделять локальные и глобальные переменные в функциях
Сергей812 вне форума  
 
Непрочитано 18.03.2015, 11:22
#2511
Кулик Алексей aka kpblc
Moderator

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


Ну это-то понятно. Вопрос в другом: можно получить указатель на внешний объект и засунуть его в локальную переменную функции. При выходе из функции указатель не обнулится, а просто потеряется - что не есть гуд.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.03.2015, 11:26
#2512
gomer

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Создать указатель на объект MS Excel (может быть, его придется создавать)
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
То же, Excel
не твое, не трогай, хуже будет
gomer вне форума  
 
Непрочитано 18.03.2015, 11:39
#2513
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,053


не лисп, но в тему - Работа с COM-объектами
Сергей812 вне форума  
 
Непрочитано 18.03.2015, 11:43
#2514
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
При выходе из функции указатель не обнулится, а просто потеряется - что не есть гуд.
вот я примерно про это и спрашивал, что память загадить можно и все рухнет, вопрос только когда это произойдет...
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 18.03.2015, 11:51
#2515
gomer

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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
вопрос только когда это произойдет...
в любой момент
gomer вне форума  
 
Непрочитано 18.03.2015, 16:02
#2516
ShaggyDoc

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


Цитата:
(gc) была актуальна автокада до R10, R11
Да, тогда без неё было просто не обойтись. Но и сейчас никто не мешает вставить вызов (gc) в одну из стартовых функций для сборки мусора.

Цитата:
Вопрос в другом: можно получить указатель на внешний объект и засунуть его в локальную переменную функции. При выходе из функции указатель не обнулится, а просто потеряется - что не есть гуд.
А его надо еще и принудительно "обнилить". Тогда ненужная память окажется в "куче" и с ней будет уже менеджер памяти Windows разбираться. Будет известно, что этот кусок "ничейный".

Цитата:
в любой момент
Может никогда, а может и быстро. Зависит от программы. Мне приходилось делать конвертор DWG с разнообразной обработкой - "нормализация", переименование слоев и прочее. Обрабатывались тысячи файлов. При этом происходили некоторые утечки памяти, но при 2-3 часах работы это было незаметно. А потом переполнялась память Windows, подключался своп и работа резко тормозилась.

Конечно, сейчас памяти "немеряно" и с этим можно никогда не столкнуться. Но память сейчас на 90% занята всякими "рюшечками и бантиками" и для серьезных программ это надо учитывать.

А ещё лучше всегда "мыть руки с мылом", т.е. обходиться минимумом глобальных, "обнилять" ненужное, не надеяться на автоматическую сборку мусора.
ShaggyDoc вне форума  
 
Непрочитано 19.03.2015, 06:56
#2517
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
"нормализация", переименование слоев и прочее.
Такое тоже есть, только для активного документа делал, а именно dxf сгенерированного робуром. Здесь обходился вообще без глобальных переменных.
И все таки не понял одного момента: локальные переменные тоже надо обнулять, или при завершении функции они сами в мусор сваливаются?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 19.03.2015, 09:53
#2518
ShaggyDoc

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


Цитата:
локальные переменные тоже надо обнулять, или при завершении функции они сами в мусор сваливаются?
Нет, лисповские локальные сами уничтожаются по завешении. Дополнительное "обниление" лучше делать для сторонних COM-объектов, т.к. Windows на всякий случай ("вдруг опять понадобится") оставляет их в памяти на некоторое время (обычно около 10 минут).

Но указатель на такой объект может быть в лисповской локальной переменной. Я обычно делаю так:

Код:
[Выделить все]
 (if (setq srv (vlax-get-or-create-object "ruDoubleListSrv.DoubleListDlg"))
    (progn
      (vlax-invoke-method srv "Create")
      (vlax-put-property srv 'Header dlg_caption)
      (vlax-put-property srv 'LeftCaption left_caption)
      (vlax-put-property srv 'RightCaption right_caption)
      (vlax-put-property srv 'ReadOnly (ru-conv-value-to-wordbool read_only))
 ...
       (vlax-invoke-method srv "Free") ;_ end of vlax-invoke-method
      (vlax-release-object srv)
      (setq srv nil)
    ) ;_ end of progn
    (ru-msg-alert "Не удалось запустить ruDoubleListSrv.DoubleListDlg")
  ) ;_ end of if
Здесь srv - локальная переменная функции. В данном случае, помимо (vlax-release-object srv) сделано (setq srv nil). Для обычных переменных это делать не надо.
ShaggyDoc вне форума  
 
Непрочитано 19.03.2015, 12:53
#2519
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 165


Подскажите как программно (на Лиспе) вставить блок с установкой значений атрибутов подставив вычисленные значения точки вставки и угла поворота.
Заранее благодарен.
mkung вне форума  
 
Непрочитано 19.03.2015, 13:06
#2520
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,053


Цитата:
Сообщение от mkung Посмотреть сообщение
Подскажите как программно (на Лиспе) вставить блок с установкой значений атрибутов подставив вычисленные значения точки вставки и угла поворота.
Заранее благодарен.
Ну что-то типа этого
Сергей812 вне форума  
Ответ
Вернуться   Форум 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