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

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

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

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

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

Подозреваю, что это делаеться с помощью объектов ActivX, но как их правильно использовать и что возможно с их помощь - не знаю. Помогите примерами, а там дальше может сам соображать начну.
Просмотров: 11579
 
Автор темы   Непрочитано 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
С.-Петербург
Сообщений: 39,787


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
С.-Петербург
Сообщений: 39,787


Потому что сначала надо брать (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
С.-Петербург
Сообщений: 39,787


Попробуй (я код не проверял):
Код:
[Выделить все]
^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,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


ТО же, что и у Алексея, но покороче.
Код:
[Выделить все]
^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,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
надо написать макрос отключения одного слоя используя вариант выбора объекта на нём
Это колесо уже изобрели. Называется 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 вне форума  
Ответ
Вернуться   Форум 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