вторник, 15 января 2013 г.

Мультивыноска с дробью в тексте и отступом от полки

Маленькая зарисовка на тему того, как в 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:  }


Результат работы кода следующий:





Комментариев нет: