/// <summary>
/// Вставка листа из шаблона в активный документ
/// Ни в коем случае нельзя вызывать, если открыта хоть одна транзакция!!
/// </summary>
/// <param name="temlate"> база данных шаблона. dwg должен быть уже прочитан </param>
/// <param name="sourceLayoutName"> копируемый лист. должен быть в шаблоне </param>
/// <param name="newLayoutName"> новое имя листа. оставьте пустым чтоб генерировать автоматом </param>
internal static ObjectId NewLayout(Database template, string sourceLayoutName, string newLayoutName = "")
{
ObjectId newID = new ObjectId();
Document doc = AcadApp.DocumentManager.MdiActiveDocument;
if (doc is null) return ObjectId.Null;
Database curDb = doc.Database;
using (Transaction templateTrans = template.TransactionManager.StartTransaction())
{
DBDictionary templateDict = (DBDictionary)templateTrans.GetObject(template.LayoutDictionaryId, OpenMode.ForRead);
if (!templateDict.Contains(sourceLayoutName))
return ObjectId.Null;
Layout templateLayout = (Layout)templateTrans.GetObject(templateDict.GetAt(sourceLayoutName), OpenMode.ForRead);
using (Transaction curTrans = curDb.TransactionManager.StartTransaction())
{
DBDictionary curLayoutDict = (DBDictionary)curTrans.GetObject(curDb.LayoutDictionaryId, OpenMode.ForRead);
if (newLayoutName == "") //сгенерим новое имя
{
if (!curLayoutDict.Contains(sourceLayoutName)) newLayoutName = sourceLayoutName;
else newLayoutName = NewName(sourceLayoutName, curLayoutDict);
}
curTrans.Commit();
} // закрываем curTrans временно для вызова CreateLayout
using (doc.LockDocument())
{
newID = LayoutManager.Current.CreateLayout(newLayoutName); // надо вызывать c блокировкой документа, но вне транзакции!
using Transaction curTrans = curDb.TransactionManager.StartTransaction();
DBDictionary curLayoutDict = (DBDictionary)curTrans.GetObject(curDb.LayoutDictionaryId, OpenMode.ForRead);
Layout newLayout = (Layout)curTrans.GetObject(newID, OpenMode.ForWrite);
// Клонируем св-ва layout
newLayout.CopyFrom(templateLayout);
// Клонируем все объекты с layout
BlockTableRecord btr = templateTrans.GetObject(templateLayout.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
ObjectIdCollection objs = new ObjectIdCollection();
foreach (ObjectId ID in btr)
objs.Add(ID);
template.WblockCloneObjects(objs, newLayout.BlockTableRecordId, new IdMapping(), DuplicateRecordCloning.Ignore, false);
curTrans.Commit();
templateTrans.Commit();
}
}
return newID;
}