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
                );
        }