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

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

как переместить блоки на определённый слой

Ответ
Поиск в этой теме
Непрочитано 25.10.2010, 12:28 #1
как переместить блоки на определённый слой
digar
 
Регистрация: 30.06.2010
Сообщений: 38

Мне необходимо загрузить условные знаки, хранящиеся в виде блоков в отдельном файле. При загрузке этого файла на специально созданный слой "TEMP" он загружается как единый блок. После применения команды EXPLODE на слое "TEMP" остаётся содержимое файла как единый блок а на слое "0" создаётся "разорванная" копия этого файла.
Как программно заменить единый блок в "TEMP" на "разорванную копию со слоя "0"?

Делаю так: загружаю блок сразу в на слой "0", там его "взрываю" а затем, просматривая все объекты, нахожу, находящиеся на слое "0" и изменяю слой на "TEMP". Но это довольно долго.

Как это сделать быстрее?

Последний раз редактировалось digar, 25.10.2010 в 12:47.
Просмотров: 8015
 
Непрочитано 25.10.2010, 12:47
#2
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,663


Цитата:
Сообщение от digar Посмотреть сообщение
Мне необходимо загрузить условные знаки, хранящиеся в виде блоков в отдельном файле. При загрузке этого файла на специально созданный слой "TEMP" он загружается как единый блок. После применения команды EXPLODE на слое "TEMP" остаётся содержимое файла как единый блок а на слое "0" создаётся "разорванная" копия этого файла.
Как программно заменить единый блок в "TEMP" на "разорванную копию со слоя "0"?
Или как найти эти блоки, чтобы изменить у них свойство слоя?
"При загрузке этого файла на специально созданный слой "TEMP"" - это чего, вставка блоком имеется ввиду или внешней ссылкой? Если блоком, то после EXPLODE получишь по идее тот набор примитивов на соответствующих слоях, который и был в исходном файле. Ну и поменяй этот файл так, как тебе нужно, удали лишние объекты и попереноси блоки на нужные слои..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 25.10.2010, 12:53
#3
digar


 
Регистрация: 30.06.2010
Сообщений: 38


Я загружаю файл общим блоком на слой "ТЕМР", но после EXPLODE получаю набор примитивов не на слое "ТЕМР" а на слое "0" ??? В этом и загвоздка.
digar вне форума  
 
Непрочитано 25.10.2010, 14:14
#4
VVA

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


digar, Посмотри команду _Xplode
Или так как и делаешь
Цитата:
Сообщение от digar Посмотреть сообщение
Делаю так: загружаю блок сразу в на слой "0", там его "взрываю" а затем, просматривая все объекты, нахожу, находящиеся на слое "0" и изменяю слой на "TEMP". Но это довольно долго.
Раз вопрос в теме программирования, то предположу, что объекты меняешь программно. Тогда покажи код.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.10.2010, 14:21
#5
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от digar Посмотреть сообщение
Я загружаю файл
В этом файле все объекты на слой "TEMP" попробуй перенести
Do$ вне форума  
 
Непрочитано 25.10.2010, 14:22
#6
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,663


Цитата:
Сообщение от VVA Посмотреть сообщение
...Тогда покажи код...
Предположу, что digar хочет сей код не показать, а получить.. А так, в принципе, все правильно:
Цитата:
"взрываю" а затем, просматривая все объекты, нахожу, находящиеся на слое "0" и изменяю слой на "TEMP"
Вставил блок, взорвал, прошелся по "explodedObjects", меняя слой на желаемый, убил исходную вставку блока .Delete, ежели не нужна..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 25.10.2010, 14:32
#7
digar


 
Регистрация: 30.06.2010
Сообщений: 38


Почему сразу халявщик а не партнёр.
Вот код:
Код:
[Выделить все]
//создаём динамический массив для точки вставки
InsertionPoint:=VarArrayCreate([0,2],varDouble);
//УСЛОВНЫЕ ЗНАКИ
  s2:=concat(progdir,'ACAD\SignsAndLines\basa500.dwg');
  InsertionPoint[0]:=ymax+50;
  InsertionPoint[1]:=xmax+50;
  DWGObj:=ModelSpace.InsertBlock(InsertionPoint, s2, 1, 1, 1, 0);
//Загружаем *.SHX
  s2:=concat(progdir,'ACAD\SignsAndLines\Topoline.shx');
  Doc.LoadShapeFile(s2);
  DWGObj.Explode;
//Создаём временный слой
  LayerName:='Temp';Layer:=Doc.Layers.Add(LayerName);
  Doc.ActiveLayer:=Layer;
//переносим условные знаки на слой TEMP
end;
  For i:=0 to MSpace.Count-1 do
   begin
   DWGObj:=MSpace.Item(I);
   if DWGObj.Layer='0' then DWGObj.Layer:='Temp';
   Mainform.ProgressBar1.Position:=Mainform.ProgressBar1.Position+1;
   STXT.Caption:=Concat('Условные обозначения ',inttostr(Mainform.ProgressBar1.Position));
   end;
VarClear(DWGObj);
digar вне форума  
 
Непрочитано 25.10.2010, 15:55
#8
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,663


Я честно говоря не знаток языков программирования, исключая разве что VBA.. Но на VBA при применении Explode к вхождению блока получается массив из объектов - примитивов, входивших в блок (например, ...explodedObjects = blckObj.Explode). Соответственно можно перебирать в цикле не все объекты ModelSpace, а только из этой объектной переменной explodedObjects. Ну и само вхождение не убивается методом Explode, его надо еще Delete, иначе он просто "продублируется" примитивами из состава блока..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 25.10.2010, 19:00
#9
Кулик Алексей aka kpblc
Moderator

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


Зачем так замороченно? Разве не проще будет зайти в описание блока и поменять все что хочется? Зачем вставлять блок и оставлять его на месте? Можно же просто его вставить и тут же удалить, или вообще использовать командные методы (раз уж про ObjectDBX не вспоминаем...)
P.S. На лиспе код не предлагаю, ибо никому не надо, а на VBA уже сто лет как не писал.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.10.2010, 21:10
#10
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,663


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Зачем так замороченно? Разве не проще будет зайти в описание блока и поменять все что хочется? Зачем вставлять блок и оставлять его на месте? Можно же просто его вставить и тут же удалить, или вообще использовать командные методы (раз уж про ObjectDBX не вспоминаем...)
P.S. На лиспе код не предлагаю, ибо никому не надо, а на VBA уже сто лет как не писал.
Я думаю, це не принципиально.. Что в описании блока перебрать примитивы, что во вхождении.. Количество-то их одинаковое. Понятно, если блок использовать дальше, а здесь-то вставил файл как блок, разбил и забыл.. Вообще, конечно, непонятно, почему нельзя в исходном файле всё перенести на нужные слои..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 25.10.2010, 22:36
#11
digar


 
Регистрация: 30.06.2010
Сообщений: 38


Наверно, я что-то не понимаю, поэтому опишу действия подробнее:
на диске имеется файл, содержащий условные обозначения , каждое из которых представляет собой блок с атрибутами или отрезок определённого типа линии. При загрузке этого файла на слой (напримет "ТЕМР"), он загружается как единый блок. Поэтому непонимаю. что значит
Цитата:
зайти в описание блока и поменять все что хочется
Затем для последующего использования обозначений я "взрываю" блок. При этом "взорванный" файл создайтся на слое "0", а мне надо все примитивы, содержащиеся в нём иметь на слое "ТЕМР". Чтобы сократить эту последовательность операций, я считываю файл на слой "0", затем "взрываю", после этого перебираю все отрисованные объекты и те, которые находятся на слое "0" переношу на слой "ТЕМР"
digar вне форума  
 
Непрочитано 25.10.2010, 22:57
#12
Кулик Алексей aka kpblc
Moderator

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


А сразу вставить на слой "temp" не судьба?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.10.2010, 23:00
#13
digar


 
Регистрация: 30.06.2010
Сообщений: 38


Так я ж говорю, что при вставке на "темр" вставляется как единый блок, а взорванный оказывается на слое "0"???!!!
digar вне форума  
 
Непрочитано 25.10.2010, 23:50
#14
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,663


Цитата:
Сообщение от digar Посмотреть сообщение
Так я ж говорю, что при вставке на "темр" вставляется как единый блок, а взорванный оказывается на слое "0"???!!!
Единый блок - это примитив "block reference" (состоящий из примитивов в данном случае файла "basa500.dwg"), он вставляется на слой "темр". После DWGObj.Explode он разбивается на отдельные примитивы, из которых состоял, и у них у каждого свое свойство "слой".
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 26.10.2010, 10:06
#15
VVA

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


digar, Почему игнорируешь пост #4?
Цитата:
Команда: _XPLODE

Выберите объекты для разделения на составляющие.
Выберите объекты: найдено: 1

Выберите объекты:

Найдено 1 объектов.
Задайте опцию
[Все/Цвет/Слой/Тип линий/вЕс линий/По объекту/Расчленить] <Расчленить>: _Layer

Введите новое имя слоя для расчлененных объектов <0>: TEMP

Объект - расчленение с установкой слоя TEMP.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.10.2010, 10:26
#16
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Стерть все блоки и вставить чистый файл. Тогда все блоки появятся в базе данных нового чертежа.
Victor вне форума  
 
Автор темы   Непрочитано 26.10.2010, 15:22
#17
digar


 
Регистрация: 30.06.2010
Сообщений: 38


VVA спасибо.
Сделал так:
Код:
[Выделить все]
InsertionPoint:=VarArrayCreate([0,2],varDouble);//создаём динамический массив для точки вставки
  s2:=concat(progdir,'ACAD\SignsAndLines\basa500.dwg');//обозначения
  InsertionPoint[0]:=ymax+50;
  InsertionPoint[1]:=xmax+50;
  DWGObj:=MSpace.InsertBlock(InsertionPoint, s2, 1, 1, 1, 0);

//Загружаем *.SHX ЗДЕСЬ БОЛЬШОЙ ВОПРОС
  s2:=concat(progdir,'ACAD\SignsAndLines\Topoline.shx');
  Doc.LoadShapeFile(s2);
//
  w1:=DWGObj.Explode;
  DWGObj.Erase;//стираю моноблок
//Создаём временный слой
  LayerName:='Temp';Layer:=Doc.Layers.Add(LayerName);
  Doc.ActiveLayer:=Layer;
//переносим условные знаки на слой TEMP
 for i:=0 to VarArrayHighBound(w1,1) do w1[i].Layer:='Temp';
Всё удачно.
Но есть ещё один вопрос:
Если в AutoCAD 2010 загружаю файл командой _INSERT и в диалоге "Вставка блока" указываю "РАСЧЛЕНИТЬ", то после закрытия диалога и указания точки вставки открывается окно для определения файла *.SHX и после его загрузки типы линий отображаются верно. Если я отказываюсь от расчленения и после закрылия диалога вставки выполняю команду _LOAD, которой загружаю тот же файл *.SHX, то типы линий отображаются не верно.
В программе (см.//Загружаем *.SHX ЗДЕСЬ БОЛЬШОЙ ВОПРОС ) загружаю требуемый SHX, но результат отображения типов линий случайный - то верно, то нет.
Вчём дело? подскажите пожалуйста?
Прилагаю архив, содержащий Test.dwg и Test.shx
Вложения
Тип файла: zip test.zip (112.2 Кб, 72 просмотров)
digar вне форума  
 
Автор темы   Непрочитано 28.10.2010, 19:27
#18
digar


 
Регистрация: 30.06.2010
Сообщений: 38


Обнаружил одну фичу: если файл *.SHX предварительно скопировать в директорию AutoCAD FONTS, то при вставке блока типы линий отображаются корректно. Но, тогда при инсталляции моей программы (вернее при запуске) необходимо найти все установленные версии AutoCAD и в директориях, где хранятся их шрифты искать нужный мне *.SHX и если его там нет, то скопировать его туда.
Это похоже на чесание левой ногой правого уха, но как иначе сделать НЕ ЗНАЮ.
digar вне форума  
 
Непрочитано 28.10.2010, 21:00
#19
Кулик Алексей aka kpblc
Moderator

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


Или добавить каталог расположения шрифтов в пути поддержки AutoCAD'a.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.10.2010, 16:22
#20
digar


 
Регистрация: 30.06.2010
Сообщений: 38


Решение нашёл:
1) В Автокад на пространстве рисования щёлкаем правой кнопкой мыши и открываем рубрику "Настройка". В появившемся окне, открываем вкладку "Файлы". В списке "Пути доступа, имена файлов и папки" разворачиваем директорию "Пути доступа к вспомогательным файлам. Сюда добавляем директорию, содержащую необходимый *.SHX файл.
или
2) При инсталляции программы в реестр (пример для AutoCAD 2010)
ROOTKEY HKEY_CURREN_USER
Key - Software\Autodeck\AutoCAD\ R18.0\ACAD-8001:491\Profiles\Профиль начальной настройки\General
Значение строковой величины ACAD дополнить C:\.....\dir\Sample.SHX; ,
т.е.добавить полный путь к необходимому файлу
digar вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как переместить блоки на определённый слой

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические блоки при копировании перестают быть динамическими. *Voland* Динамические блоки 11 04.07.2012 10:51
Карнизные блоки под перильные ограждения на мосту Anastasy Поиск литературы, чертежей, моделей и прочих материалов 0 31.08.2010 14:47
Разбиение черечежа откоса на геологические блоки в VBA Skyper Программирование 1 18.03.2010 08:54
при скрытии слоя блоки остаются видимыми Shvlad AutoCAD 5 13.10.2006 11:09
Не печатается выбранный нижний слой полностью maslina AutoCAD 11 26.04.2006 15:10