Статьи > Тестирование статей

AutoCAD .NET API: Реальные габариты MText

<< < (2/2)

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)
--- Конец цитаты ---

Ну думаю конкретно для показа принципа получения этой границы это уже излишне, но за показ такого варианта использования статика большое спасибо, думаю много где может пригодиться в будущем)

Навигация

[0] Главная страница сообщений

[*] Предыдущая страница

Перейти к полной версии