7.5.1. Поворот в 3D

Источник здесь[перевод не проверен]; [Переводчик: Вадим Семёнов]

    С помощью метода TransformBy объекта и метода Rotation принадлежащий Matrix, вы можете вращать объекты в 2D относительно указанной точки. Направление вращения для 2D объектов задается вокруг оси Z. Для 3D-объектов, ось вращения не ограничивается осью Z. При использовании метода Rotation, для замещения использования оси Z в качестве оси вращения, вы должны определить свой 3D вектор.



Более подробную информацию о вращении в 3D, см. "Поворот объектов" в Руководстве пользователя AutoCAD.

Создание 3D куба (Box) и поворот его вокруг оси

Этот пример создает 3D куб. Затем, он определяет ось для вращения и, наконец, вращает куб на 30 градусов вокруг оси.

Код VB.NET
   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.Geometry
   5:   
   6:  <CommandMethod("Rotate_3DBox")> _
   7:  Public Sub Rotate_3DBox()
   8:    '' Устанавливаем текущий документ и базу данных, начинаем транзакцию
   9:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  10:    Dim acCurDb As Database = acDoc.Database
  11:   
  12:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  13:        '' Открываем таблицу Блока для чтения
  14:        Dim acBlkTbl As BlockTable
  15:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
  16:                                     OpenMode.ForRead)
  17:   
  18:        ''Открываем запись таблицы Блока пространство Модели (Model space) для записи
  19:        Dim acBlkTblRec As BlockTableRecord
  20:        acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  21:                                        OpenMode.ForWrite)
  22:   
  23:        '' Создаем 3D Куб (Box)
  24:        Dim acSol3D As Solid3d = New Solid3d()
  25:        acSol3D.SetDatabaseDefaults()
  26:        acSol3D.CreateBox(5, 7, 10)
  27:   
  28:        '' Устанавливаем центр 3D тела в (5,5,0)
  29:        acSol3D.TransformBy(Matrix3d.Displacement(New Point3d(5, 5, 0) - _
  30:                                                  Point3d.Origin))
  31:   
  32:        Dim curUCSMatrix As Matrix3d = acDoc.Editor.CurrentUserCoordinateSystem
  33:        Dim curUCS As CoordinateSystem3d = curUCSMatrix.CoordinateSystem3d
  34:   
  35:        '' Вращаем 3D тело на 30 градусов вокруг оси которая
  36:        '' определяется точками (-3,4,0) и (-3,-4,0)
  37:        Dim vRot As Vector3d = New Point3d(-3, 4, 0). _
  38:                                           GetVectorTo(New Point3d(-3, -4, 0))
  39:   
  40:        acSol3D.TransformBy(Matrix3d.Rotation(0.5236, _
  41:                                              vRot, _
  42:                                              New Point3d(-3, 4, 0)))
  43:   
  44:        '' Добавляем новый объект в запись таблицы Блока и передаем
  45:        acBlkTblRec.AppendEntity(acSol3D)
  46:        acTrans.AddNewlyCreatedDBObject(acSol3D, True)
  47:   
  48:        '' Сохраняем новый объект в базу данных 
  49:        acTrans.Commit()
  50:    End Using
  51:  End Sub

Код C#
   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.Geometry;
   5:   
   6:  [CommandMethod("Rotate_3DBox")]
   7:  public static void Rotate_3DBox()
   8:  {
   9:    // Устанавливаем текущий документ и базу данных, начинаем транзакцию
  10:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  11:    Database acCurDb = acDoc.Database;
  12:   
  13:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  14:    {
  15:        // Открываем таблицу Блока для чтения
  16:        BlockTable acBlkTbl;
  17:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  18:                                     OpenMode.ForRead) as BlockTable;
  19:   
  20:        // Открываем запись таблицы Блока пространство Модели (Model space) для записи
  21:        BlockTableRecord acBlkTblRec;
  22:        acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  23:                                        OpenMode.ForWrite) as BlockTableRecord;
  24:   
  25:        // Создаем 3D Куб (Box)
  26:        Solid3d acSol3D = new Solid3d();
  27:        acSol3D.SetDatabaseDefaults();
  28:        acSol3D.CreateBox(5, 7, 10);
  29:   
  30:        // Устанавливаем центр 3D тела в (5,5,0)
  31:        acSol3D.TransformBy(Matrix3d.Displacement(new Point3d(5, 5, 0) -
  32:                                                  Point3d.Origin));
  33:   
  34:        Matrix3d curUCSMatrix = acDoc.Editor.CurrentUserCoordinateSystem;
  35:        CoordinateSystem3d curUCS = curUCSMatrix.CoordinateSystem3d;
  36:   
  37:        // Вращаем 3D тело на 30 градусов вокруг оси которая
  38:        // определяется точками (-3,4,0) и (-3,-4,0)
  39:        Vector3d vRot = new Point3d(-3, 4, 0).
  40:                                    GetVectorTo(new Point3d(-3, -4, 0));
  41:   
  42:        acSol3D.TransformBy(Matrix3d.Rotation(0.5236,
  43:                                              vRot,
  44:                                              new Point3d(-3, 4, 0)));
  45:   
  46:        // Добавляем новый объект в запись таблицы Блока и передаем
  47:        acBlkTblRec.AppendEntity(acSol3D);
  48:        acTrans.AddNewlyCreatedDBObject(acSol3D, true);
  49:   
  50:        // Сохраняем новый объект в базу данных 
  51:        acTrans.Commit();
  52:    }
  53:  }

Код VBA/ActiveX 

   1:  Sub Rotate_3DBox()
   2:      Dim boxObj As Acad3DSolid
   3:      Dim length As Double
   4:      Dim width As Double
   5:      Dim height As Double
   6:      Dim center(0 To 2) As Double
   7:   
   8:      ' Определяем куб
   9:      center(0) = 5: center(1) = 5: center(2) = 0
  10:      length = 5
  11:      width = 7
  12:      height = 10
  13:   
  14:      ' Создаем 3D Куб (Box) в пространстве Модели (Model space)
  15:      Set boxObj = ThisDrawing.ModelSpace. _
  16:                       AddBox(center, length, width, height)
  17:   
  18:      'Определяем ось вращения двумя точками
  19:      Dim rotatePt1(0 To 2) As Double
  20:      Dim rotatePt2(0 To 2) As Double
  21:      Dim rotateAngle As Double
  22:      rotatePt1(0) = -3: rotatePt1(1) = 4: rotatePt1(2) = 0
  23:      rotatePt2(0) = -3: rotatePt2(1) = -4: rotatePt2(2) = 0
  24:      rotateAngle = 30
  25:      rotateAngle = rotateAngle * 3.141592 / 180#
  26:   
  27:      ' Вращаем Куб (Box)
  28:      boxObj.Rotate3D rotatePt1, rotatePt2, rotateAngle
  29:   
  30:      ZoomAll
  31:  End Sub

Comments