public void Connect(dynConnector connector) { connectors.Add(connector); ellipse1Dot.Fill = System.Windows.Media.Brushes.Black; //throw the event for a connection OnPortConnected(EventArgs.Empty); }
public void Disconnect(dynConnector connector) { 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) { ellipse1Dot.Fill = System.Windows.Media.Brushes.White; } //throw the event for a connection OnPortDisconnected(EventArgs.Empty); }
/// <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 = dynBench.CANVAS_OFFSET_X; double cy = dynBench.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 (!controller.ViewingHomespace) controller.ViewHomeWorkspace(); //TODO: Refactor def = null; return controller.OpenWorkbench(xmlPath); } dynSettings.Bench.Log("Loading node definition for \"" + funName + "\" from: " + xmlPath); var workSpace = new FuncWorkspace( funName, category.Length > 0 ? category : BuiltinNodeCategories.MISC, 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(5); controller.FSchemeEnvironment.DefineSymbol(def.FunctionId.ToString(), dummyExpression); this.loadedNodes.Add(def.FunctionId, def); dynWorkspace 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]; #region instantiate nodes 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]; 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.builtinTypesByTypeName.TryGetValue(typeName, out tData)) { t = Type.GetType(typeName); if (t == null) { dynSettings.Bench.Log("Error loading definition. Could not load node of type: " + typeName); return false; } } else t = tData.Type; var el = controller.CreateInstanceAndAddNodeToWorkspace(t, nickname, guid, x, y, ws, Visibility.Hidden); 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 dynSettings.Bench.WorkBench.UpdateLayout(); #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 dynNode start = null; dynNode end = null; foreach (dynNode e in ws.Nodes) { if (e.NodeUI.GUID == guidStart) { start = e; } else if (e.NodeUI.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } //don't connect if the end element is an instance map //those have a morphing set of inputs //dynInstanceParameterMap endTest = end as dynInstanceParameterMap; //if (endTest != null) //{ // continue; //} try { if (start != null && end != null && start != end) { var newConnector = new dynConnector( start.NodeUI, end.NodeUI, startIndex, endIndex, portType, false ); ws.Connectors.Add(newConnector); } } catch { dynSettings.Bench.Log(string.Format("ERROR : Could not create connector between {0} and {1}.", start.NodeUI.GUID, end.NodeUI.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); //dynNote 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); DynamoCommands.AddNoteCmd.Execute(paramDict); } } #endregion foreach (dynNode e in ws.Nodes) e.EnableReporting(); DynamoController.hideWorkspace(ws); ws.FilePath = xmlPath; controller.PackageManagerClient.LoadPackageHeader(def, funName); var expression = CompileFunction(def); controller.FSchemeEnvironment.DefineSymbol(def.FunctionId.ToString(), expression); } catch (Exception ex) { dynSettings.Bench.Log("There was an error opening the workbench."); dynSettings.Bench.Log(ex); controller.CleanWorkbench(); def = null; return false; } return true; }
public void Execute(object parameters) { ArrayList connectionData = parameters as ArrayList; dynNodeUI start = connectionData[0] as dynNodeUI; dynNodeUI end = connectionData[1] as dynNodeUI; int startIndex = (int)connectionData[2]; int endIndex = (int)connectionData[3]; dynConnector c = new dynConnector(start, end, startIndex, endIndex, 0); }
public void Disconnect(dynConnector connector) { 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) ellipse1Dot.Fill = System.Windows.Media.Brushes.White; //throw the event for a connection OnPortDisconnected(EventArgs.Empty); }
public void Connect(dynConnector connector) { connectors.Add(connector); ellipse1Dot.Fill = System.Windows.Media.Brushes.Black; //throw the event for a connection OnPortConnected(EventArgs.Empty); }
private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Debug.WriteLine(string.Format("Port {0} selected.", this.Index)); #region test for a port dynBench bench = dynSettings.Bench; if (!bench.WorkBench.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 (this.Connectors.Count > 0 && this.Connectors[0].Start != this) { bench.ActiveConnector = this.Connectors[0]; bench.ActiveConnector.Disconnect(this); bench.WorkBench.IsConnecting = true; dynSettings.Controller.CurrentSpace.Connectors.Remove(bench.ActiveConnector); } else { try { //you've begun creating a connector dynConnector c = new dynConnector(this, bench.WorkBench, e.GetPosition(bench.WorkBench)); bench.ActiveConnector = c; bench.WorkBench.IsConnecting = true; } catch (Exception ex) { Debug.WriteLine(ex.Message); } } } else { //attempt a connection between the port //and the connector if (!bench.ActiveConnector.Connect(this)) { bench.ActiveConnector.Kill(); bench.WorkBench.IsConnecting = false; bench.ActiveConnector = null; } else { //you've already started connecting //now you're going to stop dynSettings.Controller.CurrentSpace.Connectors.Add(bench.ActiveConnector); bench.WorkBench.IsConnecting = false; bench.ActiveConnector = null; } } //set the handled flag so that the element doesn't get dragged e.Handled = true; #endregion }
public void Disconnect(dynConnector 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(dynConnector connector) { connectors.Add(connector); //throw the event for a connection OnPortConnected(EventArgs.Empty); IsConnected = true; }
public bool OpenWorkbench(string xmlPath) { Bench.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")) { //Bench.CurrentX = Convert.ToDouble(att.Value); Bench.CurrentOffset = new Point(Convert.ToDouble(att.Value), Bench.CurrentOffset.Y); } else if (att.Name.Equals("Y")) { //Bench.CurrentY = Convert.ToDouble(att.Value); Bench.CurrentOffset = new Point(Bench.CurrentOffset.X, 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]; 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]; 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 (!builtinTypesByTypeName.TryGetValue(typeName, out tData)) { t = Type.GetType(typeName); if (t == null) { Bench.Log("Error loading workspace. Could not load node of type: " + typeName); return false; } } else t = tData.Type; dynNode el = CreateInstanceAndAddNodeToWorkspace( t, nickname, guid, x, y, CurrentSpace ); el.DisableReporting(); el.LoadElement(elNode); if (ViewingHomespace) el.SaveResult = true; 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(); } FunctionDefinition funcDef = this.CustomNodeLoader.GetFunctionDefinition(funId); if (funcDef != null) fun.Definition = funcDef; else fun.NodeUI.Error("No definition found."); } //read the sub elements //set any numeric values //foreach (XmlNode subNode in elNode.ChildNodes) //{ // if (subNode.Name == "System.Double") // { // double val = Convert.ToDouble(subNode.Attributes[0].Value); // el.OutPortData[0].Object = val; // el.Update(); // } // else if (subNode.Name == "System.Int32") // { // int val = Convert.ToInt32(subNode.Attributes[0].Value); // el.OutPortData[0].Object = val; // el.Update(); // } //} } dynSettings.Workbench.UpdateLayout(); 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 dynNode start = null; dynNode end = null; foreach (dynNode e in Nodes) { if (e.NodeUI.GUID == guidStart) { start = e; } else if (e.NodeUI.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } //don't connect if the end element is an instance map //those have a morphing set of inputs //dynInstanceParameterMap endTest = end as dynInstanceParameterMap; //if (endTest != null) //{ // continue; //} if (start != null && end != null && start != end) { var newConnector = new dynConnector(start.NodeUI, end.NodeUI, startIndex, endIndex, portType); CurrentSpace.Connectors.Add(newConnector); } } CurrentSpace.Connectors.ForEach(x => x.Redraw()); #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); //dynNote 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", CurrentSpace); DynamoCommands.AddNoteCmd.Execute(paramDict); } } #endregion foreach (dynNode e in CurrentSpace.Nodes) e.EnableReporting(); #endregion HomeSpace.FilePath = xmlPath; } catch (Exception ex) { Bench.Log("There was an error opening the workbench."); Bench.Log(ex); Debug.WriteLine(ex.Message + ":" + ex.StackTrace); CleanWorkbench(); return false; } return true; }
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 = dynBench.CANVAS_OFFSET_X; double cy = dynBench.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 ( this.CustomNodeLoader.Contains(funName) ) { Bench.Log("ERROR: Could not load definition for \"" + funName + "\", a node with this name already exists."); return false; } Bench.Log("Loading node definition for \"" + funName + "\" from: " + xmlPath); FunctionDefinition def = NewFunction( Guid.Parse(id), funName, category.Length > 0 ? category : BuiltinNodeCategories.MISC, false, cx, cy ); dynWorkspace 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 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]; 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 (!builtinTypesByTypeName.TryGetValue(typeName, out tData)) { t = Type.GetType(typeName); if (t == null) { Bench.Log("Error loading definition. Could not load node of type: " + typeName); return false; } } else t = tData.Type; dynNode el = CreateInstanceAndAddNodeToWorkspace(t, nickname, guid, x, y, ws, Visibility.Hidden); 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(); #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 dynNode start = null; dynNode end = null; foreach (dynNode e in ws.Nodes) { if (e.NodeUI.GUID == guidStart) { start = e; } else if (e.NodeUI.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } //don't connect if the end element is an instance map //those have a morphing set of inputs //dynInstanceParameterMap endTest = end as dynInstanceParameterMap; //if (endTest != null) //{ // continue; //} try { if (start != null && end != null && start != end) { var newConnector = new dynConnector( start.NodeUI, end.NodeUI, startIndex, endIndex, portType, false ); ws.Connectors.Add(newConnector); } } catch { Bench.Log(string.Format("ERROR : Could not create connector between {0} and {1}.", start.NodeUI.GUID, end.NodeUI.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); //dynNote 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); DynamoCommands.AddNoteCmd.Execute(paramDict); } } #endregion foreach (dynNode e in ws.Nodes) e.EnableReporting(); 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); PackageManagerClient.LoadPackageHeader(def, funName); nodeWorkspaceWasLoaded(def, children, parents); } catch (Exception ex) { Bench.Log("There was an error opening the workbench."); Bench.Log(ex); Debug.WriteLine(ex.Message + ":" + ex.StackTrace); CleanWorkbench(); return false; } return true; }
public void Execute(object parameters) { var connectionData = parameters as Dictionary<string,object>; var start = (dynNodeUI)connectionData["start"]; var end = (dynNodeUI)connectionData["end"]; var startIndex = (int)connectionData["port_start"]; var endIndex = (int)connectionData["port_end"]; var c = new dynConnector(start, end, startIndex, endIndex, 0); dynSettings.Controller.CurrentSpace.Connectors.Add(c); }
bool OpenWorkbench(string xmlPath) { Bench.Log("Opening home workspace " + xmlPath + "..."); CleanWorkbench(); try { #region read xml file XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); foreach (XmlNode node in xmlDoc.GetElementsByTagName("dynWorkspace")) { foreach (XmlAttribute att in node.Attributes) { if (att.Name.Equals("X")) Bench.CurrentX = Convert.ToDouble(att.Value); else if (att.Name.Equals("Y")) Bench.CurrentY = Convert.ToDouble(att.Value); } } XmlNodeList elNodes = xmlDoc.GetElementsByTagName("dynElements"); XmlNodeList cNodes = xmlDoc.GetElementsByTagName("dynConnectors"); XmlNodeList nNodes = xmlDoc.GetElementsByTagName("dynNotes"); XmlNode elNodesList = elNodes[0] as XmlNode; XmlNode cNodesList = cNodes[0] as XmlNode; XmlNode nNodesList = nNodes[0] as XmlNode; 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]; string typeName = typeAttrib.Value.ToString(); Guid guid = new Guid(guidAttrib.Value.ToString()); string nickname = nicknameAttrib.Value.ToString(); double x = Convert.ToDouble(xAttrib.Value.ToString()); double y = Convert.ToDouble(yAttrib.Value.ToString()); if (typeName.StartsWith("Dynamo.Elements.")) typeName = "Dynamo.Nodes." + typeName.Remove(0, 16); TypeLoadData tData; Type t; if (!builtinTypesByTypeName.TryGetValue(typeName, out tData)) { t = Type.GetType(typeName); if (t == null) { Bench.Log("Error loading workspace. Could not load node of type: " + typeName); return false; } } else t = tData.Type; dynNode el = AddDynElement( t, nickname, guid, x, y, this.CurrentSpace ); el.DisableReporting(); el.LoadElement(elNode); if (this.ViewingHomespace) el.SaveResult = true; //read the sub elements //set any numeric values //foreach (XmlNode subNode in elNode.ChildNodes) //{ // if (subNode.Name == "System.Double") // { // double val = Convert.ToDouble(subNode.Attributes[0].Value); // el.OutPortData[0].Object = val; // el.Update(); // } // else if (subNode.Name == "System.Int32") // { // int val = Convert.ToInt32(subNode.Attributes[0].Value); // el.OutPortData[0].Object = val; // el.Update(); // } //} } dynSettings.Workbench.UpdateLayout(); 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]; Guid guidStart = new Guid(guidStartAttrib.Value.ToString()); Guid guidEnd = new Guid(guidEndAttrib.Value.ToString()); int startIndex = Convert.ToInt16(intStartAttrib.Value.ToString()); int endIndex = Convert.ToInt16(intEndAttrib.Value.ToString()); int portType = Convert.ToInt16(portTypeAttrib.Value.ToString()); //find the elements to connect dynNode start = null; dynNode end = null; foreach (dynNode e in Nodes) { if (e.NodeUI.GUID == guidStart) { start = e; } else if (e.NodeUI.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } //don't connect if the end element is an instance map //those have a morphing set of inputs //dynInstanceParameterMap endTest = end as dynInstanceParameterMap; //if (endTest != null) //{ // continue; //} if (start != null && end != null && start != end) { dynConnector newConnector = new dynConnector(start.NodeUI, end.NodeUI, startIndex, endIndex, portType); this.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.ToString(); double x = Convert.ToDouble(xAttrib.Value.ToString()); double y = Convert.ToDouble(yAttrib.Value.ToString()); dynNote n = Bench.AddNote(text, x, y, this.CurrentSpace); } } #endregion foreach (var e in this.CurrentSpace.Nodes) e.EnableReporting(); #endregion homeSpace.FilePath = xmlPath; } catch (Exception ex) { Bench.Log("There was an error opening the workbench."); Bench.Log(ex); Debug.WriteLine(ex.Message + ":" + ex.StackTrace); CleanWorkbench(); return false; } return true; }
bool OpenDefinition( string xmlPath, Dictionary<string, HashSet<dynWorkspace>> children, Dictionary<string, HashSet<string>> parents) { try { #region read xml file XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); string funName = null; string category = ""; double cx = dynBench.CANVAS_OFFSET_X; double cy = dynBench.CANVAS_OFFSET_Y; 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; } } //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 (!this.ViewingHomespace) ViewHomeWorkspace(); //TODO: Refactor return this.OpenWorkbench(xmlPath); } else if (this.FunctionDict.ContainsKey(funName)) { Bench.Log("ERROR: Could not load definition for \"" + funName + "\", a node with this name already exists."); return false; } Bench.Log("Loading node definition for \"" + funName + "\" from: " + xmlPath); //TODO: refactor to include x,y var ws = this.NewFunction( funName, category.Length > 0 ? category : BuiltinNodeCategories.MISC, false ); ws.PositionX = cx; ws.PositionY = cy; //this.Log("Opening definition " + xmlPath + "..."); XmlNodeList elNodes = xmlDoc.GetElementsByTagName("dynElements"); XmlNodeList cNodes = xmlDoc.GetElementsByTagName("dynConnectors"); XmlNodeList nNodes = xmlDoc.GetElementsByTagName("dynNotes"); XmlNode elNodesList = elNodes[0] as XmlNode; XmlNode cNodesList = cNodes[0] as XmlNode; XmlNode nNodesList = nNodes[0] as XmlNode; var dependencies = new Stack<string>(); #region instantiate nodes 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]; string typeName = typeAttrib.Value.ToString(); var oldNamespace = "Dynamo.Elements."; if (typeName.StartsWith(oldNamespace)) typeName = "Dynamo.Nodes." + typeName.Remove(0, oldNamespace.Length); Guid guid = new Guid(guidAttrib.Value.ToString()); string nickname = nicknameAttrib.Value.ToString(); double x = Convert.ToDouble(xAttrib.Value.ToString()); double y = Convert.ToDouble(yAttrib.Value.ToString()); //Type t = Type.GetType(typeName); TypeLoadData tData; Type t; if (!builtinTypesByTypeName.TryGetValue(typeName, out tData)) { t = Type.GetType(typeName); if (t == null) { Bench.Log("Error loading definition. Could not load node of type: " + typeName); return false; } } else t = tData.Type; dynNode el = AddDynElement(t, nickname, guid, x, y, ws, System.Windows.Visibility.Hidden); if (el == null) return false; el.DisableReporting(); el.LoadElement(elNode); if (el is dynFunction) { var fun = el as dynFunction; if (fun.Symbol != ws.Name) dependencies.Push(fun.Symbol); } } #endregion Bench.WorkBench.UpdateLayout(); #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]; Guid guidStart = new Guid(guidStartAttrib.Value.ToString()); Guid guidEnd = new Guid(guidEndAttrib.Value.ToString()); int startIndex = Convert.ToInt16(intStartAttrib.Value.ToString()); int endIndex = Convert.ToInt16(intEndAttrib.Value.ToString()); int portType = Convert.ToInt16(portTypeAttrib.Value.ToString()); //find the elements to connect dynNode start = null; dynNode end = null; foreach (dynNode e in ws.Nodes) { if (e.NodeUI.GUID == guidStart) { start = e; } else if (e.NodeUI.GUID == guidEnd) { end = e; } if (start != null && end != null) { break; } } //don't connect if the end element is an instance map //those have a morphing set of inputs //dynInstanceParameterMap endTest = end as dynInstanceParameterMap; //if (endTest != null) //{ // continue; //} if (start != null && end != null && start != end) { dynConnector newConnector = new dynConnector( start.NodeUI, end.NodeUI, startIndex, endIndex, portType, false ); ws.Connectors.Add(newConnector); } } #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.ToString(); double x = Convert.ToDouble(xAttrib.Value.ToString()); double y = Convert.ToDouble(yAttrib.Value.ToString()); dynNote n = Bench.AddNote(text, x, y, ws); } } #endregion foreach (var e in ws.Nodes) e.EnableReporting(); this.hideWorkspace(ws); #endregion ws.FilePath = xmlPath; bool canLoad = true; //For each node this workspace depends on... foreach (var dep in dependencies) { //If the node hasn't been loaded... if (!FunctionDict.ContainsKey(dep)) { canLoad = false; //Dep -> Ws if (children.ContainsKey(dep)) children[dep].Add(ws); else children[dep] = new HashSet<dynWorkspace>() { ws }; //Ws -> Deps if (parents.ContainsKey(ws.Name)) parents[ws.Name].Add(dep); else parents[ws.Name] = new HashSet<string>() { dep }; } } if (canLoad) SaveFunction(ws, false); nodeWorkspaceWasLoaded(ws, children, parents); } catch (Exception ex) { Bench.Log("There was an error opening the workbench."); Bench.Log(ex); Debug.WriteLine(ex.Message + ":" + ex.StackTrace); CleanWorkbench(); return false; } return true; }