Example #1
0
        public static void RemoveDrawObjects(this ICanvasDataContext canvasDataContext, ICollection <DrawObject> drawObjects)
        {
            if (drawObjects == null)
            {
                throw new ArgumentNullException(nameof(drawObjects));
            }

            if (drawObjects.Count == 0)
            {
                return;
            }

            //激发即将移除事件;
            var removingArgs = new CanvasDrawObjectsRemovingEventArgs(drawObjects, canvasDataContext);

            CommonEventHelper.Publish <CanvasDrawObjectsRemovingEvent, CanvasDrawObjectsRemovingEventArgs>(removingArgs);
            CommonEventHelper.PublishEventToHandlers <ICanvasDrawObjectsRemovingEventHandler, CanvasDrawObjectsRemovingEventArgs>(removingArgs);
            //若指示取消或集合为空,则不继续执行;
            if (removingArgs.Cancel || removingArgs.RemovingDrawObjects.Count == 0)
            {
                return;
            }

            var removingGroups = removingArgs.RemovingDrawObjects.
                                 GroupBy(p => p.Parent as CanvasLayer).Where(p => p.Key != null).ToArray();

            void RemoveDrawObjects()
            {
                try {
                    foreach (var tuple in removingGroups)
                    {
                        tuple.Key.RemoveDrawObjects(tuple);
                    }
                }
                catch (Exception ex) {
                    LoggerService.WriteException(ex);
                    MsgBoxService.ShowError(ex.Message);
                }
            }

            void AddDrawObjects()
            {
                try {
                    foreach (var tuple in removingGroups)
                    {
                        tuple.Key.AddDrawObjects(tuple);
                    }
                }
                catch (Exception ex) {
                    LoggerService.WriteException(ex);
                    MsgBoxService.ShowError(ex.Message);
                }
            }

            RemoveDrawObjects();

            var action = new StandardEditTransaction(AddDrawObjects, RemoveDrawObjects);

            canvasDataContext.CommitTransaction(action);
        }
Example #2
0
        /// <summary>
        /// 将当前<paramref name="canvasDataContext"/>中的未完成编辑完成,并将<see cref="ICanvasDataContext.CurrentEditTool"/>置空;
        /// </summary>
        /// <param name="canvasDataContext"></param>
        public static void CommitEdit(this ICanvasDataContext canvasDataContext)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            canvasDataContext.CurrentEditTool = null;
        }
Example #3
0
        public static IEnumerable <DrawObject> GetAllVisibleDrawObjects(this ICanvasDataContext canvasDataContext)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            return(canvasDataContext.GetAllDrawObjects()?.Where(p => p.IsVisible));
        }
Example #4
0
        /// <summary>
        /// 获取所有指定类型的绘制对象;
        /// </summary>
        /// <typeparam name="TDrawObject"></typeparam>
        /// <param name="canvasDataContext"></param>
        /// <returns></returns>
        public static IEnumerable <TDrawObject> GetAllDrawObjects <TDrawObject>(this ICanvasDataContext canvasDataContext) where TDrawObject : DrawObject
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            return(canvasDataContext.GetAllDrawObjects()?.OfType <TDrawObject>());
        }
        private void CanvasDataContext_IsSnapingEnabledChanged(ICanvasDataContext canvasDataContext)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            IsChecked = canvasDataContext.IsSnapingEnabled;
        }
Example #6
0
        /// <summary>
        /// 当前上下文中的所有图层的可见状态;
        /// </summary>
        /// <param name="canvasDataContext"></param>
        public static void SetAllLayersVisible(this ICanvasDataContext canvasDataContext, bool isVisible)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            foreach (var layer in canvasDataContext.Layers)
            {
                layer.IsVisible = isVisible;
            }
        }
        private void CanvasDataContext_MouseHoverSnapShapeChanged(ICanvasDataContext canvasDataContext)
        {
            var currentSnapShape = CanvasService.CanvasDataContext?.MouseHoverSnapShape;

            if (currentSnapShape != null && currentSnapShape.Position != null)
            {
                Text = LanguageService.FindResourceString(StatusBarText_CurrentSnapPosition) + $"({currentSnapShape.Position.X:F3},{currentSnapShape.Position.Y:F3})";
            }
            else
            {
                Text = LanguageService.FindResourceString(StatusBarText_CurrentSnapPosition);
            }
        }
Example #8
0
        /// <summary>
        /// 获取所有的绘制对象;
        /// </summary>
        /// <param name="canvasDataContext"></param>
        /// <returns></returns>
        public static IEnumerable <DrawObject> GetAllDrawObjects(this ICanvasDataContext canvasDataContext)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            if (canvasDataContext.Layers == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext.Layers));
            }

            return(canvasDataContext.Layers.SelectMany(p => p.DrawObjects));
        }
Example #9
0
        /// <summary>
        /// 画布当前鼠标位置发生变化时,通知状态栏;
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CanvasDataContext_CurrentMousePositionChanged(ICanvasDataContext canvasDataContext)
        {
            var currentPosition = CanvasService.CanvasDataContext.CurrentMousePosition;

            if (currentPosition == null)
            {
                return;
            }

            StatusBarService.Report(
                LanguageService.TryGetStringWithFormat(
                    Constants.LanguageFormat_CurrentMousePosition,
                    currentPosition.X.ToString("F4"),
                    currentPosition.Y.ToString("F4")
                    )
                );
        }
Example #10
0
        /// <summary>
        /// 清除画布中所有的画布中所有的绘制对象;
        /// </summary>
        public static void RemoveAllDrawObjects(this ICanvasDataContext canvasDataContext)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            if (canvasDataContext.Layers == null)
            {
                return;
            }

            foreach (var layer in canvasDataContext.Layers)
            {
                layer.Clear();
            }
        }
Example #11
0
        /// <summary>
        /// 移除所有选中绘制对象;将自动呈递事务;
        /// </summary>
        public static void RemoveSelectedDrawObjects(this ICanvasDataContext canvasDataContext)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            //处于编辑状态时不能进行删除;
            if (canvasDataContext.CurrentEditTool != null)
            {
                return;
            }

            //选定画布中所有的选中的绘制对象为即将移除的对象;
            var allDrawObjectsToBeRemoved = CanvasService.CanvasDataContext?.GetAllVisibleDrawObjects().Where(p => p.IsSelected).ToList();

            if (allDrawObjectsToBeRemoved == null || allDrawObjectsToBeRemoved.Count == 0)
            {
                return;
            }

            canvasDataContext.RemoveDrawObjects(allDrawObjectsToBeRemoved);
        }
Example #12
0
        public static void AddDrawObjects(this ICanvasDataContext canvasDataContext, ICollection <DrawObject> drawObjects)
        {
            if (drawObjects == null)
            {
                throw new ArgumentNullException(nameof(drawObjects));
            }

            if (drawObjects.Count == 0)
            {
                return;
            }

            var activeLayer = canvasDataContext.ActiveLayer;

            if (activeLayer == null)
            {
                return;
                //throw new InvalidOperationException(LanguageService.FindResourceString(Exception_ActiveLayerCannotBeNull));
            }

            void AddDrawObjects()
            {
                activeLayer.AddDrawObjects(drawObjects);
            };

            void RemoveDrawObjects()
            {
                activeLayer.RemoveDrawObjects(drawObjects);
            }

            AddDrawObjects();

            var transaction = new StandardEditTransaction(RemoveDrawObjects, AddDrawObjects);

            canvasDataContext.CommitTransaction(transaction);
        }
 public CanvasEditToolChangedEventArgs(ICanvasDataContext canvasDataContext, ValueChangedEventArgs <EditTool> valueChangedEventArgs) : base(canvasDataContext, valueChangedEventArgs)
 {
 }
Example #14
0
 public CanvasCanRedoChangedEventArgs(ICanvasDataContext canvasDataContext, CanRedoChangedEventArgs args) : base(canvasDataContext, args)
 {
 }
 public CanvasEditTransactionRedoneEventArgs(ICanvasDataContext canvasDataContext, EditTransactionRedoneEventArgs eventArgs) : base(canvasDataContext, eventArgs)
 {
 }
 public CanvasActiveLayerChangedEventArgs(ICanvasDataContext canvasDataContext, ValueChangedEventArgs <CanvasLayer> args) : base(canvasDataContext, args)
 {
 }
Example #17
0
 public CanvasDrawObjectsAddedEventArgs(ICanvasDataContext canvasDataContext, DrawObjectsAddedEventArgs drawObjectAddedEventArgs) : base(canvasDataContext, drawObjectAddedEventArgs)
 {
 }
Example #18
0
        /// <summary>
        /// 在画布上下文中,获取所有特定类型的可见绘制对象;
        /// </summary>
        /// <typeparam name="TDrawObject"></typeparam>
        /// <param name="canvasDataContext"></param>
        /// <returns></returns>
        public static IEnumerable <TDrawObject> GetAllVisibleDrawObject <TDrawObject>(this ICanvasDataContext canvasDataContext) where TDrawObject : DrawObject
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            return(canvasDataContext?.Layers?.SelectMany(p => p.DrawObjects)?.Select(p => p as TDrawObject)?.Where(p => p != null && p.IsVisible));
        }
Example #19
0
        /// <summary>
        /// 调整画布位置和缩放比例,以使得所有绘制对象在可见的范围内;
        /// </summary>
        public static void ViewAllDrawObjects(this ICanvasDataContext canvasDataContext)
        {
            if (canvasDataContext == null)
            {
                throw new ArgumentNullException(nameof(canvasDataContext));
            }

            if (canvasDataContext.CanvasProxy == null)
            {
                return;
            }

            if (canvasDataContext.Layers == null)
            {
                return;
            }

            //获取所有绘制对象所在的矩形;
            var rects = canvasDataContext.Layers.
                        SelectMany(p => p.DrawObjects).
                        Select(p => p.GetBoundingRect()).Where(p => p != null);

            var allVertexes = rects.SelectMany(p => p.GetVertexes()).ToArray();

            if (allVertexes.Length == 0)
            {
                return;
            }

            //取所有矩形的最小/大的横/纵坐标;
            //获得关注区域的信息,这将是一个矩形;(长度/宽度可能为零);
            var minX = allVertexes.Min(p => p.X);
            var maxX = allVertexes.Max(p => p.X);
            var minY = allVertexes.Min(p => p.Y);
            var maxY = allVertexes.Max(p => p.Y);

            var canvasProxy  = canvasDataContext.CanvasProxy;
            var actualWidth  = canvasProxy.ActualWidth;
            var actualHeight = canvasProxy.ActualHeight;

            //计算该矩形区域的中点位置;
            var middleX = (minX + maxX) / 2;
            var middleY = (minY + maxY) / 2;

            //计算该矩形区域的长宽;加上一个常数是为了防止该矩形区域中任意一边为零的情况,导致出现除以零的异常;
            var newWidth  = canvasProxy.ToUnit(canvasProxy.ToScreen(maxX - minX) + 200);
            var newHeight = canvasProxy.ToUnit(canvasProxy.ToScreen(maxY - minY) + 200);

            //与当前放大比例下的矩形区域大小进行比例计算,以计算缩放应该乘以的倍数;
            var timeX = canvasProxy.ToUnit(actualWidth) / newWidth;
            var timeY = canvasProxy.ToUnit(actualHeight) / newHeight;

            canvasDataContext.Zoom *= Math.Min(timeX, timeY);

            //通过改变原点所在的视图坐标,将该矩形区域的中点移动至视图中心位置;
            //计算该中点与原点的视图偏移;
            var middlePointToPanOffset =
                canvasProxy.ToScreen(new Vector2D(middleX, middleY)) -
                canvasProxy.ToScreen(Vector2D.Zero);

            //以下操作等效于将原点平移至视图中心位置后再将其向矩形区域中点相反的方向进行平移;
            canvasDataContext.PanScreenPosition = new Vector2D(actualWidth / 2, actualHeight / 2) - middlePointToPanOffset;
        }
 public CanvasDrawObjectSelectedChangedEventArgs(ICanvasDataContext canvasDataContext, DrawObjectSelectedChangedEventArgs args) : base(canvasDataContext, args)
 {
 }
Example #21
0
        private void CanvasDataContext_ZoomChanged(ICanvasDataContext canvasDataContext)
        {
            var zoom = CanvasService.CanvasDataContext.Zoom;

            Text = $"{_statusBarText_Zoom}{zoom:F3}";
        }
 public CanvasDrawObjectsRemovingEventArgs(ICollection <DrawObject> removingDrawObjects, ICanvasDataContext canvasDataContext)
 {
     RemovingDrawObjects = removingDrawObjects ?? throw new ArgumentNullException(nameof(removingDrawObjects));
     CanvasDataContext   = canvasDataContext ?? throw new ArgumentNullException(nameof(canvasDataContext));
 }
Example #23
0
        public CanvasEventArgs(ICanvasDataContext canvasDataContext, TEventArgs eventArgs)
        {
            CanvasDataContext = canvasDataContext ?? throw new ArgumentNullException(nameof(canvasDataContext));

            EventArgs = eventArgs ?? throw new ArgumentNullException(nameof(eventArgs));
        }