Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 223
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Старый 20.07.2008, 20:12 1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2055369
 
Старый 16.08.2023, 10:21
#4441
gumel


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


Цитата:
Сообщение от Фёдор Сумкин` Посмотреть сообщение
А если _end заменить на _endpoint?
Теперь у меня polyline сломался

Command: EPE
_.polyline Unknown command "POLYLINE". Press F1 for help.
Command: _endpoint Unknown command "ENDPOINT". Press F1 for help.
gumel вне форума  
 
Старый 16.08.2023, 10:30
1 | #4442
Кулик Алексей aka kpblc
Moderator

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


ТЬфу, блин! Не _.polyline, а _.pline !!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 16.08.2023, 11:56
#4443
gumel


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ТЬфу, блин! Не _.polyline, а _.pline !!
Спасибо!
gumel вне форума  
 
Старый 16.08.2023, 17:20
#4444
koMon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
С какого перепугу у тебя чертеж закрывается
видимо с этого
Нажмите на изображение для увеличения
Название: end.png
Просмотров: 34
Размер:	1.8 Кб
ID:	258149
__________________
K Lisp
koMon вне форума  
 
Старый 16.08.2023, 17:47
#4445
Кулик Алексей aka kpblc
Moderator

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


Да уже разобрались )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 14.09.2023, 12:16
#4446
Ingpro


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


Пытаюсь в коде изменить высоту текста на 2.5 и радиус на 3, но что-то делаю не так... Подскажите, как исправить
Код:
[Выделить все]
 (defun c:rcl (/ selset ent ed *error*)
  (defun *error* (msg)
    (setvar "NOMUTT" 0) ;_ Восстанавливаем NOMUTT, Что плохого в NOMUTT?
    (princ msg)
  ) ;_ end of defun
  (vl-load-com)
  (princ "\nВыберите Mтексты: ")
  (setq selset (ssget '((0 . "MTEXT"))))
  (if selset
    (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
      (setq ed (entget ent))
      (setq ed (subst (cons 41 0) (assoc 41 ed) ed))
      (setq ed (subst (cons 71 5) (assoc 71 ed) ed))
      (setq ed (subst (cons 40 250.) (assoc 40 ed) ed))
      (entmod ed)
      (entmakex	(list
		  '(0 . "CIRCLE")
		  (assoc 10 ed)
		  '(40 . 300.)
		  '(6 . "Continuous")
		  '(62 . 256)
		  '(8 . "Osi")
		) ;_ end of list
      ) ;_ end of entmake
    ) ;_ end of foreach
    (princ)
  ) ;_ end of if
) ;_ end of defun
Заменяю в строке
Код:
[Выделить все]
 (setq ed (subst (cons 40 250.) (assoc 40 ed) ed))
Код:
[Выделить все]
 (setq ed (subst (cons 40 2.5.) (assoc 40 ed) ed))
И в строке
Код:
Код:
После запуска пишет "неверная DXF-группа: (40)"
Ingpro вне форума  
 
Старый 14.09.2023, 12:39
#4447
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Код:
[Выделить все]
1
(setq ed (subst (cons 40 2.5.) (assoc 40 ed) ed))
У тебя написано 2.5. , а надо 2.5
name02 вне форума  
 
Старый 14.09.2023, 13:30
#4448
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
У тебя написано 2.5. , а надо 2.5
name02, спасибо, получилось, а после 250 стоит точка (250.)...
Ingpro вне форума  
 
Старый 14.09.2023, 14:50
#4449
Ingpro


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


Код:
Цвет или слой круга как правильно поменять в коде?
Круги создаются слоем "Osi" с цветом 7, поменять, например, на цвет 74...

Последний раз редактировалось Ingpro, 14.09.2023 в 14:56.
Ingpro вне форума  
 
Старый 15.09.2023, 06:42
#4450
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
а после 250 стоит точка (250.)
Точка после 250 в данном случае не ошибка. LISP воспринимает 250. как число типа REAL (т.е. числа с десятичными разрядами), а 250 (без точки) - как целое число типа INTEGER

Цитата:
Цвет или слой круга как правильно поменять в коде?
Круги создаются слоем "Osi" с цветом 7, поменять, например, на цвет 74...
В строке 21 пишешь соответсвенно '(62 . 74) - эта группа определяет цвет круга, а в строке 22 - '(8 . "имя_СУЩЕСТВУЮЩЕГО_слоя")

Возвращаясь к предыдущим твоим сообщениям:
Вот именно в группе 62 для определения цвета должно быть число 74, а не 74. - номер цвета должен быть целочисленными (тип INTEGER), в противном случае LISP выдаст ошибку
name02 вне форума  
 
Старый 15.09.2023, 07:37
#4451
koMon


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


Цитата:
Сообщение от name02 Посмотреть сообщение
а в строке 22 - '(8 . "имя_СУЩЕСТВУЮЩЕГО_слоя")
entmake по фиг существует слой или нет. если нет, то он создастся.
__________________
K Lisp
koMon вне форума  
 
Старый 15.09.2023, 07:37
#4452
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от name02 Посмотреть сообщение
а в строке 22 - '(8 . "имя_СУЩЕСТВУЮЩЕГО_слоя")
Необязательно существующего. Если слоя не будет, он создастся с настройками "по умолчанию".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 15.09.2023, 09:31
#4453
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
В строке 21 пишешь соответсвенно '(62 . 74) - эта группа определяет цвет круга
name02, спасибо за помощь с заменой цвета и подробные пояснения про 250 с точкой...
Ingpro вне форума  
 
Старый 26.10.2023, 12:02
#4454
gnuvse


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


Добрый день.

Как я мог бы получить из vla объекта мультивыноски данные о координатах указателья выноски(стрелка скажем), можете подсказать?

А то дамп не дает этой информации

Код:
[Выделить все]
 
(vlax-dump-object vla-obj)

Что я хочу сделать, найти самую ближайшую выноску из набора к текущей полилинии, вот прикинул вот такую функцию. Но протестировать возможности нет
Код:
[Выделить все]
 
(defun closest m-lead (vla-pl set-of-vla-mleads /) 
	(setq mlead-find nil)
	(setq closer-pt (vlax-curve-getClosestPointTo vla-pl POINT-MLEADER?))
	(setq closest-pt (vlax-curve-getClosestPointTo vla-pl POINT-MLEADER?))
	
	(foreach mlead set-of-vla-mleads
		
		; ближайшая точка на линии к точке выноски
		(if (> closer-pt closest-pt)
 			(setq closest-pt closer-pt)                       
			(setq mlead-find mlead)
		)
		
	)
	mlead-find
)

gnuvse вне форума  
 
Старый 26.10.2023, 12:12
1 | #4455
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от gnuvse Посмотреть сообщение
Как я мог бы получить из vla объекта мультивыноски данные о координатах указателья выноски(стрелка скажем), можете подсказать?
Варианта два. Первый - преобразовать в ename и смотреть там. Второй (пишу насухую, без проверки):
(vlax-safearray->list (vlax-varant-value (vla-getleaderlinevertices multileader-object 0)))
0 - индекс выноски, с которой работаешь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 26.10.2023, 12:25
#4456
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Варианта два. Первый - преобразовать в ename и смотреть там. Второй (пишу насухую, без проверки):
(vlax-safearray->list (vlax-varant-value (vla-getleaderlinevertices multileader-object 0)))
0 - индекс выноски, с которой работаешь.
Я думаю, что мне пока первого варианта хватит, правильно я понимаю, что мне потом нужно назад в vla объект преобразовать мои координаты, но как?
vlax-curve-getClosestPointTo vla-pl вторым аргументом принимает как раз точку.

Спасибо

----- добавлено через ~52 мин. -----
В продолжении https://forum.dwg.ru/showpost.php?p=...postcount=4454

При отладке кода, у меня ругается лисп при вызове vlax-curve-getClosestPointTo, ошибка - unable to get ObjectID: nil, я так понимаю, что моя координата coordinate-mlead не является WSC, как я мог бы преобразоватьее в WSC?
Гугл оперативно не дал ответ, а старая тема с CADUSER ничего не дала, кроме нерабочих ссылок.
Поиск по dwg.ru безрезультатно
Поиск по доку лиспа не помогло тоже, ничего не нашел по WSC, OSC
Код:
[Выделить все]
 
(setq closer-pt (vlax-curve-getClosestPointTo vla-pl coordinate-mlead))
Сама по себе coordinate-mlead обычная (x, y, z) z = 0.0

Последний раз редактировалось gnuvse, 26.10.2023 в 14:36.
gnuvse вне форума  
 
Старый 26.10.2023, 15:07
#4457
gnuvse


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


Не понимаю, как я мог бы отследить положение выноски на полилинии, чтобы оно было правильным, можете подсказать?
Пытался сравнивать координаты точек
Пытался сранивать длины от начала линии до точки выноски
Безуспешно

на входе vla полилинии и набор выносок

Код:
[Выделить все]
 (defun closest-mlead (vla-pl set-of-vla-mleads /) ; return closest mlead 
    (setq mlead-found nil)
    (setq key-coordinate-mlead 49)
    
 
    (setq closest-pt '(-99999.0 -99999.0 -99999.0))
    (setq L 0.0)
    (foreach mlead set-of-vla-mleads
        (setq ent-mlead (vlax-vla-object->ename mlead))
        (setq coordinate-mlead (cdr (nth key-coordinate-mlead (entget ent-mlead))))
        (setq closer-pt (vlax-curve-getClosestPointTo vla-pl coordinate-mlead))
        
        (if (< L (vlax-curve-getDistAtPoint vla-pl closer-pt))
            (progn
                (setq L (vlax-curve-getDistAtPoint vla-pl closer-pt))
                (setq mlead-found mlead)
            )
        )
        ; ближайшая точка на линии к точке выноски
        ; (if (and (> (car closer-pt) (car closest-pt))
                 ; (> (cadr closer-pt) (cadr closest-pt))
            ; )
            ; (progn 
                ; (setq closest-pt closer-pt)
                ; (setq mlead-found mlead)
            ; )
        ; )
    )
        mlead-found
)

Последний раз редактировалось gnuvse, 26.10.2023 в 15:46.
gnuvse вне форума  
 
Старый 26.10.2023, 16:21
#4458
Кулик Алексей aka kpblc
Moderator

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


У мультивыносок гарантированно по одному "хвосту" или могут быть варианты?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 26.10.2023, 16:29
#4459
gnuvse


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У мультивыносок гарантированно по одному "хвосту" или могут быть варианты?
Гарантированно по одному хвосту.
Но если вас не затруднит, могли бы и для этого вариант тоже что-то мне сообщить, я так хоть буду представлять как такие вещи обрабатывать
gnuvse вне форума  
 
Старый 26.10.2023, 16:36
1 | #4460
Кулик Алексей aka kpblc
Moderator

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


Сам отфильтруешь лишнее:
Код:
[Выделить все]
 (defun _kpblc-eval-closest-mleader (vla-polyline vla-mleader-list)
  (vl-sort (mapcar
             (function
               (lambda (x / pt closest)
                 (setq pt      (vlax-safearray->list
                                 (vlax-variant-value
                                   (vla-getleaderlinevertices x 0)
                                 ) ;_ end of vlax-variant-value
                               ) ;_ end of vlax-safearray->list
                       pt      (list (car pt) (cadr pt) (caddr pt))
                       closest (vlax-curve-getclosestpointto vla-polyline pt)
                 ) ;_ end of setq
                 (setq x (list (cons "obj" x)
                               (cons "pt" pt)
                               (cons "closest" closest)
                               (cons "dist" (distance pt closest))
                         ) ;_ end of list
                 ) ;_ end of setq
               ) ;_ end of lambda
             ) ;_ end of function
             vla-mleader-list
           ) ;_ end of mapcar
           (function (lambda (a b)
                       (< (cdr (assoc "dist" a)) (cdr (assoc "dist" b)))
                     ) ;_ end of LAMBDA
           ) ;_ end of function
  ) ;_ end of vl-sort
) ;_ end of defun
----- добавлено через ~1 мин. -----
"obj" - указатель на мультивыноску
"pt" - начальная точка первого хвоста
"closest" - ближайшая точка на полилинии
"dist" - расстояние до полилинии
__________________
Моя библиотека 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