protected override async Task Invoke(MapDocument document, CommandParameters parameters) { var objects = document.Selection.GetSelectedParents().ToList(); var box = document.Selection.GetSelectionBoundingBox(); using (var dialog = new TransformDialog(box)) { _translator.Value.Translate(dialog); if (dialog.ShowDialog() == DialogResult.OK) { try { var transaction = new Transaction(); // Add the operation var transform = dialog.GetTransformation(box); var transformOperation = new BspEditor.Modification.Operations.Mutation.Transform(transform, objects); transaction.Add(transformOperation); // Check for texture transform var tl = document.Map.Data.GetOne <TransformationFlags>() ?? new TransformationFlags(); if (dialog.Type == TransformDialog.TransformType.Rotate || dialog.Type == TransformDialog.TransformType.Translate) { if (tl.TextureLock) { transaction.Add(new TransformTexturesUniform(transform, objects.SelectMany(x => x.FindAll()))); } } else if (dialog.Type == TransformDialog.TransformType.Scale) { if (tl.TextureScaleLock) { transaction.Add(new TransformTexturesScale(transform, objects.SelectMany(x => x.FindAll()))); } } await MapDocumentOperation.Perform(document, transaction); } catch (TransformDialog.CannotScaleByZeroException) { MessageBox.Show(ErrorCannotScaleByZeroMessage, ErrorCannotScaleByZeroTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }
public void Transform() { if (_document.Selection.IsEmpty() || _document.Selection.InFaceSelection) { return; } var box = _document.Selection.GetSelectionBoundingBox(); using (var td = new TransformDialog(box)) { if (td.ShowDialog() != DialogResult.OK) { return; } var value = td.TransformValue; IUnitTransformation transform = null; switch (td.TransformType) { case TransformType.Rotate: var mov = Matrix.Translation(-box.Center); // Move to zero var rot = Matrix.Rotation(Quaternion.EulerAngles(value * DMath.PI / 180)); // Do rotation var fin = Matrix.Translation(box.Center); // Move to final origin transform = new UnitMatrixMult(fin * rot * mov); break; case TransformType.Translate: transform = new UnitTranslate(value); break; case TransformType.Scale: transform = new UnitScale(value, box.Center); break; } if (transform == null) { return; } var selected = _document.Selection.GetSelectedParents(); _document.PerformAction("Transform selection", new Edit(selected, new TransformEditOperation(transform, _document.Map.GetTransformFlags()))); } }