Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Podushkin от 04-10-2021, 23:00:16

Название: Нарезка на отдельные файлы по рамке
Отправлено: Podushkin от 04-10-2021, 23:00:16
Вечер добрый. Есть чертеж, который разделен несколькими рамками. Подскажите как содержимое каждой рамки скопировать в отдельный dwg? Сейчас беру копию проекта и оттуда по рамке вырезаю Boundary Trim снаружи все лишнее. И так далее для каждой рамки. Хочу автоматизировать данную работу. Прошу прощения за сумбурное описание   :)
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Александр Ривилис от 04-10-2021, 23:29:09
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
С какой целью?
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Дмитрий Загорулькин от 05-10-2021, 14:16:52
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
Если в двух словах, то надо определить объекты, которые попали в рамку, собрать из них коллекцию и перенести их в другой чертёж. Но тонкостей тут будет масса. Особенно, если это чертёж Civil 3D
P.S. Хотя, может оказаться, что будет проще сделать полную копию чертежа и в ней удалить всё то, что не попадает в нужную рамку.
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Александр Ривилис от 05-10-2021, 15:19:43
P.S. Хотя, может оказаться, что будет проще сделать полную копию чертежа и в ней удалить всё то, что не попадает в нужную рамку.
А возможно, если это нужно только для печати/публикации, достаточно будет использовать _XCLIP для того чтобы скрыть лишнее.
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Podushkin от 05-10-2021, 21:24:15
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
С какой целью?

Это требование заказчика. Поставлять чертеж целиком и по частям отдельными файлами
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Podushkin от 05-10-2021, 21:33:03
Подскажите как содержимое каждой рамки скопировать в отдельный dwg?
Если в двух словах, то надо определить объекты, которые попали в рамку, собрать из них коллекцию и перенести их в другой чертёж. Но тонкостей тут будет масса. Особенно, если это чертёж Civil 3D
P.S. Хотя, может оказаться, что будет проще сделать полную копию чертежа и в ней удалить всё то, что не попадает в нужную рамку.

Да, я думал над этим. В принципе я с копиями и работаю делая это вручную Trim. Поделитесь пожалуйста кодом/ необходимыми функциями для создания полной копии чертежа при этом открыв его в автокаде? 
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Александр Ривилис от 05-10-2021, 22:06:25
Podushkin,
Database.Wblock() создают новую базу с копией чертежа. Database.SaveAs() сохраняет базу в файл.
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Podushkin от 05-10-2021, 22:19:20
Podushkin,
Database.Wblock() создают новую базу с копией чертежа. Database.SaveAs() сохраняет базу в файл.

Спасибо. Буду работать.
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Podushkin от 10-10-2021, 17:58:01
      День добрый, в общем, создание нового dwg файла с копированием выделенных объектов из базового чертежа очень просто было реализовать. Все классно. Но есть ли возможность выделения объектов внутри рамки(замкнутая полилиния). Выделение даже тех частей объектов, которые частично входят в необходимую область. Пока я вижу, что необходимо найти все объекты, координаты которых находятся внутри рамки целиком, математически. Далее найти те объекты, которые пересекает рамка. Разбить эти объекты по рамке. Методом doc.Editor.SelectWindowPolygon() выделить все объекты в рамке. Только рамок таких в чертеже более 1,5 тыс. В рамках от 1 тыс. до 4 тыс. объектов. И перебором объектов это будет реализовываться до Нового Года. Trim очень классно удаляет по контуру. Неужели нет рабочего механизма, который просто выделит те же объекты, которые удаляет Trim? :'(
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Александр Ривилис от 10-10-2021, 18:27:16
Только рамок таких в чертеже более 1,5 тыс. В рамках от 1 тыс. до 4 тыс. объектов.
Т.е. в чертеже от 1500000 до 6000000 примитивов? Сочувствую. Вряд ли это можно ускорить.
P.S.: Разбивать объекты по рамке слишком проблематичная задача.
Название: Re: Нарезка на отдельные файлы по рамке
Отправлено: Podushkin от 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.                     }