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

Вернуться   Форум 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.
Просмотров: 1965696
 
Непрочитано 25.09.2010, 23:45
#1021
Кулик Алексей aka kpblc
Moderator

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


Я вообще-то говорил про то, что при некоторых операциях, таких, как _.wblock, можно запросто "потерять" свои словари.
P.S. Скорость выполнения компилированного кода может в разы превышать скорость выполнения некомпилированного...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2010, 00:46
#1022
gomer

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Скорость выполнения компилированного кода может в разы превышать скорость выполнения некомпилированного...
Это понятно... Но сколько не умножай условный ноль на разы все равно ноль и получится, но одна лишь функция ssget или другие подобные, может уменьшить скорость в сотни раз... те человеческий фактор сильно влияет на производительность...
Еще непродуманный диалоговый интерфейс...
gomer вне форума  
 
Непрочитано 26.09.2010, 13:19
#1023
Кулик Алексей aka kpblc
Moderator

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


gomer, ну ты еще сюда и время на включение компьютера добавь, а еще и установку с запуском и настройкой AutoCAD'a... Совсем все медленно получится.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2010, 14:48
#1024
Frigate

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


Можно еще вопрос?

Про такой свойство объектов, как password. Что этот пароль дает? Если его поставить на чертеж, то чертеж уже нельзя будет изменять? Или вообще просматривать? А если поставить пароль на блок, то что это даст? :-)
Frigate вне форума  
 
Непрочитано 26.09.2010, 16:20
#1025
gomer

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


А почитать справку? Ни у документа, ни у блока нет такого свойства, как password

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
сюда и время на включение компьютера добавь, а еще и установку с запуском и настройкой AutoCAD'a... Совсем все медленно получится.
Интересно.... если загрузить все и сразу... как это скажется на производительности...
gomer вне форума  
 
Непрочитано 26.09.2010, 16:32
#1026
Frigate

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


а это что тогда?

Код:
[Выделить все]
Sub Example_Password()    ' This example opens a password-protected file, closes it, and then opens another
    ' password-protected file.
 
    ThisDrawing.Application.Documents.Open "C:\MyDrawing.dwg", , "MYPASSWORD"
    'AutoCAD converts all passwords to uppercase before applying them
 
    ThisDrawing.Close
 
    ThisDrawing.Application.Documents.Open "C:\MyDrawing2.dwg", , "MYSECONDPASSWORD"
 
End Sub
ну, с блоками эт я погорячился просто )))

А реально есть ли какой способ защитить блоки от редактирования??? Чтобы можно было снять только программно.

Подскажите, пожалуйста, по функции из ru_CAD, приведенной на сайте ru_CADа:

Код:
[Выделить все]
;;; Листинг 10.43. Функция ru-list-massoc
(defun ru-list-massoc (key alist)
;;; Пример:(ru-list-massoc 10 (entget (car (entsel))))
  (mapcar 'cdr (vl-remove-if-not (function (lambda (x) (= key (car x)))) alist))
) ;_ end of defun


а дальше идет описание, что делает функция lambda и уже приводится такой код
Код:
[Выделить все]
(lambda (x) (if (= key (car x)) x))
мне кажется он верный, а не тот, что в функции:

Код:
[Выделить все]
(lambda (x) (= key (car x))))
Я прав? Может просто опечатка?

И еще вопрос - для чего именно нужна функция function - только для компиляции и оптимизацией кода? Ведь и без function все должно работать в лисп-файле. ИЛи я не так понял? Тогда прошу объяснить.

Последний раз редактировалось Frigate, 27.09.2010 в 08:21.
Frigate вне форума  
 
Непрочитано 27.09.2010, 08:18
#1027
Do$

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


Все понятно: и из названия, и пример использования есть. Что подсказать то?
Код:
[Выделить все]
;;; Листинг 10.43. Функция ru-list-massoc
(defun ru-list-massoc (key alist)
;;; Пример:(ru-list-massoc 10 (entget (car (entsel))))
  (mapcar 'cdr
	  (vl-remove-if-not
	    (function (lambda (x) (= key (car x))))
	    alist
	  ) ;_ end of vl-remove-if-not
  ) ;_ end of mapcar
) ;_ end of defun
Do$ вне форума  
 
Непрочитано 27.09.2010, 08:50
#1028
Frigate

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


посмотрите, пожалуйста, еще раз - я просто не сразу свои вопросы описал - есть добавление в мой предыдущий пост
Frigate вне форума  
 
Непрочитано 27.09.2010, 08:50
#1029
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Frigate Посмотреть сообщение
И еще вопрос - для чего именно нужна функция function - только для компиляции и оптимизацией кода?
Скорее всего, да. Разница между ‘ и function
Но мне лень писать слово function, и в надежде, что у меня программки маленькие и лёгкие, я пишу
Код:
[Выделить все]
;;; Листинг 10.43. Функция ru-list-massoc
(defun ru-list-massoc (key alist)
;;; Пример:(ru-list-massoc 10 (entget (car (entsel))))
  (mapcar 'cdr
	  (vl-remove-if-not
	    '(lambda (x) (= key (car x)))
	    alist
	  ) ;_ end of vl-remove-if-not
  ) ;_ end of mapcar
) ;_ end of defun
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 27.09.2010, 08:58
#1030
Frigate

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


Disney

спасибо за ссылку, теперь я понял, что именно для оптимизации кода и нужна function



Подумал тут... эти 2 кода равнозначны, что ли

(lambda (x) (if (= key (car x)) x))

и

(lambda (x) (= key (car x))))

???
Frigate вне форума  
 
Непрочитано 27.09.2010, 10:17
#1031
Кулик Алексей aka kpblc
Moderator

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


Не совсем. Первый вариант вернет в случае успеха значение х, второй же - всего лишь t.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2010, 10:38
#1032
Do$

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


Правильнее использовать второй вариант, и быстрее работать будет.
Кстати, они не всегда nil одновременно возвращают:
Код:
[Выделить все]
_$ (setq key nil x nil)
nil
_$ (if (= key (car x)) x)
nil
_$ (= key (car x))
T
_$
Do$ вне форума  
 
Непрочитано 27.09.2010, 12:00
#1033
Frigate

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


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

спасибо, Алексей, а то неверно код расшифровывал, вот и была сумятица в голове... в общем это ошибка на сайте ru_CAD.


Можете подсказать что делает функция logior. Справку читал - не помогло ) Слишком все коротко и смутно:
Цитата:
Returns the result of the logical bitwise inclusive OR of a list of integers
что делает функция - разобрался, но вот ее назначение в коде для меня пока туман...

Что конктерно эта функция делает в этом коде, подскажите, пожалуйста

Код:
[Выделить все]
Листинг 10.4. Создание полилинии объектными методами
(defun example ()
  (vla-put-closed
    (vla-addlightweightpolyline
      (vla-get-modelspace
 (vla-get-activedocument (vlax-get-acad-object))
      ) ;_ end of vla-get-ModelSpace
      (vlax-make-variant
 (vlax-safearray-fill
   (vlax-make-safearray vlax-vbdouble '(0 . 7))
   (list 0.0 0.0 100.0 0.0 100.0 -50.0 0.0 -50.0)
 ) ;_ end of vlax-safearray-fill
 (logior vlax-vbarray vlax-vbdouble)
      ) ;_ end of vlax-make-variant
    ) ;_ end of vla-addlightweightpolyline
    :vlax-true
  ) ;_ end of vla-put-closed
) ;_ end of defun

Последний раз редактировалось Frigate, 27.09.2010 в 12:16.
Frigate вне форума  
 
Непрочитано 27.09.2010, 12:29
#1034
Do$

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Что конктерно эта функция делает в этом коде, подскажите, пожалуйста
Чистой воды "понт"
Можно смело заменить на функцию +
P.S. Смотри функцию vlax-make-variant и константы, обозначающие типы вариантов.

Последний раз редактировалось Do$, 27.09.2010 в 12:36.
Do$ вне форума  
 
Непрочитано 27.09.2010, 13:25
#1035
Frigate

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




т.е. я могу здсь просто поставить

(+vlax-vbDouble vlax-vbArray)

?

Кстати в справке почему-то в примере присваивания variant массива не используется аргумент "тип"... Может и так будет работать? Попробую ща все варианты...
Frigate вне форума  
 
Непрочитано 27.09.2010, 13:35
#1036
ShaggyDoc

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


Цитата:
Чистой воды "понт"
Это "Чтоб никто не догадался" (С).
Можно и "смело заменить". Но потом когда-то и наткнуться на последствия.

Цитата:
Подумал тут... эти 2 кода равнозначны, что ли
(lambda (x) (if (= key (car x)) x))
и
(lambda (x) (= key (car x))))
Конечно, не равнозначны. Не забываем также, что такие функции могут использоваться и внутри других функций.

По поводу function правильно объяснено по ссылке у Алексея
Но главное - компиляция. Да ещё раньше был другой вид компиляции в файлы формата BI2 и BI4. Вот там применение function было вообще обязательным. А в ruCAD многие функции еще от версии R10 остаются.
ShaggyDoc вне форума  
 
Непрочитано 27.09.2010, 14:47
#1037
Frigate

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


ShaggyDoc ,

объясните пожалуйста нам, неучам, что ж за хитрость зарыта в этой строке и чем может грозить пропуск ее?

Еще раз повторю, что согласно примеру справке в АКАДе, вообще не используют тип в функции vlax-make-variant, предоставляя, судя по всему, функции выбирать самой тип данных.
Это тоже, наверное, может грозить сбоем в самый неожиданный момент...

Сидим и ждем умных разъяснений :-)

Просто хочется понять, где ж написано было, что именно таком образом надо "складывать" типы переменных. В справке? Можно ткнуть носом в раздел? Вообще в источник? :-)


Дополнение - еще раз перечитал справку... по умолчанию (без указания типа данных) vlax-make-variant для safearray поставит тип данных vbArray. Судя по логике, если вставлять такое выражение

Код:
[Выделить все]
logior vlax-vbarray vlax-vbdouble)
то мы предусматриваем возможность, что тип variant будет или Double или Array. А зачем так делать? Поделитесь, пожалуйста, сокровенными знаниями, доступными лишь гуру?

Что-то уже больше часа бь.сь и никак не могу присвоить верхней границе массива переменную...

вот

Код:
[Выделить все]
 
(setq tst1 12)
(setq tst1 (vlax-make-variant tst1 vlax-vbInteger))
(setq array (vlax-make-safearray vlax-vbDouble '(0 . tst1)))
в ответ получаю в комстроке
Цитата:
; ошибка: неверный тип аргумента: fixnump: TST1
Что делать?

Когда вводишь вместо верхней границы просто число, то все ок, а так... Какой эе тип данных должен быть, если не Integer???

Последний раз редактировалось Frigate, 27.09.2010 в 15:26.
Frigate вне форума  
 
Непрочитано 27.09.2010, 15:59
#1038
Do$

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
то мы предусматриваем возможность, что тип variant будет или Double или Array
Незачет. Тип варианта будет: массив (array) из вещественных чисел двойной точности (double).
Код:
[Выделить все]
(setq tst1 12)
(setq array (vlax-make-safearray vlax-vbDouble (cons 0 tst1)))

Последний раз редактировалось Do$, 27.09.2010 в 16:11.
Do$ вне форума  
 
Непрочитано 27.09.2010, 22:30
#1039
ShaggyDoc

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


Цитата:
Поделитесь, пожалуйста, сокровенными знаниями, доступными лишь гуру?
А зачем это мне? Уж разберись сам в разнице между арифметическим сложением и действием побитового включающего ИЛИ над списком чисел. Мне-то все равно не поверишь.
ShaggyDoc вне форума  
 
Непрочитано 27.09.2010, 23:09
#1040
Кулик Алексей aka kpblc
Moderator

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


Как сказать
Да, кстати! ShaggyDoc, прошу поправить меня, если я ошибаюсь (достаточно будет просто сказать, что я неправ):
logior -> операция поразрядного ИЛИ. Работает только над целыми числами. Результат - целое число.
Например:
Код:
[Выделить все]
(logior 10 12 1)
преобразовывается в
Код:
[Выделить все]
logior
1010
1100
0001
В результате получаем:
то есть 15.
Аналогично с logand:
Код:
[Выделить все]
(logand 10 12 1) ; ->
1010
1100
0001
Выполняя логическое И (то есть все три раза в каждом разряде должно быть по 1), получаем на выходе 0000, то есть 0. Так?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 27.09.2010 в 23:21.
Кулик Алексей 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