コード例 #1
0
        /// <summary>
        /// Determines the optimal start and end positions.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>
        /// <param name="startX">The start X.</param>
        /// <param name="startY">The start Y.</param>
        /// <param name="endX">The end X.</param>
        /// <param name="endY">The end Y.</param>
        private static void DetermineOptimalStartEndPositions(CompositeComponentGraph compositeComponentGraph, out double startX, out double startY, out double endX, out double endY)
        {
            double leftX, rightX, topY, bottomY;

            TraceLab.Core.Utilities.ExperimentHelper.DetermineGraphBoundaries(compositeComponentGraph, out leftX, out rightX, out topY, out bottomY);

            startX = 0;
            startY = 0;
            endX   = 0;
            endY   = 0;

            //calculate optimal start and end position
            if (leftX == rightX)
            {
                startX = leftX;
                endX   = leftX;
            }
            else
            {
                double middleX = (leftX + rightX) / 2;
                startX = middleX;
                endX   = middleX;
            }

            startY = topY - 50;
            endY   = bottomY + 50;
        }
コード例 #2
0
        public override BaseExperiment Clone()
        {
            var clone = new CompositeComponentGraph(this);

            clone.ResetModifiedFlag();
            return(clone);
        }
コード例 #3
0
        /// <summary>
        /// Connects the nodes to start and end node.
        /// In case user selected partial graph without start or/and end node, this methods adds
        /// accordingly Start and End node to the given composite graph.
        /// If some selected nodes didn't have any outgoing paths they are automatically connected to the end node.
        /// If some selected nodes didn't have any incoming paths they are automatically connected to the start node.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>

        // HERZUM SPRINT 2.4 TLAB-157
        // private static void ConnectNodesToStartAndEndNode(CompositeComponentGraph compositeComponentGraph)
        public static void ConnectNodesToStartAndEndNode(CompositeComponentGraph compositeComponentGraph)
        // END HERZUM SPRINT 2.4 TLAB-157
        {
            if (compositeComponentGraph.StartNode == null || compositeComponentGraph.EndNode == null)
            {
                double startX, startY, endX, endY;

                DetermineOptimalStartEndPositions(compositeComponentGraph, out startX, out startY, out endX, out endY);

                if (compositeComponentGraph.StartNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentStartNode start = new ExperimentStartNode();
                    start.Data.X = startX;
                    start.Data.Y = startY;
                    compositeComponentGraph.AddVertex(start);
                    compositeComponentGraph.StartNode = start;
                }

                if (compositeComponentGraph.EndNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentEndNode end = new ExperimentEndNode();
                    end.Data.X = endX;
                    end.Data.Y = endY;
                    compositeComponentGraph.AddVertex(end);
                    compositeComponentGraph.EndNode = end;
                }

                //connect subgraph to start and end
                foreach (ExperimentNode node in compositeComponentGraph.Vertices)
                {
                    if (node is ExperimentStartNode == false && node is ExperimentEndNode == false)
                    {
                        //if node has not any incoming connection from other Selected Nodes it has to be connected to the start
                        if (compositeComponentGraph.IsInEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), compositeComponentGraph.StartNode, node));
                        }

                        //if node has not any outcoming connection from other Selected Nodes it has to be connected to the end
                        if (compositeComponentGraph.IsOutEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), node, compositeComponentGraph.EndNode));
                        }
                    }
                }
                // HERZUM SPRINT 3.0: COMPOSITE BUG FIX
                if (compositeComponentGraph.EdgeCount == 0 && compositeComponentGraph.StartNode != null && compositeComponentGraph.EndNode != null)
                {
                    compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), compositeComponentGraph.StartNode, compositeComponentGraph.EndNode));
                    compositeComponentGraph.StartNode.Data.X = 0;
                    compositeComponentGraph.StartNode.Data.Y = 0;
                    compositeComponentGraph.EndNode.Data.X   = 0;
                    compositeComponentGraph.EndNode.Data.Y   = 100;
                }
                // END HERZUM SPRINT 3.0: COMPOSITE BUG FIX
            }
        }
コード例 #4
0
        // HERZUM SPRINT 2.4 TLAB-157
        public static CompositeComponentGraph ConstructEmptyGraph()
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();
            compositeComponentGraph.OwnerNode      = null;
            return(compositeComponentGraph);
        }
コード例 #5
0
ファイル: BaseExperiment.cs プロジェクト: neostoic/TraceLab
        // HERZUM SPRINT 2.3 TLAB-56 TLAB-57 TLAB-58 TLAB-59
        public void CopyAndAdd(CompositeComponentGraph subExperiment, double x, double y)
        {
            if (subExperiment == null)
            {
                return;
            }

            CopyAndAdd(subExperiment, x, y, true);
        }
コード例 #6
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DefiningCompositeComponentSetup"/> class.
        /// </summary>
        /// <param name="experiment">The experiment.</param>
        public DefiningCompositeComponentSetup(Experiment experiment)
        {
            CompositeComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes(experiment);

            InputSettings  = new SortedDictionary <string, ItemSetting>();
            OutputSettings = new SortedDictionary <string, ItemSetting>();
            ConfigSettings = new SortedDictionary <string, ConfigItemSetting>();

            TraceLab.Core.Utilities.ExperimentHelper.BFSTraverseExperiment(CompositeComponentGraph, CompositeComponentGraph.StartNode, RetrieveIOSpecAndConfig);
        }
コード例 #7
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CompositeComponentGraph"/> class with the given settings.
        /// </summary>
        /// <param name="compositeComponentNode">The composite component node.</param>
        /// <param name="componentGraph">The component graph.</param>
        /// <param name="settings">The settings. All components are initialized with with the given settings.</param>
        public CompositeComponentGraph(CompositeComponentNode compositeComponentNode, CompositeComponentGraph componentGraph) : base()
        {
            if (componentGraph == null)
            {
                throw new ArgumentException("Component graph cannot be null");
            }

            CopyFrom(componentGraph);
            OwnerNode = compositeComponentNode;
        }
コード例 #8
0
 private void ConstructGraphFromSelectedScopeNodes(CompositeComponentGraph experiment)
 {
     if (experiment == null)
         return;
     CompositeComponentGraph.CopyAndAdd (CompositeComponentGraph.ConstructGraphFromSelectedNodes (experiment), 200.0, 200.0);  
     foreach (ExperimentNode node in experiment.Vertices) {
         if (!node.IsSelected){
             ScopeBaseMetadata scopeBaseMetadata = node.Data.Metadata as ScopeBaseMetadata;
             if (scopeBaseMetadata!= null && scopeBaseMetadata.ComponentGraph!=null)
                 ConstructGraphFromSelectedScopeNodes(scopeBaseMetadata.ComponentGraph);
         }
     }
 }
コード例 #9
0
ファイル: Clipboard.cs プロジェクト: CoEST/TraceLab
        public static void Copy(BaseExperiment originalExperiment)
        {
            // HERZUM SPRINT 4: TLAB-215
            if (clipboardComponentGraph != null)
                clipboardComponentGraph.Clear ();
            // END HERZUM SPRINT 4: TLAB-215

            clipboardComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes (originalExperiment);

            foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
                node.IsSelected = false;

        }
コード例 #10
0
        /// <summary>
        /// Discovers the full graph ID path.
        /// </summary>
        private void DiscoverFullGraphIDPath()
        {
            //call the method that discovers it along with top owner node
            CompositeComponentGraph parentGraph = OwnerNode.Owner as CompositeComponentGraph;

            if (parentGraph != null)
            {
                //otherwise add to already existing path
                m_fullGraphIdPath = parentGraph.GraphIdPath + ":" + OwnerNode.ID;
            }
            else
            {
                //otherwise it must have reached the top level experiment
                m_fullGraphIdPath = OwnerNode.ID;
            }
        }
コード例 #11
0
ファイル: DragClipboard.cs プロジェクト: CoEST/TraceLab
        public static void Copy(ApplicationContext applicationContext, BaseExperiment originalExperiment)
        {
            clipboardComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes (originalExperiment);

            foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
                node.IsSelected = false;

            BasicNodeControl componentControl;
            foreach (ExperimentNode originalNode in originalExperiment.Vertices)
                foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
                    if (originalNode.ID.Equals(node.ID))
                        if(applicationContext.NodeControlFactory.TryGetNodeControl(originalNode, out componentControl)) {
                        node.Data.X = componentControl.DisplayBox.X;
                        node.Data.Y = componentControl.DisplayBox.Y;
                    }
        }
コード例 #12
0
ファイル: Clipboard.cs プロジェクト: neostoic/TraceLab
        public static void Copy(BaseExperiment originalExperiment)
        {
            // HERZUM SPRINT 4: TLAB-215
            if (clipboardComponentGraph != null)
            {
                clipboardComponentGraph.Clear();
            }
            // END HERZUM SPRINT 4: TLAB-215

            clipboardComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes(originalExperiment);

            foreach (ExperimentNode node in clipboardComponentGraph.Vertices)
            {
                node.IsSelected = false;
            }
        }
コード例 #13
0
        private static void PushParents(CompositeComponentGraph graph, List<Crumb> crumbs) 
        {
            IExperiment parent = graph.OwnerNode.Owner;

            CompositeComponentGraph graphAbove = parent as CompositeComponentGraph;
            if(graphAbove != null) 
            {
                PushParents(graphAbove, crumbs);
                ExperimentNode ownerNode = graphAbove.OwnerNode;
                crumbs.Add(new ExperimentCrumb(ownerNode.Data.Metadata.Label, graphAbove));
            }
            else if(parent is Experiment)
            {
                crumbs.Add(new ExperimentCrumb(parent.Title, parent));
            }
        }
コード例 #14
0
        // END HERZUM SPRINT 3.1 TLAB-180

        /// <summary>
        /// Initializes a new instance of the <see cref="DefiningCompositeComponentSetup"/> class.
        /// </summary>
        /// <param name="experiment">The experiment.</param>
        public DefiningCompositeComponentSetup(Experiment experiment)
        {
            // HERZUM SPRINT 2.4 TLAB-157
            // CompositeComponentGraph = CompositeComponentGraph.ConstructGraphFromSelectedNodes(experiment);
            CompositeComponentGraph = CompositeComponentGraph.ConstructEmptyGraph();
            // HERZUM SPRINT 3.1 TLAB-180
            // CompositeComponentGraph.CopyAndAdd (CompositeComponentGraph.ConstructGraphFromSelectedNodes (experiment), 200.0, 200.0);
            ConstructGraphFromSelectedScopeNodes(experiment);
            // END HERZUM SPRINT 3.1 TLAB-180
            CompositeComponentGraph.ConnectNodesToStartAndEndNode(CompositeComponentGraph);
            // END HERZUM SPRINT 2.4 TLAB-157

            InputSettings  = new SortedDictionary <string, ItemSetting>();
            OutputSettings = new SortedDictionary <string, ItemSetting>();
            ConfigSettings = new SortedDictionary <string, ConfigItemSetting>();

            TraceLab.Core.Utilities.ExperimentHelper.BFSTraverseExperiment(CompositeComponentGraph, CompositeComponentGraph.StartNode, RetrieveIOSpecAndConfig);
        }
コード例 #15
0
 private void ConstructGraphFromSelectedScopeNodes(CompositeComponentGraph experiment)
 {
     if (experiment == null)
     {
         return;
     }
     CompositeComponentGraph.CopyAndAdd(CompositeComponentGraph.ConstructGraphFromSelectedNodes(experiment), 200.0, 200.0);
     foreach (ExperimentNode node in experiment.Vertices)
     {
         if (!node.IsSelected)
         {
             ScopeBaseMetadata scopeBaseMetadata = node.Data.Metadata as ScopeBaseMetadata;
             if (scopeBaseMetadata != null && scopeBaseMetadata.ComponentGraph != null)
             {
                 ConstructGraphFromSelectedScopeNodes(scopeBaseMetadata.ComponentGraph);
             }
         }
     }
 }
コード例 #16
0
        // HERZUM SPRINT 3.0: TLAB-176
        private bool IncludeChallenge(CompositeComponentGraph experiment) {
            if (experiment == null)
                return false;
            foreach (ExperimentNode node in experiment.Vertices){
                ChallengeMetadata ch_meta = node.Data.Metadata as ChallengeMetadata;
                if (ch_meta != null){

                    // HERZUM SPRINT 3.0: TLAB-176
                    ExperimentNodeConnection firstInEdge = experiment.InEdge (node,0);
                    ExperimentNodeConnection firstOutEdge = experiment.OutEdge (node,0);
                    if (firstInEdge != null && firstInEdge.Source!= null && firstOutEdge != null && firstOutEdge.Target!= null)
                        experiment.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), firstInEdge.Source, firstOutEdge.Target));
                    // END HERZUM SPRINT 3.0: TLAB-176
                    experiment.RemoveVertex (node);
                    return true;
                }
                CompositeComponentBaseMetadata meta = node.Data.Metadata as CompositeComponentBaseMetadata;
                if (meta != null)
                    return IncludeChallenge(meta.ComponentGraph);
            }
            return false;
        }
コード例 #17
0
        private static void PushParents(CompositeComponentGraph graph, List<Crumb> crumbs) 
        {

            IExperiment parent = graph.OwnerNode.Owner;

            CompositeComponentGraph graphAbove = parent as CompositeComponentGraph;
           
            if(graphAbove != null) 
            {
                PushParents(graphAbove, crumbs);
                ExperimentNode ownerNode = graphAbove.OwnerNode;
                // HERZUM SPRINT 2.5: TLAB-173
                if (graphAbove.OwnerNode is ScopeNode || graphAbove.OwnerNode is LoopScopeNode || graphAbove.OwnerNode is ChallengeNode)
                    return;
                // END HERZUM SPRINT 2.5: TLAB-173
                crumbs.Add(new ExperimentCrumb(ownerNode.Data.Metadata.Label, graphAbove));
            }
            else if(parent is Experiment)
            {
                crumbs.Add(new ExperimentCrumb(parent.Title, parent));
            }
        }
コード例 #18
0
ファイル: ExperimentNode.cs プロジェクト: neostoic/TraceLab
        void m_data_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "IsModified")
            {
                NotifyPropertyChanged("IsModified");
            }
            if (e.PropertyName == "ErrorMessage")
            {
                SetError(Data.ErrorMessage);
            }

            // HERZUM SPRINT 5.3 TLAB-251
            CompositeComponentGraph subgraph = Owner as CompositeComponentGraph;

            if (subgraph != null)
            {
                subgraph.IsModified = true;
                if (subgraph.OwnerNode != null)
                {
                    subgraph.OwnerNode.NotifyPropertyChanged(e.PropertyName);
                }
            }
            // END HERZUM SPRINT 5.3 TLAB-251
        }
コード例 #19
0
        // HERZUM SPRINT 2.4 TLAB-157
        public static ExperimentCanvasPad CreateCompositeExperimentCanvasPad(ApplicationContext applicationContext, ExperimentCanvasWidget experimentCanvasWidget, CompositeComponentGraph experiment) 
        {   
            ExperimentCanvasPad experimentCanvasPad = null;
            if (m_mapPadToNodes.TryGetValue (applicationContext.GetHashCode() + experiment.ExperimentInfo.Id, out experimentCanvasPad))
                return experimentCanvasPad;
            else
            {
                experimentCanvasPad = new  ExperimentCanvasPad(applicationContext);
                m_mapPadToNodes.Add(applicationContext.GetHashCode() + experiment.ExperimentInfo.Id, experimentCanvasPad);
            } 
 
            DockFrame m_dockFrame = new DockFrame();
            Gdk.WindowAttr attributes = new Gdk.WindowAttr();
            attributes.WindowType = Gdk.WindowType.Child;
            attributes.X = 100;
            attributes.Y = 100;
            attributes.Width = 100;
            attributes.Height = 100;    
            Gdk.WindowAttributesType mask = WindowAttributesType.X | WindowAttributesType.Y;
            m_dockFrame.GdkWindow = new Gdk.Window(null, attributes, (int) mask);
            experimentCanvasPad.Initialize (m_dockFrame);
            experimentCanvasPad.SetApplicationModel(applicationContext.Application, experimentCanvasWidget, experiment);
            return experimentCanvasPad;
        }
コード例 #20
0
 public SubLevelExperimentViewModel(CompositeComponentGraph componentGraph, BaseLevelExperimentViewModel owner)
     : base(componentGraph, owner)
 {
 }
コード例 #21
0
        // END HERZUM SPRINT 4.0: TLAB-204

        #region Create Composite Component

        /// <summary>
        /// Constructs the graph from selected nodes of the given experiment graph.
        /// </summary>
        /// <param name="graph">The graph.</param>
        /// <returns></returns>
        public static CompositeComponentGraph ConstructGraphFromSelectedNodes(BaseExperiment originalExperiment)
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();

            AssureCompleteDecisionSelection(originalExperiment);

            //keep lookup from original node to its clone for later edge reproduction
            Dictionary <ExperimentNode, ExperimentNode> clonedNodeLookup = new Dictionary <ExperimentNode, ExperimentNode>();

            // Clone vertices that are selected and add them to the composite component graph
            foreach (ExperimentNode node in originalExperiment.Vertices)
            {
                if (node.IsSelected)
                {
                    var clonedNode = node.Clone();
                    clonedNodeLookup[node] = clonedNode;
                    compositeComponentGraph.SetLogLevelSettings(clonedNode, compositeComponentGraph.Settings);

                    compositeComponentGraph.AddVertex(clonedNode);

                    if (clonedNode.ID == "Start" && compositeComponentGraph.StartNode == null)
                    {
                        compositeComponentGraph.StartNode = (ExperimentStartNode)clonedNode;
                    }
                    else if (clonedNode.ID == "End" && compositeComponentGraph.EndNode == null)
                    {
                        compositeComponentGraph.EndNode = (ExperimentEndNode)clonedNode;
                    }
                }
            }

            // Clone edges
            foreach (ExperimentNodeConnection connection in originalExperiment.Edges)
            {
                ExperimentNode cloneSourceNode, cloneTargetNode;

                //add edges only if both source and target nodes has been found in clones lookup
                bool foundSourceNode = clonedNodeLookup.TryGetValue(connection.Source, out cloneSourceNode);
                bool foundTargetNode = clonedNodeLookup.TryGetValue(connection.Target, out cloneTargetNode);
                if (foundSourceNode && foundTargetNode)
                {
                    ExperimentNodeConnection clonedConnection = new ExperimentNodeConnection(connection.ID, cloneSourceNode, cloneTargetNode, connection.IsFixed, connection.IsVisible);
                    //copy also all route points
                    clonedConnection.RoutePoints.CopyPointsFrom(connection.RoutePoints);

                    compositeComponentGraph.AddEdge(clonedConnection);

                    //perform fixes for scopes
                    ScopeNodeHelper.TryFixScopeDecisionEntryAndExitNodes(cloneSourceNode, cloneTargetNode);
                }
            }

            ConnectNodesToStartAndEndNode(compositeComponentGraph);

            //move graph closer to the origin point
            TraceLab.Core.Utilities.ExperimentHelper.MoveGraphCloserToOriginPoint(compositeComponentGraph, 200, 200);

            if (originalExperiment.References != null)
            {
                compositeComponentGraph.References = originalExperiment.References.CopyCollection();
            }

            compositeComponentGraph.OwnerNode = null;

            return(compositeComponentGraph);
        }
コード例 #22
0
 public override BaseExperiment Clone()
 {
     var clone = new CompositeComponentGraph(this);
     clone.ResetModifiedFlag();
     return clone;
 }
コード例 #23
0
        // HERZUM SPRINT 2.4 TLAB-157
        public static CompositeComponentGraph ConstructEmptyGraph()
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();       
            compositeComponentGraph.OwnerNode = null;
            return compositeComponentGraph;

        }
コード例 #24
0
        /// <summary>
        /// Determines the optimal start and end positions.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>
        /// <param name="startX">The start X.</param>
        /// <param name="startY">The start Y.</param>
        /// <param name="endX">The end X.</param>
        /// <param name="endY">The end Y.</param>
        private static void DetermineOptimalStartEndPositions(CompositeComponentGraph compositeComponentGraph, out double startX, out double startY, out double endX, out double endY)
        {
            double leftX, rightX, topY, bottomY;
            TraceLab.Core.Utilities.ExperimentHelper.DetermineGraphBoundaries(compositeComponentGraph, out leftX, out rightX, out topY, out bottomY);

            startX = 0;
            startY = 0;
            endX = 0;
            endY = 0;

            //calculate optimal start and end position
            if (leftX == rightX)
            {
                startX = leftX;
                endX = leftX;
            }
            else
            {
                double middleX = (leftX + rightX) / 2;
                startX = middleX;
                endX = middleX;
            }

            startY = topY - 50;
            endY = bottomY + 50;
        }
コード例 #25
0
        /// <summary>
        /// Connects the nodes to start and end node.
        /// In case user selected partial graph without start or/and end node, this methods adds 
        /// accordingly Start and End node to the given composite graph. 
        /// If some selected nodes didn't have any outgoing paths they are automatically connected to the end node.
        /// If some selected nodes didn't have any incoming paths they are automatically connected to the start node.
        /// </summary>
        /// <param name="compositeComponentGraph">The composite component graph.</param>
        private static void ConnectNodesToStartAndEndNode(CompositeComponentGraph compositeComponentGraph)
        {
            if (compositeComponentGraph.StartNode == null || compositeComponentGraph.EndNode == null)
            {
                double startX, startY, endX, endY;

                DetermineOptimalStartEndPositions(compositeComponentGraph, out startX, out startY, out endX, out endY);

                if (compositeComponentGraph.StartNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentStartNode start = new ExperimentStartNode();
                    start.Data.X = startX;
                    start.Data.Y = startY;
                    compositeComponentGraph.AddVertex(start);
                    compositeComponentGraph.StartNode = start;
                }

                if (compositeComponentGraph.EndNode == null)
                {
                    //create start node and add it to graph, and connect it to the existing graph
                    ExperimentEndNode end = new ExperimentEndNode();
                    end.Data.X = endX;
                    end.Data.Y = endY;
                    compositeComponentGraph.AddVertex(end);
                    compositeComponentGraph.EndNode = end;
                }

                //connect subgraph to start and end
                foreach (ExperimentNode node in compositeComponentGraph.Vertices)
                {
                    if (node is ExperimentStartNode == false && node is ExperimentEndNode == false)
                    {
                        //if node has not any incoming connection from other Selected Nodes it has to be connected to the start
                        if (compositeComponentGraph.IsInEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), compositeComponentGraph.StartNode, node));
                        }

                        //if node has not any outcoming connection from other Selected Nodes it has to be connected to the end
                        if (compositeComponentGraph.IsOutEdgesEmpty(node))
                        {
                            compositeComponentGraph.AddEdge(new ExperimentNodeConnection(Guid.NewGuid().ToString(), node, compositeComponentGraph.EndNode));
                        }
                    }
                }
            }
        }
コード例 #26
0
        /// <summary>
        /// Constructs the graph from selected nodes of the given experiment graph.
        /// </summary>
        /// <param name="graph">The graph.</param>
        /// <returns></returns>
        public static CompositeComponentGraph ConstructGraphFromSelectedNodes(BaseExperiment originalExperiment)
        {
            var compositeComponentGraph = new CompositeComponentGraph();

            // Clone experiment info.
            compositeComponentGraph.ExperimentInfo = new ExperimentInfo();

            AssureCompleteDecisionSelection(originalExperiment);

            //keep lookup from original node to its clone for later edge reproduction
            Dictionary<ExperimentNode, ExperimentNode> clonedNodeLookup = new Dictionary<ExperimentNode, ExperimentNode>();

            // Clone vertices that are selected and add them to the composite component graph
            foreach (ExperimentNode node in originalExperiment.Vertices)
            {
                if (node.IsSelected)
                {
                    var clonedNode = node.Clone();
                    clonedNodeLookup[node] = clonedNode;
                    compositeComponentGraph.SetLogLevelSettings(clonedNode, compositeComponentGraph.Settings);
                    compositeComponentGraph.AddVertex(clonedNode);

                    if (clonedNode.ID == "Start" && compositeComponentGraph.StartNode == null)
                    {
                        compositeComponentGraph.StartNode = (ExperimentStartNode)clonedNode;
                    }
                    else if (clonedNode.ID == "End" && compositeComponentGraph.EndNode == null)
                    {
                        compositeComponentGraph.EndNode = (ExperimentEndNode)clonedNode;
                    }
                }
            }

            // Clone edges
            foreach (ExperimentNodeConnection connection in originalExperiment.Edges)
            {
                ExperimentNode cloneSourceNode, cloneTargetNode;

                //add edges only if both source and target nodes has been found in clones lookup
                bool foundSourceNode = clonedNodeLookup.TryGetValue(connection.Source, out cloneSourceNode);
                bool foundTargetNode = clonedNodeLookup.TryGetValue(connection.Target, out cloneTargetNode);
                if (foundSourceNode && foundTargetNode)
                {
                    ExperimentNodeConnection clonedConnection = new ExperimentNodeConnection(connection.ID, cloneSourceNode, cloneTargetNode, connection.IsFixed, connection.IsVisible);
                    //copy also all route points
                    clonedConnection.RoutePoints.CopyPointsFrom(connection.RoutePoints);

                    compositeComponentGraph.AddEdge(clonedConnection);

                    //perform fixes for scopes 
                    ScopeNodeHelper.TryFixScopeDecisionEntryAndExitNodes(cloneSourceNode, cloneTargetNode);
                }
            }

            ConnectNodesToStartAndEndNode(compositeComponentGraph);

            //move graph closer to the origin point
            TraceLab.Core.Utilities.ExperimentHelper.MoveGraphCloserToOriginPoint(compositeComponentGraph, 200, 200);
                        
            if (originalExperiment.References != null)
            {
                if (!TraceLabSDK.RuntimeInfo.IsRunInMono)
                {
                    compositeComponentGraph.References = new ObservableCollection<TraceLabSDK.PackageSystem.IPackageReference>(originalExperiment.References);
                }
                else
                {
                    // Mono currently has not implemented constructor of ObservableCollection(IEnumerable<T> collection)
                    // thus we have to add references manually
                    compositeComponentGraph.References = new ObservableCollection<TraceLabSDK.PackageSystem.IPackageReference>();
                    foreach (TraceLabSDK.PackageSystem.IPackageReference reference in originalExperiment.References)
                    {
                        compositeComponentGraph.References.Add(reference);
                    }
                }
            }

            compositeComponentGraph.OwnerNode = null;

            return compositeComponentGraph;
        }
コード例 #27
0
 /// <summary>
 /// Initializes the component graph from ComponentMetadataDefinition graph
 /// </summary>
 /// <param name="node">The node.</param>
 /// <param name="settings">The settings.</param>
 public override void InitializeComponentGraph(CompositeComponentNode node, TraceLab.Core.Settings.Settings settings)
 {
     //each composite node gets its own copy of ComponentMetadataDefinition.ComponentGraph
     m_compositeComponentGraph = new CompositeComponentGraph(node, ComponentMetadataDefinition.ComponentGraph);
     m_compositeComponentGraph.Settings = settings;
 }
コード例 #28
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CompositeComponentGraph"/> class with the given settings.
        /// </summary>
        /// <param name="compositeComponentNode">The composite component node.</param>
        /// <param name="componentGraph">The component graph.</param>
        /// <param name="settings">The settings. All components are initialized with with the given settings.</param>
        public CompositeComponentGraph(CompositeComponentNode compositeComponentNode, CompositeComponentGraph componentGraph) : base()
        {
            if (componentGraph == null)
            {
                throw new ArgumentException("Component graph cannot be null");
            }

            CopyFrom(componentGraph);
            OwnerNode = compositeComponentNode;
        }
コード例 #29
0
        /// <summary>
        /// Performs a deep copy of the data in this object to another instance of the Metadata.
        /// </summary>
        /// <param name="other">The other.</param>
        protected override void CopyFrom(Metadata other)
        {
            if (other == null)
                throw new ArgumentNullException("other");

            base.CopyFrom(other);

            ScopeBaseMetadata metadata = (ScopeBaseMetadata)other;
            m_experimentLocationRoot = metadata.m_experimentLocationRoot;
            m_compositeComponentGraph = (CompositeComponentEditableGraph)(metadata.m_compositeComponentGraph.Clone());
            
            HasDeserializationError = metadata.HasDeserializationError;
            if (HasDeserializationError)
            {
                DeserializationErrorMessage = metadata.DeserializationErrorMessage;
            }
            
        }
コード例 #30
0
ファイル: BaseExperiment.cs プロジェクト: neostoic/TraceLab
        public void CopyAndAdd(CompositeComponentGraph subExperiment, double x, double y, bool first)
        {
            if (subExperiment == null)
            {
                return;
            }

            if (subExperiment.IsVerticesEmpty)
            {
                return;
            }

            bool   firstNode = true;
            double minX      = 0;
            double minY      = 0;
            double offsetX   = 0;
            double offsetY   = 0;

            if (first)
            {
                foreach (ExperimentNode node in subExperiment.Vertices)
                {
                    // HERZUM SPRINT 2.6 TLAB-175
                    // if (node.ID != "Start" && node.ID != "End"){
                    if ((node.ID != "Start" && node.ID != "End") && !(first && (node is ExperimentStartNode || node is ExperimentEndNode)))
                    {
                        // END HERZUM SPRINT 2.6 TLAB-175
                        if (firstNode)
                        {
                            minX      = node.Data.X;
                            minY      = node.Data.Y;
                            firstNode = false;
                        }
                        else
                        {
                            if (node.Data.X < minX)
                            {
                                minX = node.Data.X;
                            }
                            if (node.Data.Y < minY)
                            {
                                minY = node.Data.Y;
                            }
                        }
                    }
                }
            }

            offsetX = x - minX;
            offsetY = y - minY;

            //keep lookup from original node to its clone for later edge reproduction
            Dictionary <ExperimentNode, ExperimentNode> clonedNodeLookup = new Dictionary <ExperimentNode, ExperimentNode>();

            // Clone vertices and add them to the composite component graph
            foreach (ExperimentNode node in subExperiment.Vertices)
            {
                // HERZUM SPRINT 2.6 TLAB-175
                // if (node.ID != "Start" && node.ID != "End")
                if ((node.ID != "Start" && node.ID != "End") && !(first && (node is ExperimentStartNode || node is ExperimentEndNode)))
                // END HERZUM SPRINT 2.6 TLAB-175
                {
                    var clonedNode = node.Clone();
                    clonedNode.ID = Guid.NewGuid().ToString();
                    SetLogLevelSettings(clonedNode, Settings);
                    clonedNodeLookup[node] = clonedNode;

                    clonedNode.Owner = this;

                    if (first)
                    {
                        clonedNode.Data.X = clonedNode.Data.X + offsetX;
                        clonedNode.Data.Y = clonedNode.Data.Y + offsetY;
                    }

                    AddVertex(clonedNode);

                    ScopeBaseMetadata scopeBaseMetadata       = node.Data.Metadata as ScopeBaseMetadata;
                    ScopeBaseMetadata clonedScopeBaseMetadata = clonedNode.Data.Metadata as ScopeBaseMetadata;
                    if ((scopeBaseMetadata != null && clonedScopeBaseMetadata != null) &&
                        (scopeBaseMetadata.ComponentGraph != null))
                    {
                        clonedScopeBaseMetadata.ComponentGraph.Clear();
                        clonedScopeBaseMetadata.ComponentGraph.GetExperiment().ExperimentInfo = clonedScopeBaseMetadata.ComponentGraph.GetExperiment().ExperimentInfo.CloneWithNewId();
                        clonedScopeBaseMetadata.ComponentGraph.CopyAndAdd(scopeBaseMetadata.ComponentGraph, x, y, false);
                    }
                }
            }

            // Clone edges
            foreach (ExperimentNodeConnection connection in subExperiment.Edges)
            {
                ExperimentNode cloneSourceNode, cloneTargetNode;

                //add edges only if both source and target nodes has been found in clones lookup
                bool foundSourceNode = clonedNodeLookup.TryGetValue(connection.Source, out cloneSourceNode);
                bool foundTargetNode = clonedNodeLookup.TryGetValue(connection.Target, out cloneTargetNode);
                if (foundSourceNode && foundTargetNode)
                {
                    ExperimentNodeConnection clonedConnection = new ExperimentNodeConnection(Guid.NewGuid().ToString(), cloneSourceNode, cloneTargetNode, connection.IsFixed, connection.IsVisible);
                    //copy also all route points
                    clonedConnection.RoutePoints.CopyPointsFrom(connection.RoutePoints);
                    AddEdge(clonedConnection);

                    //special case - fix scope node references
                    ScopeNodeHelper.TryFixScopeDecisionEntryAndExitNodes(cloneSourceNode, cloneTargetNode);
                }
            }

            // HERZUM SPRINT 2.4 TLAB-56 TLAB-57 TLAB-58 TLAB-59
            if (first)
            {
                if (subExperiment.References != null)
                {
                    References = subExperiment.References.CopyCollection();
                }
            }
            // HERZUM SPRINT 2.4 TLAB-56 TLAB-57 TLAB-58 TLAB-59

            // Do deep copy of errors.
            this.m_errors = new ObservableDictionary <ExperimentNode, ExperimentNodeError>();
            foreach (KeyValuePair <ExperimentNode, ExperimentNodeError> pair in m_errors)
            {
                m_errors[clonedNodeLookup[pair.Key]] = new ExperimentNodeError(pair.Value.ErrorMessage, pair.Value.ErrorType);
            }
        }
コード例 #31
0
        /// <summary>
        /// Creates sub level view for the given composite component graph.
        /// SubLevelViewModel represents the view for the breadcrumbs.
        /// 
        /// Method also collects the sub level into dictionary of sublevel id to its corresponding view model,
        /// so that when user opens subgraph it can locate coressponging view model.
        /// </summary>
        /// <param name="componentGraph">The component graph.</param>
        /// <param name="subLevelId">The sub level id.</param>
        /// <param name="parentLevelViewModel">The parent level view model - it may either top level experiment view model, or another sublevel view model.</param>
        private void CreateSubLevelViewModel(CompositeComponentGraph componentGraph, string subLevelId, BaseLevelExperimentViewModel parentLevelViewModel)
        {
            //if it is null the loading failed... and node should be marked with error already
            if (componentGraph != null)
            {
                var subLevel = new SubLevelExperimentViewModel(componentGraph, parentLevelViewModel);
                m_subLevels.Add(subLevelId, subLevel);
                AddSubLevels(subLevelId, subLevel);

                //if the graph is editable graph listen to added node event
                if (componentGraph is CompositeComponentEditableGraph)
                {
                    componentGraph.NodeAdded += OnNodeAdded;
                }
            }
        }
コード例 #32
0
ファイル: ExperimentCanvasPad.cs プロジェクト: CoEST/TraceLab
 // HERZUM SPRINT 2.3 TLAB-56 TLAB-57 TLAB-58 TLAB-59
 internal void DrawSubExperiment(CompositeComponentGraph sub_experiment)
 {   
     if (m_subExperiment != null)
         m_experimentDrawer.DrawExperiment (sub_experiment, true);              
 }
コード例 #33
0
ファイル: ExperimentCanvasPad.cs プロジェクト: CoEST/TraceLab
        // HERZUM SPRINT 2.5 TLAB-157
        /*
        private bool IsInEditableExperiment(CompositeComponentGraph experiment){
            if (experiment == null || experiment.OwnerNode == null)
                return true;

            CompositeComponentGraph fatherExperiment = experiment.OwnerNode.Owner as CompositeComponentGraph ;
            if (fatherExperiment != null && fatherExperiment.OwnerNode!= null){
                CompositeComponentBaseMetadata meta = fatherExperiment.OwnerNode.Data.Metadata as CompositeComponentBaseMetadata;
                if (meta != null && meta.ComponentGraph is CompositeComponentEditableGraph)
                    return IsInEditableExperiment (meta.ComponentGraph);
                else
                    return false;
            } else
                return true;
        }
        */
        // END SPRINT 2.5 TLAB-157

        public void SetScopeApplicationModel(ScopeNodeControl scopeNodeControl, ApplicationViewModel applicationViewModel, CompositeComponentGraph subExperiment) 
        {
            // HERZUM SPRINT 1.0
            // scopeNodeControlCurrent = scopeNodeControl;
            // END HERZUM SPRINT 1.0

                if(m_initialized == false || m_dockFrame.GdkWindow == null) 
            {
                //GdkWindow is for each dock frame is assigned when windowShell calls ShowAll(). See DockContainer.OnRealize method
                throw new InvalidOperationException ("ExperimentCanvasPad must be first initialized and dockFrame must have assigned GdkWindow before setting application model.");
            }

            m_applicationViewModel = applicationViewModel;

            // HERZUM SPRINT 1.0
            // Experiment e = new Experiment ();
            // m_applicationViewModel = ApplicationViewModel.CreateNewApplicationViewModel (applicationViewModel, e);
            // m_applicationContext = new ApplicationContext (m_applicationViewModel);
            // END HERZUM SPRINT 1.0

            if(m_applicationViewModel.Experiment == null) 
            {
                m_experimentPad.Content = new WelcomePageWidget(m_applicationContext);
            } 
            else 
            {
                // CreateExperimentControlToolbar();

                // HERZUM SPRINT 1.0
                m_subExperiment = new CompositeComponentEditableGraph (subExperiment);
                // END HERZUM SPRINT 1.0

                // HERZUM SPRINT 1.0 PROGRESS
                // HERZUM SPRINT 2.4 TLAB-157
                if (subExperiment.OwnerNode != null)
                    // END HERZUM SPRINT 2.4 TLAB-157
                    m_subExperiment.OwnerNode = subExperiment.OwnerNode;
                // HERZUM SPRINT 2.4 TLAB-157
                if (subExperiment.GraphIdPath != null)
                    // END HERZUM SPRINT 2.4 TLAB-157
                    m_subExperiment.GraphIdPath = subExperiment.GraphIdPath;
                // END HERZUM SPRINT 1.0

                // HERZUM SPRINT 4.3: TLAB-238 TLAB-243
                if (m_subExperiment.ExperimentInfo != null)
                    m_subExperiment.ExperimentInfo.FilePath = m_applicationContext.Application.Experiment.ExperimentInfo.FilePath;
                // END HERZUM SPRINT 4.3: TLAB-238 TLAB-243

                // HERZUM SPRINT 1.1 LOOP
                // ScopeMetadata scopeMetadata = scopeNodeControlCurrent.ExperimentNode.Data.Metadata as ScopeMetadata;

                // HERZUM SPRINT 2.1
                // ScopeBaseMetadata scopeMetadata = scopeNodeControlCurrent.ExperimentNode.Data.Metadata as ScopeBaseMetadata;
                ScopeBaseMetadata scopeMetadata = scopeNodeControl.ExperimentNode.Data.Metadata as ScopeBaseMetadata;
                // END HERZUM SPRINT 2.1

                // END HERZUM SPRINT 1.1 LOOP

                scopeMetadata.SetSubExperiment (m_subExperiment);
                m_experimentCanvasWidget = new ExperimentCanvasWidget ();
                m_experimentPad.Content = m_experimentCanvasWidget;

                bool isExperimentEditable = m_applicationViewModel.Experiment is IEditableExperiment;
             //   isExperimentEditable = isChallengePasswordBeenUsed ();

                m_experimentDrawer = new ExperimentDrawer (m_experimentCanvasWidget, m_applicationContext.NodeControlFactory,
                                                           m_applicationContext.NodeConnectionControlFactory);

                //m_experimentDrawer.DrawExperiment(m_applicationViewModel.Experiment, isExperimentEditable);

                // HERZUM SPRINT 2.5 TLAB-157
                // isExperimentEditable = isExperimentEditable && IsInEditableExperiment (m_subExperiment);
                isExperimentEditable = checkEditable (m_subExperiment);
                // END HERZUM SPRINT 2.5 TLAB-157

                if (scopeNodeControl is ChallengeNodeControl)
                    isExperimentEditable = true;

                // HERZUM SPRINT 3.0: TLAB-172
                isExperimentEditable = isExperimentEditable && !isInCompositeCrumb();
                // END HERZUM SPRINT 3.0: TLAB-172

                m_experimentDrawer.DrawExperiment(m_subExperiment, isExperimentEditable);               

                // HERZUM SPRINT 1.0
                m_subExperiment.NodeRemoved += OnNodeRemoved;
                m_subExperiment.EdgeRemoved += OnEdgeRemoved;
                //
                //m_applicationViewModel.Experiment.NodeRemoved += OnNodeRemoved;
                //m_applicationViewModel.Experiment.EdgeRemoved += OnEdgeRemoved;
                // END HERZUM SPRINT 1.0

                if(isExperimentEditable) 
                {
                    //enable drop of components to canvas
                    EnableDrop ();
                }
            }
        }
コード例 #34
0
ファイル: ExperimentCanvasPad.cs プロジェクト: CoEST/TraceLab
        //TRUE if it is editable
        private bool checkEditable(CompositeComponentGraph experiment){
            if (experiment == null || experiment.OwnerNode == null)
                return true;

            if(isChallengeExp()){
                if (!hasAnyPasswordBeenUsed () || !hasChallengePasswordBeenUsed()) {
                    return true;
                } else {
                    CompositeComponentGraph fatherExperiment = experiment.OwnerNode.Owner as CompositeComponentGraph;
                    if (fatherExperiment != null && fatherExperiment.OwnerNode != null) {
                        if ((fatherExperiment.OwnerNode.Data.Metadata as ChallengeMetadata) != null) {
                            return true;
                        } else {
                            return checkEditable (fatherExperiment);
                        }

                    } else {
                        return false;
                    }
                }
            } else {
                return true;
            }
                 
        }
コード例 #35
0
ファイル: ScopeBaseMetadata.cs プロジェクト: CoEST/TraceLab
 // HERZUM SPRINT 1.0
 public void SetSubExperiment(CompositeComponentEditableGraph compositeComponentEditableGraph)
 {
     m_compositeComponentGraph = compositeComponentEditableGraph;
 }
コード例 #36
0
        /// <summary>
        /// Performs a deep copy of the data in this object to another instance of the Metadata.
        /// </summary>
        /// <param name="other">The other.</param>
        protected override void CopyFrom(Metadata other)
        {
            if (other == null)
                throw new ArgumentNullException("other");
            
            base.CopyFrom(other);

            CompositeComponentMetadata metadata = (CompositeComponentMetadata)other;
            m_IOSpec = metadata.m_IOSpec.Clone();
            m_configWrapper = metadata.m_configWrapper.Clone();
            m_experimentLocationRoot = metadata.m_experimentLocationRoot;
            m_compositeComponentMetadataDefinition = metadata.m_compositeComponentMetadataDefinition;
            m_componentMetadataDefinitionID = metadata.m_componentMetadataDefinitionID;

            HasDeserializationError = metadata.HasDeserializationError;
            if (HasDeserializationError)
            {
                DeserializationErrorMessage = metadata.DeserializationErrorMessage;
            } 

            // if composite component was not present in the library, then corresponding component graph may be null.
            // the deserialization has already set the corresponding error above, nevertheless subgraph cannot be cloned obviously
            if (HasDeserializationError == false && metadata.m_compositeComponentGraph != null)
            {
                m_compositeComponentGraph = (CompositeComponentGraph)(metadata.m_compositeComponentGraph.Clone());
            }

            m_tempConfigWrapper = metadata.m_tempConfigWrapper;
            m_tempIoSpec = metadata.m_tempIoSpec;
            m_tempLabel = metadata.m_tempLabel;
        }
コード例 #37
0
ファイル: ExperimentCanvasPad.cs プロジェクト: CoEST/TraceLab
        // ***************************************************
        // HERZUM SPRINT 2.4 TLAB-157
        public void SetApplicationModel(ApplicationViewModel applicationViewModel,  ExperimentCanvasWidget experimentCanvasWidget, CompositeComponentGraph subExperiment) 
        {
            // HERZUM SPRINT 1.0
            // scopeNodeControlCurrent = scopeNodeControl;
            // END HERZUM SPRINT 1.0

            if(m_initialized == false || m_dockFrame.GdkWindow == null) 
            {
                //GdkWindow is for each dock frame is assigned when windowShell calls ShowAll(). See DockContainer.OnRealize method
                throw new InvalidOperationException("ExperimentCanvasPad must be first initialized and dockFrame must have assigned GdkWindow before setting application model.");
            }

            m_applicationViewModel = applicationViewModel;

            if(m_applicationViewModel.Experiment == null) 
            {
                m_experimentPad.Content = new WelcomePageWidget(m_applicationContext);
            } 
            else 
            {
                // CreateExperimentControlToolbar();


                m_subExperiment = new CompositeComponentEditableGraph(subExperiment);
                if (subExperiment.OwnerNode != null)
                    m_subExperiment.OwnerNode = subExperiment.OwnerNode;
                if (subExperiment.GraphIdPath != null)
                    m_subExperiment.GraphIdPath = subExperiment.GraphIdPath;

                m_experimentCanvasWidget = experimentCanvasWidget;


                m_experimentPad.Content = m_experimentCanvasWidget;

                // bool isExperimentEditable = m_applicationViewModel.Experiment is IEditableExperiment;


                m_experimentDrawer = new ExperimentDrawer(m_experimentCanvasWidget, 
                                                          new NodeControlFactory(m_applicationContext),
                                                          new NodeConnectionControlFactory(m_applicationContext));


                m_experimentDrawer.DrawExperiment(m_subExperiment, false);

            }
        }
コード例 #38
0
        /// <summary>
        /// Process excuted once xml deserialization was completed.
        /// </summary>
        /// <param name="library">The library.</param>
        /// <param name="experimentLocationRoot">The experiment location root.</param>
        public override void PostProcessReadXml(Components.IComponentsLibrary library, string experimentLocationRoot)
        {
            m_experimentLocationRoot = experimentLocationRoot;

            if (m_experimentXml != null)
            {
                using (XmlReader reader = XmlReader.Create(new System.IO.StringReader(m_experimentXml)))
                {
                    var experiment = TraceLab.Core.Experiments.ExperimentSerializer.DeserializeExperiment(reader, library);
                    m_compositeComponentGraph = new Experiments.CompositeComponentEditableGraph(experiment);
                }
                //clear variable
                m_experimentXml = null;
            }

            IsInitialized = true;
            IsModified = false;
        }