/// <summary> /// Calculates the X and Y coordinates of each control point and stores them in this.controlPointValues /// </summary> /// <param name="erroneousControlPointIndexSet"> /// empty if all points had valid equations. Otherwise contains the index of at least one point with an invalid equation. /// </param> /// <returns>True on success, False if the control point equations could not be evaluated.</returns> protected ReturnStatus <List <XyPoint <double> > > CalculateControlPointValues( List <MssParamInfo> variableParamInfoList, List <MssParamInfo> transformParamInfoList, List <XyPoint <string> > pointEquations, ref HashSet <int> erroneousControlPointIndexSet) { Logger.HighVolume(26, string.Format("CalculateControlPointValues - pointEquations: {0}, transformParamInfoList: {1}", EnumerableUtils.ToString(pointEquations), EnumerableUtils.ToString(transformParamInfoList))); erroneousControlPointIndexSet.Clear(); var controlPointList = new List <XyPoint <double> >(); //Create the input for the control point jobs. The expression string will be //individually set for each equation. EvaluationControlPointInput pointEvalInput = new EvaluationControlPointInput(); pointEvalInput.Init(variableParamInfoList, transformParamInfoList, ""); //Create jobs to evaluate the x and y coordinates for a control point EvaluationControlPointJob pointXEvalJob = new EvaluationControlPointJob(); EvaluationControlPointJob pointYEvalJob = new EvaluationControlPointJob(); double previousPointXVal = 0; //Itterate through each control point equation and evaluate it's X and Y coordinates. for (int i = 0; i < pointEquations.Count; i++) { XyPoint <string> pointEquation = pointEquations[i]; var xEquationStatus = CreateExpressionFromString(pointEquation.X, EvalType.ControlPoint); var yEquationStatus = CreateExpressionFromString(pointEquation.Y, EvalType.ControlPoint); if (!xEquationStatus.IsValid || !yEquationStatus.IsValid) { Logger.HighVolume(27, string.Format("The x or y equation for control point {0} was not a valid equation. Equations: {1}", i, pointEquation)); erroneousControlPointIndexSet.Add(i); return(new ReturnStatus <List <XyPoint <double> > >(controlPointList, false)); } //Evaluate the equation for the current control point's X value pointEvalInput.EquationStr = pointEquation.X; pointXEvalJob.Configure(pointEvalInput, xEquationStatus.Value); pointXEvalJob.Execute(); //Evaluate the equation for the current control point's Y value pointEvalInput.EquationStr = pointEquation.Y; pointYEvalJob.Configure(pointEvalInput, yEquationStatus.Value); pointYEvalJob.Execute(); //If one of the equations could not be evaluated return false if (pointXEvalJob.OutputIsValid == false || pointYEvalJob.OutputIsValid == false) { Logger.HighVolume(28, string.Format("The x or y equation for control point {0} encountered an error while being evaluated. Equations: {1}", i, pointEquation)); erroneousControlPointIndexSet.Add(i); return(new ReturnStatus <List <XyPoint <double> > >(controlPointList, false)); } //Store the current control point's X and Y coordinates in this.controlPointValues. XyPoint <double> curPoint = new XyPoint <double>(pointXEvalJob.OutputVal, pointYEvalJob.OutputVal); controlPointList.Add(curPoint); previousPointXVal = pointXEvalJob.OutputVal; } for (int i = 1; i < controlPointList.Count; i++) { //If the control points are not in order from smallest to largest then return an //invalid return status. if (controlPointList[i - 1].X > controlPointList[i].X) { Logger.HighVolume(29, string.Format("The control points are not in order. X{0}: {1}, X{2}, {3}", i - 1, controlPointList[i - 1].X, i, controlPointList[i].X)); erroneousControlPointIndexSet.Add(i); erroneousControlPointIndexSet.Add(i - 1); return(new ReturnStatus <List <XyPoint <double> > >(controlPointList, false)); } } return(new ReturnStatus <List <XyPoint <double> > >(controlPointList, true)); }
/// <summary> /// Calculates the X and Y coordinates of each control point and stores them in this.controlPointValues /// </summary> /// <param name="erroneousControlPointIndexSet"> /// empty if all points had valid equations. Otherwise contains the index of at least one point with an invalid equation. /// </param> /// <returns>True on success, False if the control point equations could not be evaluated.</returns> protected ReturnStatus<List<XyPoint<double>>> CalculateControlPointValues( List<MssParamInfo> variableParamInfoList, List<MssParamInfo> transformParamInfoList, List<XyPoint<string>> pointEquations, ref HashSet<int> erroneousControlPointIndexSet) { Logger.HighVolume(26, string.Format("CalculateControlPointValues - pointEquations: {0}, transformParamInfoList: {1}", EnumerableUtils.ToString(pointEquations), EnumerableUtils.ToString(transformParamInfoList))); erroneousControlPointIndexSet.Clear(); var controlPointList = new List<XyPoint<double>>(); //Create the input for the control point jobs. The expression string will be //individually set for each equation. EvaluationControlPointInput pointEvalInput = new EvaluationControlPointInput(); pointEvalInput.Init(variableParamInfoList, transformParamInfoList, ""); //Create jobs to evaluate the x and y coordinates for a control point EvaluationControlPointJob pointXEvalJob = new EvaluationControlPointJob(); EvaluationControlPointJob pointYEvalJob = new EvaluationControlPointJob(); double previousPointXVal = 0; //Itterate through each control point equation and evaluate it's X and Y coordinates. for (int i = 0; i < pointEquations.Count; i++) { XyPoint<string> pointEquation = pointEquations[i]; var xEquationStatus = CreateExpressionFromString(pointEquation.X, EvalType.ControlPoint); var yEquationStatus = CreateExpressionFromString(pointEquation.Y, EvalType.ControlPoint); if (!xEquationStatus.IsValid || !yEquationStatus.IsValid) { Logger.HighVolume(27, string.Format("The x or y equation for control point {0} was not a valid equation. Equations: {1}", i, pointEquation)); erroneousControlPointIndexSet.Add(i); return new ReturnStatus<List<XyPoint<double>>>(controlPointList, false); } //Evaluate the equation for the current control point's X value pointEvalInput.EquationStr = pointEquation.X; pointXEvalJob.Configure(pointEvalInput, xEquationStatus.Value); pointXEvalJob.Execute(); //Evaluate the equation for the current control point's Y value pointEvalInput.EquationStr = pointEquation.Y; pointYEvalJob.Configure(pointEvalInput, yEquationStatus.Value); pointYEvalJob.Execute(); //If one of the equations could not be evaluated return false if (pointXEvalJob.OutputIsValid == false || pointYEvalJob.OutputIsValid == false) { Logger.HighVolume(28, string.Format("The x or y equation for control point {0} encountered an error while being evaluated. Equations: {1}", i, pointEquation)); erroneousControlPointIndexSet.Add(i); return new ReturnStatus<List<XyPoint<double>>>(controlPointList, false); } //Store the current control point's X and Y coordinates in this.controlPointValues. XyPoint<double> curPoint = new XyPoint<double>(pointXEvalJob.OutputVal, pointYEvalJob.OutputVal); controlPointList.Add(curPoint); previousPointXVal = pointXEvalJob.OutputVal; } for (int i = 1; i < controlPointList.Count; i++) { //If the control points are not in order from smallest to largest then return an //invalid return status. if (controlPointList[i - 1].X > controlPointList[i].X) { Logger.HighVolume(29, string.Format("The control points are not in order. X{0}: {1}, X{2}, {3}", i - 1, controlPointList[i - 1].X, i, controlPointList[i].X)); erroneousControlPointIndexSet.Add(i); erroneousControlPointIndexSet.Add(i - 1); return new ReturnStatus<List<XyPoint<double>>>(controlPointList, false); } } return new ReturnStatus<List<XyPoint<double>>>(controlPointList, true); }