ADN Open CIS
Сообщество программистов Autodesk в СНГ

17/11/2014

Как добавить к Размеру Метку и/или Процент контроля (DIMINSPECT)?

Как добавить к Размеру Метку и/или Процент контроля (DIMINSPECT)?

Вопрос:

Необходимо к размеру в чертеже добавить Метку контроля средствами .NET API. Я прочитал статью Киана Уомсли : http://through-the-interface.typepad.com/through_the_interface/2008/09/more-quiet-comm.html В ней используется командный метод, но он не позволяет присвоить только Метку контроля без Процента контроля.

Ответ:

Есть несколько методов:

1) Сделать всё средствами ObjectARX. Класс AcDbDimension имеет для этого все средства:

Код - C++: [Выделить]
  1. enum DimInspect {
  2.   kShapeRemove  = 0,     // Not displayed - не показывать
  3.   kShapeRound   = 1,     // Rounded end (default) - круглая рамка
  4.   kShapeAngular = 2,     // Angular end - угловая рамка
  5.   kShapeNone    = 4,     // No bounding shape - без рамки
  6.   kShapeLabel   = 0x10// Label separator and alpha field displayed - показывать отдельно метку
  7.   kShapeRate    = 0x20// Shape separator and alpha field displayed - показывать отдельно проценты
  8. };
  9. bool inspection() const; // Включено Inspect?
  10. Acad::ErrorStatus setInspection(bool val); // Включить/выключить Inspect
  11.  
  12. int inspectionFrame() const; // Вид рамки
  13. Acad::ErrorStatus setInspectionFrame(int frame); // Установить вид рамки
  14.  
  15. const ACHAR* inspectionLabel() const; // Метка
  16. Acad::ErrorStatus setInspectionLabel(const ACHAR* label); // Установить метку
  17.  
  18. const ACHAR* inspectionRate() const; // Процент
  19. Acad::ErrorStatus setInspectionRate(const ACHAR* label); // Установить процент

2) Использовать средства ObjectARX в AutoCAD .NET API при помощи P/Invoke:

Например, для вызова метода AcDbDimension::setInspection можно записать:

Код - C#: [Выделить]
  1. // Для AutoCAD 2013 и 2014 - "acdb19.dll", для AutoCAD 2015 - "acdb20.dll"
  2. [DllImport("acdb20.dll", CallingConvention = CallingConvention.ThisCall,
  3. CharSet = CharSet.Unicode,
  4. EntryPoint = "?setInspection@AcDbDimension@@QEAA?AW4ErrorStatus@Acad@@_N@Z")]
  5. private static extern int setInspection64(IntPtr ths, bool bInspection);

И если dim - экземпляр класса Dimension, то

setInspection64(dim.UnmanagedObject, true);

включит для этого размера Inspection. Как видите описание этой функции зависит от версии и разрядности (32/64) AutoCAD, что делает использование данного метода достаточно громоздким.

3) Воспользоваться тем, что метка и размер контроля управляются расширенными данными размера. Это наглядно видно здесь:

В результате код будет выглядеть так:

Код - C#: [Выделить]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using AcRx = Autodesk.AutoCAD.Runtime;
  8. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  9. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  10. using AcGe = Autodesk.AutoCAD.Geometry;
  11. using AcEd = Autodesk.AutoCAD.EditorInput;
  12.  
  13. [assembly: CommandClass(typeof(DimInspect.Utils))]
  14.  
  15. namespace DimInspect
  16. {
  17.   public class Utils
  18.   {
  19.     enum DimInspect
  20.     {
  21.       ShapeRemove  = 0,     // Не показывать
  22.       ShapeRound   = 1,     // Закругленная рамка
  23.       ShapeAngular = 2,     // Угловая рамка
  24.       ShapeNone    = 4,     // Без рамки
  25.       ShapeLabel   = 0x10,  // Есть метка контроля
  26.       ShapeRate    = 0x20,  // Есть процент контроля
  27.     };
  28.     [CommandMethod("AddInspect", CommandFlags.Modal)]
  29.     public void AddInspect()
  30.     {
  31.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  32.       if (doc == null) return;
  33.       AcEd.Editor ed = doc.Editor;
  34.       AcDb.Database db = doc.Database;
  35.       // Сначала убедимся, что есть имя приложения ACAD_DSTYLE_DIMINSPECT
  36.       // Если его нет, то его нужно создать и добавить в Таблицу приложений
  37.       using (AcDb.RegAppTable regTab = db.RegAppTableId.Open(AcDb.OpenMode.ForRead) as AcDb.RegAppTable)
  38.       {
  39.         if (!regTab.Has("ACAD_DSTYLE_DIMINSPECT"))
  40.         {
  41.           using (AcDb.RegAppTableRecord regInsp = new AcDb.RegAppTableRecord())
  42.           {
  43.             regInsp.Name = "ACAD_DSTYLE_DIMINSPECT";
  44.             regTab.UpgradeOpen();
  45.             regTab.Add(regInsp);
  46.           }
  47.         }
  48.       }
  49.       while (true)
  50.       {
  51.         // Запрашиваем имя примитива размера
  52.         AcEd.PromptEntityOptions prEnt =
  53.           new AcEd.PromptEntityOptions("\nУкажите размер (ENTER - завершение): ");
  54.         prEnt.SetRejectMessage("\nЭто не размер!");
  55.         prEnt.AddAllowedClass(typeof(AcDb.Dimension), false);
  56.         prEnt.AllowNone = true;
  57.         AcEd.PromptEntityResult resEnt = ed.GetEntity(prEnt);
  58.         if (resEnt.Status != AcEd.PromptStatus.OK)
  59.           break;
  60.         // Запрашиваем Метку контроля
  61.         AcEd.PromptStringOptions prStr =
  62.           new AcEd.PromptStringOptions("\nУкажите метку контроля: ");
  63.         AcEd.PromptResult resStr = ed.GetString(prStr);
  64.         if (resStr.Status != AcEd.PromptStatus.OK)
  65.           break;
  66.         // Запрашиваем Процент контроля
  67.         AcEd.PromptIntegerOptions prCtl =
  68.           new AcEd.PromptIntegerOptions("\nУкажите процент контроля (-1 - без процента контроля) <-1>: ");
  69.         prCtl.DefaultValue = -1;
  70.         prCtl.AllowNone = true;
  71.         AcEd.PromptIntegerResult resCtl = ed.GetInteger(prCtl);
  72.         if (resCtl.Status != AcEd.PromptStatus.OK && resCtl.Status != AcEd.PromptStatus.None)
  73.           break;
  74.         string prcCtl = (resCtl.Value == -1) ? "" : (Math.Abs(resCtl.Value) % 100).ToString() + "%";
  75.         // Теперь разберёмся с Размером
  76.         using (AcDb.Dimension dim = resEnt.ObjectId.Open(AcDb.OpenMode.ForWrite) as AcDb.Dimension)
  77.         {
  78.           AcDb.ResultBuffer xdataInspect = new AcDb.ResultBuffer(
  79.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataRegAppName, "ACAD_DSTYLE_DIMINSPECT"),
  80.             // Общий флаг DIMINSPECT
  81.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 393),
  82.             // 0 - нет Inspect, 1 - есть Inspect
  83.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 1),
  84.             // Это общие флаги DIMINSPECT
  85.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 394),
  86.             // Это флаги - сумма значений:
  87.             //  0 - Не показывать
  88.             //  1 - Круглая рамка
  89.             //  2 - Угловая рамка
  90.             //  4 - Без рамки
  91.             // 16 - Метка контроля есть
  92.             // 32 - Процент контроля есть
  93.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16,
  94.               (int)  DimInspect.ShapeRound + // Всегда овальная рамка
  95.               (int) (resStr.StringResult.Length == 0 ? DimInspect.ShapeNone : DimInspect.ShapeLabel) + // Флаг метки контроля
  96.               (int) (prcCtl.Length == 0 ? DimInspect.ShapeNone : DimInspect.ShapeRate) // Флаг процента контроля
  97.           
  98.             ),
  99.             // Это Метка контроля
  100.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 395),
  101.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataAsciiString, resStr.StringResult),
  102.             // Это Процент контроля
  103.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 396),
  104.             new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataAsciiString, prcCtl)
  105.           );
  106.           dim.XData = xdataInspect;
  107.         }
  108.       }
  109.     }
  110.   }
  111. }

Автор: Александр Ривилис
Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=1082

Опубликовано 17.11.2014
Отредактировано 17.11.2014 в 11:11:21