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

Вернуться   Форум 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-кодов копируемого блока. В результате на новом слое ничего не появляеться,а в командной строке пишется - "Неверный составной объект."

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

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


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


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


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


Код:
[Выделить все]
(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,840


Ну вы блин даете:
(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,840


А если с атрибутами то посложнее:
Код:
[Выделить все]
(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,840


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


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


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


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

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


А, понял, элеметны внутри блока всегда на 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,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


А в поике по сайту набрать "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,840


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