예제 #1
0
        /// <summary>
        /// Вставка блока профиля и стрелок к местам установки профиля на стыке плиток в торце панели
        /// </summary>
        protected void addProfileTile(bool doTrans, Matrix3d trans)
        {
            double xPtProfile     = 0;
            double yPtProfile     = 0;
            double xPtArrowDirect = 0;

            if (panelBase.IsCheekLeft)
            {
                // Для торца слева - профиль вставляется в одну и туже точку (-400,-600)
                xPtProfile         = -400;
                yPtProfile         = -600;
                ptPosArrowToHorSec = ptPosHorizontalPanelSection;
            }
            else if (panelBase.IsCheekRight)
            {
                // Для торца справа - на раст (400,600) от нижнего правого края последней плитки
                xPtProfile         = panelBase.XMaxContour + 400;
                yPtProfile         = -600;
                xPtArrowDirect     = panelBase.XMaxContour;
                ptPosArrowToHorSec = new Point3d(panelBase.XMaxContour, ptPosHorizontalPanelSection.Y, 0);
            }
            else
            {
                // Не нужен профиль для панелей без торцов (Cheek)
                return;
            }

            // Поиск блока профиля в инвентаре
            BlockInfo biProfile = panelBase.Service.Env.BlocksInFacade.FirstOrDefault(b => b.BlName.Equals(Settings.Default.BlockProfileTile));

            if (biProfile == null)
            {
                return;
            }

            ObjectId idBtrProfile = biProfile.IdBtr;

            // Точка вставки блока профиля
            ptPosProfile = new Point3d(xPtProfile, yPtProfile, 0);
            Point3d ptBlrefProfile = ptPosProfile;

            if (doTrans)
            {
                ptBlrefProfile = ptPosProfile.TransformBy(trans);
            }

            // Вставка блока профиля - название и марка
            var blRefProfile = CreateBlRefInBtrDim(ptBlrefProfile, idBtrProfile, Settings.Default.SheetScale);

            if (blRefProfile == null)
            {
                return;
            }

            // Добавление атрибутов Названия и марки
            // Атрибут Названия - из вхождения атрибута
            var atrRefName = biProfile.AttrsRef.FirstOrDefault(a => a.Tag.Equals("НАЗВАНИЕ"));

            if (atrRefName != null)
            {
                // определение атрибута
                var atrDefName = biProfile.AttrsDef.FirstOrDefault(a => a.Tag.Equals("НАЗВАНИЕ"));
                if (atrDefName != null)
                {
                    AddAttrToBlockRef(blRefProfile, atrDefName.IdAtr, atrRefName.Text);
                }
            }
            // Атрибут Марки - из вхождения атрибута
            var atrRefMark = biProfile.AttrsRef.FirstOrDefault(a => a.Tag.Equals("МАРКА"));

            if (atrRefMark != null)
            {
                // определение атрибута
                var atrDefMark = biProfile.AttrsDef.FirstOrDefault(a => a.Tag.Equals("МАРКА"));
                if (atrDefMark != null)
                {
                    AddAttrToBlockRef(blRefProfile, atrDefMark.IdAtr, atrRefMark.Text);
                }
            }

            // Вставка стрелки до угла панели
            Point3d ptArrowPos    = new Point3d(xPtProfile, yPtProfile + 4 * Settings.Default.SheetScale, 0);
            Point3d ptArrowDirect = new Point3d(xPtArrowDirect, 0, 0);

            InsertArrowBlRef(ptArrowPos, ptArrowDirect, doTrans, trans);
        }
        /// <summary>
        /// Поиск первых вхождения блоков в Модели в файле Фасада АКР _service.Db
        /// </summary>
        /// <param name="blNames"></param>
        /// <returns></returns>
        private List<BlockInfo> findBlocksInFacade(List<string> blNames)
        {
            Dictionary<string, BlockInfo> resVal = new Dictionary<string, BlockInfo>();
             List<string> notFoundBlocks = blNames.ToList();
             // Поиск блоков в чертеже фасада
             using (var bt = _service.Db.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
             {
            using (var ms = bt[BlockTableRecord.ModelSpace].Open( OpenMode.ForRead) as BlockTableRecord)
            {
               foreach (var idEnt in ms)
               {
                  using (var blRef = idEnt.Open(OpenMode.ForRead, false, true) as BlockReference)
                  {
                     if (blRef !=null)
                     {
                        var blName = blRef.GetEffectiveName();
                        if (resVal.ContainsKey(blName))
                        {
                           //Добавляем только первое вхождение блока
                           continue;
                        }
                        var name = blNames.Find(n => n.Equals(blName, StringComparison.OrdinalIgnoreCase));
                        if (!string.IsNullOrEmpty(name))
                        {
                           BlockInfo bi = new BlockInfo(blRef, blName);
                           resVal.Add(blName, bi);
                           notFoundBlocks.Remove(name);
                        }
                     }
                  }
               }
            }
             }
             // Добавление ошибок для ненайденых блоков
             foreach (var blNameNotFound in notFoundBlocks)
             {
            Inspector.AddError($"В файле фасада не найден требуемый блок {blNameNotFound} для создания альбома панелей.",
               icon: System.Drawing.SystemIcons.Error);
             }

             return resVal.Values.ToList();
        }