Непонятная координата Y BlockReference.Position.

Автор Тема: Непонятная координата Y BlockReference.Position.  (Прочитано 6191 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Здравствуйте.
Столкнулся с непонятным для меня явлением.
Пишу небольшой плагин, который должен из выделенных блоков взять в работу только блоки с определенным названием и в AttributeReference вставить координату Y блока относительно текущей системы.
Когда я руками изменяю UCS, в свойствах блока Position я вижу корректную координату Y, у меня же она весьма странная, что при использовании TransformBy(ed.CurrentUserCoordinateSystem), что и без использования.
Код ниже.
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.Runtime;
  10. using Autodesk.AutoCAD.EditorInput;
  11. using Autodesk.AutoCAD.Geometry;
  12. using System.Reflection;
  13.  
  14.  
  15. namespace VDD
  16. {
  17.     public class Class1
  18.     {
  19.         [CommandMethod("VDS")]
  20.         public void VDD()
  21.         {
  22.             Document doc = Application.DocumentManager.MdiActiveDocument;
  23.             Database db = doc.Database;
  24.             Editor ed = doc.Editor;
  25.  
  26.  
  27.             using (Transaction atr = doc.TransactionManager.StartTransaction())
  28.             {
  29.  
  30.                 // Запрос на выбор блоков, работать будем только с блоками "Общее_Отметка уровня"
  31.                 PromptSelectionOptions opts1 = new PromptSelectionOptions();
  32.                 opts1.MessageForAdding = "Choose blocks ";
  33.  
  34.                 PromptSelectionResult acSSPrompt = doc.Editor.GetSelection(opts1);
  35.  
  36.  
  37.                 // Проверка статуса и того, что мы выбрали что-то
  38.                 if (acSSPrompt.Status == PromptStatus.OK)
  39.                 {
  40.                     SelectionSet acSSet = acSSPrompt.Value;
  41.  
  42.                     // Проходим по каждому блоку из выбранных
  43.                     foreach (SelectedObject acSSObj in acSSet)
  44.                     {
  45.  
  46.                         // Проверяем, что есть выбранный элемент.
  47.                         if (acSSObj != null)
  48.                         {
  49.                             // Открываем объект для записи
  50.                             Entity acEnt = atr.GetObject(acSSObj.ObjectId, OpenMode.ForWrite) as Entity;
  51.  
  52.                             //Проверяем, что это BlockReference.
  53.                             //Не забыть ввести проверку того, что это реально блок "Общее_Отметка уровня"
  54.  
  55.                             if (acEnt is BlockReference)
  56.                             {
  57.                                 BlockReference br = acEnt as BlockReference;
  58.  
  59.                                 BlockTableRecord btr = atr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  60.  
  61.                                 Point3d Position = br.Position.TransformBy(ed.CurrentUserCoordinateSystem);
  62.  
  63.                                 if (btr.Name.Equals("Общее_Отметка уровня"))
  64.                                 {
  65.  
  66.                                 AttributeCollection attCol = br.AttributeCollection;
  67.                                 foreach (ObjectId arId in attCol)
  68.                                 {
  69.                                     DBObject obj1 = atr.GetObject(arId, OpenMode.ForWrite);
  70.                                     AttributeReference attRef = obj1 as AttributeReference;
  71.  
  72.                                     if (attRef.Tag.Equals("КОМЕНТАРИЙ"))
  73.                                     {
  74.                                         attRef.TextString = "";
  75.                                     }
  76.                                     if (attRef.Tag.Equals("ОТМЕТКА"))
  77.                                     {
  78.                                         double PositionOfY = Math.Round(br.Position.Y,3);
  79.                                         attRef.TextString = PositionOfY.ToString();
  80.                                     }
  81.                                     if (attRef.Tag.Equals("ОТМЕТКА1"))
  82.                                     {
  83.                                         double PositionOfY = Math.Round(br.Position.Y, 3);
  84.                                         attRef.TextString = PositionOfY.ToString();
  85.                                     }
  86.                                 }
  87.  
  88.                             }
  89.                                 else
  90.                                 {
  91.                                     continue;
  92.                                 }
  93.  
  94.                             }
  95.                         }
  96.                     }
  97.  
  98.                 }
  99.                 //Подтверждаем изменения.
  100.                 atr.Commit();
  101.             }
  102.         }
  103.     }
  104. }

Документ с отметкой в приложении.
Если вдруг найдете что-то вопиюще неправильное в плане кода, сообщите пожалуйста. Сейчас я активно учусь)
Заранее спасибо!

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

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

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

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Спасибо за ответ.
А использование TransformBy(Editor.CurrentUserCoordinateSystem) не переводит координаты в используемый UCS?

Отмечено как Решение Александр Ривилис 28-04-2017, 12:00:01

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А использование TransformBy(Editor.CurrentUserCoordinateSystem) не переводит координаты в используемый UCS?
Переводит координаты из UCS в WCS. А тебе нужно наоборот, т.е. Editor.CurrentUserCoordinateSystem.Inverse
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Спасибо большое, Александр!

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

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

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

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Да, все работает отлично!