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

ADN Club => AutoCAD .NET API => Тема начата: Леонид Семенов от 08-08-2017, 07:06:23

Название: Создать чертеж и задать его параметры
Отправлено: Леонид Семенов от 08-08-2017, 07:06:23
Здравствуйте.
Мне нужно создать плагин, который будет выделенные блоки переносить на новый чертеж. И, казалось бы, что я все сделал.
Но осталась одна проблема. На новом чертеже масштаб чертежа отличается от исходного. Помогите пожалуйста создать новый чертеж, чтобы его параметры соответствовали бы исходному.
Название: Re: Создать чертеж и задать его параметры
Отправлено: Алексей Кулик от 08-08-2017, 07:56:52
Что за "масштаб чертежа"? Масштабов в AutoCAD тьма - про какой конкретно масштаб разговор идет?
Название: Re: Создать чертеж и задать его параметры
Отправлено: Александр Ривилис от 08-08-2017, 08:05:09
И, казалось бы, что я все сделал.
И где код, который это делает?
Название: Re: Создать чертеж и задать его параметры
Отправлено: Леонид Семенов от 08-08-2017, 08:24:06
И где код, который это делает?
Вот участок кода, где я создаю новый чертеж
Код - C# [Выбрать]
  1.                 Document acDoc = App.DocumentManager.Add("");
  2.                 acDoc.Database.SaveAs(fName, DwgVersion.Current);
  3.                 acDoc.Database.CloseInput(true);
  4.                 App.DocumentManager.MdiActiveDocument.CloseAndDiscard();

И вот участок кода, где я открываю этот чертеж (file) и добавляю туда блоки,
где Dictionary<string, List<BlockReference>> blocks
Код - C# [Выбрать]
  1.                 DocumentCollection acDocMgr = App.DocumentManager;
  2.                 Document doc = acDocMgr.Open(file, false);
  3.                 Database db = doc.Database;
  4.                 Editor ed = doc.Editor;
  5.                 using (DocumentLock acLckDoc = doc.LockDocument())
  6.                 {
  7.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  8.                     {
  9.                         if (ids.Count != 0)
  10.                         {
  11.                             IdMapping iMap = new IdMapping();
  12.                             db.WblockCloneObjects(ids, db.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false);
  13.                         }
  14.                         var layers = GetLayers(trans, db);
  15.                         var linetypes = GetLinetypes(trans, db);
  16.                         foreach (BlockReference br in blocks[file])
  17.                         {
  18.                             if (!layers.ContainsKey(br.Layer))
  19.                                 LoadLayer(Layers[br.Layer], db, trans);
  20.                             if (!linetypes.ContainsKey(br.Linetype))
  21.                                 LoadLinetype(Linetypes[br.Linetype], db, trans);
  22.                             BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  23.                             BlockTableRecord blockDef = bt[br.Name].GetObject(OpenMode.ForRead) as BlockTableRecord;
  24.                             BlockTableRecord ms = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
  25.                             Point3d point = br.Position;
  26.                             using (BlockReference blockRef = new BlockReference(point, blockDef.ObjectId))
  27.                             {
  28.                                 blockRef.ScaleFactors = br.ScaleFactors;
  29.                                 blockRef.LinetypeScale = br.LinetypeScale;
  30.                                 blockRef.Layer = br.Layer;
  31.                                 blockRef.Linetype = br.Linetype;
  32.                                 blockRef.Rotation = br.Rotation;
  33.                                 blockRef.BlockTransform = br.BlockTransform;
  34.                                 blockRef.Color = br.Color;
  35.                                 blockRef.LineWeight = br.LineWeight;
  36.                                 blockRef.Material = br.Material;
  37.                                 ms.AppendEntity(blockRef);
  38.                                 trans.AddNewlyCreatedDBObject(blockRef, true);
  39.                             }
  40.                         }
  41.                         trans.Commit();
  42.                     }
  43.                 }

Название: Re: Создать чертеж и задать его параметры
Отправлено: Леонид Семенов от 08-08-2017, 08:30:35
Что за "масштаб чертежа"? Масштабов в AutoCAD тьма - про какой конкретно масштаб разговор идет?
Я думал про "масштаб вставки", а написал "масштаб чертежа"
(https://s2.postimg.org/3z377anad/autocad.png) (https://postimg.org/image/3z377anad/)

Вообще надо бы что бы максимально сохранить параметры исходно чертежа
Название: Re: Создать чертеж и задать его параметры
Отправлено: Алексей Кулик от 08-08-2017, 08:33:33
Может быть, дело в том, что блоки не Unitless?
Название: Re: Создать чертеж и задать его параметры
Отправлено: Дмитрий Загорулькин от 08-08-2017, 11:50:13
где Dictionary<string, List<BlockReference>> blocks
Мне сильно не нравится такой подход. Вы держите кучу объектов открытыми долгое время только для того, чтобы потом прочитать их свойства. Я в похожей задаче использовал структуру такого вида:
Код - C# [Выбрать]
  1. internal struct BlockReferenceData
  2. {
  3.     public string Name;
  4.     public bool IsDynamicBlock;
  5.     public Point3d Position;
  6.     public Scale3d Scale;
  7.     public double Rotation;
  8.     public string LayerName;
  9.     public Color Color;
  10.     public string LineTypeName;
  11.     public LineWeight LineWeight;        
  12.     public Dictionary<string, string> Attributes;
  13.     public Dictionary<string, object> DynamicProperties;
  14.     // Ну и остальные нужные данные
  15.  
  16.     public BlockReferenceData(BlockReference bRef)
  17.     {
  18.         // Тут получаем все нужные данные из вставки блока bRef
  19.     }
  20.  
  21.     public void ApplyTo(BlockReference bRef)
  22.     {
  23.         // Тут переносим сохраненные данные во вставку блока bRef
  24.     }
  25. }
  26.  
По поводу изначального вопроса - есть у меня подозрение, что если у BlockReference принудительно задается свойство ScaleFactors, то настройки вставки в чертеже не должны играть роли. Возможно, тут аннотативность так себя проявляет?
В общем, нужен исходный чертеж с блоком, минимальный код, при котором проявляется проблема и подробное описание действий для воспроизведения проблемы. Иначе, гадать можно долго.
Название: Re: Создать чертеж и задать его параметры
Отправлено: Дмитрий Загорулькин от 08-08-2017, 12:06:27
А вообще, сдается мне, что тут с использованием метода Database.Wblock может получиться все гораздо проще.
Название: Re: Создать чертеж и задать его параметры
Отправлено: Александр Ривилис от 08-08-2017, 12:39:13
Мне нужно создать плагин, который будет выделенные блоки переносить на новый чертеж.
Речь вообще идёт об описании блоков (BlockTableRecord) или о вставках блоков (BlockReference)? Если BlockReference, то почему ты не их WblockCloneObjects? А если BlockTableRecord, то зачем ты создаёшь BlockReference?
Название: Re: Создать чертеж и задать его параметры
Отправлено: Александр Пекшев aka Modis от 11-08-2017, 09:32:51
Я думал про "масштаб вставки", а написал "масштаб чертежа"
Как и многое в автокаде этот масштаб задается с помощью переменной - INSUNITS. Также нужно смотреть переменные INSUNITSDEFSOURCE и INSUNITSDEFTARGET.
Вообще надо бы что бы максимально сохранить параметры исходно чертежа
Ввиду вышесказанного (про переменные) - это практически невозможно
Название: Re: Создать чертеж и задать его параметры
Отправлено: Александр Ривилис от 12-08-2017, 01:15:09
Еще есть -DWGUNITS: https://knowledge.autodesk.com/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/Difference-between-DWGUNITS-and-INSUNITS.html
Название: Re: Создать чертеж и задать его параметры
Отправлено: Алексей Кулик от 13-08-2017, 16:10:54
Кстати, по-моему, начиная с 2013 версии, команда доступна и в обычном AutoCAD.
К сожалению, я так и не понял до конца - какие элементы она меняет. Явно не только переменные текущего документа :(
Название: Re: Создать чертеж и задать его параметры
Отправлено: Александр Ривилис от 13-08-2017, 17:10:58
(https://farm5.staticflickr.com/4390/36374067902_956f86def4_o.png)

Тут подробнее: http://www.theswamp.org/index.php?topic=16554.0
Название: Re: Создать чертеж и задать его параметры
Отправлено: Леонид Семенов от 14-08-2017, 07:15:45
Спасибо большое за ответы. Перменная INSUNITS пока решила мою проблему
Название: Re: Создать чертеж и задать его параметры
Отправлено: Владимир Шу от 14-08-2017, 08:06:22
Мне нужно создать плагин, который будет выделенные блоки переносить на новый чертеж
Вообще надо бы что бы максимально сохранить параметры исходно чертежа
Скопировать файл чертежа и удалить лишнее?

Название: Re: Создать чертеж и задать его параметры
Отправлено: Леонид Семенов от 14-08-2017, 08:23:15
Мне нужно создать плагин, который будет выделенные блоки переносить на новый чертеж
Вообще надо бы что бы максимально сохранить параметры исходно чертежа
Скопировать файл чертежа и удалить лишнее?
Хорошая идея, я бы и не против так сделать. Но исходный чертеж большой и там "много мусора", что мне не хочется его чистить.
Название: Re: Создать чертеж и задать его параметры
Отправлено: Алексей Кулик от 14-08-2017, 08:37:46
А кто гарантирует, что мусор вслед за копированием блоков не потянется?
Название: Re: Создать чертеж и задать его параметры
Отправлено: Леонид Семенов от 14-08-2017, 11:32:48
А кто гарантирует, что мусор вслед за копированием блоков не потянется?
Согласен, но там его (мусора) будет меньше. И при необходимости почистить его будет легче.