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

Вернуться   Форум 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.
Просмотров: 2049419
 
Непрочитано 25.12.2024, 21:21
#4861
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ты со скобками в строке 6 не ошибся?
6 откр. и 6 закр.???
Ingpro вне форума  
 
Непрочитано 25.12.2024, 22:16
#4862
Кулик Алексей aka kpblc
Moderator

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


Изначально перед handent стояло 2 скобки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2024, 22:37
1 | #4863
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Express-команда TXT2MTX
если это express-команда, и снова автокад 2015, то я думаю её нельзя вызвать функциями command*. нужно попробовать вариант что-то типа (c:txt2mtxt (ssname ss i))...
__________________
K Lisp
koMon вне форума  
 
Непрочитано 25.12.2024, 23:12
#4864
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
если это express-команда, и снова автокад 2015, то я думаю её нельзя вызвать функциями command*. нужно попробовать вариант что-то типа (c:txt2mtxt (ssname ss i))...
Спаcибо, но ошибка была в txt2mtxt (не хватало последней t)...
Код:
[Выделить все]
 (defun c:t2mt3 ( / ss i )
(vl-load-com)
		(setq ss (ssget '((0 . "TEXT"))) i -1)
		(while (< (setq i (1+ i)) (sslength ss))
		(vl-cmdf "_.txt2mtxt" (handent (cdr(assoc 5 (entget (ssname ss i))))) "")
	)
		(princ)
)
И с этой строкой (вместо 5-й) тоже работает код
Код:
[Выделить все]
 (vl-cmdf "_.txt2mtxt" (ssname ss i) "")

Последний раз редактировалось Ingpro, 25.12.2024 в 23:20.
Ingpro вне форума  
 
Непрочитано 26.12.2024, 08:24
#4865
name02


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


Немного улучшил-упростил для использования:
- добавил обработку пустого набора
- убрал ненужные выводы в командную строку и сообщение об ошибке
- добавил отмену - Ctrl+Z вернет все в исходное состояние

Код:
[Выделить все]
 (defun c:t2mt3 (/ ss i old_sett doc *error* )
  (vl-load-com)

  (defun *error* (msg)
    (princ)
  ) ;_ end defun

  (setq ss       (ssget '((0 . "TEXT")))
        old_sett (getvar 'CMDECHO)
        doc      (vla-get-activedocument (vlax-get-acad-object))
  ) ;_ end setq

  (vla-StartUndoMark doc)

  (setvar 'CMDECHO 0)

  (if ss
    (repeat (setq i (sslength ss))
      (vl-cmdf "_.txt2mtxt" (ssname ss (setq i (1- i))) "")
    ) ;_ end repeat
  ) ;_ end if

  (setvar 'CMDECHO old_sett)

  (vla-EndUndoMark doc)

  (princ)
) ;_ end defun
Теперь, надеюсь, будет приятнее работать!
name02 вне форума  
 
Непрочитано 26.12.2024, 08:52
#4866
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Немного улучшил-упростил для использования:
- добавил обработку пустого набора
- убрал ненужные выводы в командную строку и сообщение об ошибке
- добавил отмену - Ctrl+Z вернет все в исходное состояние
name02
спасибо большое, теперь полноценный код, возврат к предыдущему состоянию сразу для всех текстов, а не по одному...
Так намного удобнее!
Ingpro вне форума  
 
Непрочитано 12.01.2025, 11:07
#4867
Ingpro


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


Объясните, пожалуйста разницу для этих строк:
Код:
[Выделить все]
 (setq ff "C:\\Program Files\\Autodesk\\AutoCAD 2015\\Fonts\\ARIAL.ttf")
; шрифт должен быть в папке Fonts AutoCAD

Код:
[Выделить все]
 (setq ff (strcat (getenv "WINDIR") "\\FONTS\\ARIAL.ttf"))
; (здесь версия автокада не указывается?)
должен ли быть шрифт в папке Fonts AutoCAD? или достаточно, чтобы он лежал в папке Windows?
Ingpro вне форума  
 
Непрочитано 12.01.2025, 11:51
| 1 #4868
koMon


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


складывать шрифты не *. shx в папку fonts автокада это просто какой-то бред, потому как они поддерживаются автокадом на системном уровне.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 12.01.2025, 13:05
#4869
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
складывать шрифты не *. shx в папку fonts автокада это просто какой-то бред, потому как они поддерживаются автокадом на системном уровне.
Значит эту строку лучше не использовать? Или только для .shx?
Код:
[Выделить все]
 (setq ff "C:\\Program Files\\Autodesk\\AutoCAD 2015\\Fonts\\ARIAL.ttf")
Ingpro вне форума  
 
Непрочитано 12.01.2025, 14:23
#4870
Кулик Алексей aka kpblc
Moderator

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


Какова конечная цель? Потому как складывать системные ttf хрен пойми куда - так себе затея ИМХО.

----- добавлено через ~1 мин. -----
И, кстати. Начиная с какой-то версии ACAD ttf можно положить просто в каталоги поиска, фонт даже регистрировать не надо - он подхватится.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2025, 14:55
#4871
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Какова конечная цель?
Просто хочу, чтобы мой стиль текста создавался при каждом открытии чертежа, у меня это получается, но нет уверенности в правильности кода...
Код:
[Выделить все]
 (defun c:create-txtst-Arl ( / *error* ss eo i ff oldcmd acadDoc)
(vl-load-com)
 (defun *error* (msg)
    (princ)
  ) ;_ end defun

(setq acadApp (vlax-get-Acad-object))
(setq acadDoc (vla-get-ActiveDocument acadApp))
(setq styles (vla-get-textstyles acadDoc))
 
(setq objStyle (vla-add styles "Arial0"))

(setq ff (strcat (getenv "WINDIR") "\\FONTS\\ARIAL.ttf"))
(vla-put-fontfile objStyle ff)

(vla-put-activetextstyle acadDoc objStyle)
(princ)
)
(c:create-txtst-Arl)
Нужно ли в этом коде делать проверку на наличие данного стиля текста?
Т. е. если я открываю чертеж, а в нём этот стиль уже есть?..
Ingpro вне форума  
 
Непрочитано 12.01.2025, 15:24
#4872
Кулик Алексей aka kpblc
Moderator

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


Насколько я помню, начиная примерно с 2010 версии проверять наличие уже не надо - vla-add в таком случае получит указатель на существующий стиль / слой / ...
Но вот будет ли оно работать, если стиль уже был, но на него назначен shx шрифт - вопрос. Я б подумал на предмет применения стандартов.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2025, 15:48
#4873
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я б подумал на предмет применения стандартов.
Имеются ввиду файлы стандартов подключенных к чертежу?

Последний раз редактировалось Ingpro, 12.01.2025 в 16:08.
Ingpro вне форума  
 
Непрочитано 12.01.2025, 16:19
1 | #4874
Кулик Алексей aka kpblc
Moderator

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


Ну да. Там, насколько я помню, можно много чего настроить
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2025, 12:02
#4875
Ingpro


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


Как можно выделить все размеры только определенного стиля на всем чертеже (или выбрать рамкой) и удалить или заменить на другой стиль?
Пытаюсь выделить и удалить, но выдает ошибку:
Код:
[Выделить все]
 (defun C:sel-dimst-del ( )
 (vl-load-com)
(vl-cmdf "_.erase" (ssget (quote ((0 . "*DIMENSION" "_dimstyle" "name-dim-style")))) "")
(princ)
)

Последний раз редактировалось Ingpro, 14.01.2025 в 10:13.
Ingpro вне форума  
 
Непрочитано 13.01.2025, 12:08
#4876
Кулик Алексей aka kpblc
Moderator

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


Со скобками разберись. (ssget '((0 . "*DIMENSION"))), а не та дичь, которую ты написал )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2025, 13:37
#4877
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Как можно выделить все размеры только определенного стиля на всем чертеже (или выбрать рамкой) и удалить или заменить на другой стиль?
Можно сделать так:
Код:
[Выделить все]
 (defun c:test (/ ss i a b new)

  ;; Выбор рамкой всех размеров с размерным стилем "Основной$3" (диаметры)
  (setq ss (ssget '((0 . "*DIMENSION") (3 . "Основной$3"))))

  (repeat (setq i (sslength ss))
    ;; Для удаления объектов из набора
    ;;(ssdel (ssname ss 0) ss)

    ;; Изменение размерного стиля на "Копия Основной"
    (setq a (ssname ss (setq i (1- i))))
    (setq b (entget a))
    (setq new (subst '(3 . "Копия Основной") (assoc 3 b) b))
    (entmod new)
  ) ;_ end repeat

  (princ)

) ;_ end defun
name02 вне форума  
 
Непрочитано 13.01.2025, 13:37
#4878
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Можно сделать так:
Код:
(defun c:test (/ ss i a b new)
;; Выбор рамкой всех размеров с размерным стилем "Основной$3" (диаметры)
(setq ss (ssget '((0 . "*DIMENSION") (3 . "Основной$3"))))
Спасибо, размеры с указанным стилем выбирает, но копию "Копия Основной" не создает и замену не выполняет...
Если стиль "Копия Основной" создать в чертеже, то замена происходит...
Или так и надо?

Последний раз редактировалось Ingpro, 13.01.2025 в 14:47.
Ingpro вне форума  
 
Непрочитано 13.01.2025, 13:54
#4879
Кулик Алексей aka kpblc
Moderator

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


#4877
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2025, 14:11
#4880
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Спасибо, но при загрузке снова выдает ошибку (; ошибка: излишние cdrs в точесной паре на входе), хотя размеры с указанным стилем выбирает, но копию и замену не выполняет...
При загрузке чего - файла в документ или при вызове программы?

Насчет копии и замены - ты же сам писал вот это:
Цитата:
Сообщение от Ingpro Посмотреть сообщение
Как можно выделить все размеры только определенного стиля на всем чертеже (или выбрать рамкой) и удалить или заменить на другой стиль?
Программа выделяет только размеры с определенным размерным стилем и меняет на другой.

Ты отладку программы в VLIDE делаешь или в блокноте?
name02 вне форума  
Ответ
Вернуться   Форум 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