Пример #1
0
        private void PlaceEvents()
        {
            GeneratingGraph = true;

            PointF Position = new PointF(EventColumn, 0);
            Graphics g = graphControl1.GetLayoutGraphics();


            foreach (DotaActionCollection kvEvents in Ability.ActionList)
            {
                var Event = DotaData.Events.FirstOrDefault(x => x.ClassName == kvEvents.ClassName);

                if (Event.RespectsTargetFlag && Ability.AbilityBehavior.HasFlag(DotaAbility.AbilityBehaviorFlags.DOTA_ABILITY_BEHAVIOR_UNIT_TARGET))
                {
                    //Add the target pin
                    Event.Targets = Event.Targets | DotaEvent.TargetsFlags.TARGET;
                }

                var EventNode = new EventNode(Event, Ability.ActionList.GetActionCollection(Event));
                EventNode.Location = Position;

               

                EventNode.PerformLayout(g);

                graphControl1.AddNode(EventNode);

                PointF col = Position;
                col.X = EventNode.Bounds.Right + ColumnSpacing; //Move this node to the left of the event node + spacing
                PointF previousCol = col;

                ExecuteNodeItem ExNode = EventNode.OutputExecute;

                float columnHeight = EventNode.Bounds.Height;
                foreach(var kvAction in kvEvents)
                {
                    if (kvAction == null) continue;
                       
                    var ActionNode = new ActionNode(kvAction);
                    ActionNode.Location = col;
                    
                    graphControl1.AddNode(ActionNode);
                    ActionNode.PerformLayout(g);

                    //Connect the execute nodes
                    var inputNode = ActionNode.InputExecute;
                    graphControl1.Connect(ExNode, inputNode);
                    ExNode = ActionNode.OutputExecute;

                    ConnectTargets(EventNode, ActionNode);


                    var varRefs = ActionNode.VariableReferences;

                    foreach(var Ref in varRefs)
                    {
                        var pos = previousCol;
                        pos.Y += columnHeight;

                        //Get the data variable for this reference
                        var actionVariable = ability.ActionList.Variables.FirstOrDefault(x => x.Name == Ref.VariableName.Replace("%", ""));
                        if (actionVariable == null)
                        {
                            MessageBox.Show("Found a reference to " + Ref.VariableName + "but could not find it in the variable table!");
                            continue;
                        }

                        //Create the variable node and add it to the graph
                        VariableNode varNode = new VariableNode(actionVariable);
                        varNode.Location = pos;
                        varNode.PerformLayout(g);
                        graphControl1.AddNode(varNode);

                        //Connect it's output to the referenced input pins

                        foreach(var inputPin in Ref.InputPins)
                        {
                            graphControl1.Connect(varNode.OutputPin, inputPin);
                        }

                        columnHeight += varNode.Bounds.Height + VariableSpacing;
                    }

                  
                    //Move the pen right to place the next action node
                    previousCol = col;
                    col.X = ActionNode.Bounds.Right + ColumnSpacing;
                    columnHeight = Math.Max(ActionNode.Bounds.Height, columnHeight);
                }


                Position.Y += columnHeight + EventSpacing;

            }

            GeneratingGraph = false;
        }