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

Вернуться   Форум 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.
Просмотров: 1973025
 
Непрочитано 12.01.2011, 08:20
#1261
Лиспер


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


Frigate, просто я предпочитаю сначала объявлять локальные функции, а потом уже основной код. Если код достаточно длинный и функций много, можно легко запутаться.
Цитата:
Сообщение от Frigate Посмотреть сообщение
Например, при необходимости указания точки пользователем (точка вставки таблицы, к примеру), пользователь отказывается от продолжения, тупо нажав ESC (даже если есть штатный вариант выхода из проги при помощи if). Что в таком случае нужно посылать в программу?
Ничего не нужно посылать. Выполняется отмена выполненных действий - и все.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 12.01.2011, 12:39
#1262
ShaggyDoc

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


Цитата:
А поводу ESC все-таки спорно - ведь из диалоговых окон, например, при отмене внесенных изменений удобно нажать ESC (если есть клавиша типа "Отменить"). Также, не во всех программах обоснован запрет нажатия ESC. Хотя на эту тему немало копий сломано на форумах, и у всех свое мнение.
Нажатие ESC в приличных диалоговых окнах не разрушает всю программу. Происходит выход из какого-то куска, например диалога.

ESC не предназначена для отмены каких-то ранее выполненных действий! Для этого должна быть или специальная кнопка (опция), или надо, в стиле штатных команд, давать возможность использовать UNDO/REDO. Вот тут программист и должен позаботиться об расстановке меток для отката.

Цитата:
Например, при необходимости указания точки пользователем (точка вставки таблицы, к примеру), пользователь отказывается от продолжения, тупо нажав ESC (даже если есть штатный вариант выхода из проги при помощи if). Что в таком случае нужно посылать в программу? Какую точку?
В момент указания точки пользователь имеет право отказаться от ввода самой точки, в том числе по ESC. Но это не должно разрушать всю программу. Кусок кода, защищенный ловушкой, просто вернет NIL, но управление останется у программы.

Современные программы работают не последовательно, а "параллельно". Программа, в стиле AutoCAD, имеет всякие опции. Одной из опций может быть "действие по умолчанию", т.е. нажатие Enter (пустой ввод). Таким действием может быть и выход. Может быть и ESC, но не в момент ввода, а в момент ожидания чего-то.

Т.е. само нажатие ESC не надо запрещать, а разрушение программы предотвращать надо. Примерно как для выключения компьютера надо закрывать Windows, а не выдергивать шнур из розетки.
ShaggyDoc вне форума  
 
Непрочитано 12.01.2011, 12:44
#1263
Frigate

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


Лиспер,

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

ShaggyDoc,

сказано более чекм убедительно. Думаю, одну из следующих программ попробую написать с применением vl-catch.

Еще одна причина моего "недорастания" до этих новомодных функций - использовал функцию Алексея (КРЫС), переделал немного под себя, но vl-catch оставил. В нескольких местах накосячил с кодом. Но где - не смог понять, пока не убрал все vl-catch. Т.е. возможно vl-catch и можно использовать, но обязательно с возможностью вывода сообщения о том, какая ошибка произошла. Собственно, пример Вы дали на предыдущей странице. Буду разбираться

Последний раз редактировалось Frigate, 12.01.2011 в 12:53.
Frigate вне форума  
 
Непрочитано 12.01.2011, 12:58
#1264
Iogan


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


Уважаемые!!!, добрый день.
Нужна помощь, запарился ужо...
Задача.. Запускаю ABC.lsp , открывается вторая сессия acad, выполняется произвольная ф-я, сессия закрывается.
1. Как программно сделать активным окно второй сессии acad.
2. Как запустить мою функцию во второй сессии
3. Как из .lsp выделить все объекты на чертеже
(vla-activate docdwg); до этой ф-ии все отлично работает, вторая сессия открыта
(vla-sendcommand docdwg (defun cod (cd obj))...) ; эта ф-я не хочет выполнять мою ф-ю, просто игнорирует, что-то делаю не так..
Надеюсь на вашу помощь. Заранее благодарен
Iogan вне форума  
 
Непрочитано 12.01.2011, 13:35
#1265
Лиспер


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


Iogan, lisp может выполняться только в активном документе, из которого он и был запущен. При смене фокуса (то есть смене активного документа) выполнения лиспа приостанавливается до возврата в исходный файл.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 12.01.2011, 13:56
#1266
Iogan


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


Лиспер, спасибо за быстрый ответ
Собственно дело в следующем
во второй сессии выполняются простейшии ф-ии (вставка текста "strcat", нарисовать что нибудь и т.д.) но вот выполнять мою ф-ю написанную ранее и прекрасно работающую (подсчет количества блоков и их автоматическую нумерацию) не желает. Я хочу следующее - из командного файла (первой сессии) выполнить операции над блоками в других файлах .dwg и получить конечный результат в основном документе.
Вот такая закавыка...
Вложения
Тип файла: lsp МойКод.LSP (1.1 Кб, 59 просмотров)
Iogan вне форума  
 
Непрочитано 12.01.2011, 21:31
#1267
gomer

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
А поводу ESC все-таки спорно - ведь из диалоговых окон, например, при отмене внесенных изменений удобно нажать ESC (если есть клавиша типа "Отменить"). Также, не во всех программах обоснован запрет нажатия ESC. Хотя на эту тему немало копий сломано на форумах, и у всех свое мнение.

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

(defun c:cmd ( / pt)
  (and (setq pt (safe-getpoint))
                     (safe-draw pt)
  )
)
Этот пример практичен в простых задачах типа "ткнул-отрисовал"
gomer вне форума  
 
Непрочитано 14.01.2011, 07:19
#1268
Frigate

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


gomer,

я диалоговые окна привел просто как пример - считаю, если возможно, надор пользователю обеспечить возможностьвыхода из программы при вводе данных не только "штатным вызходом проги", но и по ESC. Код где-то на caduser видел.

У меня сейчас еще один вопрос стоит:

как через объектную модель можно обновить поля в блоке? (если вообще это реально)

см. тему http://forum.dwg.ru/showthread.php?p=604338#post604338

Просто Если делать обновление полей блока командными методами через sendcommand, то по завершении работы callback-функции исчезает выделение самого блока. А нужно, чтобы оно не исчезало. Вернуть выделение через setfirst тоже не удалось...
Прошу помочИ


2 Алексей (КРЫС) и всем

кажется я выявил глюк блоков в автокаде.

Сейчас я понял, как они создаются :-)

Это касается ЛЮБЫХ динамическийх блоков с атрибутами!

Итак:

имеем динблок с атрибутом.
Заходим в свойства атрибута (_eattedit) и меняем степень растяжения текста.
После этого пошевелим любое из динсвойств блока (видимость, выбор, линейное растяжение - у меня при любом варианте глюк возникает).
Далее копируем блок и вставляе (Ctrl+C / Ctrl+V). Степень растяжения вернулась к исходной для блока.

Затем копируем этот блок.

Да, через _copy или кп все копируется без глюка.

Причем ТО ЖЕ САМОЕ происходит с любыми свойствами блока, кроме динамических - те то хорошо копируются )))

Шрифт например может так же слететь, толщина...

Вывод - копировать через _copy (НЕ через буфер). А лучше всего вставлять блок только программно, с уже внесенными изменениями в свойства атрибутов типа текстового стиля, толщины линий блока и тп

Последний раз редактировалось Frigate, 14.01.2011 в 10:13.
Frigate вне форума  
 
Непрочитано 14.01.2011, 18:03
#1269
gomer

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Прошу помочИ
помолчу...
gomer вне форума  
 
Непрочитано 17.01.2011, 06:19
#1270
Frigate

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


gomer,

"ПомоЧи" - это "помощи", а не "помолчи"

Молчать то, как раз, не нужно. Особенно если есть что сказать по существу
Frigate вне форума  
 
Непрочитано 19.01.2011, 13:40
#1271
Frigate

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


Cтолкнулся с проблемой - часть будущих пользователей работает в однодокументном режиме автокада (SDI равна "1"). А у меня обмен между документами сделан через "внедокументные переменные". Но эти переменные видны только в одном приложении автокада. Есть ли какая возможность обмениваться информацией между такими вот отдельно запущеннымы файлами автокада (каждый в своем приложении)?
Frigate вне форума  
 
Непрочитано 19.01.2011, 13:44
#1272
Лиспер


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


Используй реестр или файлы (ini / txt / cfg - как запишешь, так и прочитаешь).
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 19.01.2011, 16:06
#1273
Frigate

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


Лиспер,

значит другого пути нет.

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

А потом уже буду создавать временный файлик.
Frigate вне форума  
 
Непрочитано 19.01.2011, 16:14
#1274
Лиспер


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


А проще работать с реестром И наверняка быстрее
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 19.01.2011, 20:16
#1275
Woron


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Red Nova, лично я начинал с командных методов.
Где можно взять описание этих самых команд?
Пролистал несколько книг по лиспу (по оглавлениям прошелся) во всех подразумевается, что я эти команды уже знаю.
_line _arc _circle я еще понял как делать, а вот на _spline застрял.
И размеры как описывать не совсем понятно. (у меня сейчас 2007 AutoCAD стоит).
Woron вне форума  
 
Непрочитано 19.01.2011, 20:23
#1276
Кулик Алексей aka kpblc
Moderator

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


В.Свет, "Язык макрокоманд и создание кнопок". Есть в местном Download,
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.01.2011, 18:10
#1277
Woron


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


Читать начал но это не то что мне нужно.
Я лучше напишу, что сделать пытаюсь, а то похоже я вопрос не правильно задаю.
Сделал я программку (в VB) я в нее закидываю координаты XY, а она создает .lsp файл в котором такой текст

Цитата:
;(load "D:/acad.lsp")
(command "_line" "0,0" "0,0" _enter)
(command "_line" "0,0" ".5828264,0" _enter)
(command "_line" "0,.2205667" ".6861063,.2205667" _enter)
(command "_line" "0,.4399042" ".8006551,.4399042" _enter)
(command "_line" "0,.6578436" ".9258681,.6578436" _enter)
(command "_line" "0,.8742085" "1.061283,.8742085" _enter)
(command "_line" "0,1.08882" "1.206534,1.08882" _enter)
(command "_line" "0,1.301498" "1.361324,1.301498" _enter)
(command "_line" "0,1.51206" "1.5254,1.51206" _enter)
(command "_line" "0,1.720324" "1.698548,1.720324" _enter)
(command "_spline" ".5828264,0" ".6861063,.2205667" ".8006551,.4399042" ".9258681,.6578436" "1.061283,.8742085" "1.206534,1.08882" "1.361324,1.301498" "1.5254,1.51206" "1.698548,1.720324" _enter "@0,0" "@0,0")
Вот со сплайном проблема. Как его правильно вызывать нигде не написано. Точки он нормально берет, но вот как ему показать, что точки кончились и последние координаты это косательные к нач. и конеч. точкам?

И еще вопрос. В одной из книг было написано, что при появлении в AutoCADе новых команд, старые сохраняют. И в той же книге была описана команда _dimradial. Вот только AutoCAD говорит, что такой команды не знает. Может у меня отключено что-то?
Woron вне форума  
 
Непрочитано 20.01.2011, 18:15
#1278
Кулик Алексей aka kpblc
Moderator

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


1. Не обрабатываются привязки
2. Что в команде делает неинициализированная переменная _enter? Нажатие Enter эмулируется двойными кавычками.
3. Кто-то мешает использовать нормальную объектную модель? И методы типа AddLine, AddSpline?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.01.2011, 19:04
#1279
Woron


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


1. Где?
2. В листинге программы видел.
3. Вот это я уже совсем не понял. Методы Add вроде с command не вызываются?

Заменил _enter на "" сплайн построился. Спасибо!
Woron вне форума  
 
Непрочитано 20.01.2011, 20:07
#1280
Кулик Алексей aka kpblc
Moderator

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


А разве кто-то заставляет использовать именно command? Если написано внешнее приложение, то можно сделать наподобие:
Код:
[Выделить все]
Dim AcadApp As Object
Dim ActiveDoc As Object
Dim ptStart(2) As Double, ptEnd(2) As Double
Dim ptSpline() As Double

Set AcadApp = GetObject(, "AutoCAD.Application")
Set ActiveDoc = AcadApp.ActiveDocument

With ActiveDoc.ModelSpace
  ptStart(0) = 0#: ptStart(1) = 0#: ptStart(2) = 0#
  ptEnd(0) = 0#:   ptEnd(1) = 0.5828264: ptEnd(2) = 0#
  .AddLine ptStart, ptEnd
End With
Ну и тому подобное
P.S. Код пишу без проверки и "насухую".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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