public void TieToWorld() { if (_document.Selection.IsEmpty() || _document.Selection.InFaceSelection) return; var entities = _document.Selection.GetSelectedObjects().OfType<Entity>().ToList(); var children = entities.SelectMany(x => x.GetChildren()).ToList(); var ac = new ActionCollection(); ac.Add(new Reparent(_document.Map.WorldSpawn.ID, children)); ac.Add(new Delete(entities.Select(x => x.ID))); _document.PerformAction("Tie to World", ac); }
public void TieToEntity() { if (_document.Selection.IsEmpty() || _document.Selection.InFaceSelection) return; var entities = _document.Selection.GetSelectedObjects().OfType<Entity>().ToList(); Entity existing = null; if (entities.Count == 1) { var result = new QuickForms.QuickForm("Existing Entity in Selection") { Width = 400 } .Label(String.Format("You have selected an existing entity (a '{0}'), how would you like to proceed?", entities[0].ClassName)) .Label(" - Keep the existing entity and add the selected items to the entity") .Label(" - Create a new entity and add the selected items to the new entity") .Item(new QuickFormDialogButtons() .Button("Keep Existing", DialogResult.Yes) .Button("Create New", DialogResult.No) .Button("Cancel", DialogResult.Cancel)) .ShowDialog(); if (result == DialogResult.Yes) { existing = entities[0]; } } else if (entities.Count > 1) { var qf = new QuickForms.QuickForm("Multiple Entities Selected") {Width = 400} .Label("You have selected multiple entities, which one would you like to keep?") .ComboBox("Entity", entities.Select(x => new EntityContainer {Entity = x})) .OkCancel(); var result = qf.ShowDialog(); if (result == DialogResult.OK) { var cont = qf.Object("Entity") as EntityContainer; if (cont != null) existing = cont.Entity; } } var ac = new ActionCollection(); if (existing == null) { var def = _document.Game.DefaultBrushEntity; var entity = _document.GameData.Classes.FirstOrDefault(x => x.Name.ToLower() == def.ToLower()) ?? _document.GameData.Classes.Where(x => x.ClassType == ClassType.Solid).OrderBy(x => x.Name.StartsWith("trigger_once") ? 0 : 1).FirstOrDefault(); if (entity == null) { MessageBox.Show("No solid entities found. Please make sure your FGDs are configured correctly.", "No entities found!"); return; } existing = new Entity(_document.Map.IDGenerator.GetNextObjectID()) { EntityData = new EntityData(entity), ClassName = entity.Name, Colour = Colour.GetDefaultEntityColour() }; ac.Add(new Create(_document.Map.WorldSpawn.ID, existing)); } var reparent = _document.Selection.GetSelectedParents().Where(x => x != existing).ToList(); ac.Add(new Reparent(existing.ID, reparent)); ac.Add(new Actions.MapObjects.Selection.Select(existing)); _document.PerformAction("Tie to Entity", ac); Mediator.Publish(HotkeysMediator.ObjectProperties); }
/// <summary> /// Runs the transform on all the currently selected objects /// </summary> /// <param name="transformationName">The name of the transformation</param> /// <param name="transform">The transformation to apply</param> /// <param name="clone">True to create a clone before transforming the original.</param> private void ExecuteTransform(string transformationName, IUnitTransformation transform, bool clone) { if (clone) transformationName += "-clone"; var objects = Document.Selection.GetSelectedParents().ToList(); var name = String.Format("{0} {1} object{2}", transformationName, objects.Count, (objects.Count == 1 ? "" : "s")); var cad = new CreateEditDelete(); var action = new ActionCollection(cad); if (clone) { // Copy the selection, transform it, and reselect var copies = ClipboardManager.CloneFlatHeirarchy(Document, Document.Selection.GetSelectedObjects()).ToList(); foreach (var mo in copies) { mo.Transform(transform, Document.Map.GetTransformFlags()); if (Sledge.Settings.Select.KeepVisgroupsWhenCloning) continue; foreach (var o in mo.FindAll()) o.Visgroups.Clear(); } cad.Create(Document.Map.WorldSpawn.ID, copies); var sel = new ChangeSelection(copies.SelectMany(x => x.FindAll()), Document.Selection.GetSelectedObjects()); action.Add(sel); } else { // Transform the selection cad.Edit(objects, new TransformEditOperation(transform, Document.Map.GetTransformFlags())); } // Execute the action Document.PerformAction(name, action); }
private void Apply() { string actionText = null; var ac = new ActionCollection(); var editAction = GetEditEntityDataAction(); var visgroupAction = GetUpdateVisgroupsAction(); if (editAction != null) { // The entity change is more important to show actionText = "Edit entity data"; ac.Add(editAction); } if (visgroupAction != null) { // Visgroup change shows if entity data not changed if (actionText == null) actionText = "Edit object visgroups"; ac.Add(visgroupAction); } if (!ac.IsEmpty()) { // Run if either action shows changes Document.PerformAction(actionText, ac); } Class.BackColor = Color.White; }
public override void MouseDown(ViewportBase viewport, ViewportEvent e) { var vp = viewport as Viewport3D; if (vp == null || (e.Button != MouseButtons.Left && e.Button != MouseButtons.Right)) return; var behaviour = e.Button == MouseButtons.Left ? _form.GetLeftClickBehaviour(KeyboardState.Ctrl, KeyboardState.Shift, KeyboardState.Alt) : _form.GetRightClickBehaviour(KeyboardState.Ctrl, KeyboardState.Shift, KeyboardState.Alt); var ray = vp.CastRayFromScreen(e.X, e.Y); var hits = Document.Map.WorldSpawn.GetAllNodesIntersectingWith(ray).OfType<Solid>(); var clickedFace = hits.SelectMany(f => f.Faces) .Select(x => new {Item = x, Intersection = x.GetIntersectionPoint(ray)}) .Where(x => x.Intersection != null) .OrderBy(x => (x.Intersection - ray.Start).VectorMagnitude()) .Select(x => x.Item) .FirstOrDefault(); if (clickedFace == null) return; var faces = new List<Face>(); if (KeyboardState.Shift) faces.AddRange(clickedFace.Parent.Faces); else faces.Add(clickedFace); var firstSelected = Document.Selection.GetSelectedFaces().FirstOrDefault(); var firstClicked = faces.FirstOrDefault(face => !String.IsNullOrWhiteSpace(face.Texture.Name)); var ac = new ActionCollection(); var select = new ChangeFaceSelection( KeyboardState.Ctrl ? faces.Where(x => !x.IsSelected) : faces, KeyboardState.Ctrl ? faces.Where(x => x.IsSelected) : Document.Selection.GetSelectedFaces().Where(x => !faces.Contains(x))); Action lift = () => { if (firstClicked == null) return; var itemToSelect = Document.TextureCollection.GetItem(firstClicked.Texture.Name) ?? new TextureItem(null, firstClicked.Texture.Name, TextureFlags.Missing, 64, 64); Mediator.Publish(EditorMediator.TextureSelected, itemToSelect); }; switch (behaviour) { case SelectBehaviour.Select: ac.Add(select); break; case SelectBehaviour.LiftSelect: lift(); ac.Add(select); break; case SelectBehaviour.Lift: lift(); break; case SelectBehaviour.Apply: case SelectBehaviour.ApplyWithValues: var item = _form.GetFirstSelectedTexture(); if (item != null) { var texture = item.GetTexture(); ac.Add(new EditFace(faces, (document, face) => { face.Texture.Name = item.Name; face.Texture.Texture = texture; if (behaviour == SelectBehaviour.ApplyWithValues && firstSelected != null) { // Calculates the texture coordinates face.AlignTextureWithFace(firstSelected); } else if (behaviour == SelectBehaviour.ApplyWithValues) { face.Texture.XScale = _form.CurrentProperties.XScale; face.Texture.YScale = _form.CurrentProperties.YScale; face.Texture.XShift = _form.CurrentProperties.XShift; face.Texture.YShift = _form.CurrentProperties.YShift; face.SetTextureRotation(_form.CurrentProperties.Rotation); } else { face.CalculateTextureCoordinates(true); } }, true)); } break; case SelectBehaviour.AlignToView: var right = vp.Camera.GetRight(); var up = vp.Camera.GetUp(); var loc = vp.Camera.Location; var point = new Coordinate((decimal)loc.X, (decimal)loc.Y, (decimal)loc.Z); var uaxis = new Coordinate((decimal) right.X, (decimal) right.Y, (decimal) right.Z); var vaxis = new Coordinate((decimal) up.X, (decimal) up.Y, (decimal) up.Z); ac.Add(new EditFace(faces, (document, face) => { face.Texture.XScale = 1; face.Texture.YScale = 1; face.Texture.UAxis = uaxis; face.Texture.VAxis = vaxis; face.Texture.XShift = face.Texture.UAxis.Dot(point); face.Texture.YShift = face.Texture.VAxis.Dot(point); face.Texture.Rotation = 0; face.CalculateTextureCoordinates(true); }, false)); break; default: throw new ArgumentOutOfRangeException(); } if (!ac.IsEmpty()) { Document.PerformAction("Texture selection", ac); } }
/// <summary> /// Runs the transform on all the currently selected objects /// </summary> /// <param name="transformationName">The name of the transformation</param> /// <param name="transform">The transformation to apply</param> /// <param name="clone">True to create a clone before transforming the original.</param> private void ExecuteTransform(string transformationName, IUnitTransformation transform, bool clone) { var action = new ActionCollection(); if (clone) transformationName += "-clone"; var objects = Document.Selection.GetSelectedParents().ToList(); var name = String.Format("{0} {1} object{2}", transformationName, objects.Count, (objects.Count == 1 ? "" : "s")); if (clone) { // Copy the selection before transforming var copies = ClipboardManager.CloneFlatHeirarchy(Document, Document.Selection.GetSelectedObjects()).ToList(); action.Add(new Create(copies)); } // Transform the selection var keepVisgroups = Sledge.Settings.Select.KeepVisgroupsWhenCloning; action.Add(new Edit(objects, (d, x) => { x.Transform(transform, d.Map.GetTransformFlags()); if (!keepVisgroups) { foreach (var o in x.FindAll()) { o.Visgroups.Clear(); } } })); // Execute the action Document.PerformAction(name, action); }