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

Вернуться   Форум 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.
Просмотров: 1973121
 
Непрочитано 29.11.2010, 21:54
#1241
superkot007


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


- DC - не практикуется у нас (удобно, но для многих проблемно, я же не только себе хочу...)
- Просто "_.insert" - нет наглядности (по названию блока можно и не понять, что вставляется)...
- через Инструментальные палитры - мелкие изображения; с мозаичным меню тоже мелко...

А тут случайно в книге Полещука наткнулся... Можно что-нибудь "сваять"?
superkot007 вне форума  
 
Непрочитано 29.11.2010, 21:55
#1242
Кулик Алексей aka kpblc
Moderator

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


Вообще-то в окне _.insert можно и предварительный просмотр получить. И там же, нажимая кнопку Обзор, увидеть (в зависимости от настроек проводника) сохраненный вид чертежа.
Палитры инструментов (точнее, размер значков) настраиваются примерно за 3..5 секунд.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2010, 22:18
#1243
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вообще-то в окне _.insert можно и предварительный просмотр получить. И там же, нажимая кнопку Обзор, увидеть (в зависимости от настроек проводника) сохраненный вид чертежа.
Согласись, что если блоков несколько десятков и раскиданы они в разных папках, простое "Вставка - блок" (ну или _insert) не очень ускоряет процесс создания схем. Это самый последний вариант
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Палитры инструментов (точнее, размер значков) настраиваются примерно за 3..5 секунд.
Ну "Параметры отображения" все равно имеют предел , которого может и не хватить для определения, "то вставлять, или другое"...

Ну так что, моя просьба найдет понимание?

Offtop: А то, по-моему оффтопить начинаем... Многим это на мыло идет,...
superkot007 вне форума  
 
Непрочитано 29.11.2010, 22:42
#1244
Кулик Алексей aka kpblc
Moderator

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


superkot007, лично я ни разу не сталкивался с тем, чтобы программно делать sld из стороннего файла. Из текущего еще как-то можно попробовать, но это решение - на полраза (ИМХО).
Цитата:
Сообщение от superkot007 Посмотреть сообщение
если блоков несколько десятков и раскиданы они в разных папках
Значит их надо объединять. Или в одну папку, или в один dwg-файл. И вставлять уже блоками оттуда. И потом, схемы схемами, а название и пояснение к ним никто не мешает сделать информативными...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2010, 23:10
#1245
ShaggyDoc

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


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

Здесь нет никаких слайдов, иллюстрации делаются на лету, прямо с экрана.

Код же, который просишь "подправить" всего лишь учебный пример. Как делать диалог с отображением слайдов.

Сами слайды и библиотеки слайдов давно устарели. Когда ничего не было иного - возились с ними. А теперь-то зачем? Не облегчат и не ускорят они работу по сравнению со штатными средствами.

Если же надо лучше, чем через Design Center - см. рисунок. Как сделать - описано в книге "САПР на базе AutoCAD - как это делается".
Миниатюры
Нажмите на изображение для увеличения
Название: xml_3d_pipe_support.png
Просмотров: 115
Размер:	21.1 Кб
ID:	49103  
ShaggyDoc вне форума  
 
Непрочитано 29.11.2010, 23:12
#1246
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
superkot007, лично я ни разу не сталкивался с тем, чтобы программно делать sld из стороннего файла. Из текущего еще как-то можно попробовать, но это решение - на полраза (ИМХО).
Я, наверное, неправильно сформулировал... Мне слайды не нужны (архив - полный пример из книги, не более), хотел бы, чтобы таким же образом можно было выбрать нужный dwg-файл и вставить в схему...
Пожалуйста...
superkot007 вне форума  
 
Непрочитано 04.12.2010, 14:35
#1247
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В таком случае я начинаю подозревать, что либо в блоке есть атрибуты с одинаковыми тэгами, либо определения блоков разнятся. Либо автоматом после вставки выполняется команда _.attsync (или ее аналог)

Алексей, в продолжение темы (опять выплыл глючные блок):

Изначально в одном чертеже получился отчего-то такой глючный блок, который при копировании (Copy Paste) возвращает атрибуту выравнивание, установленное в самом определении блока.
Если вставлять блок через панель инструментов (не через копирование) - то все нормально, можно самому менять выравнивание и степень растяжения атрибута.
Вроде в других файлах этот же блок нормально работает. Но все-таки хочется докопаться до истины - что не так с этим блоком.

Может ты сможешь разобраться?


Прикрепляю файл, где есть такой глючный блок и нормальный блок. Они абсолютно идентичны (в описании). В чем дело - так и не понимаю.
Вложения
Тип файла: dwg
DWG 2007
Чертеж1.dwg (119.7 Кб, 3107 просмотров)
Frigate вне форума  
 
Непрочитано 04.12.2010, 23:10
#1248
Кулик Алексей aka kpblc
Moderator

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


Во-первых: что в файле делают следы ПО от CSoft?
Во-вторых: AutoCAD 2011 Eng 64 bit, AutoCAD 2011 Rus 64 bit - ситуацию после
Код:
[Выделить все]
Command: _-purge
Enter type of unused objects to purge 
[Blocks/Dimstyles/LAyers/LTypes/MAterials/MUltileaderstyles/Plotstyles/SHapes/textSTyles/Mlinestyles/Tablestyles/Visualstyles/Regapps/Zero-length geometry/Empty text objects/All]: _a
Enter name(s) to purge <*>:
Verify each name to be purged? [Yes/No] <Y>: _n
Command: _-purge
Enter type of unused objects to purge 
[Blocks/Dimstyles/LAyers/LTypes/MAterials/MUltileaderstyles/Plotstyles/SHapes/textSTyles/Mlinestyles/Tablestyles/Visualstyles/Regapps/Zero-length geometry/Empty text objects/All]: _r
Enter name(s) to purge <*>:
Verify each name to be purged? [Yes/No] <Y>: _n
Command: _audit
Fix any errors detected? [Yes/No] <N>: _y
повторить не удалось. Блок нормально копируется через буфер обмена.
У тебя в самом определении блока (насколько я понял) уже установлено для атрибута выравнивание Fit, так что еще вопрос - какое вхождение корректно Вот копирование блока со значением атрибута "1" как раз и вызывает восстановление исходного состояния выравнивания атрибута...
ИМХО - можно заносить в список багов
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.12.2010, 06:23
#1249
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Кулик Алексей aka kpblc,

1. Не знаю, брал чистый чертеж, просто копируя туда глючный и нормальный блок. Хотя на компе утсановлена СПДС Графикс.
2. У меня после этого PURGE на АКАД 2009 РУС ничего не устраняется. Ну ты это и так понял.
3. А вхождения должны быть такими, какими я их устанавливаю при размещении (insert). Если в номере кабеля больше 7 символов - то "по ширине" остается. Если меньше 7 символов, то программно выравнивание ставится "по центру" + сдвигаю точку вставки.
Но заметь, Алексей, что неглючный блок всегда копирует правильно - в т.ч. и через буфер обмена.
Так что скорее всего это глюк автокада. Только жаль, что я не могу уже повторить этот баг - т.е. сделать глючный блок из нормального, для локализации проблемы.
Итог - использовать автокад 2011

Кстати, 2011 в каком формате сохраняет чертежжи по умолчанию?
В 2007м или уже в другом?
Frigate вне форума  
 
Непрочитано 06.12.2010, 11:18
#1250
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
Кстати, 2011 в каком формате сохраняет чертежжи по умолчанию?
В 2007м или уже в другом?
в 2010-м (AC1024), у 2007-го был AC1021
alex8888 вне форума  
 
Непрочитано 11.12.2010, 15:02
#1251
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Здравствуйте, уважаемые Гуру форума.

Опять у меня траблы с таблицами, созданными программным методом.

Итак:

написал прогу, которая у указываемой таблицы проставляет все границы ячеек 0.4 мм.
Работает прога вполне нормально, но такая проблема:

если после работы проги (делает толстыми все границы таблицы) сделать стандартное Undo (нажать кнопку на панели инструментов), то при повторной попытке сделать все границы той же таблицы толстыми - акад вешается. Уже на 3 секунды работает моя прога, а минуты 2-3.

Прошу помочь советом. Или это баг Автокада?
Frigate вне форума  
 
Непрочитано 11.12.2010, 15:08
#1252
VVA

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Прошу помочь советом.
Помогаю: RegenerateTableSuppressed
Читать здесь, начиная с 4 поста или здесь При запуске Lisp идет утечка памяти
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.12.2010, 18:35
#1253
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Здравствуйте!

Прошу объяснить непонятную ситуацию:

у меня прога видит локульную переменную своей внутренней функции.

Вернее, не сама прога, а функция обработки ошибок *error*

Значит, обработчику ошибок доступны локальные переменные внутренних функций програмы???

ПРикольно - только что попробовал еще с одной переменной - просто локальной переменной внутренней функции присвоил некое значение. А в обработчике ошибок в самой программе написал PRINC эту локальную переменную внутренней функции - и ВЫВОДИТ ))) Во чудеса-то. Или так и должно быть?

Хочу уточнить, что сама программа НЕ ВИДИТ локальной переменной внутренней функции, т.е. я задал все верно. А вот обработчику ошибок доступно все... даааа... наводит на интересные мысли )))

Последний раз редактировалось Frigate, 22.12.2010 в 18:40.
Frigate вне форума  
 
Непрочитано 22.12.2010, 20:31
#1254
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Frigate, ничего необычного. В обработчике ошибок *error* будут видны только те локальные переменные которые были определены в той функции из которой был вызван обработчик ошибок *error*
Пример
Код:
[Выделить все]
(defun loc_1( / a)
  (setq a 1)
  (getpoint "\n1-я точка: ")
  )

(defun loc_2( / b)
  (setq b 2)
  (getpoint "\n2-я точка: ")
  )

(defun *error*(msg / )
  (princ a)
  (princ b)
  )

(defun glob()
  (loc_1)
  (loc_2)
  )
Если нажать Esc на запрос "1-я точка: " т. е. вызвать ошибку во время выполнения функции loc_1, то в *error* a = 1, b = nil, если нажать Esc на запрос "2-я точка: ", то в *error* a = nil, b = 2
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 22.12.2010, 21:27
#1255
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


TararykovDG,

спасибо, действительно, все очень логично получается. Только теперь придется в обработчике ошибок учитывать и эту особенность
Frigate вне форума  
 
Непрочитано 24.12.2010, 09:59
#1256
VVA

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


Frigate, Еще логичнее делать ф-цию *error* локальной. Тогда ей будут доступны все переменные функции верхнего уровня и не переопределяется стандартная ф-ция *error*. В этом примере ф-ция *error* объявлена локальной по отношению к ф-ции C:R2E и ей доступна переменная Doc без дополнительного объявления.
Вот примерный шаблон программы
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.01.2011, 16:14
#1257
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


VVA,

я именно так и делал, вроде бы... Взял код-шаблон у Алексея (КРЫС):

Код:
[Выделить все]
(defun C:
	(
	/
	*error*	
	adoc
	)
(vl-load-com)

(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))

(defun *error* (msg)
(vla-endundomark adoc)
(princ "Описание произошедшей ошибки: ")
(princ msg)
(princ)
)



(vla-endundomark adoc)

(PRINC)

);_end C:
Еще хотел поблагодарить тебя за классные ссылки на сайт Мак Ли - как раз понадобился для программного изменения динсвойств блоков.
Frigate вне форума  
 
Непрочитано 11.01.2011, 16:20
#1258
Лиспер


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


Frigate, а имя команды-то где?
Код:
[Выделить все]
(vl-load-com)

(defun c:cmd-name (/ *error* adoc)

  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ "Описание произошедшей ошибки: ")
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  ;; Что-то делать
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 11.01.2011, 18:33
#1259
ShaggyDoc

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


А ещё лучше программировать так, чтобы до *error* вообще дело не доходило. Эта функция срабатывает, когда "поздно пить боржоми". Обычно, если пользователь ESC нажал. В *error* можно только попытаться что-то исправить, обычно востановить какую-то обстановку (системные переменные). Когда-то это было единственное средство.

Но давно уже есть ловушки ошибок - функции vl-catch-all-apply, vl-catch-all-error-p, vl-catch-all-error-message. Они предотвращают саму возможность ошибок пользователя, чтобы при нажатии ESC программа не прерывалась. На мой взгляд это самое полезное нововведение в LISP после AutoCAD-14.

В очередной раз привожу высокоуровневую функцию обработки ошибок. Она упрощает использование "святой троицы".

Пример использования в комментарии:

Код:
[Выделить все]
(defun ru-error-catch
       (protected_expression on_error_expression / catch_error_result)
;|
Пример вызова
(ru-error-catch
    (function (lambda ()
                ;;; защищаемое выражение  
                (
                
                )
                ;;; То что вернет - будет результатом
              ) ;_ end of lambda
    ) ;_ end of function
    (function
      (lambda (err_msg)
        ;; если надо - выводим сообщение. err_msg подставит Автокад
        (princ (strcat "\nОШИБКА такой-то функции: " err_msg))
        ;; возвращаем NIL при ошибке
        nil
      ) ;_ end of lambda
    ) ;_ end of function
  )

|;
  
  (setq catch_error_result
         (vl-catch-all-apply protected_expression)
  ) ;_ end of setq
  (if (and (vl-catch-all-error-p catch_error_result)
           on_error_expression
      ) ;_ end of and
    (apply on_error_expression
           (list (vl-catch-all-error-message catch_error_result))
    ) ;_ end of apply
    catch_error_result
  ) ;_ end of if
) ;_ end of defun
Такой функцией надо оборачивать места возможных ошибок - и пользовательский ввод, и расчетную часть. Даже деление на ноль можно перехватить.
ShaggyDoc вне форума  
 
Непрочитано 12.01.2011, 07:08
#1260
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Лиспер,

имя шаблону-то зачем? )))

Да, может твой код и логичнее, но по-сути он ничего не меняет.

Кстати, а как же определение adoc уже после определения функции *error*? Какой тогда смысл так переставлять определение обработчика ошибок?

В любом случае, при таком раскладе никакие системные переменные не изменяются, ничего еще не нарисовано, так что не фатально.

ShaggyDoc,

да, я так и стараюсь везде делать - чтобы выполнение функции или программы могло быть прервано только при ошибке, когда пользователь нажал ESC.
С ситуацией возможного деления на ноль - иногда может быть полезна обертка из vl-catch. Уже столкнулся с такой ситуацией в своих прогах, что при определенных обстоятельствах при длинных вычислениях происходило деление на ноль. Но возникшая ошибка помогла мне исправить код - просто убрать возможность появления нуля:

Код:
[Выделить все]
(if (= col_n 0)
(setq col 1)
)
А поводу ESC все-таки спорно - ведь из диалоговых окон, например, при отмене внесенных изменений удобно нажать ESC (если есть клавиша типа "Отменить"). Также, не во всех программах обоснован запрет нажатия ESC. Хотя на эту тему немало копий сломано на форумах, и у всех свое мнение.

Например, при необходимости указания точки пользователем (точка вставки таблицы, к примеру), пользователь отказывается от продолжения, тупо нажав ESC (даже если есть штатный вариант выхода из проги при помощи if). Что в таком случае нужно посылать в программу? Какую точку? ПО -моему, никакой не нужно, а нужно корректно убрать все внесенные изменения. Но ведь это же самое можно сделать и при помощи *error*. Может я что-то недопонимаю тут? Тогда был бы рад объяснению от мастеров ЛИСПа :-)

Последний раз редактировалось Frigate, 12.01.2011 в 07:21.
Frigate вне форума  
Ответ
Вернуться   Форум 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