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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Научите работать со слоями

Научите работать со слоями

Ответ
Поиск в этой теме
Непрочитано 29.04.2008, 13:29 #1
Научите работать со слоями
Mazai
 
Москва
Регистрация: 04.04.2008
Сообщений: 97

Здраствуйте. Пожалуйста, научите работать со слоями. Хочу на АвтоЛИСПЕ понять, как:
1. Создать слой
2. Скопировать слой
3. Сделать слой активным (что бы все элементы чертились в нём)
4. Узнать имя активного слоя.

Подозреваю, что это делаеться с помощью объектов ActivX, но как их правильно использовать и что возможно с их помощь - не знаю. Помогите примерами, а там дальше может сам соображать начну.
Просмотров: 12005
 
Непрочитано 29.04.2008, 13:32
#2
Profan


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


Почему это сразу с помощью ActiveX? А обычный AutoLisp вы знаете?
Profan вне форума  
 
Непрочитано 29.04.2008, 14:01
#3
Makswell

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


Код:
[Выделить все]
;;;1-е
(vl-cmdf "_.-LAYER" "_New"     "Слой"	  "_Color"   "3"	"Слой"
	 "_LType"   "Continuous"	  "Слой"     "_LW"	"0.15"
	 "Слой"	    "_Plot"    "_plot"	  "Слой"     ""
	)

;;;2-е, непонятно, скопировать из одного рисунка в другой?

;;;3-е
(setvar "CLAYER" "Слой")
;;;4-е
(getvar "CLAYER")
Добавлено:
И никакого ActveX
Makswell вне форума  
 
Автор темы   Непрочитано 29.04.2008, 14:21
#4
Mazai


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


2-ое: всё содержимое слоя скопировать на другой слой. Или сделать копию уже существующего слоя.

Просто я только с месяц его изучаю - всех тонкостей ещё не знаю.
По поводу первого пункта - просто думал обходиться без командной строки. Вот и подумал на ActivX.
Mazai вне форума  
 
Непрочитано 29.04.2008, 14:41
#5
Кулик Алексей aka kpblc
Moderator

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


Если без ActiveX и без ком.строки, то надо использовать (entmake) или (entmakex) - см. DXF Reference из справки.
Для изменения свойств объектов надо чтобы исходный слой был не заблокирован и не заморожен; потом либо команда _.change, либо модифицировать точечную пару с ключом 8 (см. entmode и entupd), либо работать через ActiveX.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2008, 14:47
#6
Profan


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


Первый и третий пункт можно объединить:
Код:
[Выделить все]
 
(vl-cmdf "_-LAYER" "_m" "NEW_LAYER" "")
Нужна ли здесь технология ActiveX?
Profan вне форума  
 
Непрочитано 29.04.2008, 14:54
#7
Кулик Алексей aka kpblc
Moderator

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


Profan, читай #4:
Цитата:
думал обходиться без командной строки
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2008, 15:00
#8
Profan


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


Ну, думал/не думал. А как попроще написать это выражение
Код:
[Выделить все]
(vl-cmdf "_-LAYER" "_m" "NEW_LAYER" "")
без командной строки?
Profan вне форума  
 
Непрочитано 29.04.2008, 15:30
#9
Кулик Алексей aka kpblc
Moderator

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


entmakex уже просто не помню, посему activeX:
Код:
[Выделить все]
(vla-put-activelayer
  (vla-get-activedocument (vlax-get-acad-object))
  ((lambda (/ res)
     (setq
       res (vla-add
             (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
             "qwert"
             ) ;_ end of vla-add
       ) ;_ end of setq
     (vla-put-color res 1)
     res
     ) ;_ end of lambda
   )
  ) ;_ end of vla-put-ActiveLayer
Во, через entmakex:
Код:
[Выделить все]
(entmakex '((0 . "LAYER")
            (100 . "AcDbSymbolTableRecord")
            (100 . "AcDbLayerTableRecord")
            (2 . "0_0")
            (70 . 0)
            (62 . 7)
            (6 . "Continuous")
            (290 . 1)
            (370 . -3)
            )
          ) ;_ end of entmakex
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2008, 15:47
#10
Makswell

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


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

По второму пункту конечно посложнее:
Код:
[Выделить все]
(defun test (item1 item2 / old_layer new_layer lay lay_list lay_color lay_ltyp
	     lay_lw lay_plot)
  (setq	old_layer item1
	new_layer item2
  )
  (if (tblsearch "LAYER" old_layer)
    (progn
      (setq lay (entget (tblobjname "LAYER" old_layer)))
      (setq lay_color (itoa (cdr (assoc 62 lay)))) ;цвет
      (setq lay_ltyp (cdr (assoc 6 lay))) ;тип линии
					;(cdr (assoc 370 lay)) - вес линии (умноженный на 100, или -3, если "По умолчанию" ("_default"))
      (setq lay_lw (if (= (cdr (assoc 370 lay)) -3)
		     "_default"
		     (rtos (/ (cdr (assoc 370 lay)) 100.) 2 2)
		   )
      )
					;печать (0 - не печатаемый, 1 - печатаемый) (_no, _plot)
      (setq lay_plot (if (= (itoa (cdr (assoc 290 lay))) 0)
		       "_No"
		       "_Plot"
		     )
      )
      (vl-cmdf "_.-LAYER"   "_New"	 new_layer    "_Color"	   lay_color
	       new_layer    "_LType"	 lay_ltyp     new_layer	   "_LW"
	       lay_lw	    new_layer	 "_Plot"      lay_plot	   new_layer
	       ""
	      )

    )
  )
  (princ)
)
Запускать надо так (test "Старый_слой" "Новый_слой")
"Старый_слой" должен существовать
Makswell вне форума  
 
Непрочитано 30.04.2008, 11:22
#11
Makswell

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


А вот и через entmake. Кстати, если разобраться, то так даже проще и короче чем через vl-cmdf.
Код:
[Выделить все]
(defun test (item1 item2 / old_layer new_layer lay)
  (setq	old_layer item1
	new_layer item2
  )
  (if (tblsearch "LAYER" old_layer)
    (progn
      (setq lay (entget (tblobjname "LAYER" old_layer)))
      (entmake (list (cons 0 "LAYER")
		     (cons 100 "AcDbSymbolTableRecord")
		     (cons 100 "AcDbLayerTableRecord")
		     (cons 2 new_layer)
		     (cons 70 0)
		     (assoc 62 lay)
		     (assoc 6 lay)
		     (assoc 370 lay)
		     (assoc 290 lay)
	       )
      )
    )
  )
  (princ)
)
Запускать также (test "Старый_слой" "Новый_слой")
Makswell вне форума  
 
Непрочитано 30.04.2008, 11:37
#12
Makswell

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


Ещё в продожение поста #9 от Алексея. Небольшое исследование, может кому пригодится.
Список точечных пар можно создавать 3-мя способами.
Код:
[Выделить все]
;;;1-й вариант 
(entmakex '((0 . "LAYER")
	    (100 . "AcDbSymbolTableRecord")
	    (100 . "AcDbLayerTableRecord")
	    (2 . "0_0")
	    (70 . 0)
	    (62 . 7)
	    (6 . "Continuous")
	    (290 . 1)
	    (370 . -3)
	   )
)

;;;2-й вариант
(entmakex (list	'(0 . "LAYER")
		'(100 . "AcDbSymbolTableRecord")
		'(100 . "AcDbLayerTableRecord")
		'(2 . "0_0")
		'(70 . 0)
		'(62 . 7)
		'(6 . "Continuous")
		'(290 . 1)
		'(370 . -3)
	  )
)

;;;3-й вариант
(entmakex (list	(cons 0 "LAYER")
		(cons 100 "AcDbSymbolTableRecord")
		(cons 100 "AcDbLayerTableRecord")
		(cons 2 "0_0")
		(cons 70 0)
		(cons 62 7)
		(cons 6 "Continuous")
		(cons 290 1)
		(cons 370 -3)
	  )
)
2 и 3-й варианты можно комбинировать.
Makswell вне форума  
 
Непрочитано 30.04.2008, 11:43
#13
Profan


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


А так:
Код:
[Выделить все]
 
(defun C:OLC ( / ss )
(setq ss (ssget "_X" (list (cons 8 "OLD_LAYER"))))
(vl-cmdf "_COPY" ss "" "0,0" "0,0")
(vl-cmdf "_CHANGE" "_p" "" "_p" "_la" "NEW_LAYER" "")
(princ)
)
Profan вне форума  
 
Непрочитано 30.04.2008, 11:51
#14
Makswell

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


Здесь происходит перенос примитивов с одного слоя на другой.
Я так понял Mazai хочет скопировать именно слой. То есть по сути создать новый слой со всеми установками старого.
Makswell вне форума  
 
Непрочитано 30.04.2008, 11:59
#15
Profan


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


А зачем только слой программно копировать? В Диспетчере слоев установил текущим старый слой и нажал кнопку создания нового слоя. Этот слой получит свойства старого слоя. Остается его только переименовать, нажав клавишу F2. К тому же видно состояние старого слоя.
Profan вне форума  
 
Непрочитано 30.04.2008, 12:32
#16
Makswell

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


Ну, ответ на этот вопрос знает только Mazai
Сразу скажу, что мне этого не надо

Добавлено:
А вообще-то тема грамотно названа, да ещё и находится в разделе "Программирование". Думаю, это неплохое подспорье для начинающих.

Последний раз редактировалось Makswell, 30.04.2008 в 12:49.
Makswell вне форума  
 
Непрочитано 30.04.2008, 12:56
#17
Кулик Алексей aka kpblc
Moderator

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


Makswell, #12: вариант с переменной величиной в любой части точечной пары обязательно потребует cons. Это так, в качестве уточнения...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.04.2008, 13:10
#18
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


В самом простом случае, скопировать примитивы на новый слой (с такими же свойствами, как и у исходного) можно примерно так:
Код:
[Выделить все]
(defun demo (/ ent ents i newnm oldlr oldnm)
 (if (setq ent (entsel "\nВыбери объект на копируемом слое: "))
  (progn (while (and (/= "" (setq newnm (getstring "\nИмя нового слоя <Выход>: ")))
                     (tblsearch "LAYER" newnm)
                )
          (princ "\nТакой слой уже существует, нужно другое имя!")
         )
         (if (/= "" newnm)
          (progn (setq oldnm (cdr (assoc 8 (entget (car ent))))
                       oldlr (entget (tblobjname "LAYER" oldnm))
                       ents  (ssget "x" (list (cons 8 oldnm)))
                       i     -1
                 )
                 (entmake (subst (cons 2 newnm) (assoc 2 oldlr) oldlr))
                 (while (setq ent (ssname ents (setq i (1+ i))))
                  (setq ent (entget ent))
                  (entmake (subst (cons 8 newnm) (assoc 8 ent) ent))
                 )
          )
         )
  )
 )
 (princ)
)
Демокод без проверок и обработки ошибок!
Alaspher вне форума  
 
Непрочитано 30.04.2008, 15:35
#19
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Интересная тема, тоже хочется поучавствовать...

Вообще-то, использование vla методов и методов dxf, сильно различается.
Очень часто, по объему и сложности кода, а так же по скорости выполнения.
Предлагаю самим сравнить:

Код:
[Выделить все]
;;1. Создать слой через dxf
(entmakex '((0 . "LAYER")
            (100 . "AcDbSymbolTableRecord")
            (100 . "AcDbLayerTableRecord")
            (2 . "New Layer entmakex")
            (70 . 0)
           )
)
;;1. Создать слой через vla
(vla-add (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
         "New Layer vla-add"
) ;_  vla-add
Код:
[Выделить все]
;;2. Скопировать слой через dxf
(entmakex (subst '(2 . "New Layer entmakex - copy")
                 '(2 . "New Layer entmakex")
                 (entget (tblobjname "LAYER" "New Layer entmakex"))
          )
)

;;2. Скопировать слой через vla
(progn
 (setq la (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
       n  (vla-add la "New Layer vla-add copy")
       o  (vla-item la "New Layer vla-add")
 ) ;_  setq
 (foreach p '("Freeze" "LayerOn" "Linetype" "Lineweight" "Lock" "Plottable" "TrueColor")
  (vlax-put-property n p (vlax-get-property o p))
 )
)

Код:
[Выделить все]
;;3. Сделать слой активным (что бы все элементы чертились в нём) через dxf
(setvar "CLAYER" "New Layer entmakex - copy")

;;3. Сделать слой активным (что бы все элементы чертились в нём) через vla
(vla-put-ActiveLayer
 (vla-get-activedocument (vlax-get-acad-object))
 (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
           "New Layer vla-add copy"
 )
)

Код:
[Выделить все]
;;4. Узнать имя активного слоя.  через dxf
(getvar "CLAYER")
;;4. Узнать имя активного слоя.  через vla
(vla-get-name(vla-get-ActiveLayer (vla-get-activedocument (vlax-get-acad-object))))
С наступающими всех праздниками! Пусть шашлыки и пиво найдут каждого...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 04.05.2008, 10:41
#20
Mazai


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


Всем спасибо, перевариваю
Mazai вне форума  
 
Автор темы   Непрочитано 15.05.2008, 10:28
#21
Mazai


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


Подскажите пожалуйста, а как программно включить или отключить слой (имеется ввиду видимость слоя).

P.S.: В идеале хотелось бы узнать как отключить все существующие слои и оставить только один - нужный.
Mazai вне форума  
 
Непрочитано 15.05.2008, 11:12
#22
Makswell

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


Командными методами
Код:
[Выделить все]
;;;Отключение
(vl-cmdf "_-LAYER" "_off" "MyLayer" "_Y" "")
;;;Включение
(vl-cmdf "_-LAYER" "_on" "MyLayer" "")
Через ActiveX
Код:
[Выделить все]
;;;Отключение
(vla-put-layeron
  (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
	    "MyLayer"
  )
  :vlax-false
)
;;;Включение
(vla-put-layeron
  (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
	    "MyLayer"
  )
  :vlax-true
)
Makswell вне форума  
 
Автор темы   Непрочитано 15.05.2008, 16:05
#23
Mazai


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


А есть возможность сделать это например с помощью "ENTMOD" ? Разве нет в DXF-кодах отслеживания этого свойства? Я пытаюсь просто сделать всё без помощи командной строки и без помощи ActiveX.
Mazai вне форума  
 
Непрочитано 15.05.2008, 23:44
#24
Кулик Алексей aka kpblc
Moderator

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


62 код: отрицательное значение = выключение слоя.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.05.2008, 00:38
#25
ButcheR

пианист
 
Регистрация: 18.02.2008
Питер
Сообщений: 418


В меню "Слои2" есть "Изолировать слой"
ButcheR вне форума  
 
Непрочитано 16.05.2008, 08:38
#26
Makswell

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


Сообщение удалил.

Последний раз редактировалось Makswell, 16.05.2008 в 08:51.
Makswell вне форума  
 
Непрочитано 16.05.2008, 09:10
#27
Makswell

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


Цитата:
Сообщение от Mazai Посмотреть сообщение
А есть возможность сделать это например с помощью "ENTMOD" ? Разве нет в DXF-кодах отслеживания этого свойства? Я пытаюсь просто сделать всё без помощи командной строки и без помощи ActiveX.
Тогда так:
Код:
[Выделить все]
;;;Выключение
;;;Запускать как (test "Mylayer"), где Mylayer - имя слоя
(defun test (Lay_mame / ent_lay)
  (setq ent_lay (entget (tblobjname "LAYER" Lay_mame)))
  (if (not (minusp (cdr (assoc 62 ent_lay))))
    (setq ent_lay (subst (cons 62 (* -1 (cdr (assoc 62 ent_lay))))
			 (assoc 62 ent_lay)
			 ent_lay
		  )
    )
  )
  (entmod ent_lay)
  (princ)
)

;;;Включение
;;;Запускать как (test1 "Mylayer"), где Mylayer - имя слоя
(defun test1 (Lay_mame / ent_lay)
  (setq ent_lay (entget (tblobjname "LAYER" Lay_mame)))
  (if (minusp (cdr (assoc 62 ent_lay)))
    (setq ent_lay (subst (cons 62 (* -1 (cdr (assoc 62 ent_lay))))
			 (assoc 62 ent_lay)
			 ent_lay
		  )
    )
  )
  (entmod ent_lay)
  (princ)
)
Makswell вне форума  
 
Непрочитано 11.06.2008, 12:21
#28
Makswell

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


Здравствуйте.
Появился ещё вопрос. Хочу получить пояснение к слою.
Из приведённого ниже кода видно, что его значение хранится в тотечной паре с DXF-кодом 1000
Цитата:
_$ (entget (tblobjname "LAYER" "M-00_2-help draw (no_print)") '("*"))

((-1 . <Имя объекта: 7dbe8568>) (0 . "LAYER") (330 . <Имя объекта: 7db21c10>) (5 . "9FD") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "M-00_2-help draw (no_print)") (70 . 0) (62 . 24) (6 . "Continuous") (290 . 0) (370 . -3) (390 . <Имя объекта: 7db21c78>) (347 . <Имя объекта: 7dbe8620>) (-3 ("AcAecLayerStandard" (1000 . "") (1000 . "Слой для вспомогательных построений (не печатаемый)"))))
Однако
Цитата:
_$ (assoc 1000 (entget (tblobjname "LAYER" "M-00_2-help draw (no_print)") '("*")))

nil
Почему assoc не находит список с DXF-кодом 1000?
Makswell вне форума  
 
Непрочитано 11.06.2008, 13:17
#29
Кулик Алексей aka kpblc
Moderator

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


Потому что сначала надо брать (cdr (assoc -3 lst))...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.06.2008, 13:40
#30
Makswell

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


О, блин! Не заметил. Просто думал, что entget выдаёт список из цельных и законченных DXF-пар, как-то в голову не приходило, что может быть по-другому.
Да уж, впредь надо быть внимательней...
Makswell вне форума  
 
Автор темы   Непрочитано 27.06.2008, 12:44
#31
Mazai


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


А вот ещё с чем я столкнулся. Пробую написать самостоятельно макрос, который бы устанавливал текущий слой по выбранному объекту и отключал бы все остальные слои кроме текущего. Но почему-то в написанном макросе не получается указать объект для текущего слоя. Что в нём не так?
Код:
[Выделить все]
^C^С_.-layer;_set;;\_off;*;;
p.s.: не как не могу разобраться, вроде бы смысл написания макросов понял - выполняю все действия вручную - всё выполняется, запоминаю, пытаюсь то же самое исполнить ввиде макроса - результат не совподает. Чего-то не хватает
Mazai вне форума  
 
Автор темы   Непрочитано 27.06.2008, 16:54
#32
Mazai


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


Обидно, но макросом у меня не получилось. Вместо одной строчки пришлось написать Лисп. Выкладываю для тех, у кого может появиться та жа необходимость
Код:
[Выделить все]
; Программа отключения всех слоёв кроме одного
; Выбор слоя определяется выбором объекта на слое
(defun c:On_One_Layer (/ Lay Lay_name)
  (setq main_Lay (cdr (assoc 8 (entget (car (entsel "Выберите объект на том слое, который следует оставить включённым"))))))
  (setvar "CLAYER" main_Lay)
  (setq Lay (tblnext "LAYER" T))
  (while Lay
    (setq Lay_name (cdr (assoc 2 Lay)))
    (setq ent_Lay (entget (tblobjname "LAYER" Lay_name)))
    (if	(and (not (eq (cdr (assoc 2 ent_Lay)) main_Lay))
	     (not (minusp (cdr (assoc 62 ent_lay))))
	)
      (setq ent_lay (subst (cons 62 (* -1 (cdr (assoc 62 ent_lay))))
			   (assoc 62 ent_lay)
			   ent_lay
		    )
      ) ;_ end setq
    ) ;_ end if
    (entmod ent_lay)
    (setq Lay  (tblnext "LAYER"))
  ) ;_ end while
  (princ)
) ;_ end defun
Mazai вне форума  
 
Непрочитано 27.06.2008, 17:04
#33
Кулик Алексей aka kpblc
Moderator

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


Попробуй (я код не проверял):
Код:
[Выделить все]
^C^C(defun c:mylayeroff( / ent la) (if (setq ent (car (entsel))) (progn (setvar "clayer" (setq la (cdr(assoc 8 (entget ent))))) (command "_.-layer" "_off" "*" "_n" ""))));mylayeroff;
Ну и до кучи "включение всех слоев"
Код:
[Выделить все]
^C^C_.-layer;_on;*;;
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.06.2008, 19:58
#34
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


ТО же, что и у Алексея, но покороче.
Код:
[Выделить все]
^C^C_Laymcur;\_-Layer;_off;*;_n;;
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 30.06.2008, 10:42
#35
Mazai


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


Всё работает. Спасибо!
Но я всё же хочу разобраться... Во всех макросах при включении или отключении слоёв мы выбираем все слои - "*". А если нам надо именно попытаться указать объект. То есть если вместо выбора "*" нам надо перейти в режим выбора объекта на слое. У меня не получилось сдлелать это законченным макросом.
Вот, например, если нам надо написать макрос отключения одного слоя используя вариант выбора объекта на нём, то как он должен выглядеть? Или тут надо использовать Лисп?
Вот мой неработающий макрос:
Код:
[Выделить все]
^C^C_-Layer;_off;;\_y;

Последний раз редактировалось Mazai, 30.06.2008 в 10:48. Причина: выложил свой макрос
Mazai вне форума  
 
Непрочитано 30.06.2008, 10:58
#36
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
надо написать макрос отключения одного слоя используя вариант выбора объекта на нём
Это колесо уже изобрели. Называется layoff и расположено в Express Tools
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.07.2008, 14:50
#37
niki

инженер
 
Регистрация: 04.02.2005
Киев
Сообщений: 23


Подскажите можно ли в Акаде сделать: слои в слое?

Рассказываю на примере:

есть один слой называется "здание"
в нем хочу чтобы были подслои - "1этаж", "2 этаж"...
потом есть еще один слой называтся - "трубы"
в нем хочу чтобы были подслои - "вода", "пар"....
И если я замораживаю один слой "здание", то соответственно замораживаются и все "этажи".
Благодарен за ответ.
niki вне форума  
 
Непрочитано 02.07.2008, 15:01
#38
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от niki Посмотреть сообщение
можно ли в Акаде сделать: слои в слое?
Некое подобие этому можно изобразить за счёт фильтров. Как таковых, дочерних слоёв в Автокаде - нет.
Alaspher вне форума  
 
Непрочитано 24.05.2013, 08:14
#39
AndruxaZ


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


Подскажите, а как сделать следующее внутри лиспа. Нужно отключить все слои, исключая определённые, затем выполняется основная программа. По окончании вернуть слои в исходное состояние.
AndruxaZ вне форума  
 
Непрочитано 24.05.2013, 08:36
#40
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
Подскажите, а как сделать следующее внутри лиспа. Нужно отключить все слои, исключая определённые, затем выполняется основная программа. По окончании вернуть слои в исходное состояние.
Подобного уровня вопросы легко решаются самостоятельно банальным поиском по справочнику Полещука.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 24.05.2013, 08:57
#41
AndruxaZ


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


hwd , и в правду. Что-то я уже так привык задавать вопросы на форум..
AndruxaZ вне форума  
 
Непрочитано 24.05.2013, 10:57
#42
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Подскажите, а как сделать следующее внутри лиспа. Нужно отключить все слои,
исключая определённые, затем выполняется основная программа.
По окончании вернуть слои в исходное состояние.
Код:
[Выделить все]
(defun C:demo(/ *error*);<-- не забудь добавить сюда твои переменные
    (vl-load-com)
  (defun *error* (msg)
    ;(vl-bt)
    (command "_layerp")
    (and msg(princ msg)))

  ;; основная часть  ;;
  (command "_-layer" "_off" "007,008,009" ""); здесь твои слои через запятую

  ;; дальше твоя остальная программа
  
  ;; конец твоей остальной программы
  (*error* nil)
 (princ)
  )

Последний раз редактировалось Олег (jr.), 24.05.2013 в 15:11. Причина: ошибка в коде
Олег (jr.) вне форума  
 
Непрочитано 24.05.2013, 11:41
#43
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Олег (jr.) - красиво завернул.
Offtop: только не (*error nil*) а (*error* nil).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.05.2013, 15:13
#44
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Offtop: только не (*error nil*) а (*error* nil).
Спасибо, шибко торопился однако
Олег (jr.) вне форума  
 
Непрочитано 16.12.2015, 17:02
#45
dip

проектировщик
 
Регистрация: 25.05.2007
г. Чебоксары
Сообщений: 206
<phrase 1=


Добрый вечер!
Есть у меня файл с архитектурными планами:
У меня на чертеже есть слой "Двери арх". В этом слое есть примитивы: отрезки и текст.
Мне нужно во всем файле текст из слоя "Двери арх" разом перекинуть в слой "Марки дверей".
Простым выделением текста одного слоя и переводом его в другой слой не получается.
Каждый архитектурный план это отдельный блок. Приходится заходить в каждый блок, выделять текст и перекидывать в нужный мне слой, что долго.

Поэтому у меня возник вопрос:
Есть ли возможность родными средствами Автокада или программно перевести конкретные примитивы (это может быть текст или Мтекст или таблица или другой примитив) одного слоя в другой слой,
если даже они находятся на разных блоках.
dip вне форума  
 
Непрочитано 16.12.2015, 19:07
#46
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Программно можно
Код:
[Выделить все]
(defun mysetLayer ( obj )
  ;;; LayFrom - имя слоя, которому должны принадлежать примитивы (слой должен существовать)
  ;;; LayTo - имя слоя, на который перемещать (слой должен существовать)
  ;;; - lst - список имен объектов для переноса, возвращаемых функцией vla-get-ObjectName
  ;;;Пример (vla-get-ObjectName(vlax-ename->vla-object(car(entsel))))
   (setq LayFrom "Двери арх"
        LayTo "Марки дверей"
        lst '("AcDbMText" "AcDbText")
         )
  (if (and (member (vla-get-ObjectName obj) lst)
           (eq (strcase(vla-get-Layer obj))(strcase LayFrom))
           )
    (vl-catch-all-apply 'vla-put-Layer (list obj LayTo))
    )
  )
(defun C:Test()
  (vl-load-com)
  (vlax-for item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (vlax-map-Collection item 'mysetLayer)
    )
  (vla-Regen (vla-get-activedocument (vlax-get-acad-object)) acAllViewports)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.12.2015, 20:00
#47
dip

проектировщик
 
Регистрация: 25.05.2007
г. Чебоксары
Сообщений: 206
<phrase 1=


Цитата:
Сообщение от VVA Посмотреть сообщение
Программно можно
VVA, спасибо большое. Это то что нужно. Но это локальное решение задачи.
А если мыслить глобально: чтобы была возможность выбора:
1. Примитивов (текст, мтекст, таблиц и т.д) находящихся в этом файле (выбор из списка).
2. Исходного слоя находящейся в этом файле (выбор из списка).
3. Конечного слоя находящейся в этом файле (выбор из списка).
dip вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Научите работать со слоями



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клавиша Del в автокаде перестает работать :(( Barbarian AutoCAD 6 27.06.2008 15:01
Какой учеб. центр в Киеве учит работать с продук. Autodesk Silavsale Разное 2 03.12.2007 19:01
Как можно работать с "прочими" свойствами рисунка? Pungarev AutoCAD 6 22.06.2007 10:47
Перестали работать лиспы в 2006 solo LISP 6 16.08.2006 12:19
Object reactor никак не хочет работать Startrek Программирование 18 14.08.2004 15:17