internal void ApplyPreset(PresetModel state) { if (state == null) { Log("Attempted to apply a PresetState that was null"); return; } //start an undoBeginGroup using (var undoGroup = this.undoRecorder.BeginActionGroup()) { //reload each node, and record each each modification in the undogroup foreach (var node in state.Nodes) { //check that node still exists in this workspace, //otherwise bail on this node if (nodes.Contains(node)) { var originalpos = node.Position; var serializedNode = state.SerializedNodes.ToList().Find(x => Guid.Parse(x.GetAttribute("guid")) == node.GUID); //overwrite the xy coords of the serialized node with the current position, so the node is not moved serializedNode.SetAttribute("x", originalpos.X.ToString()); serializedNode.SetAttribute("y", originalpos.Y.ToString()); this.undoRecorder.RecordModificationForUndo(node); this.ReloadModel(serializedNode); } } //select all the modified nodes in the UI DynamoSelection.Instance.ClearSelection(); foreach(var node in state.Nodes) { DynamoSelection.Instance.Selection.Add(node); } } }
public void RemoveState(PresetModel state) { if (Presets.Contains(state)) { presets.Remove(state); } }
/// <summary> /// this method creates a new preset state from a set of NodeModels and adds this new state to this presets collection /// </summary> /// <param name="name">the name of preset state</param> /// <param name="description">a description of what the state does</param> /// <param name="currentSelection">a set of NodeModels that are to be serialized in this state</param> /// <param name="id">a GUID id for the state, if not supplied, a new GUID will be generated, cannot be a duplicate</param> private void AddPresetCore(string name, string description, IEnumerable<NodeModel> currentSelection, Guid id = new Guid()) { if (currentSelection == null || currentSelection.Count() < 1) { throw new ArgumentException("currentSelection is empty or null"); } var inputs = currentSelection; if (Presets.Any(x => x.Guid == id)) { throw new ArgumentException("duplicate id in collection"); } var newstate = new PresetModel(name, description, inputs, id); presets.Add(newstate); }
/// <summary> /// this method creates a new preset state from a set of NodeModels and adds this new state to this presets collection /// </summary> /// <param name="name">the name of preset state</param> /// <param name="description">a description of what the state does</param> /// <param name="currentSelection">a set of NodeModels that are to be serialized in this state</param> /// <param name="id">a GUID id for the state, if not supplied, a new GUID will be generated, cannot be a duplicate</param> private PresetModel AddPresetCore(string name, string description, IEnumerable<NodeModel> currentSelection) { if (currentSelection == null || currentSelection.Count() < 1) { throw new ArgumentException("currentSelection is empty or null"); } var inputs = currentSelection; var newstate = new PresetModel(name, description, inputs); if (Presets.Any(x => x.GUID == newstate.GUID)) { throw new ArgumentException("duplicate id in collection"); } presets.Add(newstate); return newstate; }
public void CreateModel(XmlElement modelData) { var helper = new XmlElementHelper(modelData); string typeName = helper.ReadString("type", String.Empty); if (string.IsNullOrEmpty(typeName)) { // If there wasn't a "type" attribute, then we fall-back onto // the name of the XmlElement itself, which is usually the type // name. typeName = modelData.Name; if (string.IsNullOrEmpty(typeName)) { string guid = helper.ReadString("guid"); throw new InvalidOperationException( string.Format("No type information: {0}", guid)); } } /* if (typeName.Equals("Dynamo.Nodes.DSFunction") || typeName.Equals("Dynamo.Nodes.DSVarArgFunction")) { // For DSFunction and DSVarArgFunction node types, the type name // is actually embedded within "name" attribute (for an example, // "UV.ByCoordinates@double,double"). // typeName = modelData.Attributes["name"].Value; } */ if (typeName.StartsWith("Dynamo.Models.ConnectorModel")) { var connector = NodeGraph.LoadConnectorFromXml(modelData, Nodes.ToDictionary(node => node.GUID)); OnConnectorAdded(connector); // Update view-model and view. } else if (typeName.StartsWith("Dynamo.Models.NoteModel")) { var noteModel = NodeGraph.LoadNoteFromXml(modelData); Notes.Add(noteModel); //check whether this note belongs to a group foreach (var annotation in Annotations) { //this note "was" in a group if (annotation.DeletedModelBases.Any(m => m.GUID == noteModel.GUID)) { annotation.AddToSelectedModels(noteModel); } } } else if (typeName.StartsWith("Dynamo.Models.AnnotationModel")) { var selectedNodes = this.Nodes == null ? null : this.Nodes.Where(s => s.IsSelected); var selectedNotes = this.Notes == null ? null : this.Notes.Where(s => s.IsSelected); var annotationModel = new AnnotationModel(selectedNodes, selectedNotes); annotationModel.ModelBaseRequested += annotationModel_GetModelBase; annotationModel.Disposed += (_) => annotationModel.ModelBaseRequested -= annotationModel_GetModelBase; annotationModel.Deserialize(modelData, SaveContext.Undo); Annotations.Add(annotationModel); } else if (typeName.Contains("PresetModel")) { var preset = new PresetModel(this.Nodes); preset.Deserialize(modelData, SaveContext.Undo); presets.Add(preset); //we raise this property change here so that this event bubbles up through //the model and to the DynamoViewModel so that presets show in the UI menu if our undo/redo //created the first preset RaisePropertyChanged("EnablePresetOptions"); } else // Other node types. { NodeModel nodeModel = NodeFactory.CreateNodeFromXml(modelData, SaveContext.Undo, ElementResolver); AddAndRegisterNode(nodeModel); //check whether this node belongs to a group foreach (var annotation in Annotations) { //this node "was" in a group if (annotation.DeletedModelBases.Any(m=>m.GUID == nodeModel.GUID)) { annotation.AddToSelectedModels(nodeModel); } } } }
private static PresetModel PresetFromXml(XmlElement stateNode, IEnumerable<NodeModel> nodesInNodeGraph) { var instance = new PresetModel(nodesInNodeGraph); instance.Deserialize(stateNode, SaveContext.File); return instance; }