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

18/09/2015

Устанавливаем ортографический вид без изменения ПСК

Вот предыдущая статья с подобной темой об установке ортографического вида. В приведённом коде есть ограничение, связанное с тем что модифицируется активная запись таблицы ВЭкранов (ViewportTableRecord) и после изменения вида имя текущей ПСК не отображается в Видовом Кубе. Когда же мы меняем вид при помощи Видового Куба и переключаемся на Вид Сверху – это меняет только вид, но не меняет текущую ПСК. Также оси X и Y соответственно выравниваются горизонтально и вертикально. Вот код, который позволяет добиться подобного поведения при помощи API. Он устанавливает направление вида вдоль оси +Z и выравнивает оси X и Y так же, как это делает Видовой Куб:

Код - C#: [Выделить]
  1. [DllImport("accore.dll" ,
  2.      CallingConvention = CallingConvention.Cdecl,
  3.      EntryPoint = "acedTrans" )]
  4.  private  static  extern  int  acedTrans(
  5.      double [] point,
  6.      IntPtr fromRb,
  7.      IntPtr toRb,
  8.      int  disp,
  9.      double [] result);
  10.  
  11.  [CommandMethod("SetViewDir" )]
  12.  public  static  void  SetViewDirMethod()
  13.  {
  14.      Document doc
  15.          = Application.DocumentManager.MdiActiveDocument;
  16.      Database db = doc.Database;
  17.      Editor ed = doc.Editor;
  18.  
  19.      Matrix3d ucs = ed.CurrentUserCoordinateSystem;
  20.      using  (Transaction tr
  21.          = db.TransactionManager.StartTransaction())
  22.      {
  23.          ViewportTable vt = tr.GetObject(
  24.              db.ViewportTableId,
  25.              OpenMode.ForWrite) as  ViewportTable;
  26.          ViewportTableRecord activeVTR =
  27.              tr.GetObject(ed.ActiveViewportId,
  28.              OpenMode.ForRead) as  ViewportTableRecord;
  29.          using  (ViewTableRecord vtr = new  ViewTableRecord())
  30.          {
  31.              vtr.Target = activeVTR.Target;
  32.              vtr.ViewDirection = activeVTR.ViewDirection;
  33.              vtr.Height = activeVTR.Height;
  34.              vtr.CenterPoint = activeVTR.CenterPoint;
  35.                     
  36.              vtr.ViewDirection = ucs.CoordinateSystem3d.Zaxis;
  37.  
  38.              ed.SetCurrentView(vtr);
  39.          }
  40.          tr.Commit();
  41.      }
  42.  
  43.      ucs = ed.CurrentUserCoordinateSystem;
  44.  
  45.      double [] resVec = new  double [] { 0, 0, 0 };
  46.      ResultBuffer rbFrom
  47.          = new  ResultBuffer(new  TypedValue(5003, 0));
  48.      ResultBuffer rbTo
  49.          = new  ResultBuffer(new  TypedValue(5003, 2));
  50.  
  51.      Vector3d yAxisUCS = ucs.CoordinateSystem3d.Yaxis;
  52.      int  res = acedTrans(
  53.          yAxisUCS.ToArray(),
  54.          rbFrom.UnmanagedObject,
  55.          rbTo.UnmanagedObject,
  56.          1,
  57.          resVec
  58.      );
  59.      Vector3d yAxisDCS
  60.          = new  Vector3d(resVec[0], resVec[1], resVec[2]);
  61.  
  62.      double  twistAngle
  63.          = (Math.PI * 0.5)
  64.          - Math.Atan2(yAxisDCS.Y, yAxisDCS.X);
  65.      using  (ViewTableRecord vtr
  66.          = doc.Editor.GetCurrentView())
  67.      {
  68.          vtr.ViewTwist = twistAngle;
  69.          ed.SetCurrentView(vtr);
  70.      }
  71.  }

 

А вот и снимки экрана с Видовым кубом до и после изменения Вида, которые показывают, что текущая ПСК сохранилась:

               

 

Источник: http://adndevblog.typepad.com/autocad/2015/09/setting-orthographic-view-without-affecting-ucs.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=3030

Опубликовано 18.09.2015