public override async Task Apply(CADDocument doc, params string[] args) { Editor ed = doc.Editor; var s = await ed.GetControlPoints("Select objects: "); if (s.Result != ResultMode.OK || s.Value.Count == 0) { return; } var p1 = await ed.GetPoint("Base point: "); if (p1.Result != ResultMode.OK) { return; } Composite consItems = new Composite(); CPSelectionSet consSet = new CPSelectionSet(); var ext = new Extents2D(); foreach (var pair in s.Value) { Drawable item = pair.Key.Clone(); ext.Add(item.GetExtents()); consItems.Add(item); consSet.Add(item, pair.Value); } doc.Transients.Add(consItems); float size = System.Math.Max(ext.Width, ext.Height); float lastScale = 1; var p2 = await ed.GetDistance("Scale: ", p1.Value, (p) => { p /= size; foreach (Drawable item in consItems) { item.TransformControlPoints(consSet[item], Matrix2D.Scale(p1.Value, p / lastScale)); } lastScale = p; }); doc.Transients.Remove(consItems); if (p2.Result != ResultMode.OK) { return; } foreach (var pair in s.Value) { pair.Key.TransformControlPoints(pair.Value.ToArray(), Matrix2D.Scale(p1.Value, p2.Value)); } }
public override async Task Apply(CADDocument doc, params string[] args) { Editor ed = doc.Editor; var s = await ed.GetControlPoints("Select objects: "); if (s.Result != ResultMode.OK || s.Value.Count == 0) { return; } var p1 = await ed.GetPoint("Base point: "); if (p1.Result != ResultMode.OK) { return; } Composite consItems = new Composite(); CPSelectionSet consSet = new CPSelectionSet(); foreach (var pair in s.Value) { Drawable item = pair.Key.Clone(); consItems.Add(item); consSet.Add(item, pair.Value); } doc.Transients.Add(consItems); float lastAngle = 0; var p2 = await ed.GetAngle("Rotation angle: ", p1.Value, (p) => { foreach (Drawable item in consItems) { item.TransformControlPoints(consSet[item], Matrix2D.Rotation(p1.Value, p - lastAngle)); } lastAngle = p; }); doc.Transients.Remove(consItems); if (p2.Result != ResultMode.OK) { return; } foreach (var pair in s.Value) { pair.Key.TransformControlPoints(pair.Value.ToArray(), Matrix2D.Rotation(p1.Value, p2.Value)); } }