Переместить сущность в начало координат

Автор Тема: Переместить сущность в начало координат  (Прочитано 4795 раз)

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

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

  • ADN OPEN
  • Сообщений: 39
  • Карма: 0
Столкнулся с такой проблемой: есть набор сущностей(линий, окружностей, вхождений блоков, и т.д.), и нужно их переместить(!) в нужную точку.
Однако проблема в том, что метод Matrix3D.Displacement не перемещает, а сдвигает объект относительно текущей его позиции.
Я воспользовался кодом:
Код - C# [Выбрать]
  1. var basePoint = Point3d.Origin;
  2. foreach (var objId in idList)
  3. {
  4.     var pair = entMap[objId];
  5.     var ent = (Entity)trans.GetObject(pair.Value, OpenMode.ForWrite);
  6.     var m2Array = ent.CompoundObjectTransform.ToArray();
  7.     ent.TransformBy(Matrix3d.Displacement(new Vector3d(m2Array[3] * -1, m2Array[7] * -1, 0))); // В начало координат
  8.     ent.TransformBy(Matrix3d.Displacement(basePoint.GetVectorTo(insPoint))); // В точку вставки
  9. }
  10.  
Однако Entity.CompoundObjectTransform даёт текущую матрицу только в случае если объект является вхождением блока.
Вопрос: как можно передвинуть объект в указанную точку? Или как узнать текущую позицию объекта не вдаваясь в подробности какого типа объект?
« Последнее редактирование: 01-12-2014, 10:50:12 от Александр Ривилис »

Отмечено как Решение MikhailTAP 01-12-2014, 09:14:56

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

  • ADN OPEN
  • Сообщений: 39
  • Карма: 0
Разобрался, поступил следующим образом:
Код - C# [Выбрать]
  1. var basePoint = Point3d.Origin;
  2. foreach (var objId in idList)
  3. {
  4.     var pair = entMap[objId];
  5.     var ent = (Entity)trans.GetObject(pair.Value, OpenMode.ForWrite);
  6.     Extents3d extent;
  7.     if (AutoCAD.Utilites.TryGetExtent(ent, out extent))
  8.     {
  9.         ent.TransformBy(Matrix3d.Displacement(new Vector3d(extent.MinPoint.X * -1, extent.MinPoint.Y * -1, 0)));// В начало координат
  10.         ent.TransformBy(Matrix3d.Displacement(basePoint.GetVectorTo(insPoint))); // В точку вставки
  11.     }
  12. }
  13.  
  14. public static bool TryGetExtent(Entity entity, out Extents3d extent)
  15.                 {
  16.                         try
  17.                         {
  18.                                 // получаем позицию элемента в зависимости от типа элемента
  19.                                 if (entity is DBText)
  20.                                 {
  21.                                         var pos = ((DBText)entity).Position;
  22.                                         extent = new Extents3d(pos, pos);
  23.                                 }
  24.                                 else if (entity.Bounds != null)
  25.                                 {
  26.                                         extent = entity.Bounds.Value;
  27.                                 }
  28.                                 else if (entity is BlockReference)
  29.                                 {
  30.                                         extent = ((BlockReference)entity).GeometryExtentsBestFit();
  31.                                 }                              
  32.                                 else
  33.                                 {
  34.                                         extent = entity.GeometricExtents;
  35.                                 }
  36.                         }
  37.                         catch (Exception)
  38.                         {
  39.                                 // а если и его не получили - значит феил
  40.                                 extent = new Extents3d();
  41.                                 return false;
  42.                         }
  43.  
  44.                         return true;
  45.                 }
  46.  
Получил позицию сущности через экстент. Тему можно удалить или закрыть. Спасибо.
« Последнее редактирование: 01-12-2014, 10:50:37 от Александр Ривилис »