public void CountBlc()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
if (doc == null) return;
Editor ed = doc.Editor;
Stopwatch s = new Stopwatch();
int cnt = 0;
PromptKeywordOptions pko = new PromptKeywordOptions(
"\nСпособ выбора блоков? ");
pko.AllowNone = false;
pko.Keywords.Add("Enum");
pko.Keywords.Add("enumRX");
pko.Keywords.Add("Selset");
pko.Keywords.Default = "Selset";
PromptResult pr = ed.GetKeywords(pko);
if (pr.StringResult == "Selset")
{
s.Start();
LayoutManager layoutMgr = LayoutManager.Current;
TypedValue[] filterlist = new TypedValue[2];//фильтр
filterlist[0] = new TypedValue(0, "INSERT");//только блоки
filterlist[1] = new TypedValue(410, layoutMgr.CurrentLayout);//только в текущем пространстве
SelectionFilter filter = new SelectionFilter(filterlist);
PromptSelectionResult psr = ed.SelectAll(filter);
if (psr.Status == PromptStatus.OK)
{
s.Stop();
ed.WriteMessage("\nSelSet получен блоков {0} за {1}\n",
psr.Value.Count,
s.Elapsed
);
s.Start();
SelectionSet set = psr.Value;
using (Transaction tr = db.TransactionManager.StartTransaction())//открываем транзакцию
{
foreach (ObjectId brId in set.GetObjectIds())//перебираем полученные ID блоков
{
BlockReference br = tr.GetObject(brId, OpenMode.ForRead) as BlockReference;//получаем вставку блока
if (br != null)
{
BlockTableRecord btr = tr.GetObject(
br.BlockTableRecord,
OpenMode.ForRead) as BlockTableRecord;//по вставке получаем описание блока
if (!btr.IsFromExternalReference
&& !btr.IsDependent
)//если не внешняя сылка и не зависимый блок, считаем
{
cnt++;
}
}
}
s.Stop();
ed.WriteMessage(
"\nSelSet Before Commit {0}\n",
s.Elapsed
);
s.Start();
tr.Commit();
s.Stop();
ed.WriteMessage(
"\nSelSet After Commit {0}\n",
s.Elapsed
);
s.Start();
}
}
s.Stop();
ed.WriteMessage("\nSelSet блоков {0} за {1}\n",
cnt,
s.Elapsed
);
s.Start();
}
else if (pr.StringResult == "Enum")
{
s.Start();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
ObjectId SpaceId = db.CurrentSpaceId;//ID активного пространства
BlockTableRecord btrs = tr.GetObject(
SpaceId,
OpenMode.ForRead
) as BlockTableRecord;//получаем запись BlockTableRecord активного пространства
foreach (ObjectId brId in btrs)//в активном пространстве перебираем все что в нем находится
{
BlockReference br = tr.GetObject(brId, OpenMode.ForRead) as BlockReference;//пытаемся получить вставку блока
if (br != null)
{
BlockTableRecord btr = tr.GetObject(
br.BlockTableRecord,
OpenMode.ForRead) as BlockTableRecord;//по вставке получаем описание блока
if (!btr.IsFromExternalReference
&& !btr.IsDependent
)//если не внешняя сылка и не зависимый блок, считаем
{
cnt++;
}
}
}
s.Stop();
ed.WriteMessage(
"\nEnum Before Commit {0}\n",
s.Elapsed);
s.Start();
tr.Commit();
s.Stop();
ed.WriteMessage(
"\nEnum After Commit {0}\n",
s.Elapsed);
s.Start();
}
s.Stop();
ed.WriteMessage(
"\nEnum блоков {0} за {1}\n",
cnt,
s.Elapsed
);
s.Start();
}
else if (pr.StringResult == "enumRX")
{
s.Start();
RXClass dimenClass = RXObject.GetClass(typeof(BlockReference));
using (Transaction tr = db.TransactionManager.StartTransaction())
{
ObjectId SpaceId = db.CurrentSpaceId;//ID активного пространства
BlockTableRecord btrs = tr.GetObject(
SpaceId,
OpenMode.ForRead
) as BlockTableRecord;//получаем запись BlockTableRecord активного пространства
foreach (ObjectId brId in btrs)//в активном пространстве перебираем все что в нем находится
{
//var objTest = brId.ObjectClass.Name;
if (!brId.ObjectClass.IsDerivedFrom(dimenClass))
{
continue;
}
BlockReference br = tr.GetObject(brId, OpenMode.ForRead) as BlockReference;//пытаемся получить вставку блока
if (br != null)
{
BlockTableRecord btr = tr.GetObject(
br.BlockTableRecord,
OpenMode.ForRead) as BlockTableRecord;//по вставке получаем описание блока
if (!btr.IsFromExternalReference
&& !btr.IsDependent
)//если не внешняя сылка и не зависимый блок, считаем
{
cnt++;
}
}
}
s.Stop();
ed.WriteMessage(
"\nEnumRX Before Commit {0}\n",
s.Elapsed);
s.Start();
tr.Commit();
s.Stop();
ed.WriteMessage(
"\nEnumRX After Commit {0}\n",
s.Elapsed);
s.Start();
}
s.Stop();
ed.WriteMessage(
"\nEnumRX блоков {0} за {1}\n",
cnt,
s.Elapsed
);
s.Start();
}
else
{
ed.WriteMessage("\nОтмена");
return;
}
s.Stop();
ed.WriteMessage(
"\nBefore Regen {0}\n",
s.Elapsed
);
s.Start();
ed.Regen();
s.Stop();
ed.WriteMessage(
"\nTotal {0}",
s.Elapsed
);
}