Как учесть разницу координат

Автор Тема: Как учесть разницу координат  (Прочитано 3666 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
У меня возник следующий вопрос:
Нужно в проекционной связи скопировать полилинию из блока в чертеж на определенное расстояние.
Написал код - все работает, но копирование происходит без учета текущего положения блока, то есть как будто он расположен в начале координат(World), а нужно чтобы оно учитывалось. Как это учесть? (Проще говоря -есть 2D объект, нужна его проекция на ярус ниже (текущий y-1500мм)).
Код - C# [Выбрать]
  1.  [CommandMethod("0DrawProjectionmanhole")]
  2.         public void DrawProjection()
  3.         {
  4.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.             Database db = HostApplicationServices.WorkingDatabase;
  6.             using ( Transaction tr = db.TransactionManager.StartTransaction() )
  7.             {
  8.                 // A selection filter to select only block references
  9.                 SelectionFilter filter = new SelectionFilter(new TypedValue[ 1 ]
  10.                 {
  11.                     new TypedValue(0, "INSERT")
  12.                 });
  13.  
  14.                 PromptSelectionOptions opts = new PromptSelectionOptions();
  15.                 opts.MessageForAdding = "Select block references:";
  16.                 PromptSelectionResult res = ed.GetSelection(opts);
  17.  
  18.                 if ( res.Status != PromptStatus.OK )
  19.                 {
  20.                     return;
  21.                 }
  22.  
  23.                 SelectionSet selSet = res.Value;
  24.                 ObjectId[] ids = selSet.GetObjectIds();
  25.  
  26.                 foreach ( ObjectId blkId in ids )
  27.                 {
  28.                     if ( blkId != null )
  29.                     {
  30.                         // Open the Block reference for read (no need for type checking because as the selection filter did it)
  31.                         BlockReference acBlkRef = (BlockReference) tr.GetObject(blkId, OpenMode.ForRead) as BlockReference;
  32.  
  33.                         // Open the Block table record of the selected reference for read
  34.                         BlockTableRecord acBlkTblRec = (BlockTableRecord) tr.GetObject(acBlkRef.BlockTableRecord, OpenMode.ForRead);
  35.                         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  36.                         // Step through the Block table record
  37.                         // ed.WriteMessage("\n\n{0}", acBlkRef.Name);
  38.                         foreach ( ObjectId asObjId in acBlkTblRec )
  39.                         {
  40.                             Entity ent = (Entity) tr.GetObject(asObjId, OpenMode.ForRead);
  41.                             // ed.WriteMessage("\n{0}", e);
  42.                             if (ent is Polyline)
  43.                             {
  44.                                 Polyline pl = (Polyline)tr.GetObject(ent.ObjectId, OpenMode.ForRead);
  45.                                 if (Math.Round(pl.Area) == 205664)
  46.                                 {
  47.  
  48.                                     Polyline clone = (Polyline)pl.Clone();
  49.                                     double shift = 1500;
  50.                                     Point3d resultPoint = new Point3d(pl.GetPoint3dAt(0).X, pl.GetPoint3dAt(0).Y - shift, 0);
  51.                                     Vector3d vector3d = pl.GetPoint3dAt(0).GetVectorTo(resultPoint);
  52.                                     Matrix3d displacement = Matrix3d.Displacement(vector3d);
  53.                                     clone.TransformBy(displacement);
  54.                                     btr.AppendEntity(clone);
  55.                                     tr.AddNewlyCreatedDBObject(clone, true);
  56.  
  57.                                 }
  58.                             }
  59.                         }
  60.                     }
  61.                 }
  62.  
  63.                 tr.Commit();
  64.             }
  65.         }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как учесть разницу координат
« Ответ #1 : 27-10-2019, 00:59:30 »
Ты не учитываешь, что нужно еще преобразовать по матрице BlockReference.BlockTransform
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как учесть разницу координат
« Ответ #2 : 27-10-2019, 01:01:37 »
Еще. Зачем вот это:
Код - C# [Выбрать]
  1.  if (ent is Polyline)
  2. {
  3.    Polyline pl = (Polyline)tr.GetObject(ent.ObjectId, OpenMode.ForRead);
  4.    // ....
  5. }

Вполне достаточно:

Код - C# [Выбрать]
  1. Polyline pl = ent as Polyline;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Как учесть разницу координат
« Ответ #3 : 27-10-2019, 01:20:34 »
что нужно еще преобразовать по матрице BlockReference.BlockTransform
А для чего мне нужно трансформировать блок? Он же для меня просто контейнер в котором лежит полилиния, которую я клонирую и таким образом создаю ее вне блока как проекцию. Сам блок (BlockReference) трогать нельзя, он должен остаться на месте.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как учесть разницу координат
« Ответ #4 : 27-10-2019, 01:22:19 »
А для чего мне нужно трансформировать блок?
Блок трансформировать не нужно. Нужно трансформировать клон полилинии по матрице BlockReference.BlockTransform
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Atomohod 27-10-2019, 02:10:40

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как учесть разницу координат
« Ответ #5 : 27-10-2019, 01:35:22 »
Должно получится как-то так (не тестировал):
Код - C# [Выбрать]
  1. Polyline clone = (Polyline)pl.Clone();
  2. clone.TransformBy(acBlkRef.BlockTransform);
  3.  
  4. double shift = -1500;
  5.  
  6. Vector3d vector3d = new Vector3d(0, shift, 0);
  7. Matrix3d displacement = Matrix3d.Displacement(vector3d);
  8. clone.TransformBy(displacement);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Как учесть разницу координат
« Ответ #6 : 27-10-2019, 01:48:47 »
Спасибо, заработало!
acBlkRef.BlockTransform
Можно подробнее: что это за преобразование? В чем его суть?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как учесть разницу координат
« Ответ #7 : 27-10-2019, 01:53:59 »
Можно подробнее: что это за преобразование? В чем его суть?
Матрица преобразования между системой координат вставки блока и МСК. Кстати, это всё описано в документации.
« Последнее редактирование: 27-10-2019, 08:02:12 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как учесть разницу координат
« Ответ #8 : 27-10-2019, 13:56:46 »
Еще одно замечание по коду. Никогда не делать вот так:
if (Math.Round(pl.Area) == 205664)
Нельзя сравнивать на равенство плавающие числа (double).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение