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

Вернуться   Форум 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.
Просмотров: 1972975
 
Непрочитано 05.09.2011, 14:03
#1561
TararykovDG

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


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Нужно рисовать вручную полилинию в цикле при чем каждый раз проходящую через разное количество точек. в дальнейшем нужна будет площадь этой полилинии, но это я уже разобрался как сделать а вот полилинию вручную в код поставить не получается!
Прошу помощи.
Код:
[Выделить все]
 
(defun manual-draw-pline()
  (vl-cmdf "_.pline")
  (while (= (getvar "CMDACTIVE") 1) (vl-cmdf pause))
  (entlast)
  ); end manual-draw-pline
В своем цикле вызывай (manual-draw-pline)
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 05.09.2011, 15:36
#1562
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


надо поглядеть что такое vl-cmdf

Последний раз редактировалось Ubivec81, 05.09.2011 в 15:43.
Ubivec81 вне форума  
 
Непрочитано 05.09.2011, 15:58
#1563
gomer

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


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Нужно рисовать вручную полилинию в цикле при чем каждый раз проходящую через разное количество точек.
Код:
[Выделить все]
 (defun draw_pline (lst / templst)
;;; Добавляет 3М полилнию
;;;(draw_pline (list '(0 0) '(100 200) '(300 300 300)))
  (vla-AddPolyline
	(vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object))))
	(vlax-safearray-fill
	  (vlax-make-safearray
		vlax-vbDouble
		(vl-list* 0 (1- (length (setq templst
		  (apply 'append (mapcar (function
			(lambda (x)
			  (cond
				((= 2 (length x)) (list (car x) (cadr x) 0.0))
				(T x))))
			  lst)))))))
	  templst
	)
  )
)

(defun draw_lpline (lst / templst)
;;; Добавляет легкую полилнию
;;;(draw_lpline (list '(0 0) '(100 200) '(300 300 300)))
  (vla-AddLightWeightPolyline
	(vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object))))
	(vlax-safearray-fill
	  (vlax-make-safearray
		vlax-vbDouble
		(vl-list* 0 (1- (length (setq templst
		  (apply 'append (mapcar (function
			(lambda (x)
			  (cond
				((= 3 (length x)) (reverse (cdr (reverse x))))
				(T x))))
			  lst)))))))
	  templst
	)
  )
)
gomer вне форума  
 
Непрочитано 06.09.2011, 11:52
#1564
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Код:

(vl-load-com)
(defun maketable (pt nr nc rh cw)
(vla-addtable
(vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'Modelspace)
(vlax-3d-point pt)
nr nc rh cw
);end of addtable
);end of maketable

Запускать (maketable точка_вставки количество_сток количество_колнок высота_строки ширина_колонки)
например (maketable (getpoint) 5 5 5 5)
А можно все это растолковать на пальцах. Что то не получается мозгу без помощи опытных людей освоить vl
В этом коде понятно что
vla-addtable
создается таблица с переменными (pt nr nc rh cw)
А вот дальше темный лес
(vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'Modelspace)
(vlax-3d-point pt)
Прощу помощи в изучении vl и по возможности с самого начала!
Ubivec81 вне форума  
 
Непрочитано 06.09.2011, 12:03
#1565
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
создается таблица с переменными (pt nr nc rh cw)
с какими еще переменными - это параметры таблицы, "Темный лес" - описан в справке автокада - это встроенные лисп функции, справку по объектной модели - см. справку по VB (парадокс - vb уже нету - а справка осталась ). Как вызывать COM методы (vl-...) из lisp - поищи по форуму - где-то дано хорошее описание с картинками.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 06.09.2011, 12:07
#1566
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Цитата:
Сообщение от Дима_ Посмотреть сообщение
с какими еще переменными - это параметры таблицы, "Темный лес" - описан в справке автокада - это встроенные лисп функции, справку по объектной модели - см. справку по VB (парадокс - vb уже нету - а справка осталась ). Как вызывать COM методы (vl-...) из lisp - поищи по форуму - где-то дано хорошее описание с картинками.
Ну да я не правельно написал! конечно с параметрами. Подскажите а есть эта справка на русском языке? никак не могу найти.
Ubivec81 вне форума  
 
Непрочитано 06.09.2011, 12:12
#1567
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Если только по лисп функциям (в учебниках по автолиспу поискать), по объектной модели (да еще и полная) вряд-ли найдется.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 06.09.2011, 13:36
#1568
Disney

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Как вызывать COM методы (vl-...) из lisp - поищи по форуму - где-то дано хорошее описание с картинками.
Четыре правила для работы с ActiveX в Visual Lisp

Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Подскажите а есть эта справка на русском языке?
Есть AutoCAD Объектная модель
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 06.09.2011, 14:26
#1569
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


все это сижу читаю. вроде все понятно но не могу сделать простейшего, нарисовать линию. (vl-addline....) а вот как дальше вставлять параметры я не понимаю.
Ubivec81 вне форума  
 
Непрочитано 06.09.2011, 14:34
#1570
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


ну попробуй разберись:
Код:
[Выделить все]
 (vla-addline 
  (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
  (vlax-3d-point '(0 0 0))
  (vlax-3d-point '(100 100 0)))
p.s. - с тебя два круга с однинаковыми центрами и радиусами 100 и 200 соответственно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 06.09.2011, 14:51
#1571
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Код:
[Выделить все]
 (vla-addline ;создать линию через 2 точки
    (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object))) ;  Получает коллекцию ModelSpace документа 
;Определяет активный документ (файл рисунка), но как это перевести мне не понятно (прошу пояснить)
    (vlax-3d-point '(0 0 0));точки линии должны быть 3-х мерные но откуда берется vlax я в литературе не нашел
    (vlax-3d-point '(100 100 0)))
Все дело в том что пока я с Вашей помощью и при помощи книг разбирался с командным методом то это было как то проще, а тут я не могу все это увязать ежду собой да и литературы которая описывает все это более подробно не нашел.
Ubivec81 вне форума  
 
Непрочитано 06.09.2011, 16:20
#1572
dirge


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


Всем привет! Ребят подскажите, а как можно проверить определённый блок на существование в листе?
dirge вне форума  
 
Непрочитано 06.09.2011, 16:29
#1573
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Как это не странно звучит - посмотреть все объекты листа - нет-ли там вхождения нужного блока.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 06.09.2011, 16:33
#1574
Do$

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


Для обычного блока, если не nil вот это выражение: (ssget "_X" '((0 . "INSERT") (2 . "<block name>") (67 . 1) (410 . "<layout name>"))), тогда блок(или блоки) с именем "<block name>" есть на листе с именем "<layout name>".
Для динамических немного сложнее будет...
Do$ вне форума  
 
Непрочитано 06.09.2011, 18:13
1 | #1575
VVA

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Для динамических немного сложнее будет...
Для динамических есть решение от Lee-MAC
Код:
[Выделить все]
;;;http://www.cadtutor.net/forum/showthread.php?56447-Automatically-filling-out-the-Drawing-Property-from-Titleblock-Information&p=382978&viewfull=1#post382978
;;; http://www.cadtutor.net/forum/showthread.php?62294-Select-Dynamic-Blocks-By-Name
;; Returns list of the Anonymous names taken by a Dynamic Block (if any)  -  Lee Mac 2011  -  www.lee-mac.com
;; Arguments:  block  - name of Dynamic Block.

(defun AnonymousInstancesof ( block / def rec nme ref lst )
  (while (setq def (tblnext "BLOCK" (null def)))
    (if (= 1 (logand 1 (cdr (assoc 70 def))))
      (progn
        (setq rec
          (entget
            (cdr
              (assoc 330
                (entget
                  (tblobjname "BLOCK" (setq nme (cdr (assoc 2 def))))
                )
              )
            )
          )
        )
        (while (setq ref (assoc 331 rec))
          (if
            (and
              (eq block (vla-get-effectivename (vlax-ename->vla-object (cdr ref))))
              (not (member nme lst))
            )
            (setq lst (cons nme lst))
          )
          (setq rec (cdr (member (assoc 331 rec) rec)))
        )
      )
    )
  )
  (reverse lst)
)

(defun LM:BlockList->Str ( lst del / f )
  ;; © Lee Mac 2011

  (defun f ( s ) (if (wcmatch s "`**") (strcat "`" s) s))
  
  (if (cdr lst)
    (strcat (f (car lst)) del (LM:BlockList->Str (cdr lst) del))
    (f (car lst))
  )
)
;;; USE
;;;(setq DynBlockName "TITLEBLOCK") ;_Имя ДИНАМИЧЕСКОГО блока
;;;(setq ss
;;;(ssget "_X"
;;;(list
;;;    (cons 0 "INSERT")
;;;    (cons 2 (LM:BlockList->Str (cons DynBlockName (AnonymousInstancesof DynBlockName)) ","))
;;;(cons 66 1)
;;;  )
;;;)
;;;      )
Ф-ция AnonymousInstancesof возвращает список всех возможных имен блоков, включая не именованные, например ("MIP_Формат" "*U33" "*U41" "*U42" "*U44" "*U45")
Дальше нужно лишь сформировать строку-шаблон для ssget (2 . "MIP_Формат,`*U33,`*U41,`*U42,`*U44,`*U45"). В примере все это есть
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.09.2011, 06:31
#1576
Disney

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


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
(vlax-3d-point '(0 0 0));точки линии должны быть 3-х мерные но откуда берется vlax я в литературе не нашел
я сам долго и упорно ломал мозг с этими vla, поэтому попробую...

Список это чисто LISP-овский тип данных, в VBA его нет, поэтому в ActiveX вместо списков используются варианты с безопасным массивом
(vlax-3d-point '(2.236 23.548 0.0))) - создаёт вариант из безопасного массива, который в свою очередь состоит из трёх элементов являющихся вещественными числами двойной точности.
Варианты - это структура, которая может хранить объекты разных типов. (vlax-make-variant)
Безопасный массив - массив понятно, безопасный - потому что система постоянно контролирует тип и количество элементов (vlax-make-safearray- создаёт vlax-safearray-fill - заполняет)
Т.е. получаем:
(vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2)) '(2.236 23.548 0.0)))
получилась немного громоздкая запись, а так как довольно таки часто приходиться её использовать, создали функцию
Код:
[Выделить все]
 (defun vlax-3d-point (_list_)
... ; ну тут всякие проверки для _list_ 
  (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2)) _list_)))
Если я в чём-то ошибаюсь, буду признателен если меня поправят.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 07.09.2011, 12:45
#1577
dirge


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


Всем большое, спасибо!

Ребят, извините за неудобства.

Как этот код можно переписать на LISP?

Sub DwgProps()
Dim NewText1 As String
Dim NewText2 As String
Dim oFS
Dim Fold
Dim Slesh1, Slesh2, Slesh3
Dim Konec, Zona, Papka, Hvost
Set oFS = CreateObject("Scripting.FileSystemObject")
Fold = ThisDrawing.Path

Konec = Len(Fold)
Papka = "215-GMC-01-EOM2."
Slesh1 = InStr(Fold, Papka)
Hvost = Mid(Fold, Slesh1, Konec)
Slesh2 = InStr(Hvost, ".")
Slesh3 = InStr(Hvost, "\")
If Slesh3 <> 0 Then
Zona = Mid(Hvost, Slesh2 + 1, Slesh3 - Slesh2 - 1)
Else
Zona = Mid(Hvost, Slesh2 + 1, Konec - Slesh2 - 1)
End If
NewText1 = Zona
NewText2 = "Ãëàâíûé ìåäèàöåíòð ôóíêöèîíàëüíàÿ çîíà " & NewText1 & " Ýëåêòðîîáîðóäîâàíèå è ýëåêòðîîñâåùåíèå"
changeCustDwgProp ThisDrawing, "Äîïîëíèòåëüíûé Øèôð ðàçäåëà", NewText1
changeCustDwgProp ThisDrawing, "Íàèìåíîâàíèå êîìïëåêòà", NewText2

End Sub

Private Function changeCustDwgProp(docName As AcadDocument, fldName As String, newVal As String)
On Error GoTo createIt
Dim custProps As AcadSummaryInfo
Set custProps = docName.SummaryInfo
custProps.SetCustomByKey fldName, newVal
Set custProps = Nothing
Exit Function
createIt:
custProps.AddCustomInfo fldName, newVal
Set custProps = Nothing
End Function

Private Function getCustDwgProp(docName As AcadDocument, fldName As String) As String
'KEY IS CASE SENSITIVE
On Error GoTo notFound
Dim custProps As AcadSummaryInfo
Set custProps = docName.SummaryInfo
custProps.GetCustomByKey fldName, getCustDwgProp
Set custProps = Nothing
Exit Function
notFound:
getCustDwgProp = ""
Set custProps = Nothing
End Function
dirge вне форума  
 
Непрочитано 07.09.2011, 13:03
#1578
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от dirge Посмотреть сообщение
NewText2 = "Ãëàâíûé ìåäèàöåíòð ôóíêöèîíàëüíàÿ çîíà " & NewText1 & " Ýëåêòðîîáîðóäîâàíèå è ýëåêòðîîñâåùåíèå"
changeCustDwgProp ThisDrawing, "Äîïîëíèòåëüíûé Øèôð ðàçäåëà", NewText1
changeCustDwgProp ThisDrawing, "Íàèìåíîâàíèå êîìïëåêòà", NewText2
Offtop: прям так и писать?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 07.09.2011, 13:21
#1579
dirge


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Offtop: прям так и писать?
Да, можно так, я потом подставлю текст. Буду дико признателен.
dirge вне форума  
 
Непрочитано 07.09.2011, 13:41
#1580
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 644
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Не совсем понятно мне. Когда мы объявляем функцию, локальные переменные функции мы должны вручную "убить", что бы освободить память. Например:
[code]
Код:
[Выделить все]
 (defun nfun (/ var1)
(setq var1 5)
var1
)
То есть за пределами функции переменной var1 не существует. Хорошо, но функция nfun в загруженном рисунке осталась. Цель ручной чистки переменных, как я понял - освободить память от мусора (странно, но в Common Lisp такой необходимости в ручной чистке нету, как в прочим и во многих других диалектах). Тогда почему остаются функции в памяти, после выполнения программы? Ведь они занимают больше места чем переменные.

И всё-таки, зачем "ручная" чистка переменных, это какой то атавизм (этот вопрос волнует даже больше)?
baaba вне форума  
Ответ
Вернуться   Форум 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