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

Вернуться   Форум 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.
Просмотров: 1965768
 
Непрочитано 01.12.2018, 17:43
1 | #3681
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от megabeton Посмотреть сообщение
Создал набор объектов
лучше наверное работать с коллекцией слоёв
Код:
[Выделить все]
 
;функция для обработки объекта слоя, на котором есть текстовые примитивы
(defun do_layer_function (layer_object /)
	(if (/= "" (vla-get-description layer_object)) 
		(princ (strcat "\nУ слоя \"" (vla-get-name layer_object) "\" опмсание \"" (vla-get-description layer_object) "\""))
	  	(princ (strcat "\nУ слоя \"" (vla-get-name layer_object) "\" нет описания"))
	)	
)
;*********************************************************************************************************************************
(setq dwg_Layers_collection (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))))
(vlax-for layer_item dwg_Layers_collection
	(if (apply 'ssget (list "_X" (list (cons -4 "<AND") (cons 0 "TEXT") (cons 8 (vla-get-name layer_item)) (cons -4 "AND>"))))
	  	(do_layer_function layer_item) ; вызов функции для обработки объекта слоя, на котором есть текстовые примитивы
	) 
) 
koMon вне форума  
 
Непрочитано 05.12.2018, 14:27
#3682
megabeton


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


Подскажите, как добраться до геометрических свойств полилинии (конкретно к площади).
Просто
Код:
[Выделить все]
 (entget (car (entsel)))
такую информацию напрямую не содержит.
Может возможно быстро добраться до этой информации через Свойства ActiveX
Что то наподобие такого
Код:
[Выделить все]
 (vla-get-____???_____ (vlax-ename->vla-object (__???___ (entget (car (entsel))))))))
megabeton вне форума  
 
Непрочитано 05.12.2018, 14:30
#3683
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Добрый день!
Вызвался помочь знакомому студенту в написании лисп программы.
На первый взгляд задание простое.
Отрисовать букву "З" заданной высоты.
Нарисовал букву. Задал точки. Нашел координаты.
Командными методами отрисовал графику.
Но вот условие задать уклон, выбило меня из колеи.
В каком направлении двигаться? Переопределять точки в зависимости от угла?
Вроде сделал, но при отрисовке ерунда получается какая-то.
Подскажите, что делать?
Код:
[Выделить все]
 (defun c:letter_z ( / osm pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 hg ang pt$9 pt$6)

	(setq osm (getvar "osmode")) ; запоминаем какие привязки были включены на момент запуска программы

	(initget 7) ; запрещен пустой ввод, ввод 0, ввод отрицательных чисел
	(setq hg (getreal "\nВысота буквы h:"))
	(initget 5) ; запрещен пустой ввод, ввод отрицательных чисел
	(setq ang (getreal "\nЗадайте угол наклона:"))
	(initget 1) ; запрещен пустой ввод
	(setq pt1 (getpoint "\nУкажите точку вставки: "))

	;(if (not (eq ang 0)) (setq pt1 (mapcar '+ pt1 (list ang 0 0))))
	; точки
	(setq pt2 (polar pt1 (/ (* (- 180 ang) pi) 180) (/ hg 5))) ; определяем точку pt2
	(setq pt3 (polar pt1 (/ (* (- 270 ang) pi) 180) (/ hg 10))) ; определяем точку pt3
	(setq pt4 (polar pt2 (/ (* (- 180 ang) pi) 180) (/ hg 10))) ; определяем точку pt4
	(setq pt5 (polar pt3 (/ (* (- 270 ang) pi) 180) (/ hg 5))) ; определяем точку pt5
	(setq pt6 (polar pt5 (/ (* (- 270 ang) pi) 180) (/ hg 10))) ; определяем точку pt6
	(setq pt7 (polar pt6 (/ (* (- 180 ang) pi) 180) (/ hg 5))) ; определяем точку pt7
	(setq pt8 (polar pt7 (/ (* (- 180 ang) pi) 180) (/ hg 10))) ; определяем точку pt11
	(setq pt$9 (polar pt1 (/ (* (- 270 ang) pi) 180) (/ (distance pt1 pt6) 2)))
	(setq pt9 (polar pt$9 (/ (* (- 360 ang) pi) 180) (sqrt (- (expt (distance pt1 pt4) 2) (expt (distance pt1 pt$9) 2))))) ; определяем точку pt9

	(defun tg (angl / val)
		(setq val (/ (sin angl) (cos angl)))
		val
	)
	(if (not (eq ang 0)) 
		(progn
			(setq pt$6 (polar pt6 (/ (* 270 pi) 180) (distance pt6 pt3))) ; находим нижнюю точку от нее будем считать
			(setq pt6a (polar pt6 (/ (* 360 pi) 180) (* (distance pt6 pt3) (tg ang))))
			(setq pt7a (polar pt7 (/ (* 360 pi) 180) (* (distance pt6 pt3) (tg ang))))
			(setq pt8a (polar pt8 (/ (* 360 pi) 180) (* (distance pt6 pt3) (tg ang))))
			(setq pt5a (polar pt5 (/ (* 360 pi) 180) (* (distance pt$6 pt5) (tg ang))))
			(setq pt9a (polar pt9 (/ (* 360 pi) 180) (* (distance pt$6 pt9) (tg ang))))
			(setq pt3a (polar pt3 (/ (* 360 pi) 180) (* (distance pt$6 pt3) (tg ang))))
			(setq pt1a (polar pt1 (/ (* 360 pi) 180) (* (distance pt$6 pt1) (tg ang))))
			(setq pt2a (polar pt2 (/ (* 360 pi) 180) (* (distance pt$6 pt1) (tg ang))))
			(setq pt4a (polar pt4 (/ (* 360 pi) 180) (* (distance pt$6 pt1) (tg ang))))
			
						; все точки определены, чертим эллипсы
			(setvar "osmode" 0) ; выключаем все привязки
			(command "_.ellipse" "_a" "_c" pt1a pt2a pt3a pt3a pt2a)
			(command "_.ellipse" "_a" "_c" pt1a pt4a pt9a pt9a pt4a)
			(command "_.ellipse" "_a" "_c" pt6a pt5a pt7a pt7a pt5a)
			(command "_.ellipse" "_a" "_c" pt6a pt8a pt9a pt8a pt9a)
				; чертим 3 линии
			(command "_.PLINE" pt4a pt2a "")
			(command "_.PLINE" pt3a pt5a "")
			(command "_.PLINE" pt7a pt8a "")
			
		)
		(progn
			; все точки определены, чертим эллипсы
			(setvar "osmode" 0) ; выключаем все привязки
			(command "_.ellipse" "_a" "_c" pt1 pt2 pt3 pt3 pt2)
			(command "_.ellipse" "_a" "_c" pt1 pt4 pt9 pt9 pt4)
			(command "_.ellipse" "_a" "_c" pt6 pt5 pt7 pt7 pt5)
			(command "_.ellipse" "_a" "_c" pt6 pt8 pt9 pt8 pt9)
			
				; чертим 3 линии
			(command "_.PLINE" pt4 pt2 "")
			(command "_.PLINE" pt3 pt5 "")
			(command "_.PLINE" pt7 pt8 "")
		)
	)

	; поворот буквы
	;(if (not (eq ang 0)) (command "_.rotate" "_c" (polar pt1 (/ (* 160 pi) 180) (/ hg 1)) (polar pt6 (/ (* 340 pi) 180) (/ hg 1)) "" pt1 (- 360 ang)))
	(setvar "osmode" osm) ; включаем привязки
	(princ)
)
Миниатюры
Нажмите на изображение для увеличения
Название: 235.jpg
Просмотров: 32
Размер:	34.5 Кб
ID:	208747  
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 05.12.2018, 14:34
1 | #3684
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от megabeton Посмотреть сообщение
как добраться до геометрических свойств полилинии (конкретно к площади).
(vla-get-area (vlax-ename->vla-object (car (entsel))))

----- добавлено через 43 сек. -----
Цитата:
Сообщение от Fedorino Посмотреть сообщение
Но вот условие задать уклон, выбило меня из колеи.
То есть "уклон"? Трехмерное тело надо, что ли, создать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.12.2018, 14:38
#3685
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


нет, у шрифта есть уклон, т.е. надо создать курсив
Миниатюры
Нажмите на изображение для увеличения
Название: уклон.jpg
Просмотров: 22
Размер:	41.8 Кб
ID:	208749  
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 05.12.2018, 14:39
#3686
Кулик Алексей aka kpblc
Moderator

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


Тогда пересчитывай точки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.12.2018, 14:42
#3687
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тогда пересчитывай точки.
в том то и дело, по какому алгоритму пересчитывать?
расстояние по оси Х у каждой точки меняется по разному.
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 07.12.2018, 14:15
#3688
megabeton


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


Как создать набор замкнутых полилиний?
(ssget '((0 . "LWPOLYLINE")) ??????)
megabeton вне форума  
 
Непрочитано 07.12.2018, 15:19
1 | 1 #3689
Кулик Алексей aka kpblc
Moderator

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


См. DXF 70, если не ошибаюсь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.12.2018, 14:19
1 | #3690
Vladimir_Sergeevich

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


Цитата:
Сообщение от megabeton Посмотреть сообщение
Что то наподобие такого
Код:
1
(vla-get-____???_____ (vlax-ename->vla-object (__???___ (entget (car (entsel))))))))
есть универсальный совет.
Сначала выполнить (vlax-dump-object (vlax-ename->vla-object (car (entsel))) t)
Изучить полученный список свойств и методов.
Цитата:
Сообщение от megabeton Посмотреть сообщение
Как создать набор замкнутых полилиний?
(ssget '((0 . "LWPOLYLINE")) ??????)
видимо простого ответа не будет...
Цитата:
dxf code 70
Polyline flag (bit-coded; default = 0):
1 = This is a closed polyline (or a polygon mesh closed in the M direction)
2 = Curve-fit vertices have been added
4 = Spline-fit vertices have been added
8 = This is a 3D polyline
16 = This is a 3D polygon mesh
32 = The polygon mesh is closed in the N direction
64 = The polyline is a polyface mesh
128 = The linetype pattern is generated continuously around the vertices of this polyline
вероятно по деревянному (ssget '((0 . "LWPOLYLINE") (70 . 1))) может обработать не все варианты...

з.ы. может так? (ssget '((0 . "LWPOLYLINE") (-4 . "<OR") (70 . 1) (70 . 129) (-4 . "OR>")) )
вероятно остальные флаги не сильно актуальны...
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 13.12.2018 в 14:37.
Vladimir_Sergeevich вне форума  
 
Непрочитано 13.12.2018, 14:40
#3691
megabeton


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


DXF 70 – то, что надо. По крайней мере мои задачи выполняет, выбирает все что надо.
Но тут сразу логичный вопрос наклевывается:
Откуда вы знаете все эти DXF коды?
Где найти полный список DXF кодов с разблюдовкой по каждому примитиву?
megabeton вне форума  
 
Непрочитано 13.12.2018, 14:47
#3692
Vladimir_Sergeevich

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


Цитата:
Сообщение от megabeton Посмотреть сообщение
Но тут сразу логичный вопрос наклевывается:
Откуда вы знаете все эти DXF коды?
Где найти полный список DXF кодов с разблюдовкой по каждому примитиву?
F1 справка.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 14.12.2018, 09:27
1 | #3693
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от megabeton Посмотреть сообщение
Где найти полный список DXF кодов с разблюдовкой по каждому примитиву?
https://yandex.ru/yandsearch?text=do...67&clid=124526
koMon вне форума  
 
Непрочитано 14.12.2018, 17:24
#3694
megabeton


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


Как извлечь имя примитива (полилинии к примеру), которая находится внутри простого нединамического блока?
Полилиния (примитив) - единственный объект в блоке
megabeton вне форума  
 
Непрочитано 14.12.2018, 17:32
#3695
Кулик Алексей aka kpblc
Moderator

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


Получи указатель на описание блока и проходи по описанию.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.12.2018, 19:01
#3696
megabeton


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Получи указатель на описание блока и проходи по описанию.
Подсмотрел/докрутил такую конструкцию
Код:
[Выделить все]
 (vlax-vla-object->ename (car (vl-remove-if-not (function (lambda (x) (= (vla-get-objectname x) "AcDbPolyline"))) ((lambda  (/ res) (vlax-for sub (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-effectivename (vlax-ename->vla-object (car (entsel))))) (setq res (cons sub res))) (reverse res))))))
А без ActiveX это возможно? Что типа взорвать блок, выбрать, взять имя, обратно собрать.
megabeton вне форума  
 
Непрочитано 14.12.2018, 19:49
#3697
Кулик Алексей aka kpblc
Moderator

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


Взрывать не надо. Насколько я помню (ACAD запускать лениво) - см нечто типа
Код:
[Выделить все]
 (tblobjename "block" <ИмяБлока>)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.12.2018, 20:56
#3698
megabeton


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


Не совсем понял, Offtop: или совсем не понял
Код:
[Выделить все]
 (tblobjname "block" (cdr (assoc 2 (entget (car (entsel))))))
Имя блока я получил, а дальше то как до вложенного в него примитива добраться (без ActiveX и не взрывая) ?
megabeton вне форума  
 
Непрочитано 15.12.2018, 01:43
#3699
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от megabeton Посмотреть сообщение
Как извлечь имя примитива (полилинии к примеру), которая находится внутри простого нединамического блока?
Полилиния (примитив) - единственный объект в блоке
Согласен с Алексеем:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Получи указатель на описание блока и проходи по описанию.
В подтверждение его слов приведу его же код:
Как получить vla-объект, который находится в блоке...
Правда, этот вариант без взрыва - да, а вот без ActiveX - нет. Вопрос: чем не устраивает ActiveX?
skkkk вне форума  
 
Непрочитано 15.12.2018, 09:40
#3700
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от megabeton Посмотреть сообщение
а дальше то как до вложенного в него примитива добраться (без ActiveX и не взрывая) ?
Насколько я помню, надо получить через entget начало блока и проходить по БД чертежа, пока не увидишь нечто типа ENDBLOCK.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Вопрос: чем не устраивает ActiveX?
Может, пишется под какой-нибудь клон, где ActiveX просто не реализован.
__________________
Моя библиотека 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