public void Connect(dynConnectorModel connector) { connectors.Add(connector); //throw the event for a connection OnPortConnected(EventArgs.Empty); IsConnected = true; }
private void Connect(object parameters) { //make the connector model var end = parameters as dynPortModel; _model = dynConnectorModel.Make(_activeStartPort.Owner, end.Owner, _activeStartPort.Index, end.Index, 0); if (_model == null) { return; } _model.Connected += ModelConnected; _model.Start.PropertyChanged += Start_PropertyChanged; _model.End.PropertyChanged += End_PropertyChanged; dynSettings.Controller.DynamoViewModel.Model.PropertyChanged += Model_PropertyChanged; dynSettings.Controller.DynamoViewModel.PropertyChanged += DynamoViewModel_PropertyChanged; IsHitTestVisible = false; }
public dynConnectorViewModel(dynConnectorModel model) { ConnectCommand = new DelegateCommand<object>(Connect, CanConnect); RedrawCommand = new DelegateCommand(Redraw, CanRedraw); HighlightCommand = new DelegateCommand(Highlight, CanHighlight); UnHighlightCommand = new DelegateCommand(Unhighlight, CanUnHighlight); var bc = new BrushConverter(); StrokeBrush = (Brush)bc.ConvertFrom("#777"); _model = model; _model.Start.PropertyChanged += Start_PropertyChanged; _model.End.PropertyChanged += End_PropertyChanged; _model.PropertyChanged += Model_PropertyChanged; _model.Start.Owner.PropertyChanged += StartOwner_PropertyChanged; _model.End.Owner.PropertyChanged += EndOwner_PropertyChanged; dynSettings.Controller.DynamoViewModel.PropertyChanged += DynamoViewModel_PropertyChanged; }
public void Disconnect(dynConnectorModel connector) { //throw the event for a connection OnPortDisconnected(EventArgs.Empty); if (connectors.Contains(connector)) { connectors.Remove(connector); } //don't set back to white if //there are still connectors on this port if (connectors.Count == 0) { IsConnected = false; } if (connectors.Count == 0) { Owner.State = ElementState.DEAD; } }
public dynConnectorViewModel(dynConnectorModel model) { ConnectCommand = new DelegateCommand <object>(Connect, CanConnect); RedrawCommand = new DelegateCommand(Redraw, CanRedraw); HighlightCommand = new DelegateCommand(Highlight, CanHighlight); UnHighlightCommand = new DelegateCommand(Unhighlight, CanUnHighlight); var bc = new BrushConverter(); StrokeBrush = (Brush)bc.ConvertFrom("#777"); _model = model; _model.Start.PropertyChanged += Start_PropertyChanged; _model.End.PropertyChanged += End_PropertyChanged; _model.PropertyChanged += Model_PropertyChanged; _model.Start.Owner.PropertyChanged += StartOwner_PropertyChanged; _model.End.Owner.PropertyChanged += EndOwner_PropertyChanged; dynSettings.Controller.DynamoViewModel.PropertyChanged += DynamoViewModel_PropertyChanged; //make sure we have valid curve points Redraw(); }
public void Disconnect(dynConnectorModel connector) { //throw the event for a connection OnPortDisconnected(EventArgs.Empty); if (connectors.Contains(connector)) { connectors.Remove(connector); } //don't set back to white if //there are still connectors on this port if (connectors.Count == 0) { IsConnected = false; } if (connectors.Count == 0) Owner.State = ElementState.DEAD; }
public void Connect(dynConnectorModel connector) { connectors.Add(connector); //throw the event for a connection OnPortConnected(EventArgs.Empty); IsConnected = true; }
/// <summary> /// Deserialize a function definition from a given path. A side effect of this function is that /// the node is added to the dictionary of loadedNodes. /// </summary> /// <param name="funcDefGuid">The function guid we're currently loading</param> /// <param name="controller">Reference to the calling controller</param> /// <param name="def">The resultant function definition</param> /// <returns></returns> private bool GetDefinitionFromPath(Guid funcDefGuid, DynamoController controller, out FunctionDefinition def) { try { var xmlPath = GetNodePath(funcDefGuid); #region read xml file var xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); string funName = null; string category = ""; double cx = DynamoView.CANVAS_OFFSET_X; double cy = DynamoView.CANVAS_OFFSET_Y; string id = ""; // load the header foreach (XmlNode node in xmlDoc.GetElementsByTagName("dynWorkspace")) { foreach (XmlAttribute att in node.Attributes) { if (att.Name.Equals("X")) cx = Convert.ToDouble(att.Value); else if (att.Name.Equals("Y")) cy = Convert.ToDouble(att.Value); else if (att.Name.Equals("Name")) funName = att.Value; else if (att.Name.Equals("Category")) category = att.Value; else if (att.Name.Equals("ID")) { id = att.Value; } } } // we have a dyf and it lacks an ID field, we need to assign it // a deterministic guid based on its name. By doing it deterministically, // files remain compatible if (string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(funName)) { id = GuidUtility.Create(GuidUtility.UrlNamespace, funName).ToString(); } #endregion DynamoCommands.WriteToLogCmd.Execute("Loading node definition for \"" + funName + "\" from: " + xmlPath); var workSpace = new FuncWorkspace( funName, category.Length > 0 ? category : BuiltinNodeCategories.SCRIPTING_CUSTOMNODES, cx, cy); def = new FunctionDefinition(Guid.Parse(id)) { Workspace = workSpace }; // load a dummy version, so any nodes depending on this node // will find an (empty) identifier on compilation FScheme.Expression dummyExpression = FScheme.Expression.NewNumber_E(0); controller.FSchemeEnvironment.DefineSymbol(def.FunctionId.ToString(), dummyExpression); this.loadedNodes.Add(def.FunctionId, def); dynWorkspaceModel ws = def.Workspace; XmlNodeList elNodes = xmlDoc.GetElementsByTagName("dynElements"); XmlNodeList cNodes = xmlDoc.GetElementsByTagName("dynConnectors"); XmlNodeList nNodes = xmlDoc.GetElementsByTagName("dynNotes"); XmlNode elNodesList = elNodes[0]; XmlNode cNodesList = cNodes[0]; XmlNode nNodesList = nNodes[0]; #region instantiate nodes List<Guid> badNodes = new List<Guid>(); foreach (XmlNode elNode in elNodesList.ChildNodes) { XmlAttribute typeAttrib = elNode.Attributes[0]; XmlAttribute guidAttrib = elNode.Attributes[1]; XmlAttribute nicknameAttrib = elNode.Attributes[2]; XmlAttribute xAttrib = elNode.Attributes[3]; XmlAttribute yAttrib = elNode.Attributes[4]; XmlAttribute lacingAttrib = null; if (elNode.Attributes.Count > 5) { lacingAttrib = elNode.Attributes[5]; } string typeName = typeAttrib.Value; string oldNamespace = "Dynamo.Elements."; if (typeName.StartsWith(oldNamespace)) typeName = "Dynamo.Nodes." + typeName.Remove(0, oldNamespace.Length); //test the GUID to confirm that it is non-zero //if it is zero, then we have to fix it //this will break the connectors, but it won't keep //propagating bad GUIDs var guid = new Guid(guidAttrib.Value); if (guid == Guid.Empty) { guid = Guid.NewGuid(); } string nickname = nicknameAttrib.Value; double x = Convert.ToDouble(xAttrib.Value); double y = Convert.ToDouble(yAttrib.Value); //Type t = Type.GetType(typeName); TypeLoadData tData; Type t; if (!controller.BuiltInTypesByName.TryGetValue(typeName, out tData)) { //try and get a system type by this name t = Type.GetType(typeName); //if we still can't find the type, try the also known as attributes if (t == null) { //try to get the also known as values foreach (KeyValuePair<string, TypeLoadData> kvp in controller.BuiltInTypesByName) { var akaAttribs = kvp.Value.Type.GetCustomAttributes(typeof(AlsoKnownAsAttribute), false); if (akaAttribs.Count() > 0) { if ((akaAttribs[0] as AlsoKnownAsAttribute).Values.Contains(typeName)) { controller.DynamoViewModel.Log(string.Format("Found matching node for {0} also known as {1}", kvp.Key, typeName)); t = kvp.Value.Type; } } } } if (t == null) { controller.DynamoViewModel.Log("Could not load node of type: " + typeName); controller.DynamoViewModel.Log("Loading will continue but nodes might be missing from your workflow."); //return false; badNodes.Add(guid); continue; } } else t = tData.Type; dynNodeModel el = dynSettings.Controller.DynamoViewModel.CreateNodeInstance(t, nickname, guid); if (lacingAttrib != null) { LacingStrategy lacing = LacingStrategy.First; Enum.TryParse(lacingAttrib.Value, out lacing); el.ArgumentLacing = lacing; } // note - this is because the connectors fail to be created if there's not added // to the canvas ws.Nodes.Add(el); el.WorkSpace = ws; var node = el; node.X = x; node.Y = y; if (el == null) return false; el.DisableReporting(); el.LoadElement(elNode); // inject the node properties from the xml // it has no if (el is dynFunction) { var fun = el as dynFunction; // we've found a custom node, we need to attempt to load its guid. // if it doesn't exist (i.e. its a legacy node), we need to assign it one, // deterministically Guid funId; try { funId = Guid.Parse(fun.Symbol); } catch { funId = GuidUtility.Create(GuidUtility.UrlNamespace, nicknameAttrib.Value); fun.Symbol = funId.ToString(); } // if it's not a recurisve node and it's not yet loaded, load it if (funcDefGuid != funId && !this.loadedNodes.ContainsKey(funId)) { dynSettings.Controller.CustomNodeLoader.GetFunctionDefinition(funId); fun.Definition = this.loadedNodes[funId]; } else if ( this.loadedNodes.ContainsKey(funId )) { fun.Definition = this.loadedNodes[funId]; } } } #endregion #region instantiate connectors foreach (XmlNode connector in cNodesList.ChildNodes) { XmlAttribute guidStartAttrib = connector.Attributes[0]; XmlAttribute intStartAttrib = connector.Attributes[1]; XmlAttribute guidEndAttrib = connector.Attributes[2]; XmlAttribute intEndAttrib = connector.Attributes[3]; XmlAttribute portTypeAttrib = connector.Attributes[4]; var guidStart = new Guid(guidStartAttrib.Value); var guidEnd = new Guid(guidEndAttrib.Value); int startIndex = Convert.ToInt16(intStartAttrib.Value); int endIndex = Convert.ToInt16(intEndAttrib.Value); int portType = Convert.ToInt16(portTypeAttrib.Value); //find the elements to connect dynNodeModel start = null; dynNodeModel end = null; if (badNodes.Contains(guidStart) || badNodes.Contains(guidEnd)) continue; foreach (dynNodeModel e in ws.Nodes) { if (e.GUID == guidStart) { start = e; } else if (e.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } try { if (start != null && end != null && start != end) { var newConnector = new dynConnectorModel( start, end, startIndex, endIndex, portType, false ); ws.Connectors.Add(newConnector); } } catch { DynamoCommands.WriteToLogCmd.Execute(string.Format("ERROR : Could not create connector between {0} and {1}.", start.NickName, end.NickName)); } } #endregion #region instantiate notes if (nNodesList != null) { foreach (XmlNode note in nNodesList.ChildNodes) { XmlAttribute textAttrib = note.Attributes[0]; XmlAttribute xAttrib = note.Attributes[1]; XmlAttribute yAttrib = note.Attributes[2]; string text = textAttrib.Value; double x = Convert.ToDouble(xAttrib.Value); double y = Convert.ToDouble(yAttrib.Value); //dynNoteView n = Bench.AddNote(text, x, y, ws); //Bench.AddNote(text, x, y, ws); var paramDict = new Dictionary<string, object>(); paramDict.Add("x", x); paramDict.Add("y", y); paramDict.Add("text", text); paramDict.Add("workspace", ws); dynSettings.Controller.DynamoViewModel.AddNoteCommand.Execute(paramDict); } } #endregion foreach (dynNodeModel e in ws.Nodes) e.EnableReporting(); ws.FilePath = xmlPath; controller.PackageManagerClient.LoadPackageHeader(def, funName); var expression = CompileFunction(def); controller.FSchemeEnvironment.DefineSymbol(def.FunctionId.ToString(), expression); } catch (Exception ex) { DynamoCommands.WriteToLogCmd.Execute("There was an error opening the workbench."); DynamoCommands.WriteToLogCmd.Execute(ex); def = null; return false; } return true; }
private void Connect(object parameters) { //make the connector model var end = parameters as dynPortModel; _model = dynConnectorModel.Make(_activeStartPort.Owner, end.Owner, _activeStartPort.Index, end.Index, 0); if (_model == null) return; _model.Connected += ModelConnected; _model.Start.PropertyChanged += Start_PropertyChanged; _model.End.PropertyChanged += End_PropertyChanged; dynSettings.Controller.DynamoViewModel.Model.PropertyChanged += Model_PropertyChanged; dynSettings.Controller.DynamoViewModel.PropertyChanged += DynamoViewModel_PropertyChanged; IsHitTestVisible = false; }
public bool OpenWorkbench(string xmlPath) { Log("Opening home workspace " + xmlPath + "..."); CleanWorkbench(); try { #region read xml file var xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); foreach (XmlNode node in xmlDoc.GetElementsByTagName("dynWorkspace")) { foreach (XmlAttribute att in node.Attributes) { if (att.Name.Equals("X")) { _model.CurrentSpace.X = Convert.ToDouble(att.Value); } else if (att.Name.Equals("Y")) { _model.CurrentSpace.Y = Convert.ToDouble(att.Value); } } } XmlNodeList elNodes = xmlDoc.GetElementsByTagName("dynElements"); XmlNodeList cNodes = xmlDoc.GetElementsByTagName("dynConnectors"); XmlNodeList nNodes = xmlDoc.GetElementsByTagName("dynNotes"); XmlNode elNodesList = elNodes[0]; XmlNode cNodesList = cNodes[0]; XmlNode nNodesList = nNodes[0]; //if there is any problem loading a node, then //add the node's guid to the bad nodes collection //so we can avoid attempting to make connections to it List<Guid> badNodes = new List<Guid>(); foreach (XmlNode elNode in elNodesList.ChildNodes) { XmlAttribute typeAttrib = elNode.Attributes[0]; XmlAttribute guidAttrib = elNode.Attributes[1]; XmlAttribute nicknameAttrib = elNode.Attributes[2]; XmlAttribute xAttrib = elNode.Attributes[3]; XmlAttribute yAttrib = elNode.Attributes[4]; XmlAttribute lacingAttrib = null; if (elNode.Attributes.Count > 5) { lacingAttrib = elNode.Attributes[5]; } string typeName = typeAttrib.Value; //test the GUID to confirm that it is non-zero //if it is zero, then we have to fix it //this will break the connectors, but it won't keep //propagating bad GUIDs var guid = new Guid(guidAttrib.Value); if (guid == Guid.Empty) { guid = Guid.NewGuid(); } string nickname = nicknameAttrib.Value; double x = Convert.ToDouble(xAttrib.Value); double y = Convert.ToDouble(yAttrib.Value); if (typeName.StartsWith("Dynamo.Elements.")) typeName = "Dynamo.Nodes." + typeName.Remove(0, 16); TypeLoadData tData; Type t; if (!Controller.BuiltInTypesByName.TryGetValue(typeName, out tData)) { //try and get a system type by this name t = Type.GetType(typeName); //if we still can't find the type, try the also known as attributes if(t == null) { //try to get the also known as values foreach (KeyValuePair<string, TypeLoadData> kvp in Controller.BuiltInTypesByName) { var akaAttribs = kvp.Value.Type.GetCustomAttributes(typeof(AlsoKnownAsAttribute), false); if (akaAttribs.Count() > 0) { if ((akaAttribs[0] as AlsoKnownAsAttribute).Values.Contains(typeName)) { Log(string.Format("Found matching node for {0} also known as {1}", kvp.Key , typeName)); t = kvp.Value.Type; } } } } if (t == null) { Log("Could not load node of type: " + typeName); Log("Loading will continue but nodes might be missing from your workflow."); //return false; badNodes.Add(guid); continue; } } else t = tData.Type; dynNodeModel el = CreateInstanceAndAddNodeToWorkspace( t, nickname, guid, x, y, _model.CurrentSpace ); if (lacingAttrib != null) { LacingStrategy lacing = LacingStrategy.Disabled; Enum.TryParse(lacingAttrib.Value, out lacing); el.ArgumentLacing = lacing; } el.DisableReporting(); el.LoadElement(elNode); if (ViewingHomespace) el.SaveResult = true; if (el is dynFunction) { var fun = el as dynFunction; //argument lacing on functions should be set to disabled //by default in the constructor, but for any workflow saved //before this was the case, we need to ensure it here. el.ArgumentLacing = LacingStrategy.Disabled; // we've found a custom node, we need to attempt to load its guid. // if it doesn't exist (i.e. its a legacy node), we need to assign it one, // deterministically Guid funId; try { funId = Guid.Parse(fun.Symbol); } catch { funId = GuidUtility.Create(GuidUtility.UrlNamespace, nicknameAttrib.Value); fun.Symbol = funId.ToString(); } fun.Definition = dynSettings.Controller.CustomNodeLoader.GetFunctionDefinition(funId); } } OnRequestLayoutUpdate(this, EventArgs.Empty); foreach (XmlNode connector in cNodesList.ChildNodes) { XmlAttribute guidStartAttrib = connector.Attributes[0]; XmlAttribute intStartAttrib = connector.Attributes[1]; XmlAttribute guidEndAttrib = connector.Attributes[2]; XmlAttribute intEndAttrib = connector.Attributes[3]; XmlAttribute portTypeAttrib = connector.Attributes[4]; var guidStart = new Guid(guidStartAttrib.Value); var guidEnd = new Guid(guidEndAttrib.Value); int startIndex = Convert.ToInt16(intStartAttrib.Value); int endIndex = Convert.ToInt16(intEndAttrib.Value); int portType = Convert.ToInt16(portTypeAttrib.Value); //find the elements to connect dynNodeModel start = null; dynNodeModel end = null; if (badNodes.Contains(guidStart) || badNodes.Contains(guidEnd)) continue; foreach (dynNodeModel e in _model.Nodes) { if (e.GUID == guidStart) { start = e; } else if (e.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } if (start != null && end != null && start != end) { var newConnector = new dynConnectorModel(start, end, startIndex, endIndex, portType); _model.CurrentSpace.Connectors.Add(newConnector); } } #region instantiate notes if (nNodesList != null) { foreach (XmlNode note in nNodesList.ChildNodes) { XmlAttribute textAttrib = note.Attributes[0]; XmlAttribute xAttrib = note.Attributes[1]; XmlAttribute yAttrib = note.Attributes[2]; string text = textAttrib.Value; double x = Convert.ToDouble(xAttrib.Value); double y = Convert.ToDouble(yAttrib.Value); //dynNoteView n = Bench.AddNote(text, x, y, this.CurrentSpace); //Bench.AddNote(text, x, y, this.CurrentSpace); var paramDict = new Dictionary<string, object>(); paramDict.Add("x", x); paramDict.Add("y", y); paramDict.Add("text", text); paramDict.Add("workspace", _model.CurrentSpace); AddNoteCommand.Execute(paramDict); } } #endregion foreach (dynNodeModel e in _model.CurrentSpace.Nodes) e.EnableReporting(); #endregion _model.HomeSpace.FilePath = xmlPath; } catch (Exception ex) { Log("There was an error opening the workbench."); Log(ex); Debug.WriteLine(ex.Message + ":" + ex.StackTrace); CleanWorkbench(); return false; } return true; }
void CreateConnection(object parameters) { Dictionary<string, object> connectionData = parameters as Dictionary<string, object>; dynNodeModel start = (dynNodeModel)connectionData["start"]; dynNodeModel end = (dynNodeModel)connectionData["end"]; int startIndex = (int)connectionData["port_start"]; int endIndex = (int)connectionData["port_end"]; dynConnectorModel c = new dynConnectorModel(start, end, startIndex, endIndex, 0); _model.CurrentSpace.Connectors.Add(c); }
// PB: This is deprecated, can't do it now, though... internal bool OpenDefinition( string xmlPath, Dictionary<Guid, HashSet<FunctionDefinition>> children, Dictionary<Guid, HashSet<Guid>> parents) { try { #region read xml file var xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); string funName = null; string category = ""; double cx = DynamoView.CANVAS_OFFSET_X; double cy = DynamoView.CANVAS_OFFSET_Y; string id = ""; // load the header foreach (XmlNode node in xmlDoc.GetElementsByTagName("dynWorkspace")) { foreach (XmlAttribute att in node.Attributes) { if (att.Name.Equals("X")) cx = Convert.ToDouble(att.Value); else if (att.Name.Equals("Y")) cy = Convert.ToDouble(att.Value); else if (att.Name.Equals("Name")) funName = att.Value; else if (att.Name.Equals("Category")) category = att.Value; else if (att.Name.Equals("ID")) { id = att.Value; } } } // we have a dyf and it lacks an ID field, we need to assign it // a deterministic guid based on its name. By doing it deterministically, // files remain compatible if (string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(funName)) { id = GuidUtility.Create(GuidUtility.UrlNamespace, funName).ToString(); } #endregion //If there is no function name, then we are opening a home definition if (funName == null) { //View the home workspace, then open the bench file if (!ViewingHomespace) ViewHomeWorkspace(); //TODO: Refactor return OpenWorkbench(xmlPath); } else if (Controller.CustomNodeLoader.Contains(funName)) { Log("ERROR: Could not load definition for \"" + funName + "\", a node with this name already exists."); return false; } Log("Loading node definition for \"" + funName + "\" from: " + xmlPath); FunctionDefinition def = NewFunction( Guid.Parse(id), funName, category.Length > 0 ? category : BuiltinNodeCategories.SCRIPTING_CUSTOMNODES, false, cx, cy ); dynWorkspaceModel ws = def.Workspace; //this.Log("Opening definition " + xmlPath + "..."); XmlNodeList elNodes = xmlDoc.GetElementsByTagName("dynElements"); XmlNodeList cNodes = xmlDoc.GetElementsByTagName("dynConnectors"); XmlNodeList nNodes = xmlDoc.GetElementsByTagName("dynNotes"); XmlNode elNodesList = elNodes[0]; XmlNode cNodesList = cNodes[0]; XmlNode nNodesList = nNodes[0]; var dependencies = new Stack<Guid>(); #region instantiate nodes //if there is any problem loading a node, then //add the node's guid to the bad nodes collection //so we can avoid attempting to make connections to it List<Guid> badNodes = new List<Guid>(); foreach (XmlNode elNode in elNodesList.ChildNodes) { XmlAttribute typeAttrib = elNode.Attributes[0]; XmlAttribute guidAttrib = elNode.Attributes[1]; XmlAttribute nicknameAttrib = elNode.Attributes[2]; XmlAttribute xAttrib = elNode.Attributes[3]; XmlAttribute yAttrib = elNode.Attributes[4]; XmlAttribute lacingAttrib = null; if(elNode.Attributes.Count > 5) { lacingAttrib = elNode.Attributes[5]; } string typeName = typeAttrib.Value; string oldNamespace = "Dynamo.Elements."; if (typeName.StartsWith(oldNamespace)) typeName = "Dynamo.Nodes." + typeName.Remove(0, oldNamespace.Length); //test the GUID to confirm that it is non-zero //if it is zero, then we have to fix it //this will break the connectors, but it won't keep //propagating bad GUIDs var guid = new Guid(guidAttrib.Value); if (guid == Guid.Empty) { guid = Guid.NewGuid(); } string nickname = nicknameAttrib.Value; double x = Convert.ToDouble(xAttrib.Value); double y = Convert.ToDouble(yAttrib.Value); //Type t = Type.GetType(typeName); TypeLoadData tData; Type t; if (!Controller.BuiltInTypesByName.TryGetValue(typeName, out tData)) { //try and get a system type by this name t = Type.GetType(typeName); //if we still can't find the type, try the also known as attributes if (t == null) { //try to get the also known as values foreach (KeyValuePair<string, TypeLoadData> kvp in Controller.BuiltInTypesByName) { var akaAttribs = kvp.Value.Type.GetCustomAttributes(typeof(AlsoKnownAsAttribute), false); if (akaAttribs.Count() > 0) { if ((akaAttribs[0] as AlsoKnownAsAttribute).Values.Contains(typeName)) { Log(string.Format("Found matching node for {0} also known as {1}", kvp.Key, typeName)); t = kvp.Value.Type; } } } } if (t == null) { Log("Could not load node of type: " + typeName); Log("Loading will continue but nodes might be missing from your workflow."); //return false; badNodes.Add(guid); continue; } } else t = tData.Type; dynNodeModel el = CreateInstanceAndAddNodeToWorkspace(t, nickname, guid, x, y, ws); if (lacingAttrib != null) { LacingStrategy lacing = LacingStrategy.First; Enum.TryParse(lacingAttrib.Value, out lacing); el.ArgumentLacing = lacing; } if (el == null) return false; el.DisableReporting(); el.LoadElement(elNode); if (el is dynFunction) { var fun = el as dynFunction; // we've found a custom node, we need to attempt to load its guid. // if it doesn't exist (i.e. its a legacy node), we need to assign it one, // deterministically Guid funId; try { funId = Guid.Parse(fun.Symbol); } catch { funId = GuidUtility.Create(GuidUtility.UrlNamespace, nicknameAttrib.Value); fun.Symbol = funId.ToString(); } if (dynSettings.Controller.CustomNodeLoader.IsInitialized(funId)) fun.Definition = dynSettings.Controller.CustomNodeLoader.GetFunctionDefinition(funId); else dependencies.Push(funId); } } #endregion //Bench.WorkBench.UpdateLayout(); OnRequestLayoutUpdate(this, EventArgs.Empty); #region instantiate connectors foreach (XmlNode connector in cNodesList.ChildNodes) { XmlAttribute guidStartAttrib = connector.Attributes[0]; XmlAttribute intStartAttrib = connector.Attributes[1]; XmlAttribute guidEndAttrib = connector.Attributes[2]; XmlAttribute intEndAttrib = connector.Attributes[3]; XmlAttribute portTypeAttrib = connector.Attributes[4]; var guidStart = new Guid(guidStartAttrib.Value); var guidEnd = new Guid(guidEndAttrib.Value); int startIndex = Convert.ToInt16(intStartAttrib.Value); int endIndex = Convert.ToInt16(intEndAttrib.Value); int portType = Convert.ToInt16(portTypeAttrib.Value); //find the elements to connect dynNodeModel start = null; dynNodeModel end = null; if (badNodes.Contains(guidStart) || badNodes.Contains(guidEnd)) continue; foreach (dynNodeModel e in ws.Nodes) { if (e.GUID == guidStart) { start = e; } else if (e.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } try { if (start != null && end != null && start != end) { var newConnector = new dynConnectorModel( start, end, startIndex, endIndex, portType, false ); ws.Connectors.Add(newConnector); } } catch { dynSettings.Controller.DynamoViewModel.Log(string.Format("ERROR : Could not create connector between {0} and {1}.", start.GUID, end.GUID)); } } #endregion #region instantiate notes if (nNodesList != null) { foreach (XmlNode note in nNodesList.ChildNodes) { XmlAttribute textAttrib = note.Attributes[0]; XmlAttribute xAttrib = note.Attributes[1]; XmlAttribute yAttrib = note.Attributes[2]; string text = textAttrib.Value; double x = Convert.ToDouble(xAttrib.Value); double y = Convert.ToDouble(yAttrib.Value); var paramDict = new Dictionary<string, object>(); paramDict.Add("x", x); paramDict.Add("y", y); paramDict.Add("text", text); paramDict.Add("workspace", ws); //DynamoCommands.AddNoteCmd.Execute(paramDict); dynSettings.Controller.DynamoViewModel.AddNoteCommand.Execute(paramDict); } } #endregion foreach (dynNodeModel e in ws.Nodes) e.EnableReporting(); //DynamoModel.hideWorkspace(ws); ws.FilePath = xmlPath; bool canLoad = true; //For each node this workspace depends on... foreach (Guid dep in dependencies) { canLoad = false; //Dep -> Ws if (children.ContainsKey(dep)) children[dep].Add(def); else children[dep] = new HashSet<FunctionDefinition> { def }; //Ws -> Deps if (parents.ContainsKey(def.FunctionId)) parents[def.FunctionId].Add(dep); else parents[def.FunctionId] = new HashSet<Guid> { dep }; } if (canLoad) SaveFunction(def, false); Controller.PackageManagerClient.LoadPackageHeader(def, funName); nodeWorkspaceWasLoaded(def, children, parents); } catch (Exception ex) { Log("There was an error opening the workbench."); Log(ex); Debug.WriteLine(ex.Message + ":" + ex.StackTrace); CleanWorkbench(); return false; } return true; }
private void Connect() { if (!dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.IsConnecting) { //test if port already has a connection if so grab it //and begin connecting to somewhere else //don't allow the grabbing of the start connector if (_port.Connectors.Count > 0 && _port.Connectors[0].Start != _port) { //define the new active connector var c = new dynConnectorViewModel(_port.Connectors[0].Start); dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.ActiveConnector = c; dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.IsConnecting = true; //disconnect the connector model from its start and end ports //and remove it from the connectors collection. this will also //remove the view model var successfulRemoval = dynSettings.Controller.DynamoViewModel.CurrentSpace.Connectors.Remove(_port.Connectors[0]); _port.Connectors[0].NotifyConnectedPortsOfDeletion(); Console.WriteLine(successfulRemoval); } else { try { //Create a connector view model to begin drawing if (_port.PortType != PortType.INPUT) { var c = new dynConnectorViewModel(_port); dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.ActiveConnector = c; dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.IsConnecting = true; } } catch (Exception ex) { Debug.WriteLine(ex.Message); } } } else // attempt to complete the connection { //don't attempt connection to a port which //is already connected if (_port.Connectors.Count > 0) return; // create the new connector model var start = dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.ActiveConnector.ActiveStartPort; var end = _port; var newConnectorModel = new dynConnectorModel(start.Owner, end.Owner, start.Index, end.Index, 0); // Add to the current workspace dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.Model.Connectors.Add(newConnectorModel); // Cleanup dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.IsConnecting = false; dynSettings.Controller.DynamoViewModel.CurrentSpaceViewModel.ActiveConnector = null; } }