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

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

Копирование блока на другой слой

Ответ
Поиск в этой теме
Непрочитано 28.05.2008, 16:22 #1
Копирование блока на другой слой
Mazai
 
Москва
Регистрация: 04.04.2008
Сообщений: 97

Добрый день. Подскажите мне как разобраться в следующей ситуации.
Есть блок (0 . "INSERT"), который я хочу программно с помощью Лиспа скопировать из одного слоя в другой. Делаю я это следующим образом с помощью функции
Код:
[Выделить все]
(entmake	(subst (cons 8 New_Layer_Name) (assoc 8 ent) ent))
где ENT - это список DXF-кодов копируемого блока. В результате на новом слое ничего не появляеться,а в командной строке пишется - "Неверный составной объект."

Как мне осуществить задуманное?
Просмотров: 6827
 
Непрочитано 28.05.2008, 16:40
#2
Кулик Алексей aka kpblc
Moderator

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


Если меняешь слой, то в DwgRuLispLib есть функция по замене DXF-бита. Если копируешь, то из списка исключай пары с кодами -1, 5, 330
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.05.2008, 16:43
#3
VVA

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


Код:
[Выделить все]
(entmod (subst (cons 8 New_Layer_Name) (assoc 8 ent) ent))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.05.2008, 16:45
#4
Mazai


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


Цитата:
Сообщение от Mazai Посмотреть сообщение
где ENT - это список DXF-кодов копируемого блока.
выглядит примерно так:
Код:
[Выделить все]
'((-1 . <Имя объекта: 7eca1808>)
  (0 . "INSERT")
  (330 . <Имя объекта: 7ecb2cf8>)
  (5 . "1A41")
  (100 . "AcDbEntity")
  (67 . 0)
  (410 . "Model")
  (8 . "GORIZONTALI")
  (62 . 7)
  (6 . "Continuous")
  (100 . "AcDbBlockReference")
  (66 . 1)
  (2 . "PIKET")
  (10 152.025 185.087 0.0)
  (41 . 1.0)
  (42 . 1.0)
  (43 . 1.0)
  (50 . 0.607734)
  (70 . 0)
  (71 . 0)
  (44 . 0.0)
  (45 . 0.0)
  (210 0.0 0.0 1.0)
 )
Mazai вне форума  
 
Непрочитано 28.05.2008, 16:45
#5
VVA

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


Причем у Автокада есть такая фишка: Если слоя нет, то он создастся
Код:
[Выделить все]
(entmod (subst (cons 8 "Missing layer now") (assoc 8 ent) ent))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.05.2008, 16:50
#6
Mazai


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


не использовал функцию ENTMOD, так как нужно было не изменять существующий, а делать копию на другой слой.

Тогда попробую перед созданием удалить из списка ENT записи с кодами -1, 5 и 330.

Попробовал - не получилось

Последний раз редактировалось Mazai, 28.05.2008 в 16:59.
Mazai вне форума  
 
Автор темы   Непрочитано 28.05.2008, 17:09
#7
Mazai


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


Может надо так же копировать и аттрибуты этого блока, изменяя имя слоя? Или это слишком замароченно?
Mazai вне форума  
 
Непрочитано 28.05.2008, 17:44
#8
VVA

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


Код:
[Выделить все]
(vl-load-com)
(setq ent (car(entsel "\nЧто копировать: ")))
(setq CopyEnt(vla-copy (vlax-ename->vla-object ent)))
(setq CopyEnt (entget(vlax-vla-object->ename CopyEnt)))
(entmod (subst (cons 8 "Missing layer now") (assoc 8 CopyEnt) CopyEnt))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.05.2008, 18:00
#9
Дима_

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


Ну вы блин даете:
(setq ent (cdr (entget (car (entsel "Выбирайте блок")))))
(entmakex (subst (cons 8 "newlayer") (assoc 8 ent) ent))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.05.2008, 21:27
#10
Дима_

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


А если с атрибутами то посложнее:
Код:
[Выделить все]
(defun test ( / ent)
(setq ent (car (entsel "Выбирайте блок")))
(entmakex (subst (cons 8 "newlayer") (assoc 8 (entget ent)) (cdr (entget ent))))
(if (= (cdr (assoc 66 (entget ent))) 1)
(while (/= (cdr (assoc 0 (entget ent))) "SEQEND")
(setq ent (entnext ent))
(entmakex (cdr (entget ent)))
);end of while
);end of if
);end of test
Тогда копия на другом слое, но аттрибуты как в оригинале, чтоб и аттрибуты внутри блока на новый слой загнать то
Код:
[Выделить все]
(entmakex (cdr (entget ent)))
поменять на
Код:
[Выделить все]
(entmakex (subst (cons 8 "newlayer") (assoc 8 (entget ent)) (cdr (entget ent))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.05.2008, 10:51
#11
Mazai


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


Потестил - забавно выходит...

для VVA: создаётся новый слой, но на нём ничего не видно... наверное не копируются аттрибуты блока

для Дима_: на новом слое создаются блоки в котором отображаются атрибуты, а элементы блока - не видно, пока с блоком не произойдут какие-нибудь изменениея, например пока сам блок не передвинешь. А после разбивки блока (Explode) получившиеся примитивы почему-то принадлежат изначальному слою из которого они были скопированы.

Могу показать свои чудо блоки во вложении
Вложения
Тип файла: dwg
DWG 2007
test block.dwg (100.0 Кб, 718 просмотров)
Mazai вне форума  
 
Непрочитано 29.05.2008, 11:08
#12
Дима_

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


наверное не невидно, а один на другом наложен? так для этого координату менять еще надо.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.05.2008, 11:09
#13
Mazai


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


нет, я отключаю все слои о оставляю включонным только тот на который копировал. А как сделать так что бы блоки полностью принадлежали этому слою. даже после расчлинения?
Mazai вне форума  
 
Непрочитано 29.05.2008, 11:17
#14
VVA

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


Варианты:
1. Использовать для расленения не _explode, а _Xplode
2. Задать в описании блока явно слой, но тогда после расчленения примитивы будут только на этом слое или см. п.1
3. Создать новый блок по содержимому идентичный старому, в котором сделать п.2
4. ???
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.05.2008, 11:23
#15
Дима_

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


А, понял, элеметны внутри блока всегда на 0 слое должны быть, тогда и отображаться они будут согласно слоя в котором лежит блок, в твоем случае надо все эл-ты сканировать и на ноль переносить внутри блока, ну или нового слоя - что по моему не есть правильно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.05.2008, 14:17
#16
Mazai


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


Пытаюсь создать блок (INSERT) с помощью ENTMAKEX. Для этого создаю список DXF-кодов путём удаления записей с кодами -1, 5 и 330 из полученного ранее списка ENT и изменения в нём имени слоя. Получаеться такой список
Код:
[Выделить все]
'((0 . "INSERT")
  (100 . "AcDbEntity")
  (67 . 0)
  (410 . "Model")
  (8 . "GORIZONTALI_MODIFY")
  (62 . 7)
  (6 . "Continuous")
  (100 . "AcDbBlockReference")
  (66 . 1)
  (2 . "PIKET")
  (10 177.023 204.338 0.0)
  (41 . 0.999998)
  (42 . 0.999998)
  (43 . 1.0)
  (50 . 4.80247)
  (70 . 0)
  (71 . 0)
  (44 . 0.0)
  (45 . 0.0)
  (210 0.0 0.0 1.0)
 )
Но объекта не создаёться. Функция ENTMAKEX возвращает nill - Почему невозможно создать блок используя такой список DXF-кодов?
Mazai вне форума  
 
Непрочитано 29.05.2008, 15:15
#17
VVA

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


А в поике по сайту набрать "BLOCK ENTMAKE"?
http://dwg.ru/f/showthread.php?t=5661
http://dwg.ru/f/showthread.php?t=309
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.05.2008, 15:28
#18
Mazai


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


А можно ещё тогда глупый вопрос? У меня блок создан как объект "INSERT", а здесь на сайте при обращении к блоку используют значение "BLOCK". В чём разница? Или это синонимы?
Mazai вне форума  
 
Непрочитано 29.05.2008, 16:16
#19
Дима_

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


block - это описание блока, то есть на рисунке его не видно он во внутренних таблицах распологаеться (tblnext "block"), а "insert" - вхождение блока в рисунок.
P.S. для создания вхождения минимум - (entmakex (list (cons 0 "insert") (cons 2 "Имя блока") (list 10 0 0 0)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 29.05.2008 в 16:22.
Дима_ вне форума  
 
Автор темы   Непрочитано 16.06.2008, 15:48
#20
Mazai


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


Вернулся к своим баранам.
Ну не получается у меня создать новый блок (INSERT). Использую следующий код и пример чертежа из поста #11
Код:
[Выделить все]
(defun c:test (/ ent ent1 New_Layer_Name Name_Block)
  (setq	ent	       (entget (car (entsel "Выберите блок:")))
	New_Layer_Name (strcat (cdr (assoc 8 ent)) "_MODIFY")
  )
  (if (eq (cdr (assoc 0 ent)) "INSERT")
    (progn
      (setq ent1 nil
	    ent1 (assoc 2 ent) 			;_ имя блока
	    ent1 (list ent1 (assoc 0 ent)) 	           ;_ тип примитива
	    ent1 (append ent1 (list (assoc 10 ent))) ;_ координата вставки
	    ent1 (append ent1 (list (cons 8 New_Layer_Name))) ;_ слой
      )
      (setq Name_Block (entmakex ent1)) ;_ создание блока
      (princ "\nБыл создан новый блок: ")
      (princ Name_Block)
    ) ;_ end progn
  ) ;_ end if
  (princ)
) ;_ end defun test
(entmakex ent1) возвращает nil
Что не так?
Mazai вне форума  
 
Непрочитано 16.06.2008, 16:10
#21
Кулик Алексей aka kpblc
Moderator

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


Вариант через ActiveX:
Код:
[Выделить все]
(defun c:test (/ ent ent1 new_layer_name name_block adoc *error*)
  (defun *error* (msg)
    (if res
      (vl-catch-all-apply '(lambda () (vla-erase res)))
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (setq ent            (car (entsel "Выберите блок:"))
        new_layer_name (strcat (cdr (assoc 8 (entget ent))) "_MODIFY")
        ) ;_ end of setq
  (if (not (tblobjname "layer" new_layer_name))
    (vla-add (vla-get-layers adoc) new_layer_name)
    ) ;_ end of if
  (if (= (cdr (assoc 0 (entget ent))) "INSERT")
    (vla-put-layer (vla-copy (vlax-ename->vla-object ent)) new_layer_name)
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end defun
Для entmake[x] :
Код:
[Выделить все]
(defun c:test (/ ent ent1 new_layer_name name_block adoc *error*)
  (defun *error* (msg)
    (if res
      (vl-catch-all-apply '(lambda () (vla-erase res)))
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (setq ent            (entget (car (entsel "Выберите блок:")))
        new_layer_name (strcat (cdr (assoc 8 ent)) "_MODIFY")
        ) ;_ end of setq
  (if (eq (cdr (assoc 0 ent)) "INSERT")
    (entmakex (subst
                (cons 8 new_layer_name)
                (assoc 8 ent)
                (vl-remove-if '(lambda (x) (member (car x) '(-1 5))) ent)
                ) ;_ end of subst
              ) ;_ end of entmakex
    ) ;_ end if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.06.2008, 01:26
#22
Дима_

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


Цитата:
Сообщение от Mazai Посмотреть сообщение
(setq ent1 nil
ent1 (assoc 2 ent) ;_ имя блока
ent1 (list ent1 (assoc 0 ent)) ;_ тип примитива
Первая строка - ну если только для подстраховки
P.S. - блин второй страницы не заметил.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.06.2008, 11:22
#23
Mazai


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


Простите мне мою настырность или тупость, но я так и не могу получить нужного результата.
Кулик Алексей aka kpblc, я потестил твои примеры и выяснил следующее:

в варианте с ActivX'ом - копируется только вхождение в блок. То есть аттриуты и примитивы блока остаются принадлежать старому слою. Ожидалось, что если я оставлю включённым только новый слой, то я смогу увидеть скопированные блоки. Но на новом слое ничего не видно. Если пользоваться этим вариантом, то я хотел бы понять как копировать атрибуты и примитивы вместе с блоком (INSERT). Или это не обязательно для того что бы сам блок появился на новом слое?

в варианте с EntmakeX - на выходе после команды (entmakeX ... ) - nil !!! Теоретически если бы блок создался, то я бы смог в него запихнуть и атрибуты и примитивы (как я понимаю для копируемых объектов надо было бы в DXF-код под номер 330 записать имя нового блока, которое выдала бы команда entmakeX, или я ошибаюсь?)

И всё же как мне добиться того, что бы на новый слой именно сделать копию сущетвующих блоков? Так, что бы они на нём отобразились!
Подскажите пожалуйста, в чём ошибка или не точность?
Mazai вне форума  
 
Непрочитано 17.06.2008, 11:41
#24
Кулик Алексей aka kpblc
Moderator

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


Нда, что-то про атрибуты я не подумавши... Сейчас запустить кад не могу - попозже сделаю. Хотя - посмотри на первой странице, там было вроде бы решение.
И, кстати, тут есть одна "непонятка": если атрибутам вручную изменен слой, то их копировать на новый слой или нет? А если слой при определении атрибута задан "не 0", то что тогда?
Насчет entmakex и результата. Результат функции - nil, так и должно быть. Блок копируется (проверял на блоке без атрибутов, уж тут прости).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.06.2008, 12:36
#25
Mazai


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


Как копировать аттрибуты с помощью ENTMAKE я понял - подсмотрел на первой страничке. Но примитивы блока на новом слое не видны. Сейчас пытаюсь понять как их перетащить.
Для меня осталась загадка, почему же он при создании блока с помощью entmakeX выдаёт nil - ведь объект же вроде как создаётся? (просто именно этот момент меня вводил вступор)

Для расширения кругозора осталось ещё понять как это же сделать с помощью ActivX'а.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И, кстати, тут есть одна "непонятка": если атрибутам вручную изменен слой, то их копировать на новый слой или нет? А если слой при определении атрибута задан "не 0", то что тогда?
Можешь ещё раз глянуть пример блоков на посте #11. Это исходные блоки. В них и атрибуты и примитивы блока лежат на одном и том же слое, не 0-ом!
Смысл всех манипуляций должен привести к тому, что бы на новом слое блоки выглядили как и на исходном. И по сути не важно на каком слое определены его объекты. Если они будут видны при включонном одном новом слое.
Mazai вне форума  
 
Непрочитано 17.06.2008, 13:19
#26
Кулик Алексей aka kpblc
Moderator

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


Цитата:
почему же он при создании блока с помощью entmakeX выдаёт nil
Потому что в конце кода команды test стоят
Код:
[Выделить все]
  (vla-endundomark adoc)
  (princ)
А они всегда возвращают nil.
Я сейчас тупой, поэтому пара вопросов:
  • В файле немеряно прокси-объектов от Civil'a. Вычищать?
  • Это как ты добился, что в обычном блоке у тебя в описании 1 атрибут, а отображаются 2? Ты пробовал провернуть _.attsync или _.battman?
  • Хотя ты и сказал, но... Почему примитивы блока лежат на предопределенном слое и вообще, имеют настройки не ByBlock? Ведь в таком варианте на какой слой не кидай блок, пока не включишь слой, на котором лежат примитивы блока, у тебя они видны не будут.
Мораль той басни очень прост: переводи все примитивы блока в ByBlock, слой "0".
И вот еще - подобные вещи я стараюсь делать через ActiveX, там лично мне проще работать. Так что с entmake[x]-кодами я в пролете...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.06.2008, 14:35
#27
Mazai


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
  • В файле немеряно прокси-объектов от Civil'a. Вычищать?
  • Это как ты добился, что в обычном блоке у тебя в описании 1 атрибут, а отображаются 2? Ты пробовал провернуть _.attsync или _.battman?
  • Хотя ты и сказал, но... Почему примитивы блока лежат на предопределенном слое и вообще, имеют настройки не ByBlock? Ведь в таком варианте на какой слой не кидай блок, пока не включишь слой, на котором лежат примитивы блока, у тебя они видны не будут.
1. просвяти пожалуйста как ты смог увидеть и определить что там есть прокси-объекты Civil'а? И зачем это нужно вычищать?
2. подобные файлы мы получаем от заказчика - это геодезия, чертежи переведны в автокад из Крэдо. Как у них это получается вопрос не ко мне. Пробовал твои команды, и вторые атрибуты исчезают из видимости.
3. А в данном случае, не изменяя исходник, можно покряхтеть и всё-так получить желаемый результат?

А как скопировать атрибуты с помощью ActivX я и не знаю.
Mazai вне форума  
 
Непрочитано 18.06.2008, 09:11
#28
Кулик Алексей aka kpblc
Moderator

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


Ну увидеть-то не проблема - proxyshow в 1 и всех делов
То, что вторые атрибуты исчезают - это как бы нормально: в описании-то блока один атрибут. То, что там есть второй атрибут - наверняка либо особенность Credo, либо последствия работы программы Alaspher'a по добавлению атрибутов во вхождение блока (ну или аналогичного функционала). Команды _.attsync и _.battman просто синхронизируют вхождения блоков с их описанием, так что результат был предсказуем.
Насчет последнего - подумаю, но получится или нет - вилами на воде.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.06.2008, 10:49
#29
Mazai


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


Забавно в итоге получается. Собрал код, тестю на примере из #11 поста. Результат: создаётся блок на новом слое. При просмотре нового слоя отображаются только атрибуты блок, примитивов не видно. Только после попытки немного сместить блок они становятся видны. (Регенерация чертежа не помогает). Если побегать по листам, то при возращении на исходный лист примитивы блока опять пропадают.
Копировал я с помощью команды ENTMAKE. Интересно, если попробовать осуществить то же самое с помощью ActivX - результат будет такой же?

Вот мой код на всяк случай:
Код:
[Выделить все]
;;;;;;;;;;;;;-----------------------;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;; Использование Entmake ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;-----------------------;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:test (/ Element Ent Ent1 New_layer_name Name_block adoc *error*)
  (defun *error* (msg)
    (if res
      (vl-catch-all-apply '(lambda () (vla-erase res)))
      ) ;_ end of if
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (setq	Element	       (car (entsel "Выберите блок:"))
	Ent	       (entget Element)
	New_layer_name (strcat (cdr (assoc 8 Ent)) "_MODIFY")
  ) ;_ end of setq
  (if (eq (cdr (assoc 0 Ent)) "INSERT")
    (progn
      (setq Name_blok (entmakex
			(subst
			  (cons 8 New_layer_name)
			  (assoc 8 Ent)
			  (vl-remove-if
			    '(lambda (x) (member (car x) '(-1 5)))
			    Ent
			  )
			) ;_ end of subst
		      ) ;_ end of entmakex
      )
      (if
	(= (cdr (assoc 66 Ent)) 1)
	 (while	(/= (cdr (assoc 0 Ent)) "SEQEND")
	   (setq Ent	 (entget (entnext Element))
		 Ent	 (subst	(cons 8 New_layer_name)
				(assoc 8 Ent)
				Ent
			 )
		 Element (entnext Element)
	   ) ;_ end setq
	   (entmakex Ent)
	 ) ;_ end of while
      ) ;_ end of if
    ) ;_ end progn
  ) ;_ end if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end defun

Последний раз редактировалось Mazai, 18.06.2008 в 10:50. Причина: добавил код
Mazai вне форума  
 
Непрочитано 19.06.2008, 01:33
#30
Кулик Алексей aka kpblc
Moderator

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


Я только сейчас добрался до задачки, и опять ни шиша не понял. Мой вариант по ActiveX из #21 корректно копирует твои блоки (несмотря на их "неправильность").
P.S. Попробуй не выключать слои, а замораживать их.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Копирование блока на другой слой



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вставка блока в текущий слой (проблема) Serkonst AutoCAD 11 12.01.2008 16:49
Dim.В dim'e отсечки ставяться в другой слой(( Xo66iT AutoCAD 11 03.04.2006 08:56
ACAD2005 Глюк при переносе блока(ов) на другой слой. SergeiSPB AutoCAD 5 18.08.2005 08:27
Как обьект переместтить из одного в другой слой? NTU AutoCAD 2 20.02.2005 16:20