Есть стиль таблицы, там есть TableTemplate. Из него получаю объект таблицы с помощью template.CreateTable, после чего заполняю, передаю в EntityJig, там получаю точку вставки, и в транзакции вставляю в текущую BTR.
Далее обнаруживается интересное поведение вставленной таблицы. Я записал всё на видео, ниже пояснения:
1. Править содержимое не представляется возможным (на приложенном видео видно, что при первом выделении ячейка, да и таблица выделяются не как обычно). Лучше посмотреть, чем расписывать.
2. Привязаться можно только к "точке вставки" вставки блока таблицы. Привязка к примитивам таблицы не работает.
3. ArxDbg показывает, что у таблицы BlockName - kNull!!
Двигаем таблицу, и вуаля, всё работает как надо!
Ссылка на видеоНиже привожу код, мало ли, чего сделал не так.
private Table CreateTableFromTemplate(string styleName)
{
if (string.IsNullOrWhiteSpace(styleName))
throw new ArgumentNullException("StyleName");
Table t = null;
using (Transaction tr = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
{
DBDictionary tsdict = (DBDictionary)tr.GetObject(HostApplicationServices.WorkingDatabase.TableStyleDictionaryId, OpenMode.ForRead);
if (!tsdict.Contains(styleName))
throw new WrongDataException("В файле отсутствует требуемый стиль таблиц: " + styleName);
TableStyle ts = (TableStyle)tr.GetObject(tsdict.GetAt(styleName), OpenMode.ForRead);
if (ts.Template == ObjectId.Null)
throw new WrongDataException("В табличном стиле " + styleName + " отсутствует шаблон");
TableTemplate template = (TableTemplate)tr.GetObject(ts.Template, OpenMode.ForRead);
t = template.CreateTable(TableCopyOptions.None);
for (int i = 0; i < t.Rows.Count-1; i++)
{
if (t.Rows[i].Style == "_DATA")
t.DeleteRows(i--,1);
}
t.GenerateLayout();
tr.Commit();
}
return t;
}
Потом я её заполняю, а потом вставляю Jig'ом
public class TableJigger : EntityJig
{
private double tolerance = 0.0001;
private Point3d insertPoint;
public TableJigger(Entity entity)
: base(entity)
{ }
protected override bool Update()
{
(this.Entity as Table).Position = this.insertPoint;
(this.Entity as Table).GenerateLayout();
return true;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
JigPromptPointOptions ppo = new JigPromptPointOptions("Укажите точку вставки таблицы");
ppo.UserInputControls = UserInputControls.GovernedByUCSDetect;
PromptPointResult res = prompts.AcquirePoint(ppo);
if (res.Status == PromptStatus.Cancel)
return SamplerStatus.Cancel;
if (res.Value.IsEqualTo(insertPoint, new Tolerance(tolerance, tolerance)))
return SamplerStatus.NoChange;
insertPoint = res.Value;
return SamplerStatus.OK;
}
public static PromptResult Jig(Table table)
{
PromptResult result = null;
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
TableJigger jigger = new TableJigger(table);
result = ed.Drag(jigger);
if (result.Status == PromptStatus.OK)
{
BlockTableRecord currSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
currSpace.AppendEntity(table);
tr.AddNewlyCreatedDBObject(table, true);
db.TransactionManager.QueueForGraphicsFlush();
}
tr.Commit();
}
return result;
}
}
И да! Содержимое таблицы при таком Jig'е почему-то не отображается. Что я тут делаю неправильно?