Обеспечение параллельности транзитной графики экрану
Вы можете быть заинтересованы в использовании транзитной графики, которая всегда остаётся параллельной экрану, несмотря на любые изменения вида.
Метод «Editor.PointToWorld» можно использовать для конвертации точки, для которой известны её экранные координаты, чтобы получить её координаты в МСК (WCS). Этот метод можно использовать для вычисления точек в МСК (WCS) для которых известны координаты в ДСК (DCS).
Однако достаточно сложно узнать, когда вид изменится, для того чтобы обновить транзитную графику чтобы она следовала за изменениями вида. Это потому что нет прямого пути с использованием API для того чтобы узнать, параметры вида изменились.
Событие модификации для записи таблицы видовых портов происходит только при изменении видового куба, команд ПАН (PAN), ПОКАЖИ (ZOOM), ТЗРЕНИЯ (VPOINT) и т.д. Панорамирование и зумирование с использованием колеса мыши не вызывает этого события.
В качестве обходного пути можно рассмотреть возможность использования таймера обратного вызова для контроля параметров вида и после изменения параметров вида выполнить перерисовку транзитной графики параллельно экрану (т.е. в ДСК).
Другой способ заключается в использовании события Editor.PointMonitor, но вы не получите уведомление о событии, когда панорамирование / зумирование происходит из командной строки. После того, как курсор мыши находится в редакторе AutoCAD , транзитная графика перерисовывается.
Ниже пример кода, использующий второй путь. Он рисует прямоугольник, который всегда параллелен экрану, при помощи транзитной графики:
- using System.Drawing;
- using Autodesk.AutoCAD.GraphicsInterface;
- public class TestCommands : IExtensionApplication
- {
- public static DBObjectCollection _transients = null;
- public double _viewSize = 1.0;
- public Point3d _viewCtr = Point3d.Origin;
- public Point3d _viewDir = Point3d.Origin;
- [CommandMethod("DrawTransientRect", CommandFlags.Session)]
- public void DrawTransientRectMethod()
- {
- Document activeDoc
- = Application.DocumentManager.MdiActiveDocument;
- Database db = activeDoc.Database;
- Editor ed = activeDoc.Editor;
- // Очищаем предыдущую транзитную графику
- ClearTransientGraphics();
- Point2d screenSize
- = (Point2d)Application.GetSystemVariable("SCREENSIZE");
- // Ширина и высота прямоугольника
- int width = 20;
- int height = 60;
- // Четыре угловые тоски в экранных координатах
- System.Drawing.Point upperLeft
- = new System.Drawing.Point(20, 20);
- System.Drawing.Point upperRight
- = new System.Drawing.Point(upperLeft.X + width, upperLeft.Y);
- System.Drawing.Point lowerLeft
- = new System.Drawing.Point(upperLeft.X, upperLeft.Y + height);
- System.Drawing.Point lowerRight
- = new System.Drawing.Point(upperLeft.X + width, upperLeft.Y + height);
- // Четыре угловые точки в МСК (WCS)
- Point3d upperLeftWorld = ed.PointToWorld(upperLeft, 0);
- Point3d upperRightWorld = ed.PointToWorld(upperRight, 0);
- Point3d lowerLeftWorld = ed.PointToWorld(lowerLeft, 0);
- Point3d lowerRightWorld = ed.PointToWorld(lowerRight, 0);
- // Создаём транзитную графику
- Line l1 = new Line(upperLeftWorld, upperRightWorld);
- l1.ColorIndex = 2;
- Line l2 = new Line(upperRightWorld, lowerRightWorld);
- l2.ColorIndex = 2;
- Line l3 = new Line(lowerRightWorld, lowerLeftWorld);
- l3.ColorIndex = 2;
- Line l4 = new Line(lowerLeftWorld, upperLeftWorld);
- l4.ColorIndex = 2;
- _transients.Add(l1);
- _transients.Add(l2);
- _transients.Add(l3);
- _transients.Add(l4);
- IntegerCollection intCol = new IntegerCollection();
- TransientManager tm = TransientManager.CurrentTransientManager;
- tm.AddTransient
- (
- l1,
- TransientDrawingMode.Main,
- 128,
- intCol
- );
- tm.AddTransient
- (
- l2,
- TransientDrawingMode.Main,
- 128,
- intCol
- );
- tm.AddTransient
- (
- l3,
- TransientDrawingMode.Main,
- 128,
- intCol
- );
- tm.AddTransient
- (
- l4,
- TransientDrawingMode.Main,
- 128,
- intCol
- );
- }
- // Очищаем всю транзитную графику
- void ClearTransientGraphics()
- {
- TransientManager tm
- = TransientManager.CurrentTransientManager;
- IntegerCollection intCol = new IntegerCollection();
- if (_transients != null)
- {
- foreach (DBObject transient in _transients)
- {
- tm.EraseTransient(
- transient,
- intCol
- );
- transient.Dispose();
- }
- _transients.Clear();
- }
- else
- _transients = new DBObjectCollection();
- }
- #region IExtensionApplication Members
- void IExtensionApplication.Initialize()
- {
- Document activeDoc
- = Application.DocumentManager.MdiActiveDocument;
- Editor ed = activeDoc.Editor;
- // Подписываемся на событие PointMonitor чтобы перерисовывать
- // транзитную графику в случае любых изменений вида.
- ed.PointMonitor +=
- new PointMonitorEventHandler(ed_PointMonitor);
- }
- void ed_PointMonitor(object sender, PointMonitorEventArgs e)
- {
- Document activeDoc = Application.DocumentManager.MdiActiveDocument;
- double viewSize
- = (double)Application.GetSystemVariable("VIEWSIZE");
- Point3d viewCtr
- = (Point3d)Application.GetSystemVariable("VIEWCTR");
- Point3d viewDir
- = (Point3d)Application.GetSystemVariable("VIEWDIR");
- // Просто проверим не изменились ли параметры вида с момента
- // последней отрисовки транзитной графики
- if ( viewSize != _viewSize ||
- viewCtr.Equals(_viewCtr) == false ||
- viewDir.Equals(_viewDir) == false
- )
- {
- _viewSize = viewSize;
- _viewCtr
- = (Point3d)Application.GetSystemVariable("VIEWCTR");
- _viewDir = viewDir;
- // Перерисовываем транзитную графику если
- // параметры вида изменились
- DrawTransientRectMethod();
- }
- }
- void IExtensionApplication.Terminate()
- {
- Document activeDoc
- = Application.DocumentManager.MdiActiveDocument;
- if (activeDoc != null)
- {
- // Отписываемся от события
- Editor ed = activeDoc.Editor;
- ed.PointMonitor -=
- new PointMonitorEventHandler(ed_PointMonitor);
- }
- // Очищаем перед выходом
- ClearTransientGraphics();
- }
- #endregion
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=47.0
Опубликовано 24.05.2013
Отредактировано 14.04.2015 в 00:41:03