Создать чертеж и задать его параметры

Автор Тема: Создать чертеж и задать его параметры  (Прочитано 10517 раз)

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

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

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Здравствуйте.
Мне нужно создать плагин, который будет выделенные блоки переносить на новый чертеж. И, казалось бы, что я все сделал.
Но осталась одна проблема. На новом чертеже масштаб чертежа отличается от исходного. Помогите пожалуйста создать новый чертеж, чтобы его параметры соответствовали бы исходному.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Что за "масштаб чертежа"? Масштабов в AutoCAD тьма - про какой конкретно масштаб разговор идет?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И, казалось бы, что я все сделал.
И где код, который это делает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
И где код, который это делает?
Вот участок кода, где я создаю новый чертеж
Код - 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.                 }


Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Что за "масштаб чертежа"? Масштабов в AutoCAD тьма - про какой конкретно масштаб разговор идет?
Я думал про "масштаб вставки", а написал "масштаб чертежа"


Вообще надо бы что бы максимально сохранить параметры исходно чертежа

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Может быть, дело в том, что блоки не Unitless?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
где 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, то настройки вставки в чертеже не должны играть роли. Возможно, тут аннотативность так себя проявляет?
В общем, нужен исходный чертеж с блоком, минимальный код, при котором проявляется проблема и подробное описание действий для воспроизведения проблемы. Иначе, гадать можно долго.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
А вообще, сдается мне, что тут с использованием метода Database.Wblock может получиться все гораздо проще.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Мне нужно создать плагин, который будет выделенные блоки переносить на новый чертеж.
Речь вообще идёт об описании блоков (BlockTableRecord) или о вставках блоков (BlockReference)? Если BlockReference, то почему ты не их WblockCloneObjects? А если BlockTableRecord, то зачем ты создаёшь BlockReference?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я думал про "масштаб вставки", а написал "масштаб чертежа"
Как и многое в автокаде этот масштаб задается с помощью переменной - INSUNITS. Также нужно смотреть переменные INSUNITSDEFSOURCE и INSUNITSDEFTARGET.
Вообще надо бы что бы максимально сохранить параметры исходно чертежа
Ввиду вышесказанного (про переменные) - это практически невозможно

Отмечено как Решение Леонид Семенов 14-08-2017, 07:14:21

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

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

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Кстати, по-моему, начиная с 2013 версии, команда доступна и в обычном AutoCAD.
К сожалению, я так и не понял до конца - какие элементы она меняет. Явно не только переменные текущего документа :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

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

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Спасибо большое за ответы. Перменная INSUNITS пока решила мою проблему

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Мне нужно создать плагин, который будет выделенные блоки переносить на новый чертеж
Вообще надо бы что бы максимально сохранить параметры исходно чертежа
Скопировать файл чертежа и удалить лишнее?