public void PerformOperation(MapObject mo)
 {
     var current = Extractor(mo.BoundingBox);
     var target = Extractor(_alignBox);
     var value = target - current;
     var translate = Creator(value);
     var transform = new UnitTranslate(translate);
     mo.Transform(transform, _transformFlags);
 }
        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())));
            }
        }