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

ADN Club => AutoCAD .NET API => Тема начата: Вильдар от 27-02-2016, 19:09:07

Название: Определение угла поворота по матрице трансформации блока
Отправлено: Вильдар от 27-02-2016, 19:09:07
Добрый вечер всем!
Можно как-то определить угол из матрицы трансформации блока?
Тестовый пример:
Код - C# [Выбрать]
  1.      [CommandMethod("Test")]
  2.       public void Test()
  3.       {
  4.          Document doc = Application.DocumentManager.MdiActiveDocument;        
  5.          Database db = doc.Database;
  6.          Editor ed = doc.Editor;
  7.  
  8.          // Выбор первого блока
  9.          var prOpt = new PromptEntityOptions("Выбери блок");
  10.          prOpt.SetRejectMessage("Только блок");
  11.          prOpt.AddAllowedClass(typeof(BlockReference), true);
  12.  
  13.          var prRes = ed.GetEntity(prOpt);
  14.          if (prRes.Status != PromptStatus.OK)
  15.          {
  16.             ed.WriteMessage("\nПрервано пользователем.");
  17.             return;
  18.          }
  19.  
  20.          // Определение угла вложенного блока относительно модели
  21.          using (var t = db.TransactionManager.StartTransaction())
  22.          {
  23.             // Выбранный блок
  24.             var blRef1 = prRes.ObjectId.GetObject(OpenMode.ForRead, false, true) as BlockReference;
  25.             // Определение блока
  26.             var btr1 = blRef1.BlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord;
  27.             // Пербор объектов в блоке
  28.             foreach (var idEnt in btr1)
  29.             {
  30.                // Если это вхождение блока
  31.                var blRef2 = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference;
  32.                if (blRef2 == null) continue;
  33.  
  34.                // Найти угол второго блока относительно модели используя матрицу трансформации первого блока???
  35.                Matrix3d transToModel = blRef1.BlockTransform;
  36.                double rotation2 = blRef2.Rotation;
  37.  
  38.                double rotation2InModel = TransformRotation(rotation2, transToModel);
  39.  
  40.                ed.WriteMessage($"\nУгол вложенного блока '{blRef2.Name}' в модели = {rotation2InModel * (180 / Math.PI)}");
  41.             }
  42.             t.Commit();
  43.          }        
  44.       }
  45.  
  46.       private double TransformRotation(double rotation, Matrix3d transToModel)
  47.       {
  48.          // Вот так неправильно получается
  49.          return rotation + transToModel.Translation.Convert2d(new Plane()).Angle;
  50.       }
Есть функция определения наложения блоков, она рекурсивно входит во вложения блоков. При этом матрицу трансформации я передаю дальше. Думал, что угол поворота можно из матрицы получить. Или могу угол отдельно передавать.

Спасибо!
Название: Re: Определение угла поворота по матрице трансформации блока
Отправлено: Дима_ от 27-02-2016, 22:59:38
ИХМО проще передать угол - т.к. с матрицей может быть неоднозначность.
Название: Re: Определение угла поворота по матрице трансформации блока
Отправлено: Александр Ривилис от 27-02-2016, 23:16:08
ИХМО проще передать угол - т.к. с матрицей может быть неоднозначность.
Правильнее сказать, что "вероятность однозначности стремится к 0" :)
Величину угла поворота можно получить из матрицы только если уверен, что:
1) Матрица содержит только поворот - нет переноса, масштабирования и поворот вокруг только одной оси.
2) Знаешь точку, являющуюся центром поворота.
3) Знаешь ось, вокруг которой осуществляется поворот.
Короче проще с этим не заморачиваться...
Название: Re: Определение угла поворота по матрице трансформации блока
Отправлено: Дима_ от 27-02-2016, 23:41:05
Правильнее сказать, что "вероятность однозначности стремится к 0"
Ну вот - теперь у автора нет стимула понимать что такое матрица преобразования.
Название: Re: Определение угла поворота по матрице трансформации блока
Отправлено: Вильдар от 28-02-2016, 08:38:53
Ок, спасибо. Буду угол передавать.