/// <summary>
      /// Копирование блоков сечений из шаблона блоков и доп списка блоков blNames
      /// </summary>
      /// <param name="fileBlocksTemplate"></param>
      /// <param name="service"></param>
      /// <param name="blNames"></param>
      /// <returns></returns>
      public static List<BlockSectionAbstract> LoadSections(string fileBlocksTemplate, BaseService service, List<string> blNames, 
            out Dictionary<string, ObjectId> blNamesCopy)
      {
         blNamesCopy = new Dictionary<string, ObjectId>();
         Dictionary<ObjectId, BlockSectionAbstract> blSecToCopy = new Dictionary<ObjectId, BlockSectionAbstract>();         
         using (var dbBlocks = new Database(false, true))
         {
            dbBlocks.ReadDwgFile(fileBlocksTemplate, FileOpenMode.OpenForReadAndAllShare, false, "");
            dbBlocks.CloseInput(true);
            using (var bt = dbBlocks.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
            {
               foreach (ObjectId idBtr in bt)
               {
                  using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord)
                  {
                     var blNameToCopy = blNames.Find(n => n.Equals(btr.Name, StringComparison.OrdinalIgnoreCase));
                     if (!string.IsNullOrEmpty(blNameToCopy))
                     {
                        blNamesCopy.Add(blNameToCopy, btr.Id);
                        continue;
                     }                     

                    BlockSectionAbstract blSec = null;
                     if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionVerticalPrefixName, StringComparison.OrdinalIgnoreCase))
                     {
                        blSec = new BlockSectionVertical(btr.Name, service);
                     }
                     else if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionHorizontalPrefixName, StringComparison.OrdinalIgnoreCase))
                     {
                        blSec = new BlockSectionHorizontal(btr.Name, service);
                     }

                     if (blSec != null)
                     {
                        var resParse = blSec.ParseBlName();
                        if (resParse.Success)
                        {
                           blSecToCopy.Add(idBtr, blSec);
                           //Определение ассоциативных штриховок и объектов с которыми они связаны
                           blSec.getHatchAssociateIds(btr);                           
                        }
                        else
                        {
                           Inspector.AddError($"Не определены параметры блока сечения в файле шаблона блоков. {btr.Name}. {resParse.Error}",
                              icon: System.Drawing.SystemIcons.Error);
                        }
                     }
                  }
               }
            }
            if (blSecToCopy.Count > 0)
            {
               using (ObjectIdCollection ids = new ObjectIdCollection(blSecToCopy.Keys.ToArray()))
               {
                  foreach (var item in blNamesCopy.Values)
                  {
                     ids.Add(item);
                  }

                  using (IdMapping map = new IdMapping())
                  {
                     service.Db.WblockCloneObjects(ids, service.Db.BlockTableId, map, DuplicateRecordCloning.Replace, false);
                     foreach (var item in blSecToCopy)
                     {
                        item.Value.IdBtr = map[item.Key].Value;
                        if (item.Value._hatchsAssociatedIdsDictInTemplate != null)
                        {
                           item.Value.setHatchIdsMapping(map);
                           //item.Value.ReplaceAssociateHatch();
                        }
                     }
                     foreach (var name in blNames)
                     {
                        ObjectId idBl;
                        if (blNamesCopy.TryGetValue(name, out idBl))
                        {
                           blNamesCopy[name] = map[idBl].Value;
                        }
                     }
                  }
               }              
            }
            else
            {
               Inspector.AddError("Не найдены блоки сечений панелей в файле шаблона блоков АКР. " +
                  $"Файл шаблона {fileBlocksTemplate}. Префикс блоков {Settings.Default.BlockPanelSectionVerticalPrefixName} " +
                  $"и {Settings.Default.BlockPanelSectionHorizontalPrefixName}", icon: System.Drawing.SystemIcons.Error);
            }
         }
         return blSecToCopy.Values.ToList();         
      }
        /// <summary>
        /// Копирование блоков сечений из шаблона блоков и доп списка блоков blNames
        /// </summary>
        /// <param name="fileBlocksTemplate"></param>
        /// <param name="service"></param>
        /// <param name="blNames"></param>
        /// <returns></returns>
        public static List <BlockSectionAbstract> LoadSections(string fileBlocksTemplate, BaseService service, List <string> blNames,
                                                               out Dictionary <string, ObjectId> blNamesCopy)
        {
            blNamesCopy = new Dictionary <string, ObjectId>();
            Dictionary <ObjectId, BlockSectionAbstract> blSecToCopy = new Dictionary <ObjectId, BlockSectionAbstract>();

            using (var dbBlocks = new Database(false, true))
            {
                dbBlocks.ReadDwgFile(fileBlocksTemplate, FileOpenMode.OpenForReadAndAllShare, false, "");
                dbBlocks.CloseInput(true);
                using (var bt = dbBlocks.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
                {
                    foreach (ObjectId idBtr in bt)
                    {
                        using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord)
                        {
                            var blNameToCopy = blNames.Find(n => n.Equals(btr.Name, StringComparison.OrdinalIgnoreCase));
                            if (!string.IsNullOrEmpty(blNameToCopy))
                            {
                                blNamesCopy.Add(blNameToCopy, btr.Id);
                                continue;
                            }

                            BlockSectionAbstract blSec = null;
                            if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionVerticalPrefixName, StringComparison.OrdinalIgnoreCase))
                            {
                                blSec = new BlockSectionVertical(btr.Name, service);
                            }
                            else if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionHorizontalPrefixName, StringComparison.OrdinalIgnoreCase))
                            {
                                blSec = new BlockSectionHorizontal(btr.Name, service);
                            }

                            if (blSec != null)
                            {
                                var resParse = blSec.ParseBlName();
                                if (resParse.Success)
                                {
                                    blSecToCopy.Add(idBtr, blSec);
                                    //Определение ассоциативных штриховок и объектов с которыми они связаны
                                    blSec.getHatchAssociateIds(btr);
                                }
                                else
                                {
                                    Inspector.AddError($"Не определены параметры блока сечения в файле шаблона блоков. {btr.Name}. {resParse.Error}",
                                                       icon: System.Drawing.SystemIcons.Error);
                                }
                            }
                        }
                    }
                }
                if (blSecToCopy.Count > 0)
                {
                    using (ObjectIdCollection ids = new ObjectIdCollection(blSecToCopy.Keys.ToArray()))
                    {
                        foreach (var item in blNamesCopy.Values)
                        {
                            ids.Add(item);
                        }

                        using (IdMapping map = new IdMapping())
                        {
                            service.Db.WblockCloneObjects(ids, service.Db.BlockTableId, map, DuplicateRecordCloning.Replace, false);
                            foreach (var item in blSecToCopy)
                            {
                                item.Value.IdBtr = map[item.Key].Value;
                                if (item.Value._hatchsAssociatedIdsDictInTemplate != null)
                                {
                                    item.Value.setHatchIdsMapping(map);
                                    //item.Value.ReplaceAssociateHatch();
                                }
                            }
                            foreach (var name in blNames)
                            {
                                ObjectId idBl;
                                if (blNamesCopy.TryGetValue(name, out idBl))
                                {
                                    blNamesCopy[name] = map[idBl].Value;
                                }
                            }
                        }
                    }
                }
                else
                {
                    Inspector.AddError("Не найдены блоки сечений панелей в файле шаблона блоков АКР. " +
                                       $"Файл шаблона {fileBlocksTemplate}. Префикс блоков {Settings.Default.BlockPanelSectionVerticalPrefixName} " +
                                       $"и {Settings.Default.BlockPanelSectionHorizontalPrefixName}", icon: System.Drawing.SystemIcons.Error);
                }
            }
            return(blSecToCopy.Values.ToList());
        }