Устанавливаем ортографический вид без изменения ПСК
Вот предыдущая статья с подобной темой об установке ортографического вида. В приведённом коде есть ограничение, связанное с тем что модифицируется активная запись таблицы ВЭкранов (ViewportTableRecord) и после изменения вида имя текущей ПСК не отображается в Видовом Кубе. Когда же мы меняем вид при помощи Видового Куба и переключаемся на Вид Сверху – это меняет только вид, но не меняет текущую ПСК. Также оси X и Y соответственно выравниваются горизонтально и вертикально. Вот код, который позволяет добиться подобного поведения при помощи API. Он устанавливает направление вида вдоль оси +Z и выравнивает оси X и Y так же, как это делает Видовой Куб:
- [DllImport("accore.dll" ,
- CallingConvention = CallingConvention.Cdecl,
- EntryPoint = "acedTrans" )]
- private static extern int acedTrans(
- double [] point,
- IntPtr fromRb,
- IntPtr toRb,
- int disp,
- double [] result);
- [CommandMethod("SetViewDir" )]
- public static void SetViewDirMethod()
- {
- Document doc
- = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- Matrix3d ucs = ed.CurrentUserCoordinateSystem;
- using (Transaction tr
- = db.TransactionManager.StartTransaction())
- {
- ViewportTable vt = tr.GetObject(
- db.ViewportTableId,
- OpenMode.ForWrite) as ViewportTable;
- ViewportTableRecord activeVTR =
- tr.GetObject(ed.ActiveViewportId,
- OpenMode.ForRead) as ViewportTableRecord;
- using (ViewTableRecord vtr = new ViewTableRecord())
- {
- vtr.Target = activeVTR.Target;
- vtr.ViewDirection = activeVTR.ViewDirection;
- vtr.Height = activeVTR.Height;
- vtr.CenterPoint = activeVTR.CenterPoint;
- vtr.ViewDirection = ucs.CoordinateSystem3d.Zaxis;
- ed.SetCurrentView(vtr);
- }
- tr.Commit();
- }
- ucs = ed.CurrentUserCoordinateSystem;
- double [] resVec = new double [] { 0, 0, 0 };
- ResultBuffer rbFrom
- = new ResultBuffer(new TypedValue(5003, 0));
- ResultBuffer rbTo
- = new ResultBuffer(new TypedValue(5003, 2));
- Vector3d yAxisUCS = ucs.CoordinateSystem3d.Yaxis;
- int res = acedTrans(
- yAxisUCS.ToArray(),
- rbFrom.UnmanagedObject,
- rbTo.UnmanagedObject,
- 1,
- resVec
- );
- Vector3d yAxisDCS
- = new Vector3d(resVec[0], resVec[1], resVec[2]);
- double twistAngle
- = (Math.PI * 0.5)
- - Math.Atan2(yAxisDCS.Y, yAxisDCS.X);
- using (ViewTableRecord vtr
- = doc.Editor.GetCurrentView())
- {
- vtr.ViewTwist = twistAngle;
- ed.SetCurrentView(vtr);
- }
- }
А вот и снимки экрана с Видовым кубом до и после изменения Вида, которые показывают, что текущая ПСК сохранилась:
Источник: 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