/// <summary>
/// Запуск копирования объектов из внешней ссылки.
/// </summary>
public void Execute()
{
var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
_db = doc.Database;
var layers = new List<string>();
var isSucsess = true;
_formProgress = new FormProgressBar(null) { Text = @"Копирование объектов" };
System.Windows.Forms.Application.DoEvents();
Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(_formProgress);
System.Windows.Forms.Application.DoEvents();
using (_trans = _db.TransactionManager.StartTransaction())
using (var bt = (BlockTable)_trans.GetObject(_db.BlockTableId, OpenMode.ForWrite))
using (_btr = (BlockTableRecord)_trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite))
{
// Получаем наименование всех слоев.
var layerTable = (LayerTable)_trans.GetObject(doc.Database.LayerTableId, OpenMode.ForWrite);
foreach (var layerObjId in layerTable)
{
using (var layer = (LayerTableRecord)_trans.GetObject(layerObjId, OpenMode.ForRead))
{
if (!layer.IsFrozen && !layer.IsOff)
{
layers.Add(layer.Name);
}
}
}
// Вытягиваем внешние ссылки.
var acadReferenceTree = Tap.CADGIS.AutoCAD.Utils.AcadReferenceTree.Create(doc);
acadReferenceTree.Build();
var nodes = acadReferenceTree.Nodes.Where(n => n.Type == AcadReferenceType.DRAWING && n.Database != null).ToList();
if (nodes.Count == 0)
{
MessageBox.Show("Документ не содержит внешних ссылок", "Внимание", MessageBoxButton.OK, MessageBoxImage.Warning);
_formProgress.Dispose();
return;
}
layers.AddRange(nodes.Select(p => p.Name + "|0"));
foreach (var objId in _btr)
{
using (var ent = (Entity)_trans.GetObject(objId, OpenMode.ForWrite))
{
// Проверка элемента по игнор-листу
if (ent.IsErased || ent is ProxyEntity || !ent.Visible || ent.GetType().ToString().Contains("Site"))
continue;
try
{
// Если объект блок референс
var bref = ent as BlockReference;
if (bref != null)
{
// является ли объект внешней ссылкой
var isExternalRef = nodes.Any(p => p.Name.Equals(bref.Name));
if (isExternalRef && !layers.Contains(bref.Layer))
continue;
// Получаем объекты из внешних ссылок
var bferEntities = Tap.CADGIS.AutoCAD.Instruments.AcadEntityInstruments.GetEntityFromBlockReference(bref, layers);
// Добавляем объекты в базу
AddEntitiesToBTR(bferEntities, isExternalRef, layers);
// Скрываем внеш. ссылку.
bref.Visible = false;
//bref.Erase(true);
}
}
catch
{
isSucsess = false;
}
}
}
_formProgress.SetMessage(100, string.Empty);
if (!isSucsess)
MessageBox.Show("Копирование объектов произошло с ошибкой", "Копирование", MessageBoxButton.OK, MessageBoxImage.Error);
else
{
doc.Editor.Regen();
_trans.Commit();
MessageBox.Show("Объекты успешно скопированы", "Копирование", MessageBoxButton.OK, MessageBoxImage.Information);
}
if (_formProgress != null && !_formProgress.IsDisposed)
{
_formProgress.Dispose();
}
}
}
/// <summary>
/// Добавление объектов в бд чертежа.
/// </summary>
/// <param name="bferEntities"></param>
/// <param name="isExternalRef"></param>
/// <param name="layers"></param>
private void AddEntitiesToBTR(List<Entity> bferEntities, bool isExternalRef, List<string> layers)
{
var oldPercent = 0;
var i = 0;
foreach (var brefEntity in bferEntities)
{
if (brefEntity.Database == null)
brefEntity.SetDatabaseDefaults(_db);
if (brefEntity is MLeader && brefEntity.Database == null)
continue;
if (isExternalRef && !layers.Contains(brefEntity.Layer))
continue;
if (!layers.Contains(brefEntity.Layer))
continue;
// обновляем прогресс бар
if (++i * 100 / bferEntities.Count != oldPercent)
{
oldPercent = ++i * 100 / bferEntities.Count;
_formProgress.SetMessage(oldPercent, string.Empty);
}
_btr.AppendEntity(brefEntity);
_trans.AddNewlyCreatedDBObject(brefEntity, true);
}
}