четверг, 5 июня 2014 г.

Размерные стили в AutoCAD

В данной заметке показан подробный пример по созданию и настройке размерного стиля в AutoCAD. Рассмотрена программная настройка каждой опции каждой вкладки диалогового окна редактирования размерных стилей.

Результат работы обозначенного ниже кода (команда CreateDimStyle) будет выглядеть следующим образом:


В коде каждая изменяемая нами опция настроек помечена комментарием, содержащим наименование этой опции в англоязычной версии AutoCAD.

/* DimStyleSample.cs
 * © Андрей Бушман, 2014 
 * Пример создания и настройки размерного стиля.
 */
using System;
 
using cad = Autodesk.AutoCAD.ApplicationServices
.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rt = Autodesk.AutoCAD.Runtime;
using Clr = Autodesk.AutoCAD.Colors;
//************************************
 
[assembly: Rt.CommandClass(typeof(Bushman.CAD
  .Samples.Styles.DimStyleSample))]
 
namespace Bushman.CAD.Samples.Styles {
 
  public class DimStyleSample {
 
    [Rt.CommandMethod("CreateDimStyle",
      Rt.CommandFlags.Modal)]
    public void CreateDimStyle() {
      Ap.Document doc = cad.DocumentManager
        .MdiActiveDocument;
      if(doc == null)
        return;
      Ed.Editor ed = doc.Editor;
      Db.Database db = doc.Database;
 
      using(Db.Transaction tr =
        db.TransactionManager.StartTransaction()) 
        {
 
        // Создадим новый текстовый стиль для
        // использования его в наших размерных 
        // стилях
        Db.TextStyleTable tst =
          (Db.TextStyleTable)tr.GetObject(
          db.TextStyleTableId,
          Db.OpenMode.ForWrite);
        Db.TextStyleTableRecord textStyle =
          new Db.TextStyleTableRecord();
        textStyle.Name = "Тип А прямой";
        textStyle.FileName = "Arial.ttf";
        textStyle.XScale = 0.75;
        tst.Add(textStyle);
        tr.AddNewlyCreatedDBObject(textStyle,
          true);
 
        // Создаём новый размерный стиль...
        Db.DimStyleTable dst =
          (Db.DimStyleTable)tr.GetObject(
          db.DimStyleTableId,
          Db.OpenMode.ForWrite);
        Db.DimStyleTableRecord dimStyle =
          new Db.DimStyleTableRecord();
        dimStyle.Name = "Основной без допусков";
 
        // Откройте диалоговое окно "Modify 
        // Dimension Style" (команда _DIMSTYLE) и
        // нажмите кнопку "Modify.." - мы будем
        // программно изменять эти настройки. 
        // Наименования вкладок, групп настроек и
        // конкретных опций будут приводиться для
        // английской версии AutoCAD.
 
        // *** Вкладка LINES ***
 
        // Группа настроек "Dimension lines":
 
        Db.ObjectId lineTypeId =
          // db.ContinuousLinetype;
          // или по блоку:
          db.ByBlockLinetype;
 
        // цвет "ByLayer"
        Clr.Color colorByLayer = Clr.Color
          .FromColorIndex(Clr.ColorMethod
          .ByLayer, 256);
 
        // Размерным линиям назначаем цвет 
        // "ByLayer"
        dimStyle.Dimclrd = colorByLayer; // Color 
 
        // Linetype
        dimStyle.Dimltype = lineTypeId;
        // Lineweight
        dimStyle.Dimlwd = Db.LineWeight
          .ByLineWeightDefault;
        // Extend Beyond Ticks
        dimStyle.Dimdle = 2;
        dimStyle.Dimdli = 7; // Baseline Spacing
        // Suppress dim line 1
        dimStyle.Dimsd1 = false;
        // Suppress dim line 2
        dimStyle.Dimsd2 = false;
 
        // Группа настроек "Extension Lines":
        dimStyle.Dimclre = colorByLayer; // Color
        // Linetype Ext 1
        dimStyle.Dimltex1 = lineTypeId;
        // Linetype Ext 2
        dimStyle.Dimltex2 = lineTypeId;
        dimStyle.Dimlwe = Db.LineWeight
          .ByLineWeightDefault; // Lineweight
        // Suppress Ext line 1
        dimStyle.Dimse1 = false;
        // Suppress Ext line 2
        dimStyle.Dimse2 = false;
        // Extend Beyond Dim Lines
        dimStyle.Dimexe = 2.0;
        // Offset From Origin
        dimStyle.Dimexo = 0;
        // Fixed Length Extension Lines
        dimStyle.DimfxlenOn = false;
        dimStyle.Dimfxlen = 1; // Length
 
        // *** Вкладка SYMBOL AND ARROWS ***
 
        // Группа "Arrowheads":
        // Внимание: Аннотативные блоки не могут
        // быть использованными в качестве 
        // пользовательского варианта для опций
        // First, Second и Leader. В обозначенных
        // опциях пользовательский вариант
        // представлен в виде элемента "User 
        // Arrow..." в самом низу раскрывающегося
        // списка.
        Db.BlockTable bt = (Db.BlockTable)tr
          .GetObject(db.BlockTableId,
          Db.OpenMode.ForRead);
 
        // Получаем идентификаторы интересующих
        // нас определений блоков
        Db.ObjectId id1 = GetArrowObjectId_dim(
          "DIMBLK1""_DOT");
        Db.ObjectId id2 = GetArrowObjectId_dim(
          "DIMBLK2""_CLOSED");
        Db.ObjectId id3 = GetArrowObjectId_dim(
          "DIMBLK2""_Oblique");
 
        // Убедитесь, что вы установили в true
        // значение свойства "Dimsah", если вам 
        // нужно назначить опциям First и Second
        // разные значения!
        dimStyle.Dimsah = true;
 
        // В качестве значения опций группы 
        // Arrowheads вы можете назначить 
        // Db.ObjectId.Null - в этом случае будет
        // использоваться маркер по умолчанию.
 
        // Опция "First" на вкладке "Symbols and
        // Arrows" (системная переменная Dimblk1)
        dimStyle.Dimblk1 = id3;
        // Опция "Second" на вкладке "Symbols and
        // Arrows" (системная переменная Dimblk2)   
        dimStyle.Dimblk2 = id3;
 
        // При желании, вы можете изменить оба
        // параметра (First и Second) 
        // одновременно, задав значение свойству
        // Dimblk. Но в этом случае вы не должны
        // в коде назначать значения для свойств
        // 'Dimblk1' и 'Dimblk2':
        // dimStyle.Dimblk = id3; 
 
        // Опция Leader. Если в качестве значения
        // указать ObjectId.Null, то будет 
        // использоваться вариант 'Closed filled'
        dimStyle.Dimldrblk = Db.ObjectId.Null;
        dimStyle.Dimasz = 3; // Arrow Size
 
        // Группа "Center marks":
 
        // Значения, допустимые для свойства 
        // 'Dimcen':
        //  0 - None; 
        //  1 - Mark; 
        // -1 - Line
        Int32 centerMarks = -1;
        Double centerMarksSize = 2.0;
        // Размер центрального маркера или 
        // центральной линии
        dimStyle.Dimcen = centerMarks *
          centerMarksSize;
 
        // Значение опции "Dimension Break" 
        // хранится в расширенных данных (XData)
        // размерного стиля. Давайте доберёмся до
        // него...
 
        // Для начала, получаем таблицу имён 
        // зарегистрированных приложений
        Db.RegAppTable regTable =
          (Db.RegAppTable)tr.GetObject(
          db.RegAppTableId, Db.OpenMode.ForRead);
        String xName = "cad_DSTYLE_DIMBREAK";
 
        // Если нужный нам элемент не 
        // зарегистрирован - выполняем его 
        // регистрацию
        if(!regTable.Has(xName)) {
          regTable.UpgradeOpen();
          Db.RegAppTableRecord app =
            new Db.RegAppTableRecord();
          app.Name = xName;
          regTable.Add(app);
          tr.AddNewlyCreatedDBObject(app, true);
        }
 
        Db.ResultBuffer rb = new Db.ResultBuffer(
            new Db.TypedValue((Int32)Db.DxfCode
              .ExtendedDataRegAppName, xName),
            new Db.TypedValue((Int32)Db.DxfCode
              .ExtendedDataInteger16, 391),
            new Db.TypedValue((Int32)Db.DxfCode
              .ExtendedDataReal, 0.0
          /* Наше значение свойства "Dimension 
           * Break" */));
 
        dimStyle.XData = rb;
 
        // Группа (опция) "Arc Length Symbol":
        // Значения, допустимые для свойства 
        // 'Dimarcsym' (три переключателя):
        // 0 - Precending dimension text
        // 1 - Above dimension text
        // 2 - None
 
        // Опция "Arc Length Symbol"
        dimStyle.Dimarcsym = 1;
 
        // Группа "Radius Jog Dimensions":
        // Jog Angle
        dimStyle.Dimjogang = 45 * Math.PI / 180;
 
        // Группа "Linear Jog Dimensions":
        // Значение "Linear Jog Size" хранится в 
        // расширенных данных (XData) размерного 
        // стиля.                
        xName = "cad_DSTYLE_DIMJAG";
        if(!regTable.Has(xName)) {
          regTable.UpgradeOpen();
          Db.RegAppTableRecord app =
            new Db.RegAppTableRecord();
          app.Name = xName;
          regTable.Add(app);
          tr.AddNewlyCreatedDBObject(app, true);
        }
        rb = new Db.ResultBuffer(
            new Db.TypedValue((Int32)Db.DxfCode
              .ExtendedDataRegAppName, xName),
            new Db.TypedValue((Int32)Db.DxfCode
              .ExtendedDataInteger16, 388),
            new Db.TypedValue((Int32)Db.DxfCode
              .ExtendedDataReal, 1.4995
          /* Значение для свойства "Linear Jog 
           * Size" */));
        dimStyle.XData = rb;
 
        // *** Вкладка TEXT ***
 
        // Группа "Text Appearance": 
 
        // Text Style
        dimStyle.Dimtxsty = textStyle.ObjectId;
        dimStyle.Dimclrt = Clr.Color
          .FromColorIndex(Clr.ColorMethod.ByAci,
          210); // Text Color
 
        // Свойство 'Dimtfill' влияет на 
        // поведение опции "Fill Color" и 
        // принимает одно из следующих значений:
        // 0 - Фон отсутствует
        // 1 - Использовать текущий фон чертежа
        // 2 - Фон, указанный в свойстве 
        // Dimtfillclr.
        dimStyle.Dimtfill = 0;
 
        dimStyle.Dimtfillclr = Clr.Color
          .FromColorIndex(Clr.ColorMethod.ByAci,
          256); // Fill Color (см. Dimtfill выше)
        dimStyle.Dimtxt = 3.5; // Text Height
        // Fraction Height Scale
        dimStyle.Dimfrac = 2;
        // Включить\Отключить опцию "Draw Frame 
        // Around Text"
        Boolean drawFrameAroundText = false;
 
        // Группа "Text Placement":
 
        // Опция Vertical (свойство 'Dimtad') 
        // может принимать только следующие 
        // значения:
        // 0 - Centered: центрировать размерный 
        //    текст между выносными линиями.
        // 1 - Above: разместить размерный текст
        //    над размерной линией, за 
        //    исключением случаев, когда 
        //    размерная линия не горизонтальна и
        //    текст внутри выносных линий рамещён 
        //    горизонтально (DIMTIH = 1). 
        //    Расстояние от размерной линии до
        //    самой нижней строки текста 
        //    определяется значением переменной
        //    DIMGAP (свойство Dimgap).
        // 2 - Outside: разместить размерный 
        //    текст в стороне от размерной линии, 
        //    подальше от определённых точек.
        // 3 - JIS: разместить размерный текст в 
        //    соответствии с Японским 
        //    Индустриальным Стандартом.
        dimStyle.Dimtad = 1; // Vertical 
 
        // Опция Horizontal (свойство 'Dimjust')
        // принимает только следующие значения:
        // 0 - Centered
        // 1 - At Ext Line 1
        // 2 - At Ext Line 2
        // 3 - Over Ext Line 1
        // 4 - Over Ext Line 2
        dimStyle.Dimjust = 0; // Horizontal
 
        // View Direction
#if NEWER_THAN_2009
        dimStyle.Dimtxtdirection = true;
#endif
        // Offset from Dim Line
        dimStyle.Dimgap = 1 *
          (drawFrameAroundText ? -1 : 1);
 
        // Группа "Text Alignment":
 
        // Для того, чтобы выбрать один из трёх
        // доступных вариантов, следует назначить
        // значение сразу двум свойствам: Dimtih
        // и Dimtoh.
        //
        // Horizontal: 
        //   Dimtih = true;
        //   Dimtoh = true;
        //
        // Aligned with Dimension Line:
        //   Dimtih = false;
        //   Dimtoh = false;
        //
        // ISO Standard: 
        //   Dimtih = false;
        //   Dimtoh = true;
        //                   
 
        // Text Alignment
        dimStyle.Dimtih = false;
        dimStyle.Dimtoh = false;
 
        // *** Вкладка FIT ***
 
        // Группа "Fit Options":
 
        // Свойство 'Dimatfit' может принимать
        // только следующие значения:
        // 0 - Выбрать опцию Both text and arrows
        // 1 - Выбрать опцию Arrows
        // 2 - Выбрать опцию Text
        // 3 - Выбрать опцию "Either text or 
        //    arrows (best fit)"
 
        // Для того, чтобы назначить свойству
        // 'Dimatfit' нужное значение 0-3, нужно
        // сначала назначить false свойству 
        // Dimtix. Если Dimtix назначить true, то
        // будет выбрана опция "Always Keep Text 
        // Between Ext Lines".
 
        // Опция "Always Keep Text Between Ext 
        // Lines"
        dimStyle.Dimtix = false;
 
        // Не забываем предварительно установить 
        // 'Dimtix' в false
        dimStyle.Dimatfit = 3;
 
        // Suppress Arrows If They Don't Fit 
        // Inside Extension Lines
        dimStyle.Dimsoxd = false;
 
        // Группа "Text placement" group:
 
        // Свойство Dimtmove может принимать 
        // только следующие значения:
        // 0 - Выбрана опция "Beside the 
        //    dimension line"
        // 1 - Выбрана опция "Over dimension 
        //    line, with leader"
        // 2 - Выбрана опция "Over dimension 
        //    line, without leader"
        dimStyle.Dimtmove = 1;
 
        // Группа"Scale for Dimension Features":
        dimStyle.Annotative =
          Db.AnnotativeStates.True; // Annotative                
        dimStyle.Dimscale = 1.0; // Dimscale
 
        // Для того, чтобы установить опцию 
        // "Scale Dimensions To Layout" нужно
        // свойству Dimscale присвоить 0:
        // dimStyle.Dimscale = 0;
 
        // Группа "Fine Tuning":
 
        // Place Text Manually
        dimStyle.Dimupt = false;
        // Draw Dim Line Between Ext Lines
        dimStyle.Dimtofl = false;
 
        // *** Вкладка Primary Units ***
 
        // Группа "Leader dimensions"
 
        // Опция "Unit format" (свойство 
        // 'Dimlunit') может принимать только 
        // следующие значения:
        // 1 - Scientific
        // 2 - Decimal
        // 3 - Engineering
        // 4 - Architectural
        // 5 - Fractional
        // 6 - Windows Desktop
 
        // Unit format
        dimStyle.Dimlunit = 2;
 
        // Масштабный коэффициент высоты 
        // текста, записанного в виде дроби. Эта
        // высота расчитывается путём умножения
        // указанного в свойстве Dimtfac коэффи-
        // циента на высоту текста, указанную в
        // свойстве Dimtxt.
        dimStyle.Dimtfac = 0.5;
 
        // Количество знаков после запятой:
        dimStyle.Dimdec = 0; // Precision
 
        // Опция "Fraction format" (свойство 
        // 'Dimfrac') принимает одно из следующих
        // значений:
        // 0 - Horizontal
        // 1 - Diagonal
        // 2 - Not stacked (например 1/2)
        dimStyle.Dimfrac = 0; // Fraction Format
 
        // Если опции "Unit format" в качестве
        // значения назначен 'Decimal', то в тек-
        // сте размеров, вместо точки, в качестве 
        // разделителя десятичной части будет
        // использоваться иной разделитель, кото-
        // рый указывается при помощи свойства 
        // 'Dimdsep'. Если свойству 'Dimdsep' 
        // присвоить NULL в качестве значения, то
        // в качестве десятичного разделителя 
        // будет использоваться точка.
 
        // Опция "Decimal separator" (свойство 
        // 'Dimdsep') может принимать только 
        // следующие значения:
        // '.' - Точка
        // ',' - Запятая
        // ' ' - Пробел
 
        // Decimal Separator
        dimStyle.Dimdsep = ',';
        dimStyle.Dimrnd = 0.0; // Round Off
 
        // Prefix (префикс) и Suffix (суффикс)
        // Префикс и суффикс указываются в 
        // составе строкового значения, 
        // присваиваемого свойству Dimpost.
        // Пример: "L = <> m"
        // Где:
        //    "L = " - префикс
        //    <> - вычисленное числовое значение
        //    " m" - суффикс 
        dimStyle.Dimpost = "<>";
 
        // Группа "Measurement Scale":
 
        dimStyle.Dimlfac = 1; // Scale Factor
 
        // Выделить или снять выделение опции
        // "Apply to Layout Dimensions Only" на 
        // вкладке "Primary Units":
        Boolean applyToLayoutDimensionsOnly =
          false;
        // Если свойству 'Dimfrac' назначить 
        // отрицательное значение, то опция 
        // "Apply to Layout Dimensions Only" 
        // будет включена:
        dimStyle.Dimlfac =
          applyToLayoutDimensionsOnly ? -1 *
          Math.Abs(dimStyle.Dimlfac) :
            Math.Abs(dimStyle.Dimlfac);
 
        // Подгруппа "Zero Suppression" группы
        // "Leader dimensions":
 
        // Свойству 'Dimzin' property' следует
        // назначать одно из следующих значений:
        // 0 - Подавляет нулевые значения для 
        //    футов и дюймов
        // 1 - Записывает нулевые значения для 
        //    футов и дюймов
        // 2 - Записывает нулевые значения для 
        //    футов и подавляет нулевые значения 
        //    для дюймов
        // 3 - Записывает нулевые значения для 
        //    дюймов и подавляет нулевые значения
        //    для футов
        // 4 - Подавляет ведущие нули в десятич-
        //    ных размерах (например, 0,5000 
        //    записывается как ,5000)
        // 8 - Подавляет замыкающие нули в деся-
        //    тичных размерах (например, 12,5000
        //    записывается как 12,5)
        // 12 - Подавляет и ведущие, и замыкающие
        //    нули (например, 0,5000 записывается
        //    как ,5)                
        dimStyle.Dimzin = 8;
 
        // Если включено подавление ведущих ну-
        // лей, то становятся доступными для
        // редактирования опции "Sub-units 
        // factor" и "Sub-units suffix".
#if NEWER_THAN_2009
        // TODO: Автору кода не удалось программ-
        // но добраться до этих свойств, т.к.
        // не существует переменных и свойств 
        // размерного стиля с именами "DIMMZF" и
        // "DIMMZS"        
#endif
        // Группа "Angular Dimensions":
 
        // Опции "Units format" (свойство 
        // 'Dimaunit) следует назначать одно из
        // следующих значений:
        // 0 - Decimal degrees
        // 1 - Degrees/minutes/seconds
        // 2 - Gradians
        // 3 - Radians
        dimStyle.Dimaunit = 1; // Units Format
 
        // Опция Precision (свойство 'Dimadec')
        // должно содержать одно из следующих
        // значений:
        // -1 - В угловых размерах отображается 
        //    количество знаков после запятой, 
        //    указанных с помощью переменной 
        //    DIMDEC.
        // 0-8 - Указывает количество знаков 
        //    после запятой, отображаемых в 
        //    угловых размерах (независимо от 
        //    переменной DIMDEC)
        dimStyle.Dimadec = 4; // Precision        
 
        // Подгруппа "Zero Suppression" в составе
        // группы "Angular Dimensions" управляет
        // подавлением нулей для всех угловых 
        // размеров.
        // Свойство 'Dimazin' должно содержать
        // одно из следующих значений:
        // 0 - Отображает все ведущие и замыкаю-
        //    щие нули.
        // 1 - Подавляет ведущие нули в десятич-
        //    ных размерах (например, 0,5000 
        //    записывается как ,5000)
        // 2 - Подавляет замыкающие нули в 
        //    десятичных размерах (например, 
        //    12,5000 записывается как 12,5)
        // 3 - Подавление ведущих и замыкающих 
        //    нулей (например, 0,5000 записывает-
        //    ся как ,5) 
        dimStyle.Dimazin = 2;
 
        // *** Вкладка ALTERNATIVE UNITS ***
 
        // Display Alternate Units
        dimStyle.Dimalt = false;
 
        // Группа "Alternate Units":
 
        // Опция "Unit Format" (свойство 
        // 'Dimaltu') должна содержать одно из 
        // следующих значений:
        // 1 - Scientific
        // 2 - Decimal
        // 3 - Engineering
        // 4 - Architectural Stacked
        // 5 - Fractional Stacked
        // 6 - Architectural
        // 7 - Fractional
        // 8 - Windows Desktop
        dimStyle.Dimaltu = 2; // Unit Format
        dimStyle.Dimaltd = 0; // Precision
        // Multiplier for Alternate Units
        dimStyle.Dimaltf = 25.4;
        // Round Distances To
        dimStyle.Dimaltrnd = 0;
 
        // Prefix (префикс) и Suffix (суффикс)
        // Префикс и суффикс указываются в 
        // составе строкового значения, 
        // присваиваемого свойству Dimapost.
        // Пример: "L = <> m"
        // Где:
        //    "L = " - префикс
        //    <> - вычисленное числовое значение
        //    " m" - суффикс
        dimStyle.Dimapost = "<>";
 
        // Группа "Zero Suppression":
 
        // Свойству 'Dimaltz' property' следует
        // назначать одно из следующих значений:
        // 0 - Подавляет нулевые значения для 
        //    футов и дюймов
        // 1 - Записывает нулевые значения для 
        //    футов и дюймов
        // 2 - Записывает нулевые значения для 
        //    футов и подавляет нулевые значения 
        //    для дюймов
        // 3 - Записывает нулевые значения для 
        //    дюймов и подавляет нулевые значения
        //    для футов
        // 4 - Подавляет ведущие нули в десятич-
        //    ных размерах (например, 0,5000 
        //    записывается как ,5000)
        // 8 - Подавляет замыкающие нули в деся-
        //    тичных размерах (например, 12,5000
        //    записывается как 12,5)
        // 12 - Подавляет и ведущие, и замыкающие
        //    нули (например, 0,5000 записывается
        //    как ,5)               
        dimStyle.Dimaltz = 0; // Zero Suppression
 
        // Если включено подавление ведущих ну-
        // лей, то становятся доступными для
        // редактирования опции "Sub-units 
        // factor" и "Sub-units suffix".
 
#if NEWER_THAN_2009
        // TODO: Автору кода не удалось программ-
        // но добраться до этих свойств, т.к.
        // не существует переменных и свойств 
        // размерного стиля с именами "DIMALTMZF"
        // и "DIMALTMZS".
#endif
        // Группа "Placement":
        const String bpv = @"\X";
        // Переключение опций данной группы 
        // выполняетя при помощи добавления или 
        // удаления суффикса "\X" в значении 
        // свойства Dimpost:
 
        // Если нужно выбрать опцию "Below 
        // primary value":
        // dimStyle.Dimpost = dimStyle.Dimpost
        //  .EndsWith(bpv) ? dimStyle.Dimpost :
        //  dimStyle.Dimpost + bpv;
 
        // Если нужно выбрать опцию "After 
        // primary value":
        dimStyle.Dimpost = !dimStyle.Dimpost
         .EndsWith(bpv) ? dimStyle.Dimpost :
         dimStyle.Dimpost.Substring(0,
         dimStyle.Dimpost.Length - bpv.Length);
 
 
        // *** Вкладка Tolerances ***
 
        // Группа "Tolerance Format":
 
        // Dimtol = true,  Dimlim = true  - 
        //    'Limits', but don't set this 
        //    combinations(!!!), or you will get 
        //    "Style Overrides" for Dimension 
        //    Style name. For getting the 
        //    'Limits' value, look below.
        //
        // Symmetrical:
        //    Dimtol = true
        //    Dimlim = false
        //
        // Limits (рекомендуемый вариант):
        //    Dimtol = false
        //    Dimlim = true
        //
        // None:
        //    Dimtol = false
        //    Dimlim = false
        // 
        // Basic:
        //    dimStyle.Dimgap = -1 * Math.Abs(
        //      dimStyle.Dimgap);
        //
        // Deviation:
        //    Dimtol = true
        //    Dimtm = 1.0e-009
 
        dimStyle.Dimtol = false;
        dimStyle.Dimlim = false;
 
        dimStyle.Dimtdec = 0; // Precision
        dimStyle.Dimtp = 1; // Upper Value
        dimStyle.Dimtm = 0; // Lower Value
 
        // Scaling for Height
        dimStyle.Dimtfac = 0.5;
 
        // Опция "Vertical Position" (свойство 
        // 'Dimtolj') должно принимать одно из
        // следующих значений:
        // 0 - Bottom
        // 1 - Middle
        // 2 - Top
 
        // Vertical Position
        dimStyle.Dimtolj = 1;
 
        // Группа "Tolerance Alignment":
 
        // TODO: Автору кода не удалось изменить
        // состояние переключателей "Align 
        // Decimal Separators" и "Align 
        // Operational Symbols" 
 
        // Подгруппа "Zero Suppression" в группе
        // "Tolerance Format":
 
        // 'Dimtzin' property's allowed values:
        // 0 - Подавляет нулевые значения для 
        //    футов и дюймов
        // 1 - Записывает нулевые значения для 
        //    футов и дюймов
        // 2 - Записывает нулевые значения для 
        //    футов и подавляет нулевые значения 
        //    для дюймов
        // 3 - Записывает нулевые значения для 
        //    дюймов и подавляет нулевые значения
        //    для футов
        // 4 - Подавляет ведущие нули в десятич-
        //    ных размерах (например, 0,5000 
        //    записывается как ,5000)
        // 8 - Подавляет замыкающие нули в деся-
        //    тичных размерах (например, 12,5000
        //    записывается как 12,5)
        // 12 - Подавляет и ведущие, и замыкающие
        //    нули (например, 0,5000 записывается
        //    как ,5)        
        dimStyle.Dimtzin = 8; // Zero Suppression
 
        // Группа "Alternate Unit Tolerance":
 
        dimStyle.Dimalttd = 0; // Precision
 
        // Подгруппа "Zero Suppression" в составе
        // группы "Alternate Unit Tolerance":
 
        // 'Dimalttz' property's allowed values:
        // 0 - Подавляет нулевые значения для 
        //    футов и дюймов
        // 1 - Записывает нулевые значения для 
        //    футов и дюймов
        // 2 - Записывает нулевые значения для 
        //    футов и подавляет нулевые значения 
        //    для дюймов
        // 3 - Записывает нулевые значения для 
        //    дюймов и подавляет нулевые значения
        //    для футов
        //
        // Для подавления ведущих или замыкающих 
        // нулей к выбранному значению может быть
        // добавлено:
        //
        // 4 - Подавление ведущих нулей
        // 8 - Подавление замыкающих нулей.
 
        // Zero Suppression
        dimStyle.Dimalttz = 0;
 
        // ***
        // Сохраняем выполненные изменения                
        dst.Add(dimStyle);
        tr.AddNewlyCreatedDBObject(dimStyle,
          true);
 
        // Устраняем потенциально возможную 
        // проблему появления в перечне размерных
        // стилей дополнительного элемента,
        // именованного как "Style Overrides":        
        db.Dimstyle = dimStyle.ObjectId;
        db.SetDimstyleData(dimStyle);
 
        // Теперь, на базе созданного нами основ-
        // ного размерного стиля, можно создавать
        // его деталлизированные варианты для:
        //    - радиальных размеров
        //    - угловых размеров
        //    - линейных размеров
        //    - и т.д.
 
        // Для дополнительной информации можно
        // почитать раздел документации:
        // ObjectARX Reference Guide > Additional
        // Information > Dimension Styles > 
        // Dimension Style Families.
 
        // Дочерние размерные стили создаются на
        // основе базового. Имена формируются по
        // правилу: ИмяБазовогоСтиля + Суффикс.
        // В качестве суффиксов используется один
        // из следующих вариантов:
        String[] names = new String[] {
                      "$0"//  Линейный 
                      "$2"//  Угловой  
                      "$3"//  Диаметральный
                      "$4"//  Радиальный
                      "$6"//  Ординатный
                      "$7"  //  Выноски
                  };
        foreach(String item in names) {
          Db.DimStyleTableRecord childStyle;
          String childName = dimStyle.Name +
            item;
          if(dst.Has(childName)) {
            childStyle =
              (Db.DimStyleTableRecord)tr
              .GetObject(dst[childName],
              Db.OpenMode.ForWrite);
          }
          else {
            childStyle =
              (Db.DimStyleTableRecord)dimStyle
              .Clone();
            childStyle.Name = childName;
            dst.Add(childStyle);
            tr.AddNewlyCreatedDBObject(
              childStyle, true);
          }
        }
        // Далее можно выполнять настройку
        // унаследованных размерных стилей,
        // выполняя тем самым необходимую
        // деталлизацию для конкретных типов 
        // размеров. 
        // Редактирование выполняется точно так
        // же, как мы это проделали выше с базо-
        // вым стилем, поэтому в нашем примере
        // не будем повторяться и на этом 
        // завершим работу.
 
        tr.Commit();
      }
    }
 
    static Db.ObjectId GetArrowObjectId_dim(
      string arrow, string newArrName) {
      Db.ObjectId arrObjId = Db.ObjectId.Null;
      Ap.Document doc = cad.DocumentManager
        .MdiActiveDocument;
      Db.Database db = doc.Database;
 
      string oldArrName = cad.GetSystemVariable(
        arrow) as string;
 
      // (эта операция может создать в чертеже
      // новое определение блока)
      cad.SetSystemVariable(arrow, newArrName);
 
      // Восстанавливаем предыдущее значение
      if(oldArrName.Length != 0)
        cad.SetSystemVariable(arrow, oldArrName);
 
      // Получаем идентификатор блока
      Db.Transaction tr = db.TransactionManager
        .StartTransaction();
      using(tr) {
        Db.BlockTable bt = (Db.BlockTable)tr
          .GetObject(db.BlockTableId, Db.OpenMode
          .ForRead);
        arrObjId = bt[newArrName];
        tr.Commit();
      }
      return arrObjId;
    }
  }
}





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