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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Переключение слоёв в AutoCAD с помощью клавиш.

Переключение слоёв в AutoCAD с помощью клавиш.

Ответ
Поиск в этой теме
Непрочитано 17.12.2007, 00:07 #1
Переключение слоёв в AutoCAD с помощью клавиш.
Pavel Tesko
 
Машиностроение
 
Tallinn
Регистрация: 27.11.2007
Сообщений: 30

В AutoCAD я обычно использую в среднем 8 слоёв. Уважаемые форумчани, подскажите пожалуйста есть ли возможность в AutoCAD, выбирать слой не курсором мышки, а с помощью клавиатуры. Например следующим образом: нажимается какая-то базовая или сочетания клавиш запускающая команду выбрать слой, а затем выбирается слой посредствам ввода порядкового номера присвоенного индивидуально каждому из используемых слоёв. Возможно ли это?
Просмотров: 41851
 
Непрочитано 17.12.2007, 00:15
#2
Кулик Алексей aka kpblc
Moderator

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


(defun c:l1()
(command "_.-layer" "_m" "Слой который 1" "")
)
Ну и тому подобное засовывается в автозагрузку
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.12.2007, 00:41
#3
Pavel Tesko

Машиностроение
 
Регистрация: 27.11.2007
Tallinn
Сообщений: 30


Большое спасибо!
Pavel Tesko вне форума  
 
Непрочитано 17.12.2007, 06:52
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Всего 8 слоев? Так гораздо быстрее будет выбрать слой из выпадающего списка вверху экрана. Тем более, что там видно состояние слоев. IMHO.
Profan вне форума  
 
Непрочитано 17.12.2007, 19:54
#5
Кулик Алексей aka kpblc
Moderator

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


Один из возможных вариантов: http://www.cadtutor.net/forum/showthread.php?t=18428
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.10.2008, 07:49 Переключение между слоями
#6
rain_day


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


Уважаемые, подскажите возможно ли переключение между слоями сочетанием клавиш или какой-то командой короткой? Ну мышкой их переключать просто парит иногда
rain_day вне форума  
 
Непрочитано 02.10.2008, 08:21
#7
Кулик Алексей aka kpblc
Moderator

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


_-layer <Enter> _set <enter> ИмяСлоя <enter>
Или писать программу, выполняющую автоматический переход на нужный слой и возвращающая обратно настройки (может, хватит и макроса).
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.10.2008, 08:33
#8
rain_day


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


Ммм..так бы и сказали, что проще мышкой Очень конечно постараюсь добраться до создания программ и макросов, главное во всей куче слишком умных слов отыскать простые, понятные для начала создания чего-то своего. Пока в поиске

З.ы. хотя, создал кнопку на первые 2 команды, остаётся только понять как назначить этой кнопке корячую клавишу в 2008 каде (чего ищу уже давно). Потом тока название слоя вводить. Спасибо

Последний раз редактировалось rain_day, 02.10.2008 в 08:56.
rain_day вне форума  
 
Непрочитано 09.10.2008, 12:00
#9
rain_day


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


Затянуло меня совсем в эту тему, начал по мере возможности изучать и применять макросы. Но не могу справится с такой задачей:

^C^C_-layer;_set;основные;^C^C

Этот у меня переключает слой на "основные" сочитанием клавиш. Но как написать такой макрос, который не просто переключался на этот слой, но и в режиме редактирования (при выбранном объекте) перекинет этот выбранный объект на заданный в макросе слой (а не скинет выделение и переключится на слой). В общем, сделать хочу аналог действия, когда мышкой выбираю слой из выпадающего списка. Подскажите пожалуйста
rain_day вне форума  
 
Непрочитано 09.10.2008, 12:05
#10
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,218


в 2008-ом зайдите в меню Format->Layer Tools- там куча команд для работы со слоями.
Хмурый вне форума  
 
Непрочитано 09.10.2008, 13:19
#11
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,254


Цитата:
Сообщение от rain_day Посмотреть сообщение
...
Но как написать такой макрос, который не просто переключался на этот слой, но и в режиме редактирования (при выбранном объекте) перекинет этот выбранный объект на заданный в макросе слой (а не скинет выделение и переключится на слой). В общем, сделать хочу аналог действия, когда мышкой выбираю слой из выпадающего списка. Подскажите пожалуйста
Может как-то так:
Код:
[Выделить все]
_change;_P;_LA;основные;;
Makswell вне форума  
 
Непрочитано 10.10.2008, 05:49
#12
rain_day


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


Цитата:
Сообщение от Makswell Посмотреть сообщение
Может как-то так:
Код:
[Выделить все]
_change;_P;_LA;основные;;
Неизвестная команда change.

Цитата:
Сообщение от Хмурый Посмотреть сообщение
в 2008-ом зайдите в меню Format->Layer Tools- там куча команд для работы со слоями.
Действительно, там много различных команд, но какую из них применить в макрос и в каком порядке, с каким оператором - это проблема. _laycur, возможно? Макрос ^C^C_-layer;_set;основные;^C^C меняет текущий слой, и вот если бы дальше продлить каманду типа ^C^C_-layer;_set;основные;_laycur;^C^C. Но он _laycur как продолжение команды _-layer воспринимает и не понимает чего от него хотят. А если ^C^C_-layer;_set;основные;;_laycur;^C^C, то после смены текущего слоя он скидывает выделение с обьекта и пользуется команда _laycur, отдельно, и т.к. выделенных объектов уже нет, ничего не происходит... бррр!
rain_day вне форума  
 
Непрочитано 10.10.2008, 08:02
#13
Кулик Алексей aka kpblc
Moderator

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


laycur -> Layer Current
Попробуй заменить ^C^C_-layer;_set;основные;_laycur;^C^C на
Код:
[Выделить все]
^C^C_.-layer;_set;основные;^C^C_laycur;_p^C^C
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2008, 08:20
#14
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,254


Цитата:
Сообщение от rain_day Посмотреть сообщение
Неизвестная команда change.
Да ладно, не прикалывайся. Эта команда была ещё в Автокаде R12, а может и ещё раньше.
Makswell вне форума  
 
Непрочитано 10.10.2008, 08:39
#15
acid


 
Сообщений: n/a


Makswell, когда был акад 12-й ты еще в школе на переменах девок за косы дергал!
сорри за оффтоп
 
 
Непрочитано 10.10.2008, 08:42
#16
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,254


Offtop: Да уж, было время - школа, девки, Автокад R12...

Добавлено:
Вот так день начался. Чего, с утра пораньше все решили надо мной поприкалываться? acid, мы с тобой вообще на втором курсе в университете рисовали какие-то фрагменты плана города ещё в 10-м Автокаде

Последний раз редактировалось Makswell, 10.10.2008 в 08:56.
Makswell вне форума  
 
Непрочитано 10.10.2008, 08:44
#17
rain_day


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
laycur -> Layer Current
Попробуй заменить ^C^C_-layer;_set;основные;_laycur;^C^C на
Код:
[Выделить все]
^C^C_.-layer;_set;основные;^C^C_laycur;_p^C^C
Не работает. Результат тот же, с другой концовкой - "неизвестная команда P". Что означает "." для автокада и эта "неизвестная Р"? Может быть существет команда длявыбора последнего редактируемого обьекта? Если плясать от моего макроса - сменился текущий слой -> подтверждение (или отмена всего - в данном случае не важно помоему как завершить команду _-layer) -> выбор последнего выделенного объекта -> смена слоя выбранного объекта на текущий (_laycur)

Автокад 2008
rain_day вне форума  
 
Непрочитано 10.10.2008, 09:07
#18
Кулик Алексей aka kpblc
Moderator

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


rain_day, у тебя явно что-то "не то" с AutoCAD'ом. То он не понимает _.change, то _p...
Кстати, а точно был предыдущий выбор, перед запуском макроса?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2008, 09:23
#19
rain_day


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


о команде _.change речи не шло. Но действительно, теперь и без точки _change;_P;_LA;основные;; успешно переносит выделенный объект в заданный слой. Но зато без выбранного объекта ничего не переключает Можно это как-то совместить, что бы если объект не выбран - переключался слой просто, если выбран - переключался и переносил объект на слой (кстати, было бы интересно еще если бы не переключался, а переносил и возвращался на предыдущий). Вот если бы я хотя бы знал что значат _Р и _LA...командная строка их не понимает(так бы ф2 мож помогло разобраться)

Последний раз редактировалось rain_day, 10.10.2008 в 09:43.
rain_day вне форума  
 
Непрочитано 10.10.2008, 09:26
#20
rain_day


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


С чем-то вроде _change;_P;_LA;основные;;^C^C_-layer;_set;основные;^C^C попробую поиграться как только доберусь до компьютера. Может что получится?
rain_day вне форума  
 
Непрочитано 10.10.2008, 09:31
#21
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


_Properties (Свойства) и _LAyer (Слой) - опции команды _change (изменить)
Profan вне форума  
 
Непрочитано 10.10.2008, 09:41
#22
Кулик Алексей aka kpblc
Moderator

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


Ага, только я в свой код пытался подставить в качестве _p _Previous (предыдущий набор).
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2008, 09:47
#23
rain_day


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


спасибо, есть пища для размышлений
rain_day вне форума  
 
Непрочитано 10.10.2008, 09:53
#24
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ага, только я в свой код пытался подставить в качестве _p _Previous (предыдущий набор).
Тогда макрос мог иметь вид типа:
_change;_P;;_P;_LA; и тд
Profan вне форума  
 
Непрочитано 10.10.2008, 14:27
#25
rain_day


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


_change;_P;_LA;основные;;^C^C_-layer;_set;основные;^C^C

Не даёт результатов, что для МЕНЯ совершенно не понятно. Вроде всё логично выглядит, после первой части (попытки перенести объект в заданный слой) два энтера, потом вообще два эскейпа, а он всё равно без выбранного объекта зависает где-то тут _change;_P;_LA;основные;; и просит выбрать объект. При чем если в командной строке проделывать всё в той же последовательности, всё получается.

вот:

Команда: _change

Выберите объекты: _P
найдено: 1

Выберите объекты: _LA
найдено: 1, всего: 2

Выберите объекты: основные


*Неверный выбор*
Требуется точка или
Рамка/Последний/Секрамка/БОКС/Все/Линия/РМн-угол/СМн-угол/Группа/Добавить/Исключ
ить/Несколько/Текущий/Отменить/Авто/Единственный


Ну и чего ему надо еще? Дальше по макросу два ентера и ескейпа, почему остановился?

Последний раз редактировалось rain_day, 10.10.2008 в 14:34.
rain_day вне форума  
 
Непрочитано 10.10.2008, 14:31
#26
rain_day


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


При чем _p здесь работает именно как сказал крыс. Выбирает предыдущий выбор, никакие это не пропертис. НО только для случая без выбранного объекта. Хотя почему тогда _p является опцией _change? Нет команды которая бы просто выбрала предыдуйщий выбранный объект?

Последний раз редактировалось rain_day, 10.10.2008 в 14:37.
rain_day вне форума  
 
Непрочитано 10.10.2008, 14:42
#27
rain_day


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


УРА
_change;_P;;_p;_LA;основные;;^C^C_-layer;_set;основные;^C^C

Профан и крыс, вы отлично дополнили друг друга Спасибо!
rain_day вне форума  
 
Непрочитано 10.10.2008, 14:42
#28
Кулик Алексей aka kpblc
Moderator

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


Потому что
Код:
[Выделить все]
^C^C_.change;_p;_p;_la;Основные;;_.-layer;_set;Основные;;
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2008, 14:44
#29
rain_day


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


ага, почти так. Много благодарен, хороший форум, хорошие люди
rain_day вне форума  
 
Непрочитано 10.10.2008, 14:50
#30
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Вариант.
Первая часть макроса без предварительного выбора:
Код:
[Выделить все]
 
^C^C_Select;\_change;_P;;_P;_LA;основные;;
Profan вне форума  
 
Непрочитано 10.10.2008, 20:17
#31
rain_day


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


Всмысле вместо "_change" "_Select"? Долго ломал голову что за команда \_change

Уважаемые, а где можно подглядеть такую занимательную информацию, из которой можно было бы познакомиться с такими простыми командами как _change и их опциями? Я вот в подпись крыса смотрю, "библиотека DwgRuLispLib" эт пока сильно для меня. Мне бы просто какой-нибудь справочник что ли. Представляю его себе в виде дерева такого

_change - бла бла бла....
_p - пропертис, бла бла бла
_la - слои бла бла бла


Ибо даже познакомившись с командой (случайно, интуитивно, из форума), не всегда кад подсказывает её опции, как например этот _change. В отличии, скажем, от _-layer (тут уж он в ком. строке всё расписывает)

Последний раз редактировалось rain_day, 10.10.2008 в 20:25.
rain_day вне форума  
 
Непрочитано 10.10.2008, 20:47
#32
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


Change устаревшая команда, ее помнят старожилы. Как и Leader, Attedit, а теперь и Qleader (основы ведь рубят!)). Но раз узнал - из форума (на то он и существует) то расследуй. В командную строку заглядывал? Не говоря о Help. Там есть вся инфа про команду.
Vova вне форума  
 
Непрочитано 10.10.2008, 20:57
#33
rain_day


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


Vova, да уж, тут не поспоришь. Буду стараться подружиться со справкой, а то че-то я размахнулся. Молодой, горячий, всё надо и, самое главное, сразу!

Последний раз редактировалось rain_day, 10.10.2008 в 21:06.
rain_day вне форума  
 
Непрочитано 10.10.2008, 23:15
#34
Кулик Алексей aka kpblc
Moderator

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


rain_day, в добавление к #27: посмотри и установи на время исследования системные переменные cmdecho -> 1; nomutt -> 0. Весьма пользительно
P.S. ИМХО, как всегда Почему-то ощущение, что я забыл еще как минимум одну системную переменную, отвечающую за вывод сообщений в ком.строку. Но что это за переменная - вспомнить никак не получается
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.10.2008, 02:03
#35
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


menuecho
Vova вне форума  
 
Непрочитано 13.10.2008, 05:50
#36
rain_day


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


Спасибо вам, буду грызть кранит науки. А если не получится - хотя бы полижу его
rain_day вне форума  
 
Непрочитано 13.10.2008, 08:21
#37
Кулик Алексей aka kpblc
Moderator

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


Кого-кого грызть??
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2009, 07:45
#38
rain_day


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


Чего чего..Кранит!
rain_day вне форума  
 
Непрочитано 12.01.2009, 08:55
#39
rain_day


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


Короче соврал я че-то вам, не получилось ни чего у меня тогда, щас время освободилось о5 вернулся к этой проблеме. Я чувствую решение где-то рядом
На данный момент вожусь с этим:
"свойства;слой;основные;;^C^C_-layer;_set;основные;^C^C"

В результате имею, что если объект выбран, то всё проходит удачно - меняется слой объекта на "основные" и затем меняется текущий слой. Но если объект не выбран(а это значит что я просто хочу сменить текущий слой), то:
"свойства;слой;(ВОТ ЗДЕСЬ КАД ЦИКЛИТСЯ И ДАЛЬШЕ НЕ ХОЧЕТ ЧИТАТЬ МАКРОС)основные;;^C^C_-layer;_set;основные;^C^C"

Я искал по форуму, не нашел ничего мне подходящего. А именно, я думаю, возможно туда надо вставить какой-то оператор что бы он, в случае когда объект не выбран, после того как бесуспешно выполняет команду "слой;" не тупил а продолжал дальше читать следующую безнадёжную команду "основные;" и, наконец, переходил к смене текущего слоя. Подскажите пожалуйста, мозг кипит уже

Задача - создать макро, который бы переключал текущий слой на заданный в макро и заодно, ЕСЛИ выбран объект, менял бы и его слой тоже
rain_day вне форума  
 
Непрочитано 12.01.2009, 10:09
#40
rain_day


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


может это с помощью макро вообще нельзя сделать?

Последний раз редактировалось rain_day, 12.01.2009 в 11:08.
rain_day вне форума  
 
Непрочитано 12.01.2009, 10:16
#41
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Offtop:
Вот если бы ты не грыз кранит...
Profan вне форума  
 
Непрочитано 12.01.2009, 21:00
#42
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


Если ты работаешь со строительными чертежами, а не с механическими, и не с КМ, то делаешь большую ошибку. назвав слой по типу линии. Странно, все бросились помогать, не углядев имя слоя. Гораздо продуктивнее давать имена слоев по технологии, по типу объектов и др, но только не по типу линих, не по цвету и не по весу. Про мех. черт молчу, чтобы не заклевали, так как не спец. и не смогу отбиться. Но кто так делает, не знает слоевых инструментов.
Vova вне форума  
 
Непрочитано 13.01.2009, 07:57
#43
BM60


 
Регистрация: 08.02.2008
Где-то
Сообщений: 8,466


Vova, имя слоя углядели, полагаю, все, но промолчали, чтобы не провоцировать новый "575-ый" поворот к слоевым азам.
BM60 вне форума  
 
Непрочитано 13.01.2009, 08:38
#44
Haos

инженер-строитель
 
Регистрация: 17.05.2005
E-burg
Сообщений: 717
<phrase 1=


Цитата:
Сообщение от rain_day Посмотреть сообщение
Уважаемые, подскажите возможно ли переключение между слоями сочетанием клавиш или какой-то командой короткой? Ну мышкой их переключать просто парит иногда
В автокаде кажется есть палитры? Добавьте туда необходимые типы линий и все дела.
Как вариант - повесить на мышь команду "объекты по образцу" (видел здесь в даунлоаде) и использовать уже начерченные линии.
Haos вне форума  
 
Непрочитано 13.01.2009, 16:33
#45
rain_day


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


Не совсем со строительными я работаю. Занимаюсь обследованием сооружений и, в основном, работа в каде заключается в начертании карт дефектов с их частичным описанием на чертеже. С ними невозможно поступать так, как говорит Vova - это ни к чему, слоевые инструменты задействовать особо не где (блокировать и отключить - все необходимые инструменты) и получится гора этих слоёв в каждом по 5 линий. Хотя мож я чего не так понял. Так что насчет моего вопроса, нинаете?

Haos, с переключением по сочитанию разобрался уж давно. Новая проблема вытекла прочитай #34

Последний раз редактировалось Кулик Алексей aka kpblc, 13.01.2009 в 16:44.
rain_day вне форума  
 
Непрочитано 19.05.2010, 13:37 Клавиши для переключения слоев
#46
EL'DAR

студент-бакалавр
 
Регистрация: 06.01.2010
Penza
Сообщений: 3


Здравствуйте, уважаемые форумчане.
Я всегда пользуюсь стандартным набором слоев:
"1- Основные
2 - Стены
3 - Размерные
4 - Текстовые" и т.д., их всего 9
и для ускорения рабочего процесса назначаю на часто используемые команды горячие клавиши, и мне хотелось бы узнать, как можно на клавишу к примеру Alt+1 назначить выбор слоя "1- Основные", заменив тыканье мышкой в слоях. При этом 1) если объект не выбран, то слой просто заменяется на выбранный 2) если объект выбран, то слой объекта заменяется на выбранный, и слой на панели возвращается в предыдущий.
Данный вопрос был поднят тут http://forum.dwg.ru/showthread.php?t=25232&page=2 , но решение с помощью Lisp-ика так и не было найдено. Заранее спасибо.
EL'DAR вне форума  
 
Непрочитано 19.05.2010, 14:22
#47
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


А стены рисуются не основными линиями?
Vova вне форума  
 
Непрочитано 19.05.2010, 16:36
#48
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Может как-то так:
Код:
[Выделить все]
;;;                     _Cris-LayerChange  ver 1.0
;;;                        версия для AutoCADa
;;; All rights reserved including right of reproduction in whole or in part in ang form. ;)
;;; Автор: Крылов О.В. aka Олег К. на www.dwg.ru/f/  и  www.forum.zwsoft.ru/
;;; 01.03.2010

(defun _Cris-LayerChange (AnotherLayerName / *error* curLayer curNabr numbr curList p_snapmode p_cmdecho)
;;; ФУНКЦИЯ БЫСТРОЙ СМЕНЫ СЛОЯ.
;;; Если до вызова функции были выделены какие-либо элементы, то они переместятся на заданный слой.
;;; Если ничего не выделено, то текущий слой сменится на заданный в функции. При отсутствии нужного
;;; слоя в чертеже он создается со всеми стандартными (заданными) параметрами. 
;;; Макрос для вызова функции кнопкой с панели инструментов:
;;; ^C^C^P(if (not _Cris-LayerChange)(load "[путь к файлу]_Cris-LayerChange.lsp"));(_Cris-LayerChange "имя слоя"); 
;;; Пример:
;;; ^C^C^P(if (not _Cris-LayerChange)(load "_Cris-LayerChange.lsp"));(_Cris-LayerChange "OV_Osi vozduh");

;----- Переопределение функции *error* -----;
 (defun *error* (msg)
   (princ "\n Работа программы остановлена по техническим причинам")
   (setq curNabr nil numbr nil curList nil)
   (setvar "SNAPMODE" p_snapmode)
   (setvar "CMDECHO" p_cmdecho)
   (setq p_snapmode nil p_cmdecho nil
   (princ)
 ) ; defun(*error*)

;----- Основная функция -----;
  (gc)
  (setq p_cmdecho (getvar "CMDECHO") p_snapmode (getvar "SNAPMODE") numbr 0 curNabr nil curList nil)
  (setvar "CMDECHO" 0)
  (setvar "SNAPMODE" 0)
  
  ;--- создание отсутствующих слоев ---;
  (cond
    ; слой осей воздуховодов OV_Osi vozduh
    ((eq AnotherLayerName "OV_Osi vozduh")
       (if (null (tblsearch "LTYPE" "Axis_Line"))
           (entmake '((0 . "LTYPE") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLinetypeTableRecord")
                      (2 . "Axis_Line") (3 . " Linetype for axis _____ . _____ . _____ . ____") (72 . 65) (73 . 4)
                      (40 . 25.0) (49 . 20.0) (74 . 0) (49 . -2.5) (74 . 0) (49 . 0.0) (74 . 0) (49 . -2.5) (74 . 0))
           )
       )
       (if (null (tblsearch "LAYER" "OV_Osi vozduh"))
           (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "OV_Osi vozduh") (70 . 0) (6 . "Axis_Line") (62 . 1) (290 . 1) (370 . 15)))
       )
    )
    ; слой основных линий приточных воздуховодов OV_Vent-P
    ((eq AnotherLayerName "OV_Vent-P")
       (if (null (tblsearch "LAYER" "OV_Vent-P"))
           (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "OV_Vent-P") (70 . 0) (6 . "Continuous") (62 . 171) (290 . 1) (370 . 40)))
       )
    )
    ; текстовый слой для приточных воздуховодов OV_ventP_txt
    ((eq AnotherLayerName "OV_ventP_txt")
       (if (null (tblsearch "LAYER" "OV_ventP_txt"))
           (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "OV_ventP_txt") (70 . 0) (6 . "Continuous") (62 . 171) (290 . 1) (370 . 15)))
       )
    )

;;; аналогично описываются все нужные слои

    ; для любых других слоев задается только имя
    (T
       (if (null (tblsearch "LAYER" AnotherLayerName))
           (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (cons 2 AnotherLayerName) (70 . 0) (6 . "Continuous") (290 . 1) (370 . -3)))
       )
    )   
  ) ; cond создание слоев
  
  ;--- проверка активного выбора и активация нужного слоя ---;
  (if (null (setq curNabr (ssget "I")))
      ; если набор пустой - активация другого слоя
      (setvar "CLAYER" AnotherLayerName)
      ; если в наборе есть элементы - перемещение их на другой слой
      (progn
        ; получение из набора объектов списка их имен
        (while (ssname curNabr numbr) (setq curList (append curList (list (ssname curNabr numbr))) numbr (1+ numbr)))
        ; перемещение выбранных объектов на другой слой
        (foreach
                 i
                 curList
                 (entmod (subst (cons 8 AnotherLayerName) (assoc 8 (entget i)) (entget i)))
        )
      ) ; progn
  ) ; if

  (setq curNabr nil numbr nil curList nil)
  (setvar "SNAPMODE" p_snapmode)
  (setvar "CMDECHO" p_cmdecho)
  (setq p_snapmode nil p_cmdecho nil)
  (princ)

) ; defun _Cris-LayerChange
Правда есть одна неприятность: когда нет элементов в активном выборе программа должна переключить текущий слой на другой, но по условиям работы функции ssget нужно нажать энтер или пробел, чтобы набор был пустым. Мне это не нравится.
Может ли кто-нибудь подсказать как избавиться от этого лишнего энтера? Но условие: нельзя использовать vla-функции, поскольку программа создана для ZWCAD2008i и не все vla там работают.
Перерыл все справочники и форумы, решения не нашел. Надеялся что есть системная переменная, которая отмечает есть ли выбранные объекты в данный момент, но тоже ничего не сыскалось.
Олег К. вне форума  
 
Непрочитано 19.05.2010, 16:47
#49
EL'DAR

студент-бакалавр
 
Регистрация: 06.01.2010
Penza
Сообщений: 3


Цитата:
Сообщение от Vova Посмотреть сообщение
А стены рисуются не основными линиями?
да, основными, но порой при отключения слоя 1- Основные, хочется продолжать видеть остов здания, который я поэтому и делаю в слое 2 - Стены.

Спасибо, вечером попробую подправить LISP и испробовать. О результатах на днях доложу)
EL'DAR вне форума  
 
Непрочитано 19.05.2010, 17:27
#50
KSI


 
Регистрация: 19.03.2004
Калининград
Сообщений: 1,842


А что мешает сделать несколько кнопок с макросами?
Например ^C^C_-layer;_s;Основная;;
Кроме того там можно вначале создавать слой, присваивать ему цвет, тип линии, а потом делать его активным.
^C^C_-layer;_m;Основная;_c;3;;_l;continuous;;_s;;;
KSI вне форума  
 
Непрочитано 20.05.2010, 08:09
#51
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Вооше идея интересная но если привязываться к конкретным названиям слоев то получается сугубо индивидуальная.
А вот если бы сделать последовательное переключение (вверх или вниз списка) то можно бысто переключать клавишей. Конечно если сотни слоев то не эффективно.
Например я на кнопку мыши (что на колесике) установил "Следующий документ" и быстро перебираю открытые файлы - очень удобно. Вот так бы и следующий слой.
Jonas вне форума  
 
Непрочитано 20.05.2010, 08:26
#52
Кулик Алексей aka kpblc
Moderator

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


Вешай на клавиши соответствующие команды (правда, лисп придется загрузить):
Код:
[Выделить все]
(vl-load-com)

(defun dwgru-change-layer (lst up / activelayer)
                          ;|
*    Производит переключение между слоями текущего документа
*    Параметры вызова:
	lst		список слоев
	up		t -> переключать на "следующий"
				nil -> переключать на "предыдущий"
|;
  (setq activelayer (getvar "clayer"))
  (setvar "clayer"
          (cond
            ((and (equal (car lst) activelayer) (not up))
             (last lst)
             )
            ((and (equal (last lst) activelayer) up)
             (car lst)
             )
            (t
             (cadr (member activelayer
                           (if up
                             lst
                             (reverse lst)
                             ) ;_ end of if
                           ) ;_ end of member
                   ) ;_ end of cadr
             )
            ) ;_ end of cond
          ) ;_ end of setvar
  ) ;_ end of defun

(defun c:layer-next (/ adoc lst)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq lst (vl-sort
              ((lambda (/ res name)
                 (vlax-for item (vla-get-layers adoc)
                   (if (not (wcmatch (setq name (vla-get-name item)) "*|*"))
                     (setq res (cons name res))
                     ) ;_ end of if
                   ) ;_ end of vlax-for
                 (reverse res)
                 ) ;_ end of lambda
               )
              '<
              ) ;_ end of vl-sort
        ) ;_ end of setq
  (dwgru-change-layer lst t)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

(defun c:layer-prev (/ adoc lst)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq lst (vl-sort
              ((lambda (/ res name)
                 (vlax-for item (vla-get-layers adoc)
                   (if (not (wcmatch (setq name (vla-get-name item)) "*|*"))
                     (setq res (cons name res))
                     ) ;_ end of if
                   ) ;_ end of vlax-for
                 (reverse res)
                 ) ;_ end of lambda
               )
              '<
              ) ;_ end of vl-sort
        ) ;_ end of setq
  (dwgru-change-layer lst nil)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
P.S. Код особо не гонял.
P.P.S. Код не учитывает фильтры слоев, так что в качестве рабочего использоваться не может.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.05.2010, 08:53
#53
AlphaGeo


 
Сообщений: n/a


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вешай на клавиши соответствующие команды (правда, лисп придется загрузить)
Алексей, спасибо за код.
А можно ли через Lisp активировать панель управления Слои, чтобы она выпала списком (я говорю не про Диспетчер слоев), а потом в ней выбрать с помощью курсора нужный слой.
 
 
Непрочитано 20.05.2010, 10:22
#54
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вешай на клавиши соответствующие команды (правда, лисп придется загрузить):
Просто замечательно!
Повесил на Shitt+Z и Shitt+X - не нарадуюсь!
Jonas вне форума  
 
Непрочитано 20.05.2010, 11:32
#55
Кулик Алексей aka kpblc
Moderator

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


По-моему, такое средствами lisp'a нереализуемо. Либо писать свой диалог...
Примерно так (в качестве примера)
Код:
[Выделить все]
(vl-load-com)

(defun test (/ fun_get_layers file handle dcl_id dcl_res sel_res layer_lst)

  (defun fun_get_layers (/ lst)
    (vlax-for item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
      (if (not (wcmatch (vla-get-name item) "*|*"))
        (setq lst (cons (vla-get-name item) lst))
        ) ;_ end of if
      ) ;_ end of vlax-for
    (vl-sort lst '<)
    ) ;_ end of defun

  (setq file   (strcat
                 (vl-string-right-trim "\\"
                                       (vla-get-tempfilepath (vla-get-files (vla-get-preferences (vlax-get-acad-object))))
                                       ) ;_ end of vl-string-right-trim
                 "\\dlg.dcl"
                 ) ;_ end of strcat
        handle (open file "w")
        ) ;_ end of setq
  (foreach item '("dlg:dialog{label=\"Операции со слоями\";"
                  ":popup_list{label=\"Имена слоев\";key=\"layer_lst\";}"
                  "ok_cancel;"
                  "}"
                  )
    (write-line item handle)
    ) ;_ end of foreach
  (close handle)
  (setq dcl_id (load_dialog file))
  (new_dialog "dlg" dcl_id)
  (action_tile "layer_lst" "(setq sel_res $value)")
  (start_list "layer_lst" 3)
  (mapcar (function add_list) (setq layer_lst (fun_get_layers)))
  (end_list)
  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (mode_tile "layer_lst" 2)
  (setq dcl_res (start_dialog))
  (unload_dialog dcl_id)
  (if (= 1 dcl_res)
    (setvar "clayer"
            (nth (cond (sel_res (atoi sel_res))
                       (t 0)
                       ) ;_ end of cond
                 layer_lst
                 ) ;_ end of nth
            ) ;_ end of setvar
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2011, 22:15
#56
overband

Инженер-конструктор
 
Регистрация: 25.02.2008
Москва
Сообщений: 142


Не знаю как на лиспе, но можно по-простому.
Создать новую команду со следующим макросом:

Код:
[Выделить все]
^C^C_'.-layer;р;Основной;с;Основной;ц;синий;Основной;е;0.5;Основной;;слойтек; ^C
Соответственно вместо "Основной" пишем желаемое название слоя,вместо "синий" желаемый цвет слоя (номер цвета или его название), вместо "0.5" желаемую толщину линий слоя.
Работает данная команда следующим образом. Если объектов до вызова команды выбрано не было, то команда просто делает активным слой "Основной" с внесенными в макрос параметрами цвета и толщины линий (если слоя такого в чертеже нет - создает его, если слой "Основной" есть но с отличными от заданных в макросе цветом и толщиной линии, то команда меняет цвет и толщину в соответствии с введенными в макросе). Если до перед вводом команды были выбраны объекты то они будут помещены на слой "Основной".
Небольшие ограничений команды: если до выполнения команды слой "Основной" в чертеже существовал и был выключен или заморожен, то после выполнения команды этот слой будет включен и разморожен (то есть не вылетит предупреждения "N объектов будут перемещены на выключенный слой" или что-то вроде этого)
Вот еще вариант команды с выбором помещаемых в слой объектов после ввода команды:

Код:
[Выделить все]
^C^C_'.-layer;р;Основной;с;Основной;ц;синий;Основной;е;0.5;Основной;;слойтек;
overband вне форума  
 
Непрочитано 03.07.2013, 08:45
#57
Desert_Eagle

Архитектор
 
Регистрация: 03.09.2007
Казахстан
Сообщений: 9


Господа, спасибо всем за информацию, столько умного написали, только кто может сказать как "вешать на клавиши команды"?
например переключение по слоям вверх и вниз, как написал Jonas
Цитата:
Сообщение от Jonas Посмотреть сообщение
Просто замечательно!
Повесил на Shitt+Z и Shitt+X - не нарадуюсь!
Desert_Eagle вне форума  
 
Непрочитано 03.07.2013, 12:28
#58
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Desert_Eagle Посмотреть сообщение
как "вешать на клавиши команды"
http://dwg.ru/pub/9 посмотри.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.07.2013, 13:47
#59
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


По-моему, чертеж в котором всего 9 куцых слоев должен быть простейшим как амеба. А когда вижу имя слоя типа Основные, Пунктирные и подобное то представляется что автора не учили автокаду на курсах и он никогда не пользовался командами работы со слоями, начинающимися со слова _Lay... Ибо если-бы воспользовался то догадался бы и без курсов что слои надо называть по принципу возможности выделения определенного набора, дающего возможность либо включить только то что надо либо отключить что не надо. У нас в файлах может быть и тысяча слоев, в том числя и сотня созданных автором.
Vova вне форума  
 
Непрочитано 03.07.2013, 14:08
#60
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,412


Цитата:
Сообщение от Vova Посмотреть сообщение
А когда вижу имя слоя типа Основные, Пунктирные и подобное то представляется
Автокад знаю очень хорошо, но слои именно так и называются. У нас у машиностроителей не бывает сотня слоев. Только по типам выполняемых линий. Соответственно командами работы со слоями нет необходимости пользоваться. Так что обобщать не надо.
__________________
Век живи, век учись - ...
Bull вне форума  
 
Непрочитано 03.07.2013, 15:44
#61
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


Ну ладно, про механиков обобщать не буду, может быть они и ответят на
Цитата:
Сообщение от Bull Посмотреть сообщение
У нас у машиностроителей ...... Только по типам выполняемых линий.
я ведь отвечал на пост строителя
Vova вне форума  
 
Непрочитано 04.07.2013, 05:22
#62
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от Bull Посмотреть сообщение
У нас у машиностроителей не бывает сотня слоев.
Если речь идет о LT то может и так.
При моделировании, а это я считаю основной работой конструктора, количество слоев зависит от числа сборок или даже деталей. Правда и слои не решают все нужды, приходиться пользоваться еще и группами.
Переключение слоев - а почему не использовать команду _Laymcur, для ускорения можно ее и на клавишу, останется только щелкнуть по нужному объекту. Правде если слой не выключен.
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 04.07.2013, 05:41
#63
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Цитата:
Сообщение от Jonas Посмотреть сообщение
останется только щелкнуть по нужному объекту. Правде если слой не выключен.
Если слой выключен, то объекты на этом слое не видны и щелкнуть по ним затруднительно.
Profan вне форума  
 
Непрочитано 04.07.2013, 07:06
#64
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от Profan Посмотреть сообщение
Если слой выключен, то объекты на этом слое не видны и щелкнуть по ним затруднительно.
Это я и имел в виду.
Я редко отключаю слой, обычно использую блокирование при небольшой подсветке, очень удобно.
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн

Последний раз редактировалось Jonas, 04.07.2013 в 07:12.
Jonas вне форума  
 
Непрочитано 04.07.2013, 08:32
#65
Desert_Eagle

Архитектор
 
Регистрация: 03.09.2007
Казахстан
Сообщений: 9


Спасибо, вцелом понятно, но понятно только как скопировать этот код сохранить и вставить
а вот как именно настраивать его под свои кнопки.. извините за тупость, разбираться некогда.. работы вал
может кто по доброте душевной тыкнет пальцем как именно этот код включить чтоб shift z и shift x - переключать слои вверх и вниз..
Desert_Eagle вне форума  
 
Непрочитано 04.07.2013, 14:54
#66
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


Вместо того чтобы подставлять нужный слой под одиночную линию бывает проще начертить ее в текущем слое и мазануть по ней кисточкой с аналогичной, сделанний раньше.
Но если хочешь автоматизации, а количество слоев ограничено, скажем, десятком то она есть и без лиспа.
Нарисуй короткий отрезок в слое 1, затем в слое 2 и т.д. Открой новую палету (Ctrl+3). Скопируй отрезок 1 через клипборд на палету и правой кнопкой переименуй команду в 1. Повтори для всех других отрезков Получишь десяток кнопок команд и каждая будет рисовать на выбор 8 разных объектов - отрезок, полилиние, кружок и т. д. в заданном слое
Кстати, вместо безликих цифровых имен слоев можешь задать им более технологичные, отражающие суть
На другой палете можно хранить блоки, также рассортированные по слоям
Vova вне форума  
 
Непрочитано 06.08.2013, 02:25
#67
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от Vova Посмотреть сообщение
Нарисуй короткий отрезок в слое 1, затем в слое 2 и т.д. Открой новую палету (Ctrl+3). Скопируй отрезок 1 через клипборд на палету и правой кнопкой переименуй команду в 1. Повтори для всех других отрезков Получишь десяток кнопок команд и каждая будет рисовать на выбор 8 разных объектов - отрезок, полилиние, кружок и т. д. в заданном слое
Инструментальные палитры очень удобны, но для элементов которые используются относительно не часто. Например блоков или штриховок. А рисовать отрезки, полилинии, размеры и тд не очень удобно, тк нужно слишком много кликать мышью (навести на палитру->подождать пока она развернется(в моем случае, тк стоит свойство автоматически убирать с экрана, иначе даже при минимальных размерах она занимает слишком много места)->выбрать соответствующую закладку->найти нужный инструмент и кликнуть), а во всех вышеизложенных способах на команды можно назначить горячие клавиши.
Я в работе прибегнул к комбинированному методу, на мой взгляд очень удобно.. вот суть:
1) Создал палитру со всеми использующимися типами линий, размерами, текстами.. и тд, а также блок в котором каждый элемент прорисован 1 раз, но при вставке он вставляется в непечатаемый слой.
2) В работе использую собственные кнопки с собственной панели инструментов с простыми и легкими макросами, в которых нет проверки возможного отсутствия определенного слоя или стиля. Тк все эти элементы нам создает вышеописанный блок и они наверняка на чертеже имеются. + на самые частые команды назначены горячие клавиши.
3) Поработав в файле удаляю сам блок и прочие невостребованные элементы командой _pugre.
art_rrc вне форума  
 
Непрочитано 06.08.2013, 05:41
#68
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


Цитата:
Сообщение от Vova Посмотреть сообщение
Вместо того чтобы подставлять нужный слой под одиночную линию бывает проще начертить ее в текущем слое и мазануть по ней кисточкой с аналогичной, сделанний раньше.
Вот скорая идея в развитие сказанного в моей цитате. Чтобы не выискивать по чему мазануть кисточкой.
Рисуем несколько линий-образцов в нужных слоях и типах в сторонке. Запоминаем вид. Делаем кнопку, которая:
1. Запоминает текущий вид, где в текущих параметрах нарисован объект требующий изменения свойств по образцу
2. подставляет запомненный вид с образцами на середину экрана
2. Подставляет под мышку кисточку
3. Макаем кисточку в нужный образец
4. Возвращаемся к первому виду (вероятно, другой кнопкой)
5 Мажем кисточкой по объекту
На первый взгляд должно получиться даже макросом, А лиспом вероятно все с одной кнопки
Vova вне форума  
 
Непрочитано 06.08.2013, 07:04
#69
sertor

Геодезист
 
Регистрация: 23.05.2012
Ухта
Сообщений: 1,371


EL'DAR, попробуйте эту программу: http://forum.dwg.ru/showthread.php?t=35875
__________________
Как-то так.
sertor вне форума  
 
Непрочитано 09.12.2013, 15:52
#70
Desert_Eagle

Архитектор
 
Регистрация: 03.09.2007
Казахстан
Сообщений: 9


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Цитата:

Сообщение от Desert_Eagle


как "вешать на клавиши команды"




http://dwg.ru/pub/9 посмотри.
Посмотрел. Как сохранить код и его загрузить понятно, но непонятно как пользоваться )) как на нужные клавиши "вешать" ))
Умные люди, ну плиз, растолкуйте, не могу разобраться.
Desert_Eagle вне форума  
 
Непрочитано 12.12.2013, 08:02
#71
Бали

Инженер
 
Регистрация: 23.03.2007
Уфа
Сообщений: 198


в автокаде уже есть прекрасные команды для работы со слоями:
AI_MOLC - установка выбранного слоя текущим
слойотд - изоляция слоя
слойвкл - включение всех слоёв
слойоткл - отключение выбранных слоёв
Бали вне форума  
 
Непрочитано 12.12.2013, 19:12
#72
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,234


Offtop: Интересно, что термин СЛОЙ вряд-ли отражает действительное положение объектов в пространстве автокада. Ведь слово СЛОЙ как бы отражает их единый уровень, а это совсем не так, ибо объекты имеющие одинаковый слой могут быть частично и под и над объектами другого слоя. В этом отношении англ. термин Layer ближе к действительному положению вещей. Ибо один из вариантов перевода это Наслоение прослоек. Странно что переводчики локализаторов автокада не придумали другого термина, тогда как поправить авторов автокада они горазды. Например, Previous они перевели как Текущий, считая его более правильным чем Предыдущий (имеется в виду опция выбора объектов, селектированных предыдущей командой)
Vova вне форума  
 
Непрочитано 04.09.2014, 07:36
#73
Paranoik27


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



Здравствуйте, а подскажите пожалуйста, где можно почитать о этих кодах, это я так понимаю Макросы? Хотелось бы по-подробнее разобраться и начать оптимизировать свой рабочий процесс.
Кстати, еще удобно пользоваться функцией копирования свойств слоя, и перекидывать его на тот. который нужно изменить, только перед этим задать эту команду в горячие клавиши, у меня напрмиер это "Shift+R". Или использовать сокращенную команду "кпс".
Paranoik27 вне форума  
 
Непрочитано 04.09.2014, 07:51
1 | #74
Valery Brelovsky

Инженер дорожник
 
Регистрация: 22.10.2007
Израиль
Сообщений: 1,859


Цитата:
Сообщение от Paranoik27 Посмотреть сообщение
Здравствуйте, а подскажите пожалуйста, где можно почитать о этих кодах, это я так понимаю Макросы
Запускаешь поиск по слову "Макросы" и находишь всё что интересует.

А по поводу переключения слоёв удобно пользоваться Лиспом "Быстрое рисование "
http://forum.dwg.ru/showthread.php?t=35875
Выбыраешь объект к примеру линия и сразу рисуешь линию на слое на котром размещена линия.
Valery Brelovsky вне форума  
 
Непрочитано 04.09.2014, 08:05
#75
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Не плохо бы переключать слои по типу "Ctrl+Tad".
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 04.09.2014, 09:25
#76
Paranoik27


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



Так вообще в идеале было бы)))
Paranoik27 вне форума  
 
Непрочитано 04.09.2014, 09:29
#77
Valery Brelovsky

Инженер дорожник
 
Регистрация: 22.10.2007
Израиль
Сообщений: 1,859


Цитата:
Сообщение от Paranoik27 Посмотреть сообщение
подскажите пожалуйста, где можно почитать о этих кодах, это я так понимаю Макросы?
Вот к примеру макрос для присвоения линии слоя "Осевой" для автодороги.
^C^C_-Linetype;_Load;"CENTER" "acad.lin";;^C^C_-layer New SBG_CL; ^C^C_-layer Color 3 SBG_CL; ^C^C_-layer Ltype CENTER SBG_CL;C^C(if (not C:SBG_CL) (LOAD "DP.lsp")) SBG_CL
В макросе определена загрузка типа лиии, создание слоя для сентральной лиии и присовении этих свойств слоя выбраной лини.
Я в своей работе практически не переключаюсь между слоями. От осевой через _offset я строю край проезжей части и соответственно аналогичной кнопкой присваиваю им соответствующий слой, линия асфальта или бортовой камень.
Valery Brelovsky вне форума  
 
Непрочитано 04.09.2014, 09:30
#78
Кулик Алексей aka kpblc
Moderator

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


Палитры инструментов исключаются из рассмотрения напрочь?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.09.2014, 10:37
#79
Paranoik27


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



C панели умеем, интересно просто научиться с макросами обращаться.
Paranoik27 вне форума  
 
Непрочитано 04.09.2014, 10:45
#80
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Paranoik27 Посмотреть сообщение
интересно просто научиться с макросами обращаться.
Такие вопросы в другом разделе форума.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.09.2014, 10:49
#81
Paranoik27


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



Спасибо.
Paranoik27 вне форума  
 
Непрочитано 05.09.2014, 00:30
#82
skkkk


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


Цитата:
Сообщение от Paranoik27 Посмотреть сообщение
Не плохо бы переключать слои по типу "Ctrl+Tad".
Цитата:
Сообщение от Paranoik27 Посмотреть сообщение
Так вообще в идеале было бы)))
Это сделать можно, даже довольно легко. Надо только уточнить пожелания пользователей. Как надо? Чтоб одно сочетание меняло слои по списку вниз, а другое (может, то же +Shift) - вверх? Или первое нажатие вниз, а второе - обратно вверх? В общем, хотелось бы как можно более полного описания желаемого процесса с максимальным продумыванием всех возможных деталей, неявных на первый взгляд. Ну например, что делать, если слой, на который мы переключились отключен или заморожен? Вывести предупреждение? Предложить разблокировать? Ну и так далее... Думаю, это будет две команды, одна переключит на следующий по списку слой, вторая - на предыдущий. На каждую из них вешаем горячие клавиши - и всего делов. Не уверен, можно ли переназначить в Автокаде именно Ctrl+Tab (да и надо ли?) - нет возможности сейчас проверить, но любое другое из доступных сочетаний - не вопрос.
Правда сделать я это смогу только на лиспе, поэтому нужно будет попросить модераторов перенести тему в Программирование, тем более, предложенные решения - уже на программной основе.
skkkk на форуме  
 
Непрочитано 05.09.2014, 07:12
#83
Valery Brelovsky

Инженер дорожник
 
Регистрация: 22.10.2007
Израиль
Сообщений: 1,859


Цитата:
Сообщение от skkkk Посмотреть сообщение
Чтоб одно сочетание меняло слои по списку вниз, а другое (может, то же +Shift) - вверх
А если слоёв сотня, и перебирать их по одному нажимая клавишу. Предложение просто супер. Открыл меннежер слоёв и выбрал тот что нужно.
А функция _Laymcur установить слой по объекту совсем не катит, посади её на клавишу если так хочется.
Valery Brelovsky вне форума  
 
Непрочитано 05.09.2014, 09:34
#84
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от Valery Brelovsky Посмотреть сообщение
А если слоёв сотня, и перебирать их по одному нажимая клавишу. Предложение просто супер. Открыл меннежер слоёв и выбрал тот что нужно.
А если слоев сотня то клавишами можно и не пользоваться (думаю ругать ни кто не будет).
Цитата:
Сообщение от Valery Brelovsky Посмотреть сообщение
А функция _Laymcur установить слой по объекту совсем не катит, посади её на клавишу если так хочется.
А если в слое еще нет объектов?
Да и вообще, жалко что ли?
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 05.09.2014, 10:20
#85
Valery Brelovsky

Инженер дорожник
 
Регистрация: 22.10.2007
Израиль
Сообщений: 1,859


Цитата:
Сообщение от Jonas Посмотреть сообщение
А если слоев сотня то клавишами можно и не пользоваться
А смысл тогда всей затеии?

Цитата:
Сообщение от Jonas Посмотреть сообщение
А если в слое еще нет объектов?
Тогда клавишей и переключать нечего.

Вообще если смыл вей работы что бы переключать слоя то есть смыл и можно даже зациклить, утром пришёл на работу включил вером уходя выключил, а можно и не выключать......
Но вообще за включением и переключением должено стоять последующее действием. Исходя из этого нужно и формировать решение.
К примеру макрос для вставки блока содаёт слой активизирует его и блок вставляется на соответсвующий слой.

У автора правда восемь слоёв,

Цитата:
Сообщение от Pavel Tesko Посмотреть сообщение
В AutoCAD я обычно использую в среднем 8 слоёв.
Но при восьми слоях заморачиваться с клавишей, ну сделалбы восемь кнопок нажал и установился нужный слой.

^C^C_-layer New 1; ^C^C_-layer Color 11 1;^C^C_-layer Set 1;
Примерно так.
Valery Brelovsky вне форума  
 
Непрочитано 05.09.2014, 12:51
#86
skkkk


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


Я что-то не понял, прогу-то писать? Где ТЗ?
skkkk на форуме  
 
Непрочитано 05.09.2014, 14:16
#87
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Конечно писать.
Требования простые:
- переключение вверх и вниз,
- на замороженное, изолированное, блокированное и пр. состояние слоев не обращать внимание.
Заранее спасибо.
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 05.09.2014, 14:45
#88
Кулик Алексей aka kpblc
Moderator

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


Ну-ну, попробуйте переключиться на замороженный слой
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.09.2014, 15:45
#89
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну-ну, попробуйте переключиться на замороженный слой
Да и бог с ним, пойдем далее (всего лишь лишний щелчек).
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 06.09.2014, 01:01
#90
skkkk


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


Цитата:
Сообщение от Jonas Посмотреть сообщение
на замороженное, изолированное, блокированное и пр. состояние слоев не обращать внимание
Это как понять? Не обращать внимания, что слой отключен, заблокирован, и все равно активировать его, или не обращать внимания и пропускать, активируя следующий включенный и разблокированный?
skkkk на форуме  
 
Непрочитано 08.09.2014, 04:29
#91
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от skkkk Посмотреть сообщение
не обращать внимания и пропускать, активируя следующий включенный и разблокированный
Думаю что да.
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 08.09.2014, 13:44
#92
skkkk


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


Когда уже большую часть кода написал, нашел вот эту тему...
Думаю, ладно, есть решение и есть, я все равно, в академических целях за это взялся, даже интересно было посмотреть, как решил эту задачу Алексей Кулик в #7 (после объединения тем #52), но вот пост #9 (ныне #54) меня удивил.
Jonas, как так-то?
Раз уж написал, выложу его тут:
Код:
[Выделить все]
 (defun lay-down () (lay-switch T))
(defun lay-up () (lay-switch nil))
;;; Функция переключает слои в активном чертеже.
;;; Если аргумент flag задан, переключает на следующий слой, если нет - на предыдущий. 
;;; Сортировка слоев в диспетчере свойств не учитывается, переключение идет в алфавитном порядке.
;;; Замороженные, блокированные и отключенные слои, а также слой Defpoints пропускаются.
;;; Не учитываются фильтры слоев.
(defun lay-switch (flag / Table adoc c-lay lay-lst i next-lay item)
	(defun Table (s / d r)
		(while (setq d (tblnext s (null d)))
			(setq r (append r (list (cdr (assoc 2 d)))))
		)
	) ;end of defun (Table)
	(setq adoc (vla-get-activedocument (vlax-get-acad-object)) ;;; Текущий документ.
		  c-lay (getvar "CLAYER") ;;; Текущий слой (STR).
		  lay-lst ;;; Список слоев чертежа (LIST of STR): 
				(if flag ;;; если аргумент flag (SYM) задан,
				   (acad_strlsort (table "LAYER")) ;;; то отсортированный по алфавиту от А до Я,
				   (reverse (acad_strlsort (table "LAYER"))) ;;; или от Я до А, если nil. 
				) ;end of if
		  lay-lst (vl-remove-if '(lambda (x) (wcmatch x "*|*")) lay-lst) ;;; Убираем из списка слои, зависящие от внешних ссылок.
		  i (vl-position c-lay lay-lst) ;;; Номер слоя в списке (INT).
		  next-lay ;;; Следующий по списку слой
					(if (= c-lay (last lay-lst)) ;;; если он последний в списке, 
						(nth (setq i 0) lay-lst) ;;; то начинаем с начала списка,
						(nth (setq i (1+ i)) lay-lst) ;;; если нет, продолжаем остаток списка.
					) ;end of if 
		  item (vla-item (vla-get-Layers adoc) next-lay) ;;; Указатель на VLA-объект следующего слоя.
	) ;end of setq
	(while  (or (= (vla-get-Freeze item) :vlax-true) ;;; Если следующий слой ИЛИ заморожен,
				(= (vla-get-Lock item) :vlax-true)   ;;; ИЛИ заблокирован,
				(= (vla-get-LayerOn item) :vlax-false) ;;; ИЛИ отключен,
				(= (vla-get-Name item) "Defpoints") ;;; ИЛИ это слой "Defpoints",
			) ;end of or
		(princ
			(strcat "\nПропущен "  ;;; то сообщаем об этом в командной строке
					(if (= (vla-get-Freeze item) :vlax-true)
						"ЗАМОРОЖЕННЫЙ "
						""
					)
					(if (= (vla-get-Lock item) :vlax-true)
						"ЗАБЛОКИРОВАННЫЙ "
						""
					)
					(if (= (vla-get-LayerOn item) :vlax-false)
						"ОТКЛЮЧЕННЫЙ "
						""
					)
					"слой \"" next-lay "\". "
			) ;end of strcat
		) ;end of princ
		(setq next-lay ;;; и проверяем следующие, до тех пор, пока какой-то из них не окажется И размороженным, И разблокированным, И включенным.
					(if (= next-lay (last lay-lst)) ;;; если он последний в списке, 
						(nth (setq i 0) lay-lst) ;;; то начинаем с начала списка,
						(nth (setq i (1+ i)) lay-lst) ;;; если нет, продолжаем остаток списка.
					) ;end of if 
			  item (vla-item (vla-get-Layers adoc) next-lay)
		) ;end of setq
	) ;end of while
	(if (= next-lay c-lay) ;;; Если вычисленнвй слой совпадает с текущим, т.е слой всего один, или все остальные слои заморожены, отключены или заблокированы,
		(princ "\nНет других включенных, размороженных и разблокированных слоев.") ;;; сообщаем об этом и завершаем работу программы.
		(progn ;;; Если не совпадает,
			(setvar "CLAYER" next-lay) ;;; то назначаем активным вычисленный слой,
			(princ  (strcat "\nАктивирован слой \"" next-lay "\". "))  ;;; посылаем отчет в командную строку.
		) ;end of progn
	) ;end of if
	(princ) ;;; "Тихо" выходим.
);end of defun (lay-switch)

Согласен с Алексеем в его комментарии к своему коду:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
P.P.S. Код не учитывает фильтры слоев, так что в качестве рабочего использоваться не может.
От себя добавлю, что код также не учитывает сортировку слоев в диспетчере свойств слоев. Если в диспетчере слои отсортированы по имени, то переключение будет идти по порядку, если же они отсортированы как-то иначе (по цвету, например), то переключение будет происходить хаотично. Напомню, что на панели Слои выпадающий список слоев отсортирован по алфавиту, т.е. в нем порядок переключения будет правильным. Если кто подскажет, как выяснить программно способ сортировки слоев в диспетчере свойств слоев, то смогу подправить.

Последний раз редактировалось skkkk, 09.09.2014 в 10:42. Причина: Добавил обработку слоя "Defpoints"
skkkk на форуме  
 
Непрочитано 09.09.2014, 05:08
#93
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от skkkk Посмотреть сообщение
но вот пост #9 меня удивил.
Jonas, как так-то?
Да, было дело. В то время работал главным и занимался только моделированием ну и как то не прижилось, вот и забыл.
Последние годы делаю всё, от А до Я, поэтому востребовано а про код Кулик Алексей aka kpblc забыл.
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 09.09.2014, 05:42
#94
skkkk


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


Ничего страшного. Зато я позанимался . Было интересно. Скажу больше: я готов, с разрешения Алексея, и при подсказках и помощи других форумчан, попробовать разобраться и с фильтрами слоев, да и вообще, развить данную программку, исправить все найденные недоработки и ошибки. Сам я ее себе тоже на вооружение взял, повесил на мышку и переключение слоев. Удобно, если заблокировать не используемые в данный момент слои и переключаться между двумя-тремя используемыми. Гонял весь день вчера, работает четко.
Возникла мысль, может, стоит добавить обработку предварительно выбранных объектов? То есть, если объекты выбраны, то они будут переноситься на следующий/предыдущий слой? Жду предложений.

Уважаемые модераторы, перенесите, пожалуйста тему в раздел "Программирование".
skkkk на форуме  
 
Непрочитано 09.09.2014, 08:47
#95
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Спасибо, работает нормально.
Цитата:
Сообщение от skkkk Посмотреть сообщение
То есть, если объекты выбраны, то они будут переноситься на следующий/предыдущий слой?
На следующий может и не нужно а вот если при выбранных объектах можно листать слои и остановившись на нужном подтвердить перенос, было бы актуально.
Кстати, я тоже поставил на кнопку грызуна шифт+N - следующий а контр+кнопка (шифт+N) - назад.
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 09.09.2014, 08:53
#96
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
я готов, с разрешения Алексея
Не понял, а я-то тут каким боком?

----- добавлено через ~11 мин. -----
Объединены три темы по переключению слоев с помощью клавиш. Тема перенесена из "AutoCAD" в "Программирование"
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.09.2014, 12:04
#97
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,887
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Хочу еще напомнить, что когда-то была востребована ф-ция отключения/включения слоев по фильтру layer-filters-status-change

Цитата:
Сообщение от skkkk Посмотреть сообщение
и при подсказках и помощи других форумчан, попробовать разобраться и с фильтрами слоев
Парочку ссылок
Make a layer filter... yes i said MAKE
Exporter/importer des filtres de calque
Can I create frequently used layer filters in LISP?
Я когда-то начинал разбираться с фильтрами слоев. Даже написал что-то наподобие библиотеки. По памяти - по моему не получилось из лиспа устанавливать текущим тот или иной фильтр. Могу ошибаться. Библиотека во вложении
Вложения
Тип файла: lsp layfilter-VVA.LSP (32.8 Кб, 24 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.09.2014, 12:12
#98
skkkk


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не понял, а я-то тут каким боком?
Как это?
Во-первых, я могу вдруг остро зануждаться в
Цитата:
Сообщение от skkkk Посмотреть сообщение
подсказках и помощи
а во-вторых, ты ж, как-никак первоотец идеи и ее воплощения, - за тобой и право приоритетного голоса.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Объединены три темы по переключению слоев с помощью клавиш. Тема перенесена из "AutoCAD" в "Программирование"
Вот это правильно, спасибо, Алексей. Большое спасибо!
Цитата:
Сообщение от Jonas Посмотреть сообщение
листать слои и остановившись на нужном подтвердить перенос
А каким образом подтвердить, если у нас команды (да и функция) активируют слой и завершаются? После каждого переключения выдавать запрос "Да/Нет"? Или через один? Думаю, это может лишить смысла всю затею.
Я предлагаю пойти по Автокадовскому принципу работы со слоями: если надо переключить текущий слой, объекты должны быть НЕ выделенными, а если нужно назначить объектам свойство "Слой", они должны быть ПРЕДВАРИТЕЛЬНО выделены. Выделение после сбрасывается Ecs, либо объекты подвергаются действию следующей команды. Так и надо: пока объекты выделены, мы по кругу меняем им слой - вверх/вниз по списку, и смотрим в ком.строку, где все оглашается; затем нажали Esc - и уже меняем по кругу активный слой. Максимум, можно только в начале спросить что-то вроде: "Сбросить выделение [Да/Нет]". Я так думаю.
skkkk на форуме  
 
Непрочитано 09.09.2014, 12:15
#99
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Наверно возможно. Пишите, будем пробовать.
__________________
Из честолюбия или чувства долга не может родиться ни чего ценного. А. Эйнштейн
Jonas вне форума  
 
Непрочитано 07.12.2017, 08:41
#100
Gefest1


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


Прочитав тему я так понял, что способ не придумали?
У меня сейчас такое ТЗ для программы:
-переключение слоёв должно происходить внутри действующего фильтра слоёв.
-команда задается сочетанием клавиш на клавиатуре
-выбор слоя осуществляется колесом мышки (либо, по желанию пользователя, по началу названия слоя набираемого с клавы), название слоя отображается возле курсора
-подтверждение выбора слоя осуществляется по нажатию ЛКМ (либо ПКМ, либо колесика)
-после этого выбранный слой становится текущим, а если был выбран объект - то объект переносится на выбранный слой.
По моему, получится удобно (ели фильтр настроен грамотно)
Если слои назвать например 1,2,3,.. то получаем результат, который хотел ТС.
Получится такое сделать?
Gefest1 вне форума  
 
Непрочитано 07.12.2017, 09:27
#101
Boxa

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


Цитата:
Сообщение от Gefest1 Посмотреть сообщение
Прочитав тему я так понял, что способ не придумали?
У меня сейчас такое ТЗ для программы:
-переключение слоёв должно происходить внутри действующего фильтра слоёв.
-команда задается сочетанием клавиш на клавиатуре
-выбор слоя осуществляется колесом мышки (либо, по желанию пользователя, по началу названия слоя набираемого с клавы), название слоя отображается возле курсора
-подтверждение выбора слоя осуществляется по нажатию ЛКМ (либо ПКМ, либо колесика)
-после этого выбранный слой становится текущим, а если был выбран объект - то объект переносится на выбранный слой.
По моему, получится удобно (ели фильтр настроен грамотно)
Если слои назвать например 1,2,3,.. то получаем результат, который хотел ТС.
Получится такое сделать?
С первого взгляда проблем не вижу, ничего сложного в ТЗ нет, все реализуемо, надо просто сеть и написать.
ЗЫ.
Я со стороны C# смотрю.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 07.12.2017, 10:22
#102
Кулик Алексей aka kpblc
Moderator

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


Offtop: Boxa, вот зря ты это написал Сейчас на тебя насядут: ну так сделай, раз не сложно!
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.12.2017, 10:50
#103
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


А я бы вообще ничего не стал делать, если предполагается слои называть просто цифрами. IMHO.
Setvar вне форума  
 
Непрочитано 07.12.2017, 12:03
#104
Boxa

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


Offtop:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сейчас на тебя насядут: ну так сделай, раз не сложно!
Автор спрашивал: "Получится такое сделать?. Я написал, что получится. реализуемо != не сложно
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 08.12.2017, 14:32
#105
Gefest1


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


Ок, уточню: есть ли энтузиасты, недавно изучившие как писать программы для автокада, жаждущие попрактиковаться и получить творческое удовольствие, и создать полезную для людей программу?
Если есть - сделайте пожалуйста, и если всё будет хорошо - похвалим и вам будет приятно, если нет - узнаете что надо повысить квалификацию)
В другой раз для вас тоже что-нибудь хорошее сделают.
Gefest1 вне форума  
 
Непрочитано 08.12.2017, 15:41
#106
Boxa

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


Цитата:
Сообщение от Gefest1 Посмотреть сообщение
энтузиасты, недавно изучившие как писать программы
Кулик Алексей aka kpblc, А ты говоришь насядут =о) Я тут по всем параметрам сразу мимо. =о)
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 13.12.2017, 12:57
#107
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 400
<phrase 1=


Добрый день!
Как во всей подшивке (разные файлы) сделать один определенный слой непечатаемым?
Точнее как добраться до слоёв в каждом файле из подшивки с помощью vba?
Alexeipost вне форума  
 
Непрочитано 13.12.2017, 13:16
#108
Сергей812


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


Цитата:
Сообщение от Alexeipost Посмотреть сообщение
Точнее как добраться до слоёв в каждом файле из подшивки с помощью vba?
никак) Из подшивки можно получить имена *.dwg файлов, содержащие листы, включенные в подшивку.
Сергей812 вне форума  
 
Непрочитано 13.12.2017, 13:31
#109
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 400
<phrase 1=


До "печатаемости" слоя в данном файле добрался.

Код:
[Выделить все]
Sub Слой_печать_вкл_выкл()
Dim i As Integer

For i = 0 To ThisDrawing.Layers.Count - 1
    If ThisDrawing.Layers.Item(i).Name = "Печать_подписи" Then
        If ThisDrawing.Layers.Item(i).Plottable = False Then
            ThisDrawing.Layers.Item(i).Plottable = True
        Else
            ThisDrawing.Layers.Item(i).Plottable = False
        End If
    End If

Next

End Sub
Теперь надо добраться до остальных файлов в подшивке.

2 Сергей812
Можно маленький примерчик как взять подшивку и перебрать все файлы в ней, пожалуйста)))
Alexeipost вне форума  
 
Непрочитано 13.12.2017, 13:54
#110
Сергей812


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


А разве так работать не будет:
Код:
[Выделить все]
Dim lLayer As AcadLayer
On Error Resume Next
Set lLayer = ThisDrawing.Layers(%Имя  слоя%)
If (Err.Number = 0) then  lLayer.Plottable = Not lLayer.Plottable
писал на коленке, VBA в акаде у меня уже много лет даже не установлен)

Цитата:
Сообщение от Alexeipost Посмотреть сообщение
Можно маленький примерчик как взять подшивку и перебрать все файлы в ней, пожалуйста)))
Перебираете подшивку, получаете листы в цикле. Из листа получаете имя привязанного файла *.dwg, проверяете - нет ли такого уже файла во вспомогательном списке имен файлов. Если нет - добавляете. Если используется древовидную структуру листов в подшивке, то будут еще субнаборы (в .Net это AcSmSubset) листов. Обрабатываете листы в этих субнаборах с помощью рекурсии.
Сергей812 вне форума  
 
Непрочитано 13.12.2017, 13:59
#111
Boxa

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


Цитата:
Сообщение от Alexeipost Посмотреть сообщение
Можно маленький примерчик как взять подшивку и перебрать все файлы в ней, пожалуйста)))
Нда... неужели настолько лень документацию читать... C:\Program Files\Autodesk\AutoCAD 20ХХ\Sample\ActiveX\SheetSetVBA\
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 13.12.2017, 14:36
#112
Сергей812


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


Дополнению к коду в посте №109 - если нашли слой, то можно выходить из цикла. Или надеетесь, что ещё будет слой с таким же именем?)
Сергей812 вне форума  
 
Непрочитано 13.12.2017, 15:50
#113
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 400
<phrase 1=


2 Сергей812
Ваш код работает.

2 Boxa
Читать не лень. По указанному адресу нет такой папки у меня.
Alexeipost вне форума  
 
Непрочитано 13.12.2017, 16:14
#114
Сергей812


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


Тут на форуме есть все, как в Греции) За правильность не ручаюсь - лень вчитываться)
Сергей812 вне форума  
 
Непрочитано 20.12.2017, 07:49
#115
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 400
<phrase 1=


Заклинание непинания: "Я не программист! Я делаю свою работу удобнее и быстрее!"

Для чего эта программа?
Если надо отправить на печать (на плоттер или в пдф) документ с подписями и печатями, то данная программа включает слой "Печать_подписи" (у меня именно в этом слое находятся подписи и печати) во всех листах подшивки.
Если надо этот слой выключить, то по месту (1) см.код вместо True надо поставить False.
Вот что получилось:
Код:
[Выделить все]
Sub Layer_Plotable_on()
Dim lLayer As AcadLayer  'Слой
Dim oEnumDb As IAcSmEnumDatabase 'База подшивок
Dim oItem As IAcSmPersist 'Одна подшивка
Dim oSheetSetMgr As AcSmSheetSetMgr
Set oSheetSetMgr = New AcSmSheetSetMgr

Set oEnumDb = oSheetSetMgr.GetDatabaseEnumerator
Set oItem = oEnumDb.Next 'Берем первую подшивку

Dim oSheetDb As AcSmDatabase

'Перебор открытых подшивок
Do While Not oItem Is Nothing
    Set oSheetDb = oItem
    
    oSheetDb.LockDb oSheetDb 'Блокировка подшивки для работы с ней
    If oSheetDb.GetLockStatus = 1 Then
        On Error Resume Next
        Dim oEnum As IAcSmEnumPersist
        Dim oItemSh As IAcSmPersist
        Dim oacSht As IAcSmSheet 'Один лист в подшивке
        
        Set oEnum = oSheetDb.GetEnumerator
        Set oItemSh = oEnum.Next 'Берем один лист
        Do While Not oItemSh Is Nothing
            If oItemSh.GetTypeName = "AcSmSheet" Then 'Если свойство листа подшивки AcSmSheet, то вытаскиваем имя файла данного листа подшивки
                Set oacSht = oItemSh
                ThisDrawing.Application.Documents.Open (oacSht.GetLayout.ResolveFileName) 'открываем этот файл
                Set lLayer = ThisDrawing.Layers("Печать_подписи") 'Ищем слой "Печать_подписи"
                If (Err.Number = 0) Then
                    lLayer.Plottable = True 'Если находим, то делаем этот слой печатаемым (1) False вместо True делает слой непечатаемым
                Else
                    MsgBox "Слой ""Печати_подписи"" не найден" 'Если не находим сообщаем что такого слоя в файле нет
                End If
                ThisDrawing.Close True 'Закрываем с сохранением файл
            End If
        Set oItemSh = oEnum.Next 'Берем следующий лист подшивки
    Loop 'Конец перебора листов

    oSheetDb.UnlockDb oSheetDb 'Разблокируем подшивку
    End If
    Set oItem = oEnumDb.Next 'Берем следующую подшивку
Loop 'Конец перебора подшивок
End Sub
Код не оптимальный.
У меня некоторые листы подшивки ссылаются на один и тот же файл.
Прога каждый раз открывает файл листа подшивки делает своё дело и закрывает его.
Ускорить работу данного кода можно открыв все файлы листов подшивки, потом по очереди менять значение plotable и закрывать файлы. Для этого надо сделать проверку "если файл уже открыт, то не открывать его".
Допустим у меня есть подшивка, в которой десять листов ссылаются на один файл.
Вот так вот.
Alexeipost вне форума  
 
Непрочитано 20.12.2017, 08:11
#116
Boxa

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


Если Вы все равно используете On Error Resume Next, то зачем вот это:
Код:
[Выделить все]
Set lLayer = ThisDrawing.Layers("Печать_подписи") 'Ищем слой "Печать_подписи"
If (Err.Number = 0) Then
    lLayer.Plottable = True 'Если находим, то делаем этот слой печатаемым (1) False вместо True делает слой непечатаемым
Else
     MsgBox "Слой ""Печати_подписи"" не найден" 'Если не находим сообщаем что такого слоя в файле нет
End If
проще сделать все сразу:
Код:
[Выделить все]
ThisDrawing.Layers.Item("Печать_подписи").Plottable = True
Если есть, то включит, если нет то ошибку проглотит...

Хотя я бы конструцию On Error Resume Next и условия не использовал, а обошелся бы конструкцией
Код:
[Выделить все]
For Each lLayer In ThisDrawing.Layers
    If lLayer.Name = "Печать_подписи" Then
        lLayer.Plottable = True
        Exit For
    End If
Next
ЗЫ.
В .NET проще, там можно напрямую спросить, есть ли слой с заданным именем....
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 20.12.2017, 10:30
#117
Сергей812


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


Общие замечания и рекомендации:
1. В начале программы вставить запрос - включить и выключить слой через функцию GetKeyword.
2. Использовать логирование в комстроку акада, закрывать каждый раз MsgBox - не совсем френдли интерфейс.
3. Сначала перебрать все подшивки, собрать оттуда имена файлов, а потом уже обрабатывать файлы. Попробуйте для создания списка уникальных имен файлов использовать Scripting.Dictionary с поздним связыванием (если админы не отключили скрипты, конечно).
4. Выводить имена обрабатываемых файлов в комстроку акада и статус обработки типа: ОК, не удалось открыть, не найден слой.
5. Сделайте счетчики для разных состояний статуса обработки и выводите в комстроке в конце суммарную информацию: всего файлов, из них успешно и т.д.
Сергей812 вне форума  
 
Непрочитано 20.12.2017, 11:59
#118
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 400
<phrase 1=


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Общие замечания и рекомендации:
1. В начале программы вставить запрос - включить и выключить слой через функцию GetKeyword.
Можно и так, но у меня на панели две разные кнопки ("принтер" и "зачеркнутый принтер"), а в файле plot_on_off.dvb два кода (вкл/выкл).

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
2. Использовать логирование в комстроку акада, закрывать каждый раз MsgBox - не совсем френдли интерфейс.
Согласен что не френдли. Как применить логирование? (У себя строку с MsgBox убрал апострофом)
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
3. Сначала перебрать все подшивки, собрать оттуда имена файлов, а потом уже обрабатывать файлы. Попробуйте для создания списка уникальных имен файлов использовать Scripting.Dictionary с поздним связыванием (если админы не отключили скрипты, конечно).
Админы у нас конечно те ещё звери, но я к скриптам отношения не имею))) По этому смотрю в сторону "открытия файла если такой файл еще не открыт".
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
4. Выводить имена обрабатываемых файлов в комстроку акада и статус обработки типа: ОК, не удалось открыть, не найден слой.
Поделитесь примером на VBA
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
5. Сделайте счетчики для разных состояний статуса обработки и выводите в комстроке в конце суммарную информацию: всего файлов, из них успешно и т.д.
Надо заморочиться на это.
Alexeipost вне форума  
 
Непрочитано 20.12.2017, 15:09
#119
Сергей812


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


Цитата:
Сообщение от Alexeipost Посмотреть сообщение
Можно и так, но у меня на панели две разные кнопки ("принтер" и "зачеркнутый принтер"), а в файле plot_on_off.dvb два кода (вкл/выкл).
дублировать весь код из-за одной строки со значением - я бы вынес в отдельную процедуру с параметром: Boolean - статус печати и уже ее бы в командах вызывал.

Цитата:
Сообщение от Alexeipost Посмотреть сообщение
Согласен что не френдли. Как применить логирование? (У себя строку с MsgBox убрал апострофом)
Цитата:
Сообщение от Alexeipost Посмотреть сообщение
Поделитесь примером на VBA
ThisDrawing.Utility.Prompt - принимает один аргумент в виде строки. Соответственно, формируете строки (для переноса строк используя vbCrLf) и выводите в комстроку акада.

Цитата:
Сообщение от Alexeipost Посмотреть сообщение
Админы у нас конечно те ещё звери, но я к скриптам отношения не имею))) По этому смотрю в сторону "открытия файла если такой файл еще не открыт".
это внутри кода VBA создаваемый объект, просто в отличие от встроенных в сам VBA коллекций более гибкий инструмент.
Сергей812 вне форума  
 
Непрочитано 19.02.2021, 07:34 Это же очень просто
#120
feel-alex


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


В адаптации назначаете горячую клавишу и в ней пишите макрос
^C^C(setvar "CLAYER" "ИМЯСЛОЯ")
Можете и в контекстное меню поставить и горячие клавиши назначить

Последний раз редактировалось Кулик Алексей aka kpblc, 19.02.2021 в 07:43.
feel-alex вне форума  
 
Непрочитано 25.02.2021, 11:06
#121
koMon


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


Нажмите на изображение для увеличения
Название: QA.jpg
Просмотров: 15
Размер:	35.6 Кб
ID:	234842 пользовательская команда QA. для списка слоёв не больше 9.
групповой и по свойствам фильтры обрабатываются только по именам слоёв. маски в фильтре по свойствам не обрабатываются. выбор слоя для активации по порядковому номеру в выпадающем списке-> <Enter>, ЛКМ, клавишами "вверх"/"вниз"-> <Enter>. выбранные до вызова QA примитивы переносятся (если возможно) на слой, который может стать текущим.
Вложения
Тип файла: rar quick_layer_assign.fas.rar (4.1 Кб, 4 просмотров)
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Переключение слоёв в AutoCAD с помощью клавиш.

Реверс. Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Работа со старыми чертежами с помощью AutoCAD и Photoshop Shoorup AutoCAD 9 10.05.2007 23:41
Комбинации клавиш для команд в AutoCAD 2006 Artiznov AutoCAD 3 03.03.2006 15:23
AUTOCAD 2006 Aragorn AutoCAD 14 01.04.2005 00:55
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48