Example #1
0
        // 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));
        }
Example #2
0
        // 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;
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        /// <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);
                    }
                }
            }
        }
Example #5
0
        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());
 }
Example #7
0
        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);
                        }
                    }
                }
        }
Example #8
0
        // 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;
     }
 }
Example #10
0
        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;
            }
        }
Example #11
0
        /// <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);
                }
            }
        }
Example #12
0
        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);
        }
Example #13
0
        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;
        }
Example #14
0
        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());
 }