Перейти к содержимому


Перенос объектов блока на слой блока без непосредственного редактирования


Сообщений в теме: 5

#1 avasiliev91

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 29 Август 2018 - 16:42

Здравствуйте. Можно ли реализовать в программе перенос объектов блока на слой блока без его редактирования? Если я переношу блок со слоя на слой, то объекты блока меняют цвет на цвет слоя, а если я разбиваю блок, то объекты автоматически помещаются только на Слой 0, а не на слой блока. Почему так? Спасибо.

#2 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 450 сообщений
  • Пол:Мужчина

Отправлено 29 Август 2018 - 17:19

на самом деле, все происходит немножко не так :)
что такое блок? это набор объектов. исходно (до помещения в блок) эти объекты обладают своим собственным набором свойств - слой, цвет, тип линии и прочее. что характерно - слой у объекта всегда свой собственный, т.е. это настоящий слой из таблицы слоев. а вот для цвета, типа линии, лайнвейта - есть помимо непосредственного задания есть еще варианты наследования - ByLayer (т.е. брать соответствующее свойство из параметров слоя) и ByBlock - брать из параметров блока.
чтобы объекты блока "перекрашивались" при изменении сответствующего свойства блока - у них, естественно, должно стоять именно byBlock.
то есть, например, рисуем две линии. у одной цвет ставим красный, у второй - ByBlock. делаем из них блок, и красим этот блок, к примеру, в зеленый цвет. первая линия так и останется красной, а вот вторая унаследует цвет блока - и станет зеленой. но то, что вторая линия зеленая - это одна видимость, на самом деле у нее по-прежнему стоит цвет ByBlock!

едем дальше... допустим, мы эксплодим этот блок. из него должны вывалиться две линии. они и вывалятся - одна по-прежнему красная, а вторая - по-прежнему ByBlock. но поскольку она уже не входит в зеленый блок - то, естественно, зеленый цвет ей взять уже неоткуда, и она перекрасится в дефолтный цвет.

такая вот загогулина... т.е. при разбивке блока из него вываливается его содержимое.

что касается переноса объектов на слой блока... технически - ноль проблем. но это не слишком осмысленная операция. дело в том, что блок - это не просто несколько объектов, объединенных в один. основное назначение блока - повторяемость. то есть создав блок, я могу его вставить несколько раз. и все эти вставки используют один и тот же набор объектов. физически один!
и если я этот набор изменю - то соответственно изменятся ВСЕ вставки этого блока.
и что в таком раскладе получится? вот у меня есть блок. он вставлен 10 раз, и каждая вставка лежит на своем слое. дальше я выбираю первую - допустим она лежит на слое 1 - и говорю - а перемести мне все содержимое... окей, переместили - и все 10 вставок блока дружно поменялись. потом я выбираю вторую (на слое 2) и повторяю процедуру - и опять все 10 вставок меняются в соответствии с переносом содержимого на слой 2. и так далее... так что сделать можно, но
1) не особо нужно
2) чревато

#3 avasiliev91

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 30 Август 2018 - 17:05

Спасибо за ответ. Я понял вышенаписанное. Теперь попробую дальше объяснить нюансы моего вопроса.
Некая программа делает экспорт графики в файл формата DXF.
Она группирует объекты (в том числе и блоки) по слоям. Получаем наборы объектов по слоям.
Среди этих объектов очень много (десятки тысяч) блоков, разных. Дальше происходит самое интересное.
Так как мне нужно избавиться от блоков, а мне нужно только содержимое блоков, то я их выделяю и разгруппировываю,
а все содержимое этих блоков оказывается на Слое "0"!!! Т. е. смешивается в одну кучу!!!
Конечно есть вариант, можно сначала выделить все блоки одного слоя, разгруппировать их,
выделить эти объекты на Слое "0" и вернуть их на слой блока. Но слоёв много, а самих блоков ещё больше.
Вот в чём загвоздка. Загвоздка в управлении свойствами объектов блоков когда их много, когда нужно "нормализовать"
свойства входящих в блок объектов. Т. е. присвоить одинаковые свойства всем объектам выделенных блоков.

#4 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 450 сообщений
  • Пол:Мужчина

Отправлено 30 Август 2018 - 18:15

примерно понятно...
то есть речь идет не о переносе объектов блока на его слой, а о переносе на этот слой результатов EXPLODE :)
опять-таки, на самом деле тьфу и растереть. собственно, такую командочку можно запросто даже на скрипте накатать.
идея достаточно простая
1. выбираем объекты
2. эксплодим все, что на селектировали
2.1 - запускаем цикл по всем объектам селекции
2.2 - у очередного объекта спрашиваем слой
2.3 - эксплодим объект (он развалится на куски)
2.4 - всем кускам ставим слой какой надо
2.5 - добавляем куски в базу данных

тут, правда, есть небольшая тонкость - ежели внутри блока был другой блок... тогда надо повторить! :)

#5 doctorraz

    Активист

  • Пользователи
  • PipPipPipPip
  • 782 сообщений
  • Пол:Мужчина
  • Город:Волгоград
  • Интересы:всё понемногу

Отправлено 30 Август 2018 - 18:23

возможно стоит посмотреть http://forum.dwg.ru/...ghlight=bgtools

http://forum.dwg.ru/...ead.php?t=21492

#6 avasiliev91

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 11 Сентябрь 2018 - 14:03

Просмотр сообщенияLion007 (30 Август 2018 - 18:15) писал:

на самом деле тьфу и растереть. собственно, такую командочку можно запросто даже на скрипте накатать.

Я нашёл приблизительный скрипт, но этот, да и не только этот, скрипты не работают в NanoCAD-е.
При запуске этой программы он начинает запрашивать слой, запрашивает, но дальше не работает. А мне бы ещё нужно чтобы слой сам считывался из свойств самого блока. Вот.
Кто-нибудь может помочь доработать-исправить-адаптировать этот текст для NanoCAD? Если это не особо сложно... Или как это сделать... Спасибо.

;; Функция задает всем объектам блока слой
(defun c:gp-block-l( / layers block-name i ss_nabor old_cmdecho)
  (initget 128)
  (setq layers (getvar "CLAYER"))
  (if (not (setq layers (getkword (strcat "\nВведите имя слоя: [\"" (getvar "CLAYER") "\"]> "))))
	(setq layers (getvar "CLAYER"))
  );_if
  (vl-load-com)
  (setq active_document (vla-get-activedocument (vlax-get-acad-object)))
  (setq old_cmdecho (getvar "cmdecho"));;изм №1
  (setvar "cmdecho" 0);;изм №1
  (vla-startundomark active_document);;изм №1
  ; необходимо удостовериться в наличии слоя  
  (setvar "CLAYER" layers)
  (setq ss_nabor (ssget  '((0 . "INSERT"))))
  (if (null ss_nabor)
	(progn
	  (princ "\n Блок не выбран!")
	  (princ)
	);_progn
	(progn
	  (setq i 0)
	  (while (< i (sslength ss_nabor))
   (setq block-name  (cdr(assoc 2 (entget(ssname ss_nabor i)))))
   (block-to-layer layers block-name)
   (setq i (+ 1 i))
	  );_while
	);_progn
  );_if
  (vla-endundomark active_document)
  (setvar "cmdecho" old_cmdecho)
);_defun

;; функция переводит блок на один слой layer_name с сохранением свойств объектов
(defun block-to-layer (layer_name block-name / adoc bl prop linetype ss linecolor  subent)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (vlax-for bl (vla-get-blocks adoc)
	;(vlax-dump-object (vla-get-blocks adoc) t)
	(if	(wcmatch (strcase (vla-get-name bl) t) block-name)
	  (vlax-for   subent bl
   (foreach prop (list
			 (list "linetype" "byblock")
			 (list "layer" layer_name)			
			 )
	 ;(vlax-dump-object subent t)
	 (if (= (car prop) "linetype")
	   (progn
		 (if (or (= (setq ss (vlax-get-property   subent (car prop) )) "ByLayer")
			(= (setq ss (vlax-get-property   subent (car prop) )) "ByBlock"))
	  (progn
		(setq linetype(cdr (assoc 6  (TBLSEARCH "LAYER" (vlax-get-property   subent "layer" )))))
		(setq prop (list (car prop) linetype ))
		);_progn
	  (progn
		(setq ss(vlax-get-property   subent (car prop) ))
		(setq prop (list (car prop) ss ))
		);_progn
	  );_if
		 );_progn
	   )
	 (vl-catch-all-apply
	   'vlax-put-property
	   (list subent (car prop) (cadr prop))
	   ) ;_ end of vl-catch-all-apply
	 ;(vlax-dump-object subent t)
	 ) ;_ end of foreach
   ) ;_ end of vlax-for
	  ) ;_ end of if	
	) ;_ end of vlax-for
(vla-endundomark adoc)
(vla-regen adoc acAllViewports)
(princ)
) ;_ end of defun

Этот текст программы я взял здесь: http://www.caduser.r...1#message270981





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей