//Команды, определённые в данном коде:
//Specification - создание спецификации путем извлечения информации из блоков.
using Autodesk.AutoCAD.Colors;
using AppServCore = Autodesk.AutoCAD.ApplicationServices.Core;
using AppServ = Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;
[assembly: CommandClass(typeof(Evth.CAD.Samples.Styles.CreateTable))]
namespace Evth.CAD.Samples.Styles
{
public class CreateTable
{
// Наименование группы команд
private const string Group = "Samples";
private const string TextStyleName = "Текст таблиц";
private const string TableStyleName1 = "Базовый";
private const string TableStyleName2 = "Спецификация";
[CommandMethod(Group, "Specification", CommandFlags.Modal)]
public void Specification()
{
var list1 = new List<string>();
var list2 = new List<string>();
var list3 = new List<string>();
var doc = AppServCore.Application.DocumentManager.MdiActiveDocument;
if (doc == null)
return;
var db = doc.Database;
var ed = doc.Editor;
using (doc.LockDocument())
{
var activeDocument = default(AcadDocument);
activeDocument = (AcadDocument)
AppServ.DocumentExtension.GetAcadDocument(AppServCore.Application.DocumentManager.MdiActiveDocument);
using (var tr = db.TransactionManager.StartTransaction())
{
***************************
//Пропускаю момент формирования списков list1..3 (это происходит путем выделения блоков и считывания нужной инфы
***************************
var tst = tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
var textStyleId = ObjectId.Null;
if (tst.Has(TextStyleName))
{
textStyleId = tst[TextStyleName];
}
else
{
var textStyle = new TextStyleTableRecord();
textStyle.Name = TextStyleName;
// ttf или, к примеру, shx файл.
textStyle.FileName = "Isocpeur.shx";
textStyle.XScale = 0.95;
tst.Add(textStyle);
tr.AddNewlyCreatedDBObject(textStyle, true);
textStyleId = textStyle.ObjectId;
}
var tableStylesDictionary = tr.GetObject(db.TableStyleDictionaryId, OpenMode.ForWrite) as DBDictionary;
TableStyle tableStyle;
var tableStyleId = ObjectId.Null;
if (tableStylesDictionary.Contains(TableStyleName1))
{
return;
}
else
{
tableStyle = new TableStyle();
tableStyleId = tableStylesDictionary.SetAt(TableStyleName1, tableStyle);
tr.AddNewlyCreatedDBObject(tableStyle, true);
}
// Некоторые операции будут выполняться через COM, т.к. некоторые настройки
// Бушману удалось выполнить только через COM.
var customTableStyle = (IAcadTableStyle)tableStyle.AcadObject;
customTableStyle.FlowDirection = AcTableDirection.acTableTopToBottom;
// Шаг 1: Сначала создаём таблицу, которая должна применяться в качестве шаблона.
var table = new Table();
table.SetDatabaseDefaults();
table.TableStyle = tableStyleId;
table.Position = new Point3d(0, 0, 0);
const int columnsCount = 6;
int rowsCount = list1.Count + 4;
table.SetSize(rowsCount, columnsCount);
table.Height = 15;
table.Width = 20;
table.ColorIndex = 5;
// Заполняем таблицу...
String[,] str = new String[rowsCount, columnsCount];
for (int i = 0; i < rowsCount; i++)
{
for (int j = 0; j < columnsCount; j++)
{
str[i, j] = String.Empty;
}
}
str[0, 0] = "Спецификация";
str[1, 0] = "Поз.";
str[1, 1] = "Обозначение";
str[1, 2] = "Наименование";
str[1, 3] = "Кол.";
str[1, 4] = "Масса ед.,кг";
str[1, 5] = "Приме- чание";
for (int i = 0; i < rowsCount; i++)
{
for (int j = 0; j < columnsCount; j++)
{
table.Cells[i, j].SetValue(str[i, j], ParseOption.ParseOptionNone);
}
table.Rows[i].Height = 8;
}
table.Rows[1].Height = 15;
table.Columns[0].Width = 15;
table.Columns[1].Width = 60;
table.Columns[2].Width = 65;
table.Columns[3].Width = 10;
table.Columns[4].Width = 15;
table.Columns[5].Width = 20;
for (int i = 0; i < list1.Count; i++)
{
table.Cells[i + 2, 0].SetValue(list1[i] +
Convert.ToString(Math.Round(Convert.ToDouble(list3[i]) / 100, 0, MidpointRounding.AwayFromZero)),
ParseOption.ParseOptionNone);
}
for (int i = 0; i < list1.Count; i++)
{
table.Cells[i + 2, 2].SetValue(" " + list1[i] + " СТБ 1704-2012" + " L=" + list3[i],
ParseOption.ParseOptionNone);
}
for (int i = 0; i < list1.Count; i++)
{
table.Cells[i + 2, 4].SetValue(Convert.ToString(Math.Round(Math.Pow(Convert.ToDouble(list1[i]), 2) *
Math.PI / 4 * Convert.ToDouble(list3[i]) * 7850 / Math.Pow(10, 9), 2, MidpointRounding.AwayFromZero)),
ParseOption.ParseOptionNone);
}
for (Int32 i = 0; i < columnsCount; i++)
{
table.Columns[i].Alignment = CellAlignment.MiddleCenter;
}
for (Int32 i = 0; i < 2; i++)
{
table.Rows[i].Alignment = CellAlignment.MiddleCenter;
if (i == 0)
table.Rows[i].Style = "_TITLE";
else
table.Rows[i].Style = "_HEADER";
}
for (int i = 2; i < rowsCount; i++)
{
table.Cells[i, 2].Alignment = CellAlignment.MiddleLeft;
}
table.GenerateLayout();
// Шаг 2: Назначаем созданную нами выше таблицу, шаблоном для табличного стиля
var tableStyle2 = new TableStyle();
tableStyle2.CopyFrom(tableStyle);
var tableStyle2Id = tableStylesDictionary.SetAt(TableStyleName2, tableStyle2);
tr.AddNewlyCreatedDBObject(tableStyle2, true);
var template =new TableTemplate(table, TableCopyOptions.TableCopyColumnWidth |
TableCopyOptions.TableCopyRowHeight |TableCopyOptions.ConvertFormatToOverrides);
db.AddDBObject(template);
tr.AddNewlyCreatedDBObject(template, true);
#if NEWER_THAN_AUTOCAD_2014
tableStyle2.Template = template.ObjectId;
#elif NEWER_THAN_AUTOCAD_2009
IAcadTableStyle customTableStyle2 = (IAcadTableStyle)tableStyle2.AcadObject;
customTableStyle.TemplateId =((IAcadObject)template.AcadObject).ObjectID;
#else
Com.IAcadTableStyle2 customTableStyle2 = (Com.IAcadTableStyle2)tableStyle2.AcadObject;
customTableStyle2.TemplateId = ((Com.IAcadObject)template.AcadObject).ObjectID;
#endif
//Выполняем настройки таблиуцы (вызываем приватный метод)
InitializeEmbededCellStyles(tableStyle2, textStyleId);
var dict = tr.GetObject(db.TableStyleDictionaryId, OpenMode.ForRead) as DBDictionary;
var ts = tr.GetObject(dict.GetAt(TableStyleName2),
OpenMode.ForRead) as TableStyle;
var template2 = tr.GetObject(ts.Template, OpenMode.ForRead) as
TableTemplate;
var tableInstance = new Table();
tableInstance.CopyFrom(template2, TableCopyOptions.FillTarget);
tableInstance.GenerateLayout();
PromptPointResult pr = ed.GetPoint("\nУкажите точку вставки таблицы: ");
if (pr.Status == PromptStatus.OK)
{
tableInstance.Position = pr.Value;
}
var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
var modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
modelSpace.AppendEntity(tableInstance);
tr.AddNewlyCreatedDBObject(tableInstance, true);
*****************************************************
// Вот здесь хочу удалить стиль "Базовый", но никак не выходит
*****************************************************
tr.Commit();
}
}
}