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

Вернуться   Форум 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.
Просмотров: 2054782
 
Непрочитано 09.08.2024, 12:41
#4741
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сет Посмотреть сообщение
Перпендикулярно чему?
Меняешь UCS, ждешь, что пользователь будет вести плюс-минус около оси Ox. А он бац - и вдоль оси Oy текущей UCS
Цитата:
Сообщение от Сет Посмотреть сообщение
Вроде простого включения МСК будет достаточно.
А кто сказал, что при старте кода система координат была мировой?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.08.2024, 12:50
#4742
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Меняешь UCS, ждешь, что пользователь будет вести плюс-минус около оси Ox. А он бац - и вдоль оси Oy текущей UCS
Да, есть такой нюанс. Надо просто его учитывать. На мой взгляд это лучше, чем тыкать вообще наугад и потом программно устанавливать точку на одну общую прямую.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А кто сказал, что при старте кода система координат была мировой?
Так как я делаю программки чисто для себя, то можно сказать, что при старте всегда МСК. Я редко трогаю систему координат. А если затрону - ну опять же, просто надо будет иметь ввиду, что после отработки этой команды - система переключится на МСК.

----- добавлено через ~2 мин. -----
Кстати, проблему с перпендикулярным вводом частично можно уменьшить, если начало координат закинуть подальше, чтобы физически сложно было выбрать перпендикулярный режим.
Сет вне форума  
 
Непрочитано 09.08.2024, 12:54
1 | #4743
name02


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


Можно сделать так:
Код:
[Выделить все]
 (defun c:test (/ pt0 pt1 pt2 pt3 line1)

  (setq pt1 (getpoint "\nУкажите точку 1:"))
  (setq pt2 (getpoint pt1 "\nУкажите точку 2:"))

  (command-s "_LINE" pt1 pt2 "")

  (setq line1 (entlast))

  (vl-cmdf "_lengthen" "_dy" (list line1 pt2) pause "")

  (setq pt0 (cdr (assoc 10 (entget line1))))

  (if (or (equal pt0 pt1) (equal pt0 pt2))
    (setq pt3 (cdr (assoc 11 (entget line1))))
    (setq pt3 pt0)
  ) ;_ END_OF if

) ;_ END_OF defun
name02 вне форума  
 
Непрочитано 09.08.2024, 14:13
#4744
Сет


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Можно сделать так:
Выглядит неплохо.
Сет вне форума  
 
Непрочитано 12.08.2024, 21:59
#4745
NewNeo


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


Доброй ночи!
Подскажите как в коде указать универсальный путь к файлу шаблона? Если ввести конструкцию %UserName% в пути напрямую, то не работает(
Дали идею:
(getenv "%appdata%")
(getenv "%userprofile%")
Но как применить в коде не знаю, мои знания в язык LISP равны нулю к сожалению(

Код:
[Выделить все]
 (vl-load-com)

(defun c:set-def-settings (/ acad_obj files)
  (setq acad_obj (vlax-get-acad-object)
        files    (vla-get-files (vla-get-preferences acad_obj))
  )
  (vla-put-qnewtemplatefile files "C:\\Users\\%%UserName%%\\AppData\\Local\\Autodesk\\C3D 2024\\rus\\Template\\ACAD metric.dwt")
  (vla-put-templatedwgpath files "C:\\Users\\%%UserName%%\\AppData\\Local\\Autodesk\\C3D 2024\\rus\\Template")
  (princ)
)
NewNeo вне форума  
 
Непрочитано 13.08.2024, 07:37
#4746
name02


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


У тебя неправильно написаны переменные, нужно так:
(getenv "APPDATA")
(getenv "USERPROFILE")


Если нужно только имя пользователя:
(getvar "LOGINNAME")

Для объединения строк используется оператор strcat
name02 вне форума  
 
Непрочитано 21.08.2024, 11:47
#4747
Сет


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


Подскажите, каким образом можно добраться до свойств массива (расстояние между строками, столбцами, количество строк, столбцов), чтобы их изменить?
Сет вне форума  
 
Непрочитано 21.08.2024, 12:01
#4748
Кулик Алексей aka kpblc
Moderator

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


ИМХО никак. В СОМ-модели соответствующие свойства вроде бы не проброшены, да и в ename-представлении динамический массив - всего лишь анонимный блок. Правда, со своими реакторами и словарями.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.08.2024, 12:04
#4749
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ИМХО никак. В СОМ-модели соответствующие свойства вроде бы не проброшены, да и в ename-представлении динамический массив - всего лишь анонимный блок. Правда, со своими реакторами и словарями.
Поискал информацию в интернете - удивился, что ничего такого не нашлось по изменению свойств массивов. А ведь через палитру Свойства - это возможно. Получается надо удалять старый массив и затем создавать новый с нужными параметрами.
Сет вне форума  
 
Непрочитано 21.08.2024, 12:25
#4750
Кулик Алексей aka kpblc
Moderator

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


Или расковыривать словари на примитиве - насколько я помню, там что-то мелькало.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2024, 09:31
#4751
Сет


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


А можно ли добраться простым способом до шага динамического массива? Вот здесь это сделано, но через открытие редактора блоков. Это слишком неудобно.
Сет вне форума  
 
Непрочитано 22.08.2024, 09:37
#4752
Кулик Алексей aka kpblc
Moderator

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


Я же говорю - вскрывай словари.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2024, 09:40
#4753
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я же говорю - вскрывай словари.
Пока что не сталкивался с ними, абсолютно новая для меня тема. Надо изучать.
Сет вне форума  
 
Непрочитано 22.08.2024, 10:02
1 | #4754
Кулик Алексей aka kpblc
Moderator

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


Ну как-то так примерно
Миниатюры
Нажмите на изображение для увеличения
Название: 2024-08-22_10-04-18.png
Просмотров: 42
Размер:	44.9 Кб
ID:	264333  
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2024, 10:42
#4755
Сет


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


А можно ли через vla-функции создать массив, который получается командой _array? Есть функция ArrayRectangular, она создает просто набор отдельных объектов, а нужно чтобы результат был в виде единого объекта.
Сет вне форума  
 
Непрочитано 22.08.2024, 12:09
#4756
Сет


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


Не придумал как сделать из набора примитивов обычный автокадовский массив с ручками, обернул набор в анонимный блок. Ниже реализация. Посмотрите, нет ли там каких-то явных глупостей в коде, может что-то можно сделать проще.
Функция создает объект, представляющий собой заводской сварной шов - небольшой отрезок с некоторым шагом. Геометрия пока жестко прописана в коде (длина отрезка и максимальный шаг отрезков).
Код:
[Выделить все]
 (vl-load-com)
(setq acad_application (vlax-get-acad-object))
(setq active_document (vla-get-ActiveDocument acad_application))
(setq model_space (vla-get-ModelSpace active_document))

(defun c:asd (/ pt1 pt2 pt3 len n line blc)
    (setq pt1 (getpoint "\nПервая точка:"))
    (setq pt2 (getpoint pt1 "\nВторая точка:"))
    (setq len (distance pt1 pt2))
    (setq n 1)
    (while (> (/ len n) 130)
	(setq n (1+ n))
    ) ; while
    (setq pt3 (polar pt1 (/ pi 2) 130))
    (setq blc (vla-add (vla-get-blocks active_document) (vlax-3d-point pt1) "*U"))
    (setq line (vla-AddLine blc (vlax-3d-point pt1) (vlax-3d-point pt3)))
    (vla-ArrayRectangular line 1 (1+ n) 1 1 (/ len n) 1)
    (vla-insertblock model_space (vlax-3d-point pt1) (vla-get-name blc) 1.0 1.0 1.0 (angle pt1 pt2))
    (princ)
) ; defun
Сет вне форума  
 
Непрочитано 04.10.2024, 12:13
#4757
nikkomp


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


Использую вот зтот код
Код:
[Выделить все]
;|=============================================================================
*    проверка размеров на правильность проставления. Вручную проставленные
* размеры меняют цвет на 1, вес линии на 2.11 мм. Переназначения текста не
* выполняется
=============================================================================|;
(defun c:kpblc-dimcheck (/ *kpblc-activedoc* selset item temp_text)
  (vl-load-com)
  (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark *kpblc-activedoc*)
  (setq selset (ssget '((0 . "DIMENSION"))))
  (while (and selset
	      (> (sslength selset) 0)
	      (setq item (ssname selset 0))
	      (ssdel item selset)
	      ) ;_ end of and
    (setq item (vlax-ename->vla-object item))
    (if	(and (/= (vla-get-textoverride item) "")
    (not (wcmatch (vla-get-textoverride item) "*<>*"))
	     ) ;_ end of and
      (progn
	(vla-put-color item 1)		; цвет - красный
	(vla-put-lineweight item 211)	; вес линии - 2.11
        (vla-put-TextColor item 6)      ; цвет - фиолетовый
	(setq temp_text (vla-get-textoverride item))
	(vla-put-TextOverride item (strcat "%%u" temp_text)) ; текст - подчеркнутый
	) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of while
  (vla-endundomark *kpblc-activedoc*)
  (princ)
  ) ;_ end of defun
Можно добавить команду, чтобы все эти перебитые размеры переносились в определенный, желательно новый слой?
nikkomp вне форума  
 
Непрочитано 04.10.2024, 12:35
1 | #4758
Кулик Алексей aka kpblc
Moderator

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


Ну создай перед while свой слой, и в конце после vla-put-textoverride добавь (vla-put-layer item <Имя твоего слоя>)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.11.2024, 11:56
#4759
Ingpro


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


Как программно выбрать все тексты или Мтексты на чертеже с одинаковым содержанием,
указав на нужный текст в чертеже. Мтекст может быть многострочным.
Код:
[Выделить все]
 (defun c:Sel-mtxt ( )
(sssetfirst nil (ssget "_A" (list (cons 0 "*TEXT") 
(cons 1 (getstring "\nВведите строку для поиска: ")))))
Здесь нужно ввести текст в командную строку
Но мне нужно выбрать текст на экране

Код:
[Выделить все]
 (setq e (entsel "Please choose an object: "))
эта строка выбирает объект и выводит имя объекта и координаты
(<Имя объекта: 7ffffb0c620> (12816.6 1477.96 0.0))
(<Имя объекта: 7ffffb0c610> (11643.9 2491.88 0.0))
(<Имя объекта: 7ffffb0c630> (13407.1 1037.49 0.0))
Для мтекстов с одинаковым содержанием выводятся различные имена...
Возможно ли выбрать одинаковые мтексты как одинаковые объекты, указав на мтекст-образец?
Ingpro вне форума  
 
Непрочитано 09.11.2024, 16:21
#4760
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Ingpro Посмотреть сообщение
эта строка выбирает объект и выводит имя объекта и координаты
(<Имя объекта: 7ffffb0c620> (12816.6 1477.96 0.0))
(<Имя объекта: 7ffffb0c610> (11643.9 2491.88 0.0))
(<Имя объекта: 7ffffb0c630> (13407.1 1037.49 0.0))
Для мтекстов с одинаковым содержанием выводятся различные имена...
если будут выводить одинаковые имена - это битая БД чертежа)

Цитата:
Сообщение от Ingpro Посмотреть сообщение
Возможно ли выбрать одинаковые мтексты как одинаковые объекты, указав на мтекст-образец?
деформатирование исходного образца-мультитекста, в цикле по всем мультитекстам в чертеже деформатировать их содержимое и сравнивать "чистые" текстовые значения.
Сергей812 вне форума  
Ответ
Вернуться   Форум 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