// Constructors internal Session(Domain domain, SessionConfiguration configuration, bool activate) : base(domain) { Guid = Guid.NewGuid(); IsDebugEventLoggingEnabled = OrmLog.IsLogged(LogLevel.Debug); // Just to cache this value // Both Domain and Configuration are valid references here; // Configuration is already locked Configuration = configuration; Name = configuration.Name; identifier = Interlocked.Increment(ref lastUsedIdentifier); CommandTimeout = configuration.DefaultCommandTimeout; allowSwitching = configuration.Supports(SessionOptions.AllowSwitching); // Handlers Handlers = domain.Handlers; Handler = CreateSessionHandler(); // Caches, registry EntityStateCache = CreateSessionCache(configuration); EntityChangeRegistry = new EntityChangeRegistry(this); EntitySetChangeRegistry = new EntitySetChangeRegistry(this); ReferenceFieldsChangesRegistry = new ReferenceFieldsChangesRegistry(this); entitySetsWithInvalidState = new HashSet <EntitySetBase>(); // Events EntityEvents = new EntityEventBroker(); Events = new SessionEventAccessor(this, false); SystemEvents = new SessionEventAccessor(this, true); // Etc. PairSyncManager = new SyncManager(this); RemovalProcessor = new RemovalProcessor(this); pinner = new Pinner(this); Operations = new OperationRegistry(this); NonPairedReferencesRegistry = new NonPairedReferenceChangesRegistry(this); CommandProcessorContextProvider = new CommandProcessorContextProvider(this); // Validation context ValidationContext = Configuration.Supports(SessionOptions.ValidateEntities) ? (ValidationContext) new RealValidationContext() : new VoidValidationContext(); // Creating Services Services = CreateServices(); disposableSet = new DisposableSet(); remapper = new KeyRemapper(this); disableAutoSaveChanges = !configuration.Supports(SessionOptions.AutoSaveChanges); // Perform activation if (activate) { ActivateInternally(); } // Query endpoint SystemQuery = Query = new QueryEndpoint(new QueryProvider(this)); }
// IDisposable implementation /// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> public void Dispose() { if (isDisposed) { return; } try { OrmLog.Debug(Strings.LogSessionXDisposing, this); SystemEvents.NotifyDisposing(); Events.NotifyDisposing(); Services.DisposeSafely(); Handler.DisposeSafely(); CommandProcessorContextProvider.DisposeSafely(); Domain.ReleaseSingleConnection(); disposableSet.DisposeSafely(); disposableSet = null; EntityChangeRegistry.Clear(); EntitySetChangeRegistry.Clear(); EntityStateCache.Clear(); ReferenceFieldsChangesRegistry.Clear(); NonPairedReferencesRegistry.Clear(); } finally { isDisposed = true; } }
public void AddPart(CommandPart part) { if (prepared) { throw new InvalidOperationException("Unable to change command: it is already prepared"); } statements.Add(part.Statement); foreach (var parameter in part.Parameters) { underlyingCommand.Parameters.Add(parameter); } if (part.Resources.Count == 0) { return; } if (resources == null) { resources = new DisposableSet(); } foreach (var resource in part.Resources) { resources.Add(resource); } }
/// <summary> /// Добавление внутренних стен /// </summary> private void AddIWalls() { var wallsH = Elements.OfType <WallHatch>().ToList(); using (var disposeLines = new DisposableSet <Line>()) { var lines = wallsH.Select(s => GetExtentLine(s.Ext, false)).Where(w => w.Length > 2500).ToList(); disposeLines.AddRange(lines); var lineEqComparer = new LineEqualityComparer(new Tolerance(0.1, 0.1), 450, 450); while (true) { var linesCountBefore = lines.Count; lines = lines.GroupBy(g => g, lineEqComparer).Select(s => s.ToList().GetUnionLine()).ToList(); disposeLines.AddRange(lines); if (lines.Count == linesCountBefore) { break; } } foreach (var line in lines) { line.TransformBy(transform); if (IsInnerWall(line)) { line.LayerId = settings.LayerApart.LayerId; block.AppendEntity(line); t.AddNewlyCreatedDBObject(line, true); } } } }
public static DisposableSet <Polyline> GetPolylines( [NotNull] this Hatch ht, HatchLoopTypes loopType = HatchLoopTypes.External) { var loops = GetPolylines2(ht, Tolerance.Global, loopType); var res = new DisposableSet <Polyline>(loops.Select(s => s.GetPolyline())); loops.Clear(); return(res); }
public virtual void SetUp() { if (DoNotActivateSharedSession) { return; } disposables = new DisposableSet(); _ = disposables.Add(Session = Domain.OpenSession()); _ = disposables.Add(Session.OpenTransaction()); }
public static void Check(Map map) { dictChecked = new Dictionary <ObjectId, HashSet <ObjectId> >(); using (var regions = new DisposableSet <Region>()) using (var contours = new DisposableSet <Polyline>()) { foreach (var build in map.Buildings) { dictChecked.Add(build.Building.IdEnt, new HashSet <ObjectId>()); build.InitContour(); if (build.Contour == null) { Inspector.AddError($"Не определен контур здания - {NetLib.StringExt.ClearString(build.GetInfo())}, слой '{build.Building.Layer}'. Проверка наложения зданий.", build.Building.IdEnt, System.Drawing.SystemIcons.Error); continue; } contours.Add(build.Contour); try { var reg = BrepExtensions.CreateRegion(build.Contour); build.Region = reg; regions.Add(reg); } catch (Exception ex) { Inspector.AddError($"Ошибка определения контура здания - '{NetLib.StringExt.ClearString(build.GetInfo())}', слой '{build.Building.Layer}'. {ex.Message}. Проверка наложения зданий.", build.Building.IdEnt, System.Drawing.SystemIcons.Error); } } foreach (var build in map.Buildings.Where(w => w.Region != null)) { // здания в границах текущего здания var nearest = map.GetBuildingsInExtents(build.ExtentsInModel); if (!nearest.Any()) { continue; } nearest.Remove(build); // Проверка наложение с каждым ближайшим зданием foreach (var nearBuild in nearest) { // Чтобы не проверять два взаимно пересекающихся дома 2 раза if (dictChecked[build.Building.IdEnt].Contains(nearBuild.Building.IdEnt)) { continue; } dictChecked[nearBuild.Building.IdEnt].Add(build.Building.IdEnt); CheckIntersect(build, nearBuild); } } } }
// Dispose implementation public override void Dispose() { using (var toDispose = new DisposableSet()) { foreach (var pair in instances) { var service = pair.Value; var disposable = service as IDisposable; if (disposable != null) { toDispose.Add(disposable); } } } }
protected void CreateSessionAndTransaction() { try { disposables = new DisposableSet(); var session = Domain.OpenSession(); disposables.Add(session); var transaction = session.OpenTransaction(); disposables.Add(transaction); } catch { disposables.DisposeSafely(); disposables = null; throw; } }
private async ValueTask DisposeImpl(bool isAsync) { if (isDisposed) { return; } sessionLifetimeToken.Expire(); try { if (IsDebugEventLoggingEnabled) { OrmLog.Debug(Strings.LogSessionXDisposing, this); } SystemEvents.NotifyDisposing(); Events.NotifyDisposing(); Services.DisposeSafely(); if (isAsync) { await Handler.DisposeSafelyAsync().ConfigureAwait(false); } else { Handler.DisposeSafely(); } CommandProcessorContextProvider.DisposeSafely(); Domain.ReleaseSingleConnection(); disposableSet.DisposeSafely(); disposableSet = null; EntityChangeRegistry.Clear(); EntitySetChangeRegistry.Clear(); EntityStateCache.Clear(); ReferenceFieldsChangesRegistry.Clear(); NonPairedReferencesRegistry.Clear(); Extensions.Clear(); } finally { isDisposed = true; } }
/// <summary> /// Offset the source polyline to specified side(s). /// </summary> /// <param name="source">The polyline to be offseted.</param> /// <param name="offsetDist">The offset distance.</param> /// <param name="side">The offset side(s).</param> /// <returns>A polyline sequence resulting from the offset of the source polyline.</returns> public static IEnumerable <Polyline> Offset(this Polyline source, double offsetDist, OffsetSide side) { side = OffsetSide.Out; offsetDist = Math.Abs(offsetDist); using (var plines = new DisposableSet <Polyline>()) { var offsetRight = source.GetOffsetCurves(offsetDist).Cast <Polyline>(); plines.AddRange(offsetRight); var offsetLeft = source.GetOffsetCurves(-offsetDist).Cast <Polyline>(); plines.AddRange(offsetLeft); var areaRight = offsetRight.Select(pline => pline.Area).Sum(); var areaLeft = offsetLeft.Select(pline => pline.Area).Sum(); switch (side) { case OffsetSide.In: return(plines.RemoveRange( areaRight < areaLeft ? offsetRight : offsetLeft)); case OffsetSide.Out: return(plines.RemoveRange( areaRight < areaLeft ? offsetLeft : offsetRight)); case OffsetSide.Left: return(plines.RemoveRange(offsetLeft)); case OffsetSide.Right: return(plines.RemoveRange(offsetRight)); case OffsetSide.Both: plines.Clear(); return(offsetRight.Concat(offsetLeft)); default: return(null); } } }
public static DisposableSet <HatchLoopPl> GetPolylines2( [NotNull] this Hatch ht, Tolerance weddingTolerance, HatchLoopTypes loopType = (HatchLoopTypes)119, bool wedding = false) { var loops = new DisposableSet <HatchLoopPl>(); var nloops = ht.NumberOfLoops; for (var i = 0; i < nloops; i++) { var loop = ht.GetLoopAt(i); if (loopType.HasAny(loop.LoopType)) { Debug.WriteLine($"GetPolylines2 HasFlag {loop.LoopType}!"); var poly = new Polyline(); var vertex = 0; if (loop.IsPolyline) { foreach (BulgeVertex bv in loop.Polyline) { poly.AddVertexAt(vertex++, bv.Vertex, bv.Bulge, 0.0, 0.0); } } else { foreach (Curve2d curve in loop.Curves) { if (curve is LinearEntity2d l) { if (NeedAddVertexToPl(poly, vertex - 1, l.StartPoint, weddingTolerance)) { poly.AddVertexAt(vertex++, l.StartPoint, 0, 0, 0); } poly.AddVertexAt(vertex++, l.EndPoint, 0, 0, 0); } else if (curve is CircularArc2d arc) { if (arc.IsCircle()) { loops.Add(new HatchLoopPl { Loop = arc.CreateCircle(), Types = loop.LoopType }); continue; } var bulge = arc.GetBulge(arc.IsClockWise); if (NeedAddVertexToPl(poly, vertex - 1, arc.StartPoint, weddingTolerance)) { poly.AddVertexAt(vertex++, arc.StartPoint, bulge, 0, 0); } else { poly.SetBulgeAt(vertex - 1, bulge); } poly.AddVertexAt(vertex++, arc.EndPoint, 0, 0, 0); } else { Inspector.AddError($"Тип сегмента штриховки не поддерживается {curve}", ht); } } } if (poly.NumberOfVertices != 0) { if (wedding) { poly.Wedding(weddingTolerance); } if (!poly.Closed) { poly.Closed = true; } loops.Add(new HatchLoopPl { Loop = poly, Types = loop.LoopType }); } } } return(loops); }
public ObjectId CreateContour2(BlockTableRecord btr) { if (panelBtr.ExtentsByTile.Diagonal() < endOffset) { return ObjectId.Null; } // из всех плиток отделить торцевые плитки???? // дерево границ плиток TreeTiles = new RTree<Tuple<ObjectId, Extents3d>>(); foreach (var item in panelBtr.Tiles) { try { var r = new Rectangle(Math.Round(item.Item2.MinPoint.X, 1), Math.Round(item.Item2.MinPoint.Y, 1), Math.Round(item.Item2.MaxPoint.X, 1), Math.Round(item.Item2.MaxPoint.Y, 1), 0, 0); TreeTiles.Add(r, item); } catch { } } // Отфильтровать плитки - панели от торцевых. using (var colPlTiles = new DisposableSet<Polyline>()) { //List<Polyline> colPlTile = new List<Polyline>(); foreach (var item in panelBtr.Tiles) { // Проверить наличие плиток справа и слева - если есть плитка с одной из сторон то это плитка панели а не торца // Проверка наличия плиток слева от этой double yCenter = ((Math.Round(item.Item2.MaxPoint.Y, 1) - Math.Round(item.Item2.MinPoint.Y, 1)) * 0.5); var ptCenterLeft = new Point(Math.Round(item.Item2.MinPoint.X, 1), yCenter, 0); var finds = TreeTiles.Nearest(ptCenterLeft, distTileMinInPanel); if (!finds.Skip(1).Any()) { // Нет плиток слева, проверка плиток справа var ptCenterRight = new Point(Math.Round(item.Item2.MaxPoint.X, 1), yCenter, 0); finds = TreeTiles.Nearest(ptCenterRight, distTileMinInPanel); if (!finds.Skip(1).Any()) { // Нет плиток справа // Проверка - торцевые плитки могут быть только у граней панели if ((item.Item2.MinPoint.X - panelBtr.ExtentsByTile.MinPoint.X) < distTileMinInPanel || panelBtr.ExtentsByTile.MaxPoint.X - item.Item2.MaxPoint.X < distTileMinInPanel || item.Item2.MinPoint.Y - panelBtr.ExtentsByTile.MinPoint.Y < distTileMinInPanel || panelBtr.ExtentsByTile.MaxPoint.Y - item.Item2.MaxPoint.Y < distTileMinInPanel) { continue; } } } // Плитка панели, а не торца Polyline pl = item.Item2.GetPolyline(); colPlTiles.Add(pl); } using (var regUnion = BrepExtensions.Union(colPlTiles, null)) { var plUnion = regUnion.GetPolylines().FirstOrDefault(f => f.Value == BrepLoopType.LoopExterior); //var pl3d = colPlTiles.GetExteriorContour(); if (plUnion.Key != null) { if (panelBtr.CPS != null) { plUnion.Key.LayerId = panelBtr.CPS.IdLayerContour; } btr.AppendEntity(plUnion.Key); btr.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(plUnion.Key, true); panelBtr.ExtentsNoEnd = plUnion.Key.GeometricExtents; return plUnion.Key.Id; } } } return ObjectId.Null; }
public ObjectId CreateContour2(BlockTableRecord btr) { if (panelBtr.ExtentsByTile.Diagonal() < endOffset) { return(ObjectId.Null); } // из всех плиток отделить торцевые плитки???? // дерево границ плиток TreeTiles = new RTree <Tuple <ObjectId, Extents3d> >(); foreach (var item in panelBtr.Tiles) { try { var r = new Rectangle(Math.Round(item.Item2.MinPoint.X, 1), Math.Round(item.Item2.MinPoint.Y, 1), Math.Round(item.Item2.MaxPoint.X, 1), Math.Round(item.Item2.MaxPoint.Y, 1), 0, 0); TreeTiles.Add(r, item); } catch { } } // Отфильтровать плитки - панели от торцевых. using (var colPlTiles = new DisposableSet <Polyline>()) { //List<Polyline> colPlTile = new List<Polyline>(); foreach (var item in panelBtr.Tiles) { // Проверить наличие плиток справа и слева - если есть плитка с одной из сторон то это плитка панели а не торца // Проверка наличия плиток слева от этой double yCenter = ((Math.Round(item.Item2.MaxPoint.Y, 1) - Math.Round(item.Item2.MinPoint.Y, 1)) * 0.5); var ptCenterLeft = new Point(Math.Round(item.Item2.MinPoint.X, 1), yCenter, 0); var finds = TreeTiles.Nearest(ptCenterLeft, distTileMinInPanel); if (!finds.Skip(1).Any()) { // Нет плиток слева, проверка плиток справа var ptCenterRight = new Point(Math.Round(item.Item2.MaxPoint.X, 1), yCenter, 0); finds = TreeTiles.Nearest(ptCenterRight, distTileMinInPanel); if (!finds.Skip(1).Any()) { // Нет плиток справа // Проверка - торцевые плитки могут быть только у граней панели if ((item.Item2.MinPoint.X - panelBtr.ExtentsByTile.MinPoint.X) < distTileMinInPanel || panelBtr.ExtentsByTile.MaxPoint.X - item.Item2.MaxPoint.X < distTileMinInPanel || item.Item2.MinPoint.Y - panelBtr.ExtentsByTile.MinPoint.Y < distTileMinInPanel || panelBtr.ExtentsByTile.MaxPoint.Y - item.Item2.MaxPoint.Y < distTileMinInPanel) { continue; } } } // Плитка панели, а не торца Polyline pl = item.Item2.GetPolyline(); colPlTiles.Add(pl); } using (var regUnion = BrepExtensions.Union(colPlTiles, null)) { var plUnion = regUnion.GetPolylines().FirstOrDefault(f => f.Value == BrepLoopType.LoopExterior); //var pl3d = colPlTiles.GetExteriorContour(); if (plUnion.Key != null) { if (panelBtr.CPS != null) { plUnion.Key.LayerId = panelBtr.CPS.IdLayerContour; } btr.AppendEntity(plUnion.Key); btr.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(plUnion.Key, true); panelBtr.ExtentsNoEnd = plUnion.Key.GeometricExtents; return(plUnion.Key.Id); } } } return(ObjectId.Null); }
public virtual void SetUp() { disposables = new DisposableSet(); disposables.Add(Session = Domain.OpenSession()); disposables.Add(Session.OpenTransaction()); }