public void iterateEntInBlock(BlockTableRecord btr, bool _deleteWaste = true) { var tilesDict = new Dictionary <Extents3d, Tuple <ObjectId, Extents3d> >(); _extentsByTile = new Extents3d(); foreach (ObjectId idEnt in btr) { if (!idEnt.IsValidEx()) { continue; } using (var ent = idEnt.GetObject(OpenMode.ForRead) as Entity) { EntInfos.Add(new EntityInfo(ent)); // Если это подпись Марки (на слое Марок) if (ent is DBText && string.Equals(ent.Layer, Settings.Default.LayerMarks, StringComparison.CurrentCultureIgnoreCase)) { // Как определить - это текст Марки или Покраски - сейчас Покраска в скобках (). Но вдруг будет без скобок. var textCaption = (DBText)ent; if (textCaption.TextString.StartsWith("(")) { CaptionPaint = textCaption.TextString; IdCaptionPaint = idEnt; } else { CaptionMarkSb = textCaption.TextString; IdCaptionMarkSb = idEnt; CaptionLayerId = textCaption.LayerId; } continue; } // Если блок - плитка или окно else if (ent is BlockReference) { var blRef = ent as BlockReference; var blName = blRef.GetEffectiveName(); if (blName.Equals(Settings.Default.BlockTileName, StringComparison.CurrentCultureIgnoreCase)) { var ext = blRef.GeometricExtentsСlean(); _extentsByTile.AddExtents(ext); try { tilesDict.Add(ext, new Tuple <ObjectId, Extents3d>(blRef.Id, ext)); } catch (ArgumentException) { // Ошибка - плитка с такими границами уже есть ErrMsg += "Наложение плиток. "; } catch (Exception ex) { Logger.Log.Error(ex, "iterateEntInBlock - tilesDict.Add(ent.GeometricExtents, ent.GeometricExtents);"); } continue; } else if (blName.StartsWith(Settings.Default.BlockWindowName, StringComparison.OrdinalIgnoreCase)) { // Окно оставляем continue; } } //// Удаление лишних объектов (мусора) //if (_deleteWaste && deleteWaste(ent)) continue; // Если объект удален, то переход к новому объекту в блоке if (_deleteWaste && (string.Equals(ent.Layer, Settings.Default.LayerDimensionFacade, StringComparison.CurrentCultureIgnoreCase) || string.Equals(ent.Layer, Settings.Default.LayerDimensionForm, StringComparison.CurrentCultureIgnoreCase))) { ent.UpgradeOpen(); ent.Erase(); } } } Tiles = tilesDict.Values.ToList(); // Проверка if (string.IsNullOrEmpty(CaptionMarkSb)) { ErrMsg += "Не наден текст подписи марки панели. "; } if (string.IsNullOrEmpty(CaptionPaint)) { ErrMsg += "Не наден текст подписи марки покраски панели. "; } if (ExtentsByTile.Diagonal() < 100) { ErrMsg += string.Format("Не определены габариты панели по плиткам - диагональ панели = {0}", ExtentsByTile.Diagonal()); } // Определение высоты панели HeightByTile = ExtentsByTile.MaxPoint.Y - ExtentsByTile.MinPoint.Y; }
private void defineEnds(ContourPanel contourPanel) { // условие наличия торцов if (ExtentsByTile.Diagonal() < 1000 || ExtentsNoEnd.Diagonal() < 1000 || ExtentsByTile.Diagonal() - ExtentsNoEnd.Diagonal() < 100) { return; } // Определение торцевых объектов в блоке // Торец слева if ((ExtentsNoEnd.MinPoint.X - ExtentsByTile.MinPoint.X) > 400) { // поиск объектов с координатой близкой к ExtentsByTile.MinPoint.X var endTiles = GetEndTiles(new Extents3d(ExtentsByTile.MinPoint, new Point3d(ExtentsByTile.MinPoint.X + 300, ExtentsByTile.MaxPoint.Y, ExtentsByTile.MaxPoint.Z)), contourPanel.TreeTiles); //var idsEndEntsTemp = getEndEntsInCoord(ExtentsByTile.MinPoint.X, true); if (endTiles.Count > 0) { HashSet <ObjectId> idsEndLeftEntsHash = new HashSet <ObjectId>(); endTiles.ForEach(t => idsEndLeftEntsHash.Add(t)); IdsEndsLeftEntity = idsEndLeftEntsHash.ToList(); } } // Торец справа if ((ExtentsByTile.MaxPoint.X - ExtentsNoEnd.MaxPoint.X) > 400) { var endTiles = GetEndTiles(new Extents3d( new Point3d(ExtentsByTile.MaxPoint.X - 300, ExtentsByTile.MinPoint.Y, ExtentsByTile.MinPoint.Z), ExtentsByTile.MaxPoint), contourPanel.TreeTiles); //var idsEndEntsTemp = getEndEntsInCoord(ExtentsByTile.MaxPoint.X, true); if (endTiles.Count > 0) { var idsEndRightEntsHash = new HashSet <ObjectId>(); endTiles.ForEach(t => idsEndRightEntsHash.Add(t)); IdsEndsRightEntity = idsEndRightEntsHash.ToList(); } } // Торец сверху if ((ExtentsByTile.MaxPoint.Y - ExtentsNoEnd.MaxPoint.Y) > 400) { var endTiles = GetEndTiles(new Extents3d( new Point3d(ExtentsByTile.MinPoint.X, ExtentsByTile.MaxPoint.Y - 300, ExtentsByTile.MaxPoint.Z), ExtentsByTile.MaxPoint), contourPanel.TreeTiles); //var idsEndEntsTemp = getEndEntsInCoord(ExtentsByTile.MaxPoint.Y, false); if (endTiles.Count > 0) { var idsEndTopEntsHash = new HashSet <ObjectId>(); endTiles.ForEach(t => idsEndTopEntsHash.Add(t)); IdsEndsTopEntity = idsEndTopEntsHash.ToList(); } } // Торец снизу if ((ExtentsNoEnd.MinPoint.Y - ExtentsByTile.MinPoint.Y) > 400) { var endTiles = GetEndTiles(new Extents3d(ExtentsByTile.MinPoint, new Point3d(ExtentsByTile.MaxPoint.X, ExtentsByTile.MinPoint.Y + 300, ExtentsByTile.MinPoint.Z)), contourPanel.TreeTiles); //var idsEndEntsTemp = getEndEntsInCoord(ExtentsByTile.MinPoint.Y, false); if (endTiles.Count > 0) { HashSet <ObjectId> idsEndBotEntsHash = new HashSet <ObjectId>(); endTiles.ForEach(t => idsEndBotEntsHash.Add(t)); IdsEndsBottomEntity = idsEndBotEntsHash.ToList(); } } }