Статьи > Тестирование статей
AutoCAD .NET API: Реальные габариты MText
alz:
В общем результирующий вариант с последними предложениями
--- Код - C# [Выбрать] ---private Extents3d? MtextRealExtents(MText mText){ if (mText == null)return null; Point3d point = mText.Location; Plane plane = new Plane(point, mText.Normal); Vector3d vx = plane.Normal.GetPerpendicularVector().GetNormal().TransformBy(Matrix3d.Rotation(mText.Rotation, plane.Normal, point)).GetNormal(); ; Vector3d vy = vx.TransformBy(Matrix3d.Rotation(Math.PI / 2, plane.Normal, point)).GetNormal(); double h = mText.ActualHeight; double w = mText.ActualWidth; //получаем нижний левый угол текста switch (mText.Attachment) { case AttachmentPoint.TopLeft: point = point - vy*h; break; case AttachmentPoint.MiddleCenter: point = point - vy*h/2 - vx*w/2; break; case AttachmentPoint.TopCenter: point = point - vy * h - vx * w / 2; break; case AttachmentPoint.TopRight: point = point - vy * h - vx * w; break; case AttachmentPoint.MiddleLeft: point = point - vy * h / 2; break; case AttachmentPoint.MiddleRight: point = point - vy * h/2 - vx * w; break; case AttachmentPoint.BottomLeft: break; case AttachmentPoint.BottomCenter: point = point - vx * w/2; break; case AttachmentPoint.BottomRight: point = point - vx * w; break; } var ext = new Extents3d(); ext.AddPoint(point); ext.AddPoint((point + vx * w + vy * h)); ext.AddPoint((point + vx * w)); ext.AddPoint((point + vy * h)); return new Extents3d(ext.MinPoint.Project(plane, Vector3d.ZAxis), ext.MaxPoint.Project(plane, Vector3d.ZAxis)); }
Владимир Шу:
Позвольте еще позанудничать...
В 6 строчке точно нужно два раза нормализовать вектор?
Вы вроде получаете нормализованный (единичный) вектор перпендикулярный плоскости и потом просто поворачиваете его... и снова нормализуете и сразу за этим, в 7 строчке Вы опять поворачиваете единичный вектор и снова нормализуете его.
Что то меня сомнения грызут, что все это нужно...
И еще,
--- Код - C# [Выбрать] ---private Extents3d? MtextRealExtents(MText mText)имеет смысл заменить на
--- Код - C# [Выбрать] ---public static Extents3d? MtextRealExtents(this MText mText)запихнув все это в статичный класс, что бы удобнее было вызывать:
--- Код - C# [Выбрать] ---var mt = new MText();var ext = mt.MtextRealExtents();
--- Цитировать ---Зачем Gem и Db? Вроде программа простейшая и мне хватило этого
--- Конец цитаты ---
--- Код - C# [Выбрать] ---using Db = Autodesk.AutoCAD.DatabaseServices;using Gem = Autodesk.AutoCAD.Geometry;Таким образом разделяю объекты автокада и других библиотек, просто привык к такому.
alz:
Не, не нужно, я если честно сомневаюсь что и один раз нужно, просто разворот потом уже добавлял и ляпнул на автомате, заметил уже когда выложил но поздно
alz:
--- Цитата: Владимир Шу от 28-03-2023, 07:49:35 ---имеет смысл заменить на
--- Код - C# [Выбрать] ---public static Extents3d? MtextRealExtents(this MText mText)
--- Конец цитаты ---
Ну думаю конкретно для показа принципа получения этой границы это уже излишне, но за показ такого варианта использования статика большое спасибо, думаю много где может пригодиться в будущем)
Навигация
Перейти к полной версии