public static void PaintTileInBtr(ObjectId idBtr, RTree <ColorArea> rtreeColorAreas, Matrix3d transToModel) { var btr = idBtr.GetObject(OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId idEnt in btr) { if (idEnt.IsValidEx() && idEnt.ObjectClass.Name == "AcDbBlockReference") { var blRef = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; string blName = blRef.GetEffectiveName(); if (blName.StartsWith(Settings.Default.BlockTileName, StringComparison.OrdinalIgnoreCase)) { Tile tile = new Tile(blRef, blName); //Определение покраски плитки Paint paint = ColorArea.GetPaint(tile.CenterTile.TransformBy(transToModel), rtreeColorAreas); if (paint != null) { blRef.UpgradeOpen(); blRef.Layer = paint.Layer; FillTileArticle(blRef, paint.Article); // Так же поворачивает атрибут //tile.SetPaint(paint); } } else if (!MarkSb.IsBlockNamePanel(blName)) { // Покраска во вложенных блоках, кроме АРК панелей PaintTileInBtr(blRef.BlockTableRecord, rtreeColorAreas, blRef.BlockTransform * transToModel); } } } }
// Определение покраски панели (список цветов по порядку списка плитов в блоке СБ) public static List <Paint> GetPanelMarkAR(MarkSb markSb, BlockReference blRefPanel, RTree <ColorArea> rtreeColorAreas) { List <Paint> paintsAR = new List <Paint>(); int i = 0; bool hasTileWithoutPaint = false; foreach (Tile tileMarSb in markSb.Tiles) { Paint paintSb = markSb.Paints[i++]; Paint paintAR; if (paintSb == null) { // Опрделение покраски по зонам Point3d centerTileInBlRef = GetCenterTileInBlockRef(blRefPanel.Position, tileMarSb.CenterTile); paintAR = ColorArea.GetPaint(centerTileInBlRef, rtreeColorAreas); if (paintAR == null) { if (!hasTileWithoutPaint) { //Ошибка. Не удалось определить покраску плитки.??? Inspector.AddError($"{markSb.MarkSbClean} - не все плитки покрашены", blRefPanel, icon: System.Drawing.SystemIcons.Error); hasTileWithoutPaint = true; } } } else { paintAR = paintSb; } paintsAR.Add(paintAR); } return(paintsAR); }
// Получение списка плиток в определении блока private void IterateBtrEnt() { _tiles = new List <Tile>(); _paints = new List <Paint>(); var btrMarkSb = _idBtr.GetObject(OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId idEnt in btrMarkSb) { if (idEnt.IsValidEx() && idEnt.ObjectClass.Name == "AcDbBlockReference") { var blRef = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; string blName = blRef.GetEffectiveName(); // Плитка if (blName.Equals(Settings.Default.BlockTileName, StringComparison.OrdinalIgnoreCase)) { Tile tile = new Tile(blRef, blName); //Определение покраски плитки Paint paint = ColorArea.GetPaint(tile.CenterTile, _rtreeColorArea); _tiles.Add(tile); _paints.Add(paint); } // Окна else if (BlockWindow.IsblockWindow(blName)) { BlockWindow window = new BlockWindow(blRef, blName, this); Windows.Add(window); } } } }