private Rectangle GetBuildingRectangle(MapBuilding building) { #if TEST //EntityHelper.AddEntityToCurrentSpace(building.ExtentsInModel.GetPolyline()); #endif return(new Rectangle(building.ExtentsInModel)); }
private void Map_BuildingAdded(object sender, MapBuilding e) { // Флаг что расчет требуется обновить - т.к.изменились здания на чертеже IsUpdateRequired = true; UpdateInfo = "Требуется обновление - добавлено здание."; //Update(); }
/// <summary> /// Определение дома для здания /// </summary> /// <param name="building">Здание без дома</param> private void DefineHouseForBuilding(MapBuilding building) { var allIntersectBuildings = new HashSet <MapBuilding>(); GetIntersectBuildings(building, ref allIntersectBuildings); // Найти все связанные здания для нового дома var allNewHouseBuildings = GetAllReferencedBuildings(allIntersectBuildings); NewHouse(allNewHouseBuildings); }
private static void CheckIntersect(MapBuilding build1, MapBuilding build2) { using (var r1 = (Region)build1.Region.Clone()) using (var r2 = (Region)build2.Region.Clone()) { r1.BooleanOperation(BooleanOperationType.BoolIntersect, r2); if (r1.NumChanges > 1 && r1.Area > 13.5) { Inspector.AddError($"Наложение зданий. Площадь наложения {NetLib.DoubleExt.Round(r1.Area,1)}. '{build1.GetInfo().Replace("\r\n", " ")}' и '{build2.GetInfo().Replace("\r\n", " ")}'. Проверка наложения зданий.", r1.GeometricExtents, Matrix3d.Identity, System.Drawing.SystemIcons.Error); } } }
/// <summary> /// Изменение /// </summary> /// <param name="building"></param> public void ChangeBuildingType(MapBuilding building) { if (building == null) { return; } var pointsInBuilding = Tree.GetPointsInBuilding(building); foreach (var item in pointsInBuilding) { item.Update(); } }
private Point3d PromptSelectPointOnScreen(out MapBuilding building) { var pt = ed.GetPointWCS("\nВыбор расчетной точки (на внешней стене здания):"); // Проверка точки building = InsPointBase.DefineBuilding(ref pt, model); // Нет ли уже точки в этом месте if (model.Tree.HasPoint(pt)) { ed.WriteMessage($"\nУже есть расчетная точка в этом месте. Укажите другую точку."); pt = PromptSelectPointOnScreen(out building); } return(pt); }
public MapBuilding GetBuildingInPoint(Point2d pt) { MapBuilding building = null; var buildingsInPt = GetBuildingsInPoint(pt); if (buildingsInPt.Count == 1) { building = buildingsInPt[0]; } else if (buildingsInPt.Count > 1) { // Выбрать ближайшую полилинию double minLen = -1; var pt3d = pt.Convert3d(); foreach (var buildItem in buildingsInPt) { bool initContour = false; if (buildItem.Contour == null || buildItem.Contour.IsDisposed) { buildItem.InitContour(); initContour = true; } try { var ptContour = buildItem.Contour.GetClosestPointTo(pt3d, false); var l = (pt3d - ptContour).Length; if (l < minLen || minLen == -1) { minLen = l; building = buildItem; } } catch { } if (initContour) { buildItem.Contour.Dispose(); } } } return(building); }
public static bool CorrectCalcPoint(ref Point3d pt, MapBuilding building, Document doc) { bool res; // Корректировка точки Point3d correctPt; building.InitContour(); using (building.Contour) { correctPt = building.Contour.GetClosestPointTo(pt, true); } if ((pt - correctPt).Length < 0.3) { // Точка достаточно близко к контуру - поправка точки и ОК. pt = correctPt; res = true; } else { // Точка далеко от контура - не пойдет. res = false; #if TEST //building.InitContour(); //using (building.Contour) //{ // EntityHelper.AddEntityToCurrentSpace((Autodesk.AutoCAD.DatabaseServices.Polyline)building.Contour.Clone()); //} //var dbPt = new DBPoint(correctPt); //dbPt.Color = Color.FromColor(System.Drawing.Color.AliceBlue); //EntityHelper.AddEntityToCurrentSpace(dbPt); //dbPt = new DBPoint(pt); //dbPt.Color = Color.FromColor(System.Drawing.Color.Gold); //EntityHelper.AddEntityToCurrentSpace(dbPt); #endif } return(res); }
/// <summary> /// Пересекающиеся дома /// </summary> private void GetIntersectBuildings(MapBuilding building, ref HashSet <MapBuilding> intersectBuildings) { using (var offset = building.Contour.Offset(1, OffsetSide.Out).First()) { // Ближайшие дома без уже найденных зданий intersectBuildings.Add(building); var nearestBuildings = map.GetBuildingsInExtents(offset.GeometricExtents).Except(intersectBuildings). Where(w => w.Building.IsProjectedBuilding == building.Building.IsProjectedBuilding).ToList(); var curIntersectBuildings = new List <MapBuilding>(); foreach (var nearBuilding in nearestBuildings) { var ptsIntersect = new Point3dCollection(); offset.IntersectWith(nearBuilding.Contour, Intersect.OnBothOperands, ptsIntersect, IntPtr.Zero, IntPtr.Zero); if (ptsIntersect.Count > 0) { if (intersectBuildings.Add(nearBuilding) && nearBuilding.House == null) { curIntersectBuildings.Add(nearBuilding); // Усреднение вершин двух секций var contourItem = nearBuilding.Contour; try { building.Contour.AverageVertexes(ref contourItem, toleranceVertex, true); } catch { } } } } foreach (var intersectBuild in curIntersectBuildings) { GetIntersectBuildings(intersectBuild, ref intersectBuildings); } } }
private void DefineEnt(Entity ent) { var building = ElementFactory.Create <IBuilding>(ent); if (building != null) { // Если это не полилиния или блок - такие объекты пока не поддерживаются if (!(ent is Polyline) && !(ent is BlockReference)) { Inspector.AddError($"Тип здания не подходит для инсоляции - '{ent.GetRXClass().Name}', слой '{ent.Layer}'", ent, System.Drawing.SystemIcons.Error); return; } var insBuild = new MapBuilding(building); Buildings.Add(insBuild); var r = GetBuildingRectangle(insBuild); treeBuildings.Add(r, insBuild); // Подписывание на изменения объекта ent.Modified += Building_Modified; ent.Erased += Building_Erased; // Оповещение расчета о изменении здания if (IsEventsOn) { BuildingAdded?.Invoke(this, insBuild); } return; } // Сбор точек инсоляции var dbPt = ent as DBPoint; if (dbPt != null) { if (InsPointHelper.IsInsPoint(dbPt)) { InsPoints.Add(dbPt.Id); // Оповещение о создании точки if (IsEventsOn) { InsPointAdded?.Invoke(this, dbPt.Id); } } return; } var pl = ent as Polyline; if (pl != null) { var entExtDicExt = new EntDictExt(pl, InsService.PluginName); var dic = entExtDicExt.Load(); if (dic != null) { var dicPlace = dic.GetInner(Place.PlaceDicName); if (dicPlace != null) { Places.Add(new KeyValuePair <ObjectId, DicED>(pl.Id, dicPlace)); } } //// Если она на слое sapr_ins_visuals - удаление //if (VisualDatabase.IsVisualElement(ent)) //{ // ent.UpgradeOpen(); // ent.Erase(); //} } }
/// <summary> /// Точки принадлежащие зданию /// </summary> public List <InsPoint> GetPointsInBuilding(MapBuilding building) { return(Points.Where(p => p.Building == building).ToList()); }