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(); }