コード例 #1
0
        private string GenerateBody(RevitFunctionViewModel revitFunction)
        {
            var formulaBody = FunctionTypeAnalizer.GetBlueprint(revitFunction.FunctionType);

            for (int i = 0; i < revitFunction.Arguments.Count; i++)
            {
                string arg = revitFunction.Arguments[i];
                if (arg == "Function")
                {
                    var childFunction = revitFunction.ChildFunctions.First();
                    arg = GenerateBody(childFunction);
                    revitFunction.ChildFunctions.Remove(childFunction);
                }

                if ((revitFunction.FunctionType == RevitEnums.FunctionType.OrFunction ||
                     revitFunction.FunctionType == RevitEnums.FunctionType.AndFunction) &&
                    i > 1)
                {
                    formulaBody = formulaBody.Replace(Convert.ToString(formulaBody.Last()), $",{{{i}}})");
                }
                formulaBody = formulaBody.Replace($"{{{i}}}", arg);
            }

            return(formulaBody);
        }
コード例 #2
0
        private void CheckCommasInFunction(RevitFunctionModel function, string formula, int functionEndPos)
        {
            var numOfArgs = FunctionTypeAnalizer.CheckNumberOfArgs(function.FunctionType);

            if (numOfArgs > 1)
            {
                bool insideChildFunction  = false;
                int  childFunctionCounter = 0;
                var  correctNumOfCommas   = numOfArgs - 1;
                int  numOfCommas          = 0;
                for (int i = function.StartPos + 1; i < functionEndPos; i++)
                {
                    char character = formula[i];
                    if (character.Equals(openingBracket))
                    {
                        if (childFunctionCounter == 0)
                        {
                            insideChildFunction = true;
                        }
                        childFunctionCounter++;
                    }
                    else if (character.Equals(closingBracket))
                    {
                        childFunctionCounter--;
                        if (childFunctionCounter == 0)
                        {
                            insideChildFunction = false;
                        }
                    }

                    if (!insideChildFunction)
                    {
                        if (character.Equals(comma))
                        {
                            numOfCommas++;
                        }
                    }

                    if (correctNumOfCommas < numOfCommas)
                    {
                        throw new Exception($"Unnecessary comma in formula at index {i} - possibly bracket around this index.");
                    }
                }
                if (correctNumOfCommas > numOfCommas)
                {
                    throw new Exception(
                              $"Missing commas in {function.FunctionTypeName}(at index {function.StartPos}).\nFunction should have {correctNumOfCommas} commas but contains only {numOfCommas}.");
                }
            }
        }