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

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

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

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

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

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


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


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


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


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 вне форума  
Ответ
Вернуться   Форум 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