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

Вернуться   Форум 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.
Просмотров: 1965735
 
Непрочитано 04.04.2018, 17:08
#3521
Кулик Алексей aka kpblc
Moderator

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


А если
Код:
[Выделить все]
(vl-cmdf "_AecConvertToTable" pause)
??
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.04.2018, 17:09
#3522
koMon


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


Цитата:
Сообщение от Alexll Посмотреть сообщение
Возможно ли при помощи subst заменить одну точечную пару на две?
Нет. Subst заменяет элемент списка на другой элемент списка. Если элемент списка ТП, то и замена должна быть одна ТП.

Цитата:
Сообщение от Alexll Посмотреть сообщение
При добавление точечной пары в примитив, необходимо ставить точечную пару в то место, где она обычно стоит, или можно добавить в начало?
Я думаю, что ТП встанет на своё место после выполнения entmod.

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от kurstep Посмотреть сообщение
Там только одна ручка для скрытия (ГРУППА - Гр2)
Это атрибут в составе динамического параметра видимости. Нужно из лиспа управлять видимостью этого параметра?
koMon вне форума  
 
Непрочитано 04.04.2018, 17:20
#3523
kurstep


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если
Код:
[Выделить все]
(vl-cmdf "_AecConvertToTable" pause)
??
Неа, так не получается
kurstep вне форума  
 
Непрочитано 04.04.2018, 17:45
#3524
Alexll


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Нет. Subst заменяет элемент списка на другой элемент списка. Если элемент списка ТП, то и замена должна быть одна ТП.
Понял. спасибо, а то и дальше бы с этим вариантом бился... )

Цитата:
Сообщение от koMon Посмотреть сообщение
Это атрибут в составе динамического параметра видимости. Нужно из лиспа управлять видимостью этого параметра?
Да. Хочу потом все выделить, и все спрятать, что бы на каждый не тыкать.
Alexll вне форума  
 
Непрочитано 05.04.2018, 10:50
1 | 1 #3525
koMon


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


Цитата:
Сообщение от Alexll Посмотреть сообщение
Да. Хочу потом все выделить, и все спрятать, что бы на каждый не тыкать.
Чисто в качестве теста)

Код:
[Выделить все]
 
(defun c:Dyn_Visibility_Off ()
	(setq acad_Object (vlax-get-acad-object)
		  document_object (vla-get-ActiveDocument acad_Object)
		  document_Selection_sets (vla-get-SelectionSets document_object)
		  there_is_Blocks_Sset nil
	)
	(vlax-for selection_set document_Selection_sets
		(if (= "Blocks_Sset" (vla-get-name selection_set))
			(setq there_is_Blocks_Sset t
				  Blocks_sset_Object selection_set
			)
		)
	)
	(if there_is_Blocks_Sset
		(progn
			(vla-delete Blocks_sset_Object)
			(vlax-release-object Blocks_sset_Object)
			(setq Blocks_sset_Object (vla-Add document_Selection_sets "Blocks_Sset"))
		)
		(setq Blocks_sset_Object (vla-Add document_Selection_sets "Blocks_Sset"))
	)
	(setq group_Code (vlax-make-safearray vlax-vbInteger '(0 . 0))
		  vlax_function_executed (vlax-safearray-put-element group_Code 0 0)
	      data_Value (vlax-make-safearray vlax-vbVariant '(0 . 0))
	      vlax_function_executed (vlax-safearray-put-element data_Value 0 "INSERT")
		  vlax_function_executed (vl-catch-all-apply 'vla-SelectOnScreen (list Blocks_sset_Object group_Code data_Value))
	)

	(if (< (vla-get-count Blocks_sset_Object) 1)
		(princ "\nНичего не выбрано или команда прервана.")
		(progn
		    (vlax-for sset_block Blocks_sset_Object	(vla-highlight sset_block :vlax-true))
			(setq initget_setting (initget 1 "Показать Скрыть")
				  Visibility_Action (vl-catch-all-apply 'GetKWord (list "\nСвойство \"Видимость1\" [Показать/Скрыть]?"))
			)
			(vlax-for sset_block Blocks_sset_Object
				(if (> (vlax-safearray-get-u-bound (vlax-variant-value (vla-GetDynamicBlockProperties sset_block)) 1) 0)
						(if (setq visibility_object_found (car
															   (vl-member-if '(lambda (dyn_property) (= "Видимость1" (vla-get-PropertyName dyn_property)))
																		      (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties sset_block)))
														  	   )
														  )
							)
							(if (/= Visibility_Action (vla-get-PropertyName visibility_object_found))
								(vla-put-Value visibility_object_found Visibility_Action)
							)
						)
				)
				(vla-highlight sset_block :vlax-false)
			)
		)
	)
	(princ)
)

Последний раз редактировалось koMon, 05.04.2018 в 15:26.
koMon вне форума  
 
Непрочитано 24.04.2018, 17:23
#3526
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Товарищи дорогие, помогите!

Пытался вынуть содержимое из атрибута блока и напоролся на такую штуку - в описании атрибута дважды встречается список с его содержимым, причем первый список содержит только фрагмент, а полное содержимое во втором.
"(cdr (assoc 1 (entget ..." цепляет первый список. Как добраться до второго списка с полным текстом?

Код:
[Выделить все]
Команда: (entget(car(entsel)))
Выберите объект: ((-1 . <Имя объекта: 7ef2ef50>) (0 . "ATTDEF") (5 . "6A") (102 
. "{ACAD_XDICTIONARY") (360 . <Имя объекта: 7ef2ef58>) (102 . "}") (330 . <Имя 
объекта: 7ef2ec10>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . 
"BC-АТРИБУТЫ") (100 . "AcDbText") (10 -2.91064e-011 -13.8363 0.0) (40 . 2.5)
 (1 . "Шкаф для установки приборов системы") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . 
"ISOCPEUR") (71 . 0) (72 . 0) (11 -2.91064e-011 -12.5863 0.0) (210 0.0 0.0 1.0) 
(100 . "AcDbAttributeDefinition") (280 . 0) (3 . "") (2 . "ТЕХНИЧЕСКАЯ_ХАР-КА") 
(70 . 9) (73 . 0) (74 . 2) (280 . 1) (71 . 4) (72 . 0) (11 -2.91064e-011 
-12.5863 0.0) (101 . "Embedded Object") (10 -2.91064e-011 -12.5863 0.0) (40 . 
2.5) (41 . 161.512) (46 . 0.0) (71 . 4) (72 . 5) (1 . "Шкаф для установки. 
приборов системы \"Орион\" на DIN рейки. Содержит источник \"РИП-12 RS\", 
автомат защиты по 220В и УЗО. Место для установки одного или двух батарей 
12В-17АЧ. ") (7 . "ISOCPEUR") (210 0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 152.125) 
(43 . 7.41667) (50 . 0.0) (73 . 1) (44 . 1.0))
Пример блока во вложении.

Вложения
Тип файла: dwg
DWG 2010
ШПС.dwg (283.8 Кб, 17 просмотров)
Nike на форуме  
 
Непрочитано 24.04.2018, 18:12
#3527
Сергей812


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


еще бы сохраняли чертеж не из редактора блока)
Сергей812 вне форума  
 
Непрочитано 24.04.2018, 18:19
#3528
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Сергей812, это "wblock" мне так наэкспортировал.
Nike на форуме  
 
Непрочитано 24.04.2018, 21:04
1 | #3529
koMon


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


Цитата:
Сообщение от Nike Посмотреть сообщение
"(cdr (assoc 1 (entget ..." цепляет первый список. Как добраться до второго списка с полным текстом?
А если так?

Код:
[Выделить все]
 
(setq block_object (vlax-ename->vla-object (car (entsel "\nВыберите блок с атрибутами: ")))
      attributes_list (vlax-safearray->list (vlax-variant-value (vla-getattributes block_object)))
)
(princ "\n\n")
(foreach attribute_item attributes_list
  	(princ (strcat (vla-get-tagstring attribute_item) ": " (vla-get-textstring attribute_item) "\n"))
) 
koMon вне форума  
 
Непрочитано 24.04.2018, 21:36
1 | #3530
Кулик Алексей aka kpblc
Moderator

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


Забыл про постоянные атрибуты...
Как один из вариантов:
Код:
[Выделить все]
 (defun _kpblc-block-attr-get-pointer-mask (blk mask / _kpblc-conv-vla-to-list)
                                          ;|
*    Получение списка атрибутов блока по маске. Учитываются также постоянные атрибуты.
*    Параметры вызова:
  blk      указатель на вставку блока. Без проверки типа.
  mask     строка с маской тэга атрибута
|;
  (defun _kpblc-conv-vla-to-list (value / res) ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;  (cond ((listp value) (mapcar (function _kpblc-conv-vla-to-list) value))
          ((= (type value) 'variant) (_kpblc-conv-vla-to-list (vlax-variant-value value)))
          ((= (type value) 'safearray)
           (if (>= (vlax-safearray-get-u-bound value 1) 0)
             (_kpblc-conv-vla-to-list (vlax-safearray->list value))
             ) ;_ end of if
           )
          ((vlax-property-available-p value 'count)
           (vlax-for sub (_kpblc-conv-ent-to-vla value) (setq res (cons sub res)))
           )
          (t value)
          ) ;_ end of cond
    ) ;_ end of defun
  (if (and blk
           (setq blk (cond ((= (type blk) 'ename) (vlax-ename->vla-object blk))
                           ((= (type blk) 'vla-object) blk)
                           ) ;_ end of cond
                 ) ;_ end of setq
           (wcmatch (strcase (vla-get-objectname blk)) "*BLOCKREF*")
           (or (and (vlax-property-available-p blk 'hasattributes)
                    (equal (vla-get-hasattributes blk) :vlax-true)
                    (> (vlax-safearray-get-u-bound (vlax-variant-value (vla-getattributes blk)) 1) -1)
                    ) ;_ end of and
               (and (vlax-method-applicable-p blk 'getconstantattributes)
                    (> (vlax-safearray-get-u-bound (vlax-variant-value (vla-getconstantattributes blk)) 1) -1)
                    ) ;_ end of and
               ) ;_ end of or
           ) ;_ end of and
    (progn (if (not mask)
             (setq mask "*")
             ) ;_ end ofif
           (vl-remove-if-not (function (lambda (x) (wcmatch (strcase (vla-get-tagstring x)) (strcase mask))))
                             (apply (function append)
                                    (mapcar (function _kpblc-conv-vla-to-list)
                                            (list (vla-getattributes blk) (vla-getconstantattributes blk))
                                            ) ;_ end of mapcar
                                    ) ;_ end of apply
                             ) ;_ end of vl-remove-if-not
           ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
----- добавлено через ~1 мин. -----
Ну и пример вызова:
Код:
[Выделить все]
 (foreach att (_kpblc-block-attr-get-pointer-mask (car (entsel)) nil)
  (princ (strcat "\nTag : \"" (vla-get-tagstring att) "\"; value = \"" (vla-get-textstring att) "\""))
  ) ;_ end of foreach
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.04.2018, 08:52
#3531
koMon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Забыл про постоянные атрибуты...
ну, для нэофита, я думаю это простительно)
koMon вне форума  
 
Непрочитано 25.04.2018, 12:17
#3532
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Кулик Алексей aka kpblc, koMon, спасибо, коды работают, но они работают собственно с блоками.
А я копаюсь в свойствах определения атрибута.

Вот в этом блоке текст из атрибута вообще размазался по двум группам
И как его поднять?

Код:
[Выделить все]
Команда: (entget(car(entsel)))
Выберите объект: ((-1 . <Имя объекта: 7ef61f50>) (0 . "ATTDEF") (5 . "6A") (102 
. "{ACAD_XDICTIONARY") (360 . <Имя объекта: 7ef61f58>) (102 . "}") (330 . <Имя 
объекта: 7ef61c10>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . 
"BC-АТРИБУТЫ") (100 . "AcDbText") (10 -2.91064e-011 -13.8363 0.0) (40 . 2.5) (1 
. "Адресный расширитель. Размещается внутри охранного") (50 . 0.0) (41 . 1.0) 
(51 . 0.0) (7 . "ISOCPEUR") (71 . 0) (72 . 0) (11 -2.91064e-011 -12.5863 0.0) 
(210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (280 . 0) (3 . "") (2 . 
"ТЕХНИЧЕСКАЯ_ХАР-КА") (70 . 9) (73 . 0) (74 . 2) (280 . 1) (71 . 4) (72 . 0) 
(11 -2.91064e-011 -12.5863 0.0) (101 . "Embedded Object") (10 -2.91064e-011 
-12.5863 0.0) (40 . 2.5) (41 . 93.2144) (46 . 0.0) (71 . 4) (72 . 5) (3 . 
"Адресный расширитель. Размещается внутри охранного извещателя, питается от 
двухпроводной линии, передает состояние контактов сигнального реле (на 
замыкание) и датчика вскрытия корпуса через «С2000-КДЛ» на пульт «С2000» или 
АРМ. Рабочая температура от")  (1 . " минус 30 до +50°С") (7 . "ISOCPEUR") (210 
0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 0.0) (43 . 0.0) (50 . 0.0) (73 . 1) (44 . 
1.0))
Вложения
Тип файла: dwg
DWG 2010
С2000Р-АРР32.dwg (281.5 Кб, 5 просмотров)
Nike на форуме  
 
Непрочитано 25.04.2018, 13:12
1 | 1 #3533
Кулик Алексей aka kpblc
Moderator

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


Уже говорили - не надо было сохранять под редактором блоков.
Второе. Атрибут имеет как минимум 2 характеристики: TagString и TextString. Для многострочного атрибута есть еще и свойство MTextAttributeContent.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.04.2018, 13:35
#3534
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Кулик Алексей aka kpblc, спасибо, понятно. Что ничего не понятно.
Делал массовый экспорт блоков (много) из одного файла каждый блок в свой файл с помощью wblock - нашел несколько программ и все они в таком разблоченном виде выдают.
Чтоб в нормальном виде блоки были - не нашел.
Буду теперь искать способ все файлы массово заблочивать и читать уже атрибуты, а не их определения.

ЗЫ Wipeout-ы все наверх повылезают..
Nike на форуме  
 
Непрочитано 25.04.2018, 14:11
1 | #3535
koMon


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


Цитата:
Сообщение от Nike Посмотреть сообщение
А я копаюсь в свойствах определения атрибута.
ну тогда так?

Код:
[Выделить все]
 
(setq attdef_object (vlax-ename->vla-object (car (entsel "\nВыберите определение арибута: "))))
(princ "\n\n")
(princ (strcat (vla-get-tagstring attdef_object) ": " (vla-get-textstring attdef_object) "\n"))
koMon вне форума  
 
Непрочитано 25.04.2018, 14:27
#3536
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


koMon, да! Спасибище!!!
Nike на форуме  
 
Непрочитано 27.04.2018, 16:13 Вопрос
#3537
sathalex


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


Здравствуйте.
У меня в программе есть две переменные st1 и st2. Им назначено численное значение.
Код:
[Выделить все]
 (defun sl_check ()
(vl-load-com)
(vla-GetBoundingBox
    (vlax-ename->vla-object
      (car (entsel "\nУкажите объект <Esc для выхода>: ")))
    'minpt
    'maxpt)
  (setq st1 (rtos (last (vlax-safearray->list minpt)) 2 3))
  (setq st2 (rtos (last (vlax-safearray->list maxpt)) 2 3))
  )
Я пытаюсь создать третью переменную (разницу первых двух)
Код:
[Выделить все]
 (setq st3 (- st2 st1))
но ничего не выходит. Помогите советом, как это реализовать правильно.
Разобрался:
Код:
[Выделить все]
 (setq st3 (rtos (- (last (vlax-safearray->list maxpt)) (last (vlax-safearray->list minpt))) 2 3)

Последний раз редактировалось sathalex, 04.05.2018 в 12:53. Причина: сам разобрался
sathalex вне форума  
 
Непрочитано 27.04.2018, 17:01
#3538
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от sathalex Посмотреть сообщение
Им назначено численное значение.
Это было бы правдой, если бы не rtos
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2018, 23:39
#3539
mindchamber


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


^C^Cразметить \ Б пс 2

Хочу сделать автоматический макрос для разметки линии блоком. Почему не работает? Спасибо
mindchamber вне форума  
 
Непрочитано 30.04.2018, 12:39
1 | 1 #3540
Кулик Алексей aka kpblc
Moderator

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


Выполняй команду через ком.строку и смотри на запросы. Это будет быстрее и проще, чем гадать.
__________________
Моя библиотека 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