Как добавить к Размеру Метку и/или Процент контроля (DIMINSPECT)?
Как добавить к Размеру Метку и/или Процент контроля (DIMINSPECT)?
Вопрос:
Необходимо к размеру в чертеже добавить Метку контроля средствами .NET API. Я прочитал статью Киана Уомсли : http://through-the-interface.typepad.com/through_the_interface/2008/09/more-quiet-comm.html В ней используется командный метод, но он не позволяет присвоить только Метку контроля без Процента контроля.
Ответ:
Есть несколько методов:
1) Сделать всё средствами ObjectARX. Класс AcDbDimension имеет для этого все средства:
- enum DimInspect {
- kShapeRemove = 0, // Not displayed - не показывать
- kShapeRound = 1, // Rounded end (default) - круглая рамка
- kShapeAngular = 2, // Angular end - угловая рамка
- kShapeNone = 4, // No bounding shape - без рамки
- kShapeLabel = 0x10, // Label separator and alpha field displayed - показывать отдельно метку
- kShapeRate = 0x20, // Shape separator and alpha field displayed - показывать отдельно проценты
- };
- bool inspection() const; // Включено Inspect?
- Acad::ErrorStatus setInspection(bool val); // Включить/выключить Inspect
- int inspectionFrame() const; // Вид рамки
- Acad::ErrorStatus setInspectionFrame(int frame); // Установить вид рамки
- const ACHAR* inspectionLabel() const; // Метка
- Acad::ErrorStatus setInspectionLabel(const ACHAR* label); // Установить метку
- const ACHAR* inspectionRate() const; // Процент
- Acad::ErrorStatus setInspectionRate(const ACHAR* label); // Установить процент
2) Использовать средства ObjectARX в AutoCAD .NET API при помощи P/Invoke:
Например, для вызова метода AcDbDimension::setInspection можно записать:
- // Для AutoCAD 2013 и 2014 - "acdb19.dll", для AutoCAD 2015 - "acdb20.dll"
- [DllImport("acdb20.dll", CallingConvention = CallingConvention.ThisCall,
- CharSet = CharSet.Unicode,
- EntryPoint = "?setInspection@AcDbDimension@@QEAA?AW4ErrorStatus@Acad@@_N@Z")]
- private static extern int setInspection64(IntPtr ths, bool bInspection);
И если dim - экземпляр класса Dimension, то
включит для этого размера Inspection. Как видите описание этой функции зависит от версии и разрядности (32/64) AutoCAD, что делает использование данного метода достаточно громоздким.
3) Воспользоваться тем, что метка и размер контроля управляются расширенными данными размера. Это наглядно видно здесь:
В результате код будет выглядеть так:
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- using AcRx = Autodesk.AutoCAD.Runtime;
- using AcAp = Autodesk.AutoCAD.ApplicationServices;
- using AcDb = Autodesk.AutoCAD.DatabaseServices;
- using AcGe = Autodesk.AutoCAD.Geometry;
- using AcEd = Autodesk.AutoCAD.EditorInput;
- [assembly: CommandClass(typeof(DimInspect.Utils))]
- namespace DimInspect
- {
- public class Utils
- {
- enum DimInspect
- {
- ShapeRemove = 0, // Не показывать
- ShapeRound = 1, // Закругленная рамка
- ShapeAngular = 2, // Угловая рамка
- ShapeNone = 4, // Без рамки
- ShapeLabel = 0x10, // Есть метка контроля
- ShapeRate = 0x20, // Есть процент контроля
- };
- [CommandMethod("AddInspect", CommandFlags.Modal)]
- public void AddInspect()
- {
- AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- AcEd.Editor ed = doc.Editor;
- AcDb.Database db = doc.Database;
- // Сначала убедимся, что есть имя приложения ACAD_DSTYLE_DIMINSPECT
- // Если его нет, то его нужно создать и добавить в Таблицу приложений
- using (AcDb.RegAppTable regTab = db.RegAppTableId.Open(AcDb.OpenMode.ForRead) as AcDb.RegAppTable)
- {
- if (!regTab.Has("ACAD_DSTYLE_DIMINSPECT"))
- {
- using (AcDb.RegAppTableRecord regInsp = new AcDb.RegAppTableRecord())
- {
- regInsp.Name = "ACAD_DSTYLE_DIMINSPECT";
- regTab.UpgradeOpen();
- regTab.Add(regInsp);
- }
- }
- }
- while (true)
- {
- // Запрашиваем имя примитива размера
- AcEd.PromptEntityOptions prEnt =
- new AcEd.PromptEntityOptions("\nУкажите размер (ENTER - завершение): ");
- prEnt.SetRejectMessage("\nЭто не размер!");
- prEnt.AddAllowedClass(typeof(AcDb.Dimension), false);
- prEnt.AllowNone = true;
- AcEd.PromptEntityResult resEnt = ed.GetEntity(prEnt);
- if (resEnt.Status != AcEd.PromptStatus.OK)
- break;
- // Запрашиваем Метку контроля
- AcEd.PromptStringOptions prStr =
- new AcEd.PromptStringOptions("\nУкажите метку контроля: ");
- AcEd.PromptResult resStr = ed.GetString(prStr);
- if (resStr.Status != AcEd.PromptStatus.OK)
- break;
- // Запрашиваем Процент контроля
- AcEd.PromptIntegerOptions prCtl =
- new AcEd.PromptIntegerOptions("\nУкажите процент контроля (-1 - без процента контроля) <-1>: ");
- prCtl.DefaultValue = -1;
- prCtl.AllowNone = true;
- AcEd.PromptIntegerResult resCtl = ed.GetInteger(prCtl);
- if (resCtl.Status != AcEd.PromptStatus.OK && resCtl.Status != AcEd.PromptStatus.None)
- break;
- string prcCtl = (resCtl.Value == -1) ? "" : (Math.Abs(resCtl.Value) % 100).ToString() + "%";
- // Теперь разберёмся с Размером
- using (AcDb.Dimension dim = resEnt.ObjectId.Open(AcDb.OpenMode.ForWrite) as AcDb.Dimension)
- {
- AcDb.ResultBuffer xdataInspect = new AcDb.ResultBuffer(
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataRegAppName, "ACAD_DSTYLE_DIMINSPECT"),
- // Общий флаг DIMINSPECT
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 393),
- // 0 - нет Inspect, 1 - есть Inspect
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 1),
- // Это общие флаги DIMINSPECT
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 394),
- // Это флаги - сумма значений:
- // 0 - Не показывать
- // 1 - Круглая рамка
- // 2 - Угловая рамка
- // 4 - Без рамки
- // 16 - Метка контроля есть
- // 32 - Процент контроля есть
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16,
- (int) DimInspect.ShapeRound + // Всегда овальная рамка
- (int) (resStr.StringResult.Length == 0 ? DimInspect.ShapeNone : DimInspect.ShapeLabel) + // Флаг метки контроля
- (int) (prcCtl.Length == 0 ? DimInspect.ShapeNone : DimInspect.ShapeRate) // Флаг процента контроля
- ),
- // Это Метка контроля
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 395),
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataAsciiString, resStr.StringResult),
- // Это Процент контроля
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16, 396),
- new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataAsciiString, prcCtl)
- );
- dim.XData = xdataInspect;
- }
- }
- }
- }
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=1082
Опубликовано 17.11.2014Отредактировано 17.11.2014 в 11:11:21