protected abstract void GenerateArrayCreateExpression(System.CodeDom.CodeArrayCreateExpression e);
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(System.CodeDom.CodeTypeDeclaration codeClass, System.CodeDom.CodeStatementCollection codeStatementCollection, CodeGenerateSystem.Base.LinkPinControl element, CodeGenerateSystem.Base.GenerateCodeContext_Method context) { GetBezierPointsFromCtrl(); if (!codeClass.Members.Contains(mBezierPointsField)) { // code: private static System.Collections.Generic.List<EngineNS.BezierPointBase> mBezierPoints_XXX = new System.Collections.Generic.List<EngineNS.BezierPointBase>(new BezierPoint[] { new EngineNS.BezierPointBase(), new EngineNS.BezierPointBase() }); mBezierPointsField.Type = new System.CodeDom.CodeTypeReference(BezierPointsListType); mBezierPointsField.Name = StaticBezierPointsName; mBezierPointsField.Attributes = System.CodeDom.MemberAttributes.Private; var arrayCreateExp = new System.CodeDom.CodeArrayCreateExpression(); arrayCreateExp.CreateType = new System.CodeDom.CodeTypeReference(typeof(EngineNS.BezierPointBase)); foreach (var bPt in mBezierPoints) { var newBPT = new System.CodeDom.CodeObjectCreateExpression(); newBPT.CreateType = new System.CodeDom.CodeTypeReference(typeof(EngineNS.BezierPointBase)); newBPT.Parameters.Add(new System.CodeDom.CodeObjectCreateExpression(typeof(EngineNS.Vector2), new System.CodeDom.CodeExpression[] { new System.CodeDom.CodePrimitiveExpression(bPt.Position.X), new System.CodeDom.CodePrimitiveExpression(bPt.Position.Y) })); newBPT.Parameters.Add(new System.CodeDom.CodeObjectCreateExpression(typeof(EngineNS.Vector2), new System.CodeDom.CodeExpression[] { new System.CodeDom.CodePrimitiveExpression(bPt.ControlPoint.X), new System.CodeDom.CodePrimitiveExpression(bPt.ControlPoint.Y) })); arrayCreateExp.Initializers.Add(newBPT); } mBezierPointsField.InitExpression = new System.CodeDom.CodeObjectCreateExpression(BezierPointsListType, arrayCreateExp); codeClass.Members.Add(mBezierPointsField); } // 判断5个输入链接是否需要生成代码 if (mCtrlValueInputHandle.HasLink) { if (!mCtrlValueInputHandle.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlValueInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlValueInputHandle.GetLinkedPinControl(0, true), context); } } if (mCtrlValueYMaxInputHandle.HasLink) { if (!mCtrlValueYMaxInputHandle.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlValueYMaxInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlValueYMaxInputHandle.GetLinkedPinControl(0, true), context); } } if (mCtrlValueYMinInputHandle.HasLink) { if (!mCtrlValueYMinInputHandle.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlValueYMinInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlValueYMinInputHandle.GetLinkedPinControl(0, true), context); } } if (mCtrlValueXMaxInputHandle.HasLink) { if (!mCtrlValueXMaxInputHandle.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlValueXMaxInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlValueXMaxInputHandle.GetLinkedPinControl(0, true), context); } } if (mCtrlValueXMinInputHandle.HasLink) { if (!mCtrlValueXMinInputHandle.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlValueXMinInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlValueXMinInputHandle.GetLinkedPinControl(0, true), context); } } if (mCtrlValueXLoopHandle.HasLink) { if (!mCtrlValueXLoopHandle.GetLinkedObject(0, true).IsOnlyReturnValue) { await mCtrlValueXLoopHandle.GetLinkedObject(0, true).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mCtrlValueXLoopHandle.GetLinkedPinControl(0, true), context); } } // 自身代码生成 if (!context.Method.Statements.Contains(mVariableDeclaration)) { // 声明 mVariableDeclaration.Type = new System.CodeDom.CodeTypeReference(typeof(double)); mVariableDeclaration.Name = GCode_GetValueName(null, context); mVariableDeclaration.InitExpression = CodeGenerateSystem.Program.GetDefaultValueExpressionFromType(typeof(double)); context.Method.Statements.Insert(0, mVariableDeclaration); } var assignExp = new System.CodeDom.CodeAssignStatement(); assignExp.Left = new System.CodeDom.CodeVariableReferenceExpression(GCode_GetValueName(null, context)); var classType = mTemplateClassInstance.GetType(); System.CodeDom.CodeExpression minXExp, maxXExp, minYExp, maxYExp, isXLoopExp; if (mCtrlValueXMinInputHandle.HasLink) { minXExp = mCtrlValueXMinInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlValueXMinInputHandle.GetLinkedPinControl(0, true), context); } else { var pro = classType.GetProperty("XMin"); var xMin = pro.GetValue(mTemplateClassInstance); minXExp = new System.CodeDom.CodePrimitiveExpression(xMin); } if (mCtrlValueXMaxInputHandle.HasLink) { maxXExp = mCtrlValueXMaxInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlValueXMaxInputHandle.GetLinkedPinControl(0, true), context); } else { var pro = classType.GetProperty("XMax"); var xMax = pro.GetValue(mTemplateClassInstance); maxXExp = new System.CodeDom.CodePrimitiveExpression(xMax); } if (mCtrlValueYMinInputHandle.HasLink) { minYExp = mCtrlValueYMinInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlValueYMinInputHandle.GetLinkedPinControl(0, true), context); } else { var pro = classType.GetProperty("YMin"); var yMin = pro.GetValue(mTemplateClassInstance); minYExp = new System.CodeDom.CodePrimitiveExpression(yMin); } if (mCtrlValueYMaxInputHandle.HasLink) { maxYExp = mCtrlValueYMaxInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlValueYMaxInputHandle.GetLinkedPinControl(0, true), context); } else { var pro = classType.GetProperty("YMax"); var yMax = pro.GetValue(mTemplateClassInstance); maxYExp = new System.CodeDom.CodePrimitiveExpression(yMax); } if (mCtrlValueXLoopHandle.HasLink) { isXLoopExp = mCtrlValueXLoopHandle.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlValueXLoopHandle.GetLinkedPinControl(0, true), context); } else { var pro = classType.GetProperty("XLoop"); var isXLoop = pro.GetValue(mTemplateClassInstance); isXLoopExp = new System.CodeDom.CodePrimitiveExpression(isXLoop); } // code: EngineNS.BezierCalculate.ValueOnBezier(mBezierPoints_XXX, XPos); assignExp.Right = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression( new System.CodeDom.CodeTypeReferenceExpression(typeof(EngineNS.BezierCalculate)), "ValueOnBezier", new System.CodeDom.CodeExpression[] { new System.CodeDom.CodeVariableReferenceExpression(StaticBezierPointsName), // bezierPtList mCtrlValueInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlValueInputHandle.GetLinkedPinControl(0, true), context), // xValue minXExp, maxXExp, minYExp, maxYExp, new System.CodeDom.CodePrimitiveExpression(0), // MinBezierX new System.CodeDom.CodePrimitiveExpression(mBezierWidth), // MaxBezierX new System.CodeDom.CodePrimitiveExpression(0), // MinBezierY new System.CodeDom.CodePrimitiveExpression(mBezierHeight), // MaxBezierY isXLoopExp // bLoopX }); codeStatementCollection.Add(assignExp); // 收集用于调试的数据的代码 var debugCodes = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection); CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodes, this.mCtrlValueInputHandle.GetLinkPinKeyName(), mCtrlValueInputHandle.GetLinkedObject(0, true).GCode_CodeDom_GetValue(mCtrlValueInputHandle.GetLinkedPinControl(0, true), context), mCtrlValueInputHandle.GetLinkedObject(0, true).GCode_GetTypeString(mCtrlValueInputHandle.GetLinkedPinControl(0, true), context), context); CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodes, mCtrlValueOutputHandle.GetLinkPinKeyName(), assignExp.Left, GCode_GetTypeString(null, context), context); CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes); }