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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос для назначения выбранным объектам свойств цвета и веса линий "по слою"

Макрос для назначения выбранным объектам свойств цвета и веса линий "по слою"

Ответ
Поиск в этой теме
Непрочитано 04.02.2021, 15:11 #1
Макрос для назначения выбранным объектам свойств цвета и веса линий "по слою"
SeRioOuS
 
проектирование автомобильных дорог
 
Москва
Регистрация: 15.11.2019
Сообщений: 55

В заголовке все сказано, может кто-то помочь с такой командой? Очень нужно для монотонного редактирования объектов в разных файлах...
Макрос для назначения выбранным объектам свойств цвета и веса линий "по слою"
Просмотров: 6382
 
Непрочитано 04.02.2021, 15:14
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Либо окно свойств, либо SETBYLAYER
Boxa вне форума  
 
Непрочитано 04.02.2021, 15:27
1 | #3
CaMoCAD


 
Регистрация: 25.03.2008
Зелик
Сообщений: 1,576


я себе такую кнопку сделал "Сделать по-Ленински" - на кнопке Ильич 16-битный, а под кнопкой вот такой макросик:
^C^C_change;p;c;byl;lt;byl;lw;byl;;
Сначала выделяем объекты, хоть 1, хоть рамкой, - потом говорим "ЛЕНИН ЖИВ" и в тот же миг цвет(c), тип линии(lt) и вес линии(lw) становятся "по дефолту слоя" (byl). Можно и добавить чего-нить, да мне не надо.
__________________
* Буква "ё" не используется в тексте исключительно в связи с требованиями ЕСКД.
CaMoCAD вне форума  
 
Автор темы   Непрочитано 04.02.2021, 15:35
#4
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 55


Цитата:
Сообщение от CaMoCAD Посмотреть сообщение
я себе такую кнопку сделал "Сделать по-Ленински" - на кнопке Ильич 16-битный, а под кнопкой вот такой макросик:
^C^C_change;p;c;byl;lt;byl;lw;byl;;
Сначала выделяем объекты, хоть 1, хоть рамкой, - потом говорим "ЛЕНИН ЖИВ" и в тот же миг цвет(c), тип линии(lt) и вес линии(lw) становятся "по дефолту слоя" (byl). Можно и добавить чего-нить, да мне не надо.
почти то, что нужно)
только цвет назначает не "по слою", а задает именно цвет слоя. Это важно)
И почему-то на текст и отрезки не действует...
SeRioOuS вне форума  
 
Непрочитано 04.02.2021, 15:50
#5
CaMoCAD


 
Регистрация: 25.03.2008
Зелик
Сообщений: 1,576


Моя вина. Наверное, неправильно понял задачу
Каждый объект принимает свойства своего слоя, не меняя его. Если объектов много, то каждый станет "Ленинским" по-понятиям своего слоя. Слой объекты не меняют. Свойства слоя тоже. Действует и на отрезки и на тексты, хоть на солиды
PS 1 - сначала выбор
2 - потом Ленин
__________________
* Буква "ё" не используется в тексте исключительно в связи с требованиями ЕСКД.
CaMoCAD вне форума  
 
Автор темы   Непрочитано 04.02.2021, 16:34
#6
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 55


Цитата:
Сообщение от CaMoCAD Посмотреть сообщение
Моя вина. Наверное, неправильно понял задачу
Каждый объект принимает свойства своего слоя, не меняя его. Если объектов много, то каждый станет "Ленинским" по-понятиям своего слоя. Слой объекты не меняют. Свойства слоя тоже. Действует и на отрезки и на тексты, хоть на солиды
PS 1 - сначала выбор
2 - потом Ленин
Что-то я, наверное, сделал не так... Сейчас после нажатия на Ленинскую кнопку автокад начинает со мной диалог в командной строке, стартуя команду "Изменить"... Как это работает - мне не понятно, из Вашего макроса удалил только ненужный мне тип линий.
С задачей частично справился обычным рекордером операций... Не кнопочка, конечно, но тоже сойдет)
SeRioOuS вне форума  
 
Непрочитано 04.02.2021, 17:05
#7
CaMoCAD


 
Регистрация: 25.03.2008
Зелик
Сообщений: 1,576


Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Сейчас после нажатия на Ленинскую кнопку автокад начинает со мной диалог в командной строке
Еще раз: сначала выбор объектов для изменения, только потом - кнопка. Тогда для команды CHANGE уже будет сформирован последний набор объектов (p-previous), с которым она тут же начнет работать.
Сделать наоборот у меня не получилось уже не помню почему, кажется, из-за каких-то нелогичных особенностей CHANGE или SELECT
PS aCAD2016 x64 WIN10 - все работает
__________________
* Буква "ё" не используется в тексте исключительно в связи с требованиями ЕСКД.
CaMoCAD вне форума  
 
Непрочитано 04.02.2021, 17:11
#8
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от CaMoCAD Посмотреть сообщение
Еще раз: сначала выбор объектов для изменения, только потом - кнопка. Тогда для команды CHANGE уже будет сформирован последний набор объектов (p-previous), с которым она тут же начнет работать.
Сделать наоборот у меня не получилось уже не помню почему, кажется, из-за каких-то нелогичных особенностей CHANGE или SELECT
PS aCAD2016 x64 WIN10 - все работает
pickfirst ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.02.2021, 17:27
#9
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 55


Ну шо уж вы... Я с первого раза понял, что сначала объекты выбираем, потом Ленина будоражим. Автокад 2021, винда 10
Вот командная строка:

Команда: Задайте противоположный угол или [Линия/РМн-угол/СМн-угол]:
Команда:
Команда:
Команда: _change
найдено: 106
Точка изменения или [Свойства]: p
Требуется точка или ключевое слово.
SeRioOuS вне форума  
 
Непрочитано 04.02.2021, 17:30
#10
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Ну шо уж вы... Я с первого раза понял, что сначала объекты выбираем, потом Ленина будоражим. Автокад 2021, винда 10
Вот командная строка:

Команда: Задайте противоположный угол или [Линия/РМн-угол/СМн-угол]:
Команда:
Команда:
Команда: _change
найдено: 106
Точка изменения или [Свойства]: p
Требуется точка или ключевое слово.
https://autolisp.ru/2010/03/04/localization/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.02.2021, 17:52
#11
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 55


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
^C^C_.change;_p;_color;_bylayer;_lineweight;_bylayer;;

Сделал вот так, но ничего не изменилось. В каком месте не туда воюю?)
SeRioOuS вне форума  
 
Непрочитано 04.02.2021, 21:39
#12
Кулик Алексей aka kpblc
Moderator

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


Без понятия. Я уже очень давно использую команды только там, где это реально необходимо. Для таких задач я бы лисп писал, но никак не DIESEL-выражение
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.02.2021, 23:33
#13
EStranger


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


А если так, ребята?
^C^C(Command "_.CHANGE" "_p" "" "_p" "_Color" "_BYLAYER" "_LType" "_BYLAYER" "_LWeight" "_BYLAYER" "")

Повесим на кнопочку малюсенький LISP-код вместо DIESEL. Вроде нормально работает...
EStranger вне форума  
 
Непрочитано 05.02.2021, 06:45
#14
Vladimir_Sergeevich

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


лиспом это как то так.

Код:
[Выделить все]
 (defun by-lay-col-lw-lt (  / locked adoc)
	(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
		locked 0
		)
	(vla-startUndoMark adoc)
	(vlax-for obj (sad-get-ss nil) 
		(if (= (vla-get-Lock (vla-item (vla-get-Layers (vla-get-Database adoc)) (vla-get-Layer obj))) :vlax-false)
			(progn
				(vla-put-Color obj 256)
				(vla-put-LineWeight obj -1)
				(vla-put-LineType obj "ByLayer")
			)
			(setq locked (1+ locked))
		)
	)	
	(if (/= locked 0) (princ (strcat "\nНа блокированном слое " (itoa locked) " объектов.")))
	(vla-endUndoMark adoc)
	(princ);;silent end
)

(defun by-cur-col-lw-lt-lay (  / locked adoc)
	(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
		locked 0
	)
	(vla-startUndoMark adoc)
	(vlax-for obj (sad-get-ss nil) 
		(if (= (vla-get-Lock (vla-item (vla-get-Layers (vla-get-Database adoc)) (vla-get-Layer obj))) :vlax-false)
			(progn
				(vla-put-Color obj (getvar "CECOLOR"))
				(vla-put-LineWeight obj (getvar "CELWEIGHT"))
				(vla-put-LineType obj (getvar "CELTYPE"))
				(vla-put-Layer obj (vla-get-Name (vla-get-ActiveLayer adoc)))
			)
			(setq locked (1+ locked))
		)
	)	
	(if (/= locked 0) (princ (strcat "\nНа блокированном слое " (itoa locked) " объектов.")))
	(vla-endUndoMark adoc)
	(princ);;silent end
)

(defun sad-get-ss (filter_lst / temp ss code_lst filter_value_lst) ;|получение набора, возвращает объект IAcadSelectionSet
	(sad-get-ss nil)
	Фильтр вида '((0 "TEXT") (8 "0"))
	возвращает IAcadSelectionSet
	пустой выбор недопустим
	|;
(setq temp t
	ss (vla-get-PickfirstSelectionSet (vla-get-activeDocument (vlax-get-acad-object))) 
	code_lst '()
	filter_value_lst '()
);;#<VLA-OBJECT IAcadSelectionSet 136be084>
(if filter_lst
	(progn
		(foreach f filter_lst ;;sorting
			(setq code_lst (cons (car f) code_lst)
			filter_value_lst (cons (cadr f) filter_value_lst)
			)
		)
		(setq ;;convert to safearray
			code_lst
			(vlax-safearray-fill
				(vlax-make-safearray 
					vlax-vbInteger
					(cons 0 (1- (length filter_lst)))
				)
				code_lst
			)
			filter_value_lst
			(vlax-safearray-fill
				(vlax-make-safearray
					vlax-vbVariant
					(cons 0 (1- (length filter_lst)))
				)
				filter_value_lst
			)
		) 
	)
)
;;(while temp
  (if (= (vla-get-Count ss) 0)
	(vla-SelectOnScreen ss
		code_lst ;;kodes of filters (variant) (list of DXF codes)
		filter_value_lst ;;filters (list of values DXF codes)
	)
	;;(setq temp nil)
  )
;;)
ss
)



только я уже забыл, когда сам последний раз пользовался, культура оформления графики решает больше лиспа
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 05.02.2021, 11:38
#15
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 55


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
лиспом это как то так.

Код:
[Выделить все]
 (defun by-lay-col-lw-lt (  / locked adoc)
	(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
		locked 0
		)
	(vla-startUndoMark adoc)
	(vlax-for obj (sad-get-ss nil) 
		(if (= (vla-get-Lock (vla-item (vla-get-Layers (vla-get-Database adoc)) (vla-get-Layer obj))) :vlax-false)
			(progn
				(vla-put-Color obj 256)
				(vla-put-LineWeight obj -1)
				(vla-put-LineType obj "ByLayer")
			)
			(setq locked (1+ locked))
		)
	)	
	(if (/= locked 0) (princ (strcat "\nНа блокированном слое " (itoa locked) " объектов.")))
	(vla-endUndoMark adoc)
	(princ);;silent end
)

(defun by-cur-col-lw-lt-lay (  / locked adoc)
	(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
		locked 0
	)
	(vla-startUndoMark adoc)
	(vlax-for obj (sad-get-ss nil) 
		(if (= (vla-get-Lock (vla-item (vla-get-Layers (vla-get-Database adoc)) (vla-get-Layer obj))) :vlax-false)
			(progn
				(vla-put-Color obj (getvar "CECOLOR"))
				(vla-put-LineWeight obj (getvar "CELWEIGHT"))
				(vla-put-LineType obj (getvar "CELTYPE"))
				(vla-put-Layer obj (vla-get-Name (vla-get-ActiveLayer adoc)))
			)
			(setq locked (1+ locked))
		)
	)	
	(if (/= locked 0) (princ (strcat "\nНа блокированном слое " (itoa locked) " объектов.")))
	(vla-endUndoMark adoc)
	(princ);;silent end
)

(defun sad-get-ss (filter_lst / temp ss code_lst filter_value_lst) ;|получение набора, возвращает объект IAcadSelectionSet
	(sad-get-ss nil)
	Фильтр вида '((0 "TEXT") (8 "0"))
	возвращает IAcadSelectionSet
	пустой выбор недопустим
	|;
(setq temp t
	ss (vla-get-PickfirstSelectionSet (vla-get-activeDocument (vlax-get-acad-object))) 
	code_lst '()
	filter_value_lst '()
);;#<VLA-OBJECT IAcadSelectionSet 136be084>
(if filter_lst
	(progn
		(foreach f filter_lst ;;sorting
			(setq code_lst (cons (car f) code_lst)
			filter_value_lst (cons (cadr f) filter_value_lst)
			)
		)
		(setq ;;convert to safearray
			code_lst
			(vlax-safearray-fill
				(vlax-make-safearray 
					vlax-vbInteger
					(cons 0 (1- (length filter_lst)))
				)
				code_lst
			)
			filter_value_lst
			(vlax-safearray-fill
				(vlax-make-safearray
					vlax-vbVariant
					(cons 0 (1- (length filter_lst)))
				)
				filter_value_lst
			)
		) 
	)
)
;;(while temp
  (if (= (vla-get-Count ss) 0)
	(vla-SelectOnScreen ss
		code_lst ;;kodes of filters (variant) (list of DXF codes)
		filter_value_lst ;;filters (list of values DXF codes)
	)
	;;(setq temp nil)
  )
;;)
ss
)



только я уже забыл, когда сам последний раз пользовался, культура оформления графики решает больше лиспа
а как его запустить?) По этой (by-lay-col-lw-lt) команде не запускается после подгрузки
SeRioOuS вне форума  
 
Непрочитано 05.02.2021, 11:41
#16
Петр-и-Алекс


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


коллеги, прошу дублировать лиспы сюда
https://forum.dwg.ru/forumdisplay.php?f=30
а то потом фиг найдешь

----- добавлено через ~2 мин. -----
"а как его запустить? "
- а это к администрации...
ответ есть и сто лет как опубликован. тема: найти его
Петр-и-Алекс вне форума  
 
Непрочитано 05.02.2021, 12:50
#17
Кулик Алексей aka kpblc
Moderator

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


Какой смысл дублировать лисп в библиотеку, если он не является "библиотечным"? В крайнем случае - в "Готовые программы", но именно представленный код я бы туда не закидывал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.02.2021, 12:59
#18
Петр-и-Алекс


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


Ну это - да. может и в "Готовые программы".
Смысл вот в чем: на сайте довольно много интересного, но раскидано по форумам.
И если тупо "смотреть, что есть на сайте", то смотришь "Готовые программы" и "функции", а подобные посты лежат незамеченные.
Что до качества кода - так это на совести автора и на его репутации. Что тут, что там доверяй-но-проверяй.
Петр-и-Алекс вне форума  
 
Непрочитано 05.02.2021, 13:16
#19
EStranger


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


Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
а как его запустить?) По этой (by-lay-col-lw-lt) команде не запускается после подгрузки
Проверил - всё отлично работает. Может скопировали из окошка кода не очень корректно или не запущена поддержка функций VL: (vl-load-com)?
Приделал к коду Владимира Сергеевича запуск поддержки функций VL и определение двух команд SetByLay - для установки свойств по слою примитива и SetByCur - для установки свойств примитива по текущим свойствам и изменения слоя на текущий. В этом коде именно эти функции реализованы. Может Вам так легче будет их использовать. Проверил - команды работают.

А код на кнопку, как я выше написал (с лисп-командой) не пробовали заменить.
Т.е. вместо строки в определение макроса на кнопке: ^C^C_.change;_p;_color;_bylayer;_lineweight;_bylayer;;
вставить строку: ^C^C(Command "_.CHANGE" "_p" "" "_p" "_Color" "_BYLAYER" "_LType" "_BYLAYER" "_LWeight" "_BYLAYER" "")

Может этого будет достаточно. Эта строчка работает - проверил. "Война" идет куда надо
Вложения
Тип файла: lsp SetProp_b_Lay_SetProp_b_Cur.lsp (3.0 Кб, 18 просмотров)
EStranger вне форума  
 
Автор темы   Непрочитано 05.02.2021, 15:37
#20
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 55


Цитата:
Сообщение от EStranger Посмотреть сообщение
Проверил - всё отлично работает. Может скопировали из окошка кода не очень корректно или не запущена поддержка функций VL: (vl-load-com)?
Приделал к коду Владимира Сергеевича запуск поддержки функций VL и определение двух команд SetByLay - для установки свойств по слою примитива и SetByCur - для установки свойств примитива по текущим свойствам и изменения слоя на текущий. В этом коде именно эти функции реализованы. Может Вам так легче будет их использовать. Проверил - команды работают.

А код на кнопку, как я выше написал (с лисп-командой) не пробовали заменить.
Т.е. вместо строки в определение макроса на кнопке: ^C^C_.change;_p;_color;_bylayer;_lineweight;_bylayer;;
вставить строку: ^C^C(Command "_.CHANGE" "_p" "" "_p" "_Color" "_BYLAYER" "_LType" "_BYLAYER" "_LWeight" "_BYLAYER" "")

Может этого будет достаточно. Эта строчка работает - проверил. "Война" идет куда надо
проблема была в том, что я кнопку на палитру выводил и не менял ее. Сколько я код не менял - все оставалось как в первый раз. Потом дошло, удалил кнопку, перезапустил автокад - все заработало)
SeRioOuS вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос для назначения выбранным объектам свойств цвета и веса линий "по слою"

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как активировать масштаб веса линий? инженер гарин AutoCAD 5 13.12.2018 17:11
Цвета линий в AutoCAD. Зачем они нужны и как их изменить АнтонЧ AutoCAD 47 09.10.2013 20:34
Где можно прочитать достоверную информацию про использование цветов, веса линий ... при печати в режиме Monocrome? Edgario AutoCAD 12 19.05.2010 09:28
изменение толщины (веса) линий при печати, без редактирования чертежа lex0101 AutoCAD 6 01.12.2009 20:37
Привязка только к объектам определенного цвета Torino AutoCAD 30 29.03.2004 15:56