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
{
[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),
// Это флаги - нужно расшифровывать:
// 1 - Круглая рамка
// 2 - Угловая рамка
// 4 - Без рамки
// 16 - Метка контроля есть
// 32 - Процент контроля есть
new AcDb.TypedValue((int)AcDb.DxfCode.ExtendedDataInteger16,
1 + // Всегда овальная рамка
(resStr.StringResult.Length == 0 ? 0 : 16) + // Флаг метки контроля
(prcCtl.Length == 0 ? 0 : 32) // Флаг процента контроля
),
// Это Метка контроля
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;
}
}
}
}
}