Нарезка на отдельные файлы по рамке

Автор Тема: Нарезка на отдельные файлы по рамке  (Прочитано 2911 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн PodushkinАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Вечер добрый. Есть чертеж, который разделен несколькими рамками. Подскажите как содержимое каждой рамки скопировать в отдельный dwg? Сейчас беру копию проекта и оттуда по рамке вырезаю Boundary Trim снаружи все лишнее. И так далее для каждой рамки. Хочу автоматизировать данную работу. Прошу прощения за сумбурное описание   :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
С какой целью?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2463
  • Карма: 692
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
Если в двух словах, то надо определить объекты, которые попали в рамку, собрать из них коллекцию и перенести их в другой чертёж. Но тонкостей тут будет масса. Особенно, если это чертёж Civil 3D
P.S. Хотя, может оказаться, что будет проще сделать полную копию чертежа и в ней удалить всё то, что не попадает в нужную рамку.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
P.S. Хотя, может оказаться, что будет проще сделать полную копию чертежа и в ней удалить всё то, что не попадает в нужную рамку.
А возможно, если это нужно только для печати/публикации, достаточно будет использовать _XCLIP для того чтобы скрыть лишнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн PodushkinАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
С какой целью?

Это требование заказчика. Поставлять чертеж целиком и по частям отдельными файлами

Оффлайн PodushkinАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
Если в двух словах, то надо определить объекты, которые попали в рамку, собрать из них коллекцию и перенести их в другой чертёж. Но тонкостей тут будет масса. Особенно, если это чертёж Civil 3D
P.S. Хотя, может оказаться, что будет проще сделать полную копию чертежа и в ней удалить всё то, что не попадает в нужную рамку.

Да, я думал над этим. В принципе я с копиями и работаю делая это вручную Trim. Поделитесь пожалуйста кодом/ необходимыми функциями для создания полной копии чертежа при этом открыв его в автокаде? 

Отмечено как Решение Podushkin 05-10-2021, 22:19:26

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Podushkin,
Database.Wblock() создают новую базу с копией чертежа. Database.SaveAs() сохраняет базу в файл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн PodushkinАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Podushkin,
Database.Wblock() создают новую базу с копией чертежа. Database.SaveAs() сохраняет базу в файл.

Спасибо. Буду работать.

Оффлайн PodushkinАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
      День добрый, в общем, создание нового dwg файла с копированием выделенных объектов из базового чертежа очень просто было реализовать. Все классно. Но есть ли возможность выделения объектов внутри рамки(замкнутая полилиния). Выделение даже тех частей объектов, которые частично входят в необходимую область. Пока я вижу, что необходимо найти все объекты, координаты которых находятся внутри рамки целиком, математически. Далее найти те объекты, которые пересекает рамка. Разбить эти объекты по рамке. Методом doc.Editor.SelectWindowPolygon() выделить все объекты в рамке. Только рамок таких в чертеже более 1,5 тыс. В рамках от 1 тыс. до 4 тыс. объектов. И перебором объектов это будет реализовываться до Нового Года. Trim очень классно удаляет по контуру. Неужели нет рабочего механизма, который просто выделит те же объекты, которые удаляет Trim? :'(

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Только рамок таких в чертеже более 1,5 тыс. В рамках от 1 тыс. до 4 тыс. объектов.
Т.е. в чертеже от 1500000 до 6000000 примитивов? Сочувствую. Вряд ли это можно ускорить.
P.S.: Разбивать объекты по рамке слишком проблематичная задача.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн PodushkinАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Нарезка на отдельные файлы по рамке
« Ответ #10 : 11-10-2021, 22:44:02 »
Александр, вот такой вариант придумал. В принципе работает. Где coll это лист из рамок.
               
Код - C# [Выбрать]
  1.     for (int i = 0; i < coll.Count(); i++)
  2.                     {
  3.                         using (Transaction tr = db.TransactionManager.StartTransaction())
  4.                         {
  5.                             BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
  6.                             using (Database newDb = new Database(true, false))
  7.                             {
  8.                                 var oldDia = Application.GetSystemVariable("CMDDIA");
  9.                                 Application.SetSystemVariable("CMDDIA", 0);
  10.                                 ed.Command("_.MAPTRIM",
  11.                                 /* Выбрать */ "В",
  12.                                 /* Объект */ coll[i].ObjectId,
  13.                                 /* Нет */ "Н",
  14.                                 /* Нет */ "Н",
  15.                                 /* Внутри */ "С",
  16.                                 /* Нет */ "Н",
  17.                                 /* Нет */ "Н",
  18.                                 /* Игнорировать */ "И",
  19.                                 /* Да */ "Д"
  20.                                 );
  21.                                 Application.SetSystemVariable("CMDDIA", oldDia);
  22.  
  23.                                 List<ObjectId> objlist = new List<ObjectId>();
  24.  
  25.                                 foreach (ObjectId id in ms)
  26.                                 {
  27.                                   objlist.Add(id);
  28.                                 }
  29.                                 ObjectIdCollection objlistColl = new ObjectIdCollection();
  30.                                 foreach (ObjectId objId in objlist)
  31.                                 {
  32.                                     objlistColl.Add(objId);
  33.                                 }
  34.                                 db.Wblock(newDb, objlistColl, Point3d.Origin, DuplicateRecordCloning.Ignore);
  35.                                 string FileName = "D:/X" + i.ToString() + ".dwg";
  36.                                 newDb.SaveAs(FileName, DwgVersion.Newest);
  37.                             }
  38.                             tr.Commit();
  39.                             doc.Editor.Command("_undo", 1);
  40.                         }
  41.                        
  42.  
  43.                     }