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

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

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

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

В AutoCAD я обычно использую в среднем 8 слоёв. Уважаемые форумчани, подскажите пожалуйста есть ли возможность в AutoCAD, выбирать слой не курсором мышки, а с помощью клавиатуры. Например следующим образом: нажимается какая-то базовая или сочетания клавиш запускающая команду выбрать слой, а затем выбирается слой посредствам ввода порядкового номера присвоенного индивидуально каждому из используемых слоёв. Возможно ли это?
Просмотров: 63661
 
Непрочитано 12.01.2009, 10:16
#41
Profan


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


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

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


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


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


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

инженер-строитель
 
Регистрация: 17.05.2005
E-burg
Сообщений: 696
<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,288


А стены рисуются не основными линиями?
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
С.-Петербург
Сообщений: 39,787


Вешай на клавиши соответствующие команды (правда, лисп придется загрузить):
Код:
[Выделить все]
(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. Код не учитывает фильтры слоев, так что в качестве рабочего использоваться не может.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей 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
С.-Петербург
Сообщений: 39,787


По-моему, такое средствами 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
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей 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
С.-Петербург
Сообщений: 39,787


Цитата:
Сообщение от Desert_Eagle Посмотреть сообщение
как "вешать на клавиши команды"
http://dwg.ru/pub/9 посмотри.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.07.2013, 13:47
#59
Vova

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


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

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


Цитата:
Сообщение от Vova Посмотреть сообщение
А когда вижу имя слоя типа Основные, Пунктирные и подобное то представляется
Автокад знаю очень хорошо, но слои именно так и называются. У нас у машиностроителей не бывает сотня слоев. Только по типам выполняемых линий. Соответственно командами работы со слоями нет необходимости пользоваться. Так что обобщать не надо.
__________________
Век живи, век учись - ...
Bull вне форума  
Ответ
Вернуться   Форум 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