示例#1
0
        private void ApplyTransform(ITransform transform, IGraphicsElement graphicsElement)
        {
            if (transform is IRotateTransform rotateTransform)
            {
                double centerX = graphicsElement.Left + rotateTransform.CenterX;
                double centerY = graphicsElement.Top + rotateTransform.CenterY;

                skCanvas.RotateDegrees((float)rotateTransform.Angle, (float)centerX, (float)centerY);
            }
            else if (transform is IScaleTransform scaleTransform)
            {
                double centerX = graphicsElement.Left + scaleTransform.CenterX;
                double centerY = graphicsElement.Top + scaleTransform.CenterY;

                skCanvas.Scale((float)scaleTransform.ScaleX, (float)scaleTransform.ScaleY, (float)centerX, (float)centerY);
            }
            else if (transform is ITranslateTransform translateTransform)
            {
                skCanvas.Translate((float)translateTransform.X, (float)translateTransform.Y);
            }
            else if (transform is ITransformGroup transformGroup)
            {
                foreach (ITransform childTransform in transformGroup.Children)
                {
                    ApplyTransform(childTransform, graphicsElement);
                }
            }
            else
            {
                throw new InvalidOperationException($"Unknown transform type {transform.GetType()}");
            }
        }
        private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Point mousePos    = e.GetPosition(canvas);
            Point globalPoint = new Point((mousePos.X / canvasSize.X) * canvasPos.Width + canvasPos.Left, (mousePos.Y / canvasSize.Y) * canvasPos.Height + canvasPos.Top);

            IGraphicsElement selected = null;

            double           x = globalPoint.X - DX / 2;
            double           y = globalPoint.Y - DY / 2;
            IGraphicsElement element;

            elements.Reset();

            while (elements.Next(out element))
            {
                if (element.IO == null)
                {
                    continue;
                }

                Rect   aabb   = element.AABB;
                Point  center = new Point(aabb.Left + aabb.Width / 2, aabb.Top + aabb.Height / 2);
                double dx     = center.X - x;
                double dy     = center.Y - y;

                if (dx >= 0 && dx < DX && dy >= 0 && dy < DY)
                {
                    selected = element;
                    break;
                }
            }

            if (selected == null)
            {
                return;
            }

            new ElementWindow(selected.IO.GID, client)
            {
                Owner = this
            }.Show();
        }