Beispiel #1
0
        private void CheckVariablesUsage()
        {
            LexicalAnalyzer lexAnalyzer = new LexicalAnalyzer();
            SyntaxAnalyzer  syntaxAnalyzer;

            foreach (Transition trans in TransitionsList)
            {
                if (trans is SimpleTransition strans)
                {
                    lexAnalyzer.Source = strans.Condition;
                    syntaxAnalyzer     = new SyntaxAnalyzer(lexAnalyzer, VariableCollection.GetConditionDictionary(trans.OwnerDraw.OwnerSheet).Keys.ToList());
                    foreach (SyntaxToken token in syntaxAnalyzer.Tokens)
                    {
                        if (token.Qualifier != SyntaxToken.Qualifiers.Correct)
                        {
                            MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, string.Format("{0}: {1}.", trans.Name, token.ToString()), trans));
                        }
                    }
                    foreach (string outputOperation in strans.OutputsList)
                    {
                        string outputName = LexicalRules.GetOutputId(outputOperation);
                        if (!trans.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(output => output.Name == outputName))
                        {
                            MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Output " + outputName + " is not defined in variables list.", trans));
                        }
                    }
                }
            }
            foreach (DrawableObject obj in ObjectsTable)
            {
                if (obj is State state)
                {
                    //state.EnterOutputsList.RemoveAll(str => !state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(str)));
                    foreach (string outputOperation in state.EnterOutputsList)
                    {
                        string outputName = LexicalRules.GetOutputId(outputOperation);
                        if (!state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(outputName)))
                        {
                            MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Output " + outputName + " is not defined in variables list.", state));
                        }
                    }
                    //state.ExitOutputsList.RemoveAll(str => !state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(str)));
                    foreach (string outputOperation in state.ExitOutputsList)
                    {
                        string outputName = LexicalRules.GetOutputId(outputOperation);
                        if (!state.OwnerDraw.OwnerSheet.Variables.InternalOutputs.Exists(var => var.Name == LexicalAnalyzer.GetId(outputName)))
                        {
                            MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Output " + outputName + " is not defined in variables list.", state));
                        }
                    }
                }
            }
        }
        public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
        {
            if (value == null)
            {
                throw new Exception("The property value must be different to null.");
            }
            var svc   = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
            var codes = value as string;

            if (svc != null && codes != null)
            {
                DrawableObject obj   = context.Instance as DrawableObject;
                DrawingSheet   sheet = obj.OwnerDraw.OwnerSheet;

                using (var form = new EditCondition(VariableCollection.GetConditionDictionary(sheet), codes))
                {
                    if (svc.ShowDialog(form) == DialogResult.OK)
                    {
                        value = form.Condition;
                    }
                }
            }
            return(value);
        }
Beispiel #3
0
 private void GetUsedObjects(DrawingSheet sheet, VariableCollection variables)
 {
     if (sheet is ModelSheet model)
     {
         UsedModels.Add(model);
     }
     else
     {
         UsedSheets.Add(sheet);
     }
     foreach (DrawableObject obj in sheet.Sketch.Objects)
     {
         if (obj is Relation indir)
         {
             Variable input  = VariableCollection.GetIndirectInput(sheet, indir.Trigger);
             Variable output = VariableCollection.GetIndirectOutput(sheet, indir.Output);
             if (input == null)
             {
                 MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation trigger variable not found.", indir));
             }
             if (output == null)
             {
                 MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation output variable not found.", indir));
             }
             if (input != null && output != null)
             {
                 BasicRelation ibindir = RelationsList.FirstOrDefault(ind => ind.Input.Name == input.Name);
                 BasicRelation obindir = RelationsList.FirstOrDefault(ind => ind.Action.Output.Name == input.Name);
                 if (ibindir != null)
                 {
                     MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation has same input than other one.", indir, ibindir.Relation));
                 }
                 if (obindir != null)
                 {
                     MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation has same output than other one.", indir, obindir.Relation));
                 }
                 if (ibindir == null && obindir == null)
                 {
                     BasicOutput   action = indir.Action == null ? null : new BasicOutput((OperationType)Enum.Parse(typeof(OperationType), indir.Action), output);
                     BasicRelation bindir = new BasicRelation(indir, input, action);
                     RelationsList.Add(bindir);
                 }
             }
         }
         else if (obj is Equation eq)
         {
             IInternalOutput output = variables.IndirectOutputs.FirstOrDefault(io => io.Name == eq.AssignTo);
             if (output == null)
             {
                 MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Relation trigger variable not found.", eq));
             }
             if (eq.Operation == "")
             {
                 MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Equation does not have operation.", eq));
             }
             LexicalAnalyzer lexAnalyzer = new LexicalAnalyzer();
             SyntaxAnalyzer  syntaxAnalyzer;
             lexAnalyzer.Source = eq.Operation;
             syntaxAnalyzer     = new SyntaxAnalyzer(lexAnalyzer, VariableCollection.GetConditionDictionary(eq.OwnerDraw.OwnerSheet).Keys.ToList());
             foreach (SyntaxToken token in syntaxAnalyzer.Tokens)
             {
                 if (token.Qualifier != SyntaxToken.Qualifiers.Correct)
                 {
                     MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, string.Format("{0}: {1}.", eq.Name, token.ToString()), eq));
                 }
             }
             EquationsList.Add(new BasicEquation(eq));
         }
         else if (obj is Transition trans)
         {
             TransitionsList.Add(trans);
             if (trans.StartObject == null)
             {
                 MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition without start connection.", trans));
             }
             if (trans.EndObject == null)
             {
                 MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition without end connection.", trans));
             }
             if (trans is SimpleTransition strans && strans.Condition == "" && strans.Timeout == 0)
             {
                 if (strans.StartObject is Origin origin)
                 {
                     if (strans.EndObject is End || strans.EndObject is Abort)
                     {
                         MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "One shot machine Transition should have a condition.", trans));
                     }
                 }
                 else if (!strans.DefaultTransition)
                 {
                     MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition does not have condition or timeout value.", trans));
                 }
             }
             else if (trans is SuperTransition sptrans && sptrans.Links == "")
             {
                 MessagesList.Add(new CheckMessage(CheckMessage.MessageTypes.Error, "Transition is not linking any object.", trans));
             }
         }