Маленькая зарисовка на тему того, как в AutoCAD программно создать мультивыноску, у которой часть текста оформлена в виде дроби. Тут же показано, как решать всем хорошо известную проблему с прилипанием текста к полке мультивыноски.
1: // #define AutoCAD2009
2:
3: using System;
4: using cad = Autodesk.AutoCAD.ApplicationServices.Application;
5: using AppSrv = Autodesk.AutoCAD.ApplicationServices;
6: using DbSrv = Autodesk.AutoCAD.DatabaseServices;
7: using Geom = Autodesk.AutoCAD.Geometry;
8: using Rtm = Autodesk.AutoCAD.Runtime;
9:
10: [assembly: Rtm.CommandClass(typeof(AndreyBushman.CAD.Sample))]
11:
12: namespace AndreyBushman.CAD {
13:
14: public sealed class Sample {
15:
16: [Rtm.CommandMethod("MLeaderSample")]
17: public static void MLeaderSample() {
18: AppSrv.Document doc = cad.DocumentManager.MdiActiveDocument;
19: DbSrv.Database db = doc.Database;
20:
21: // Поскольку мне нужно добавить небольшое количество примитивов,
22: // то выполняю это без использования транзакции. Я не буду в явном виде
23: // вызывать методы DBObject.Close() - вместо этого воспользуюсь блоками using.
24: // Более подробная информация по теме здесь:
25: // http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html
26: using (DbSrv.OpenCloseTransaction tr = db.TransactionManager.StartOpenCloseTransaction()) {
27: using (DbSrv.BlockTableRecord space = db.CurrentSpaceId.Open(DbSrv.OpenMode.ForWrite)
28: as DbSrv.BlockTableRecord) {
29:
30: using (DbSrv.MLeader mlead = new DbSrv.MLeader()) {
31: mlead.SetDatabaseDefaults();
32: mlead.ContentType = DbSrv.ContentType.MTextContent;
33: mlead.SetTextAttachmentType(
34: DbSrv.TextAttachmentType.AttachmentBottomLine,
35: DbSrv.LeaderDirectionType.LeftLeader);
36:
37: DbSrv.MText mText = new DbSrv.MText();
38: mText.SetDatabaseDefaults();
39: mText.Width = 5;
40: mText.Height = 3.5;
41: // Использование некоторых символов в некоторых шрифтах может
42: // способствовать "прилипанию" текста к полке мультивыноски.
43: // Чтобы устранить эту проблему, в состав значения свойства
44: // Contents добавлен текст "\pxse 1;", где 1 определяет некоторую
45: // величину отступа от полки (не буквальную).
46: // Кроме того, часть текста выполнена в виде дроби (для примера).
47: mText.Contents = "\\pxse 1;8-AOT\\A1;{\\H0.7x;\\S4x18/2,5;}";
48: mText.Location = new Geom.Point3d(200.0, 200.0, 0);
49: #if AutoCAD2009
50: mText.TextStyle = db.Textstyle;
51: #else
52: mText.TextStyleId = db.Textstyle;
53: #endif
54: mlead.MText = mText;
55: Int32 idx = mlead.AddLeaderLine(new Geom.Point3d(190.0, 190.0, 0));
56: Geom.Matrix3d transForm = Geom.Matrix3d.Displacement(new Geom.Vector3d(0, 0, 10));
57: mlead.TransformBy(transForm);
58:
59: space.AppendEntity(mlead);
60: }
61: }
62: }
63: }
64: }
65: }
Результат работы кода следующий:
Комментариев нет:
Отправить комментарий