Example #1
0
 protected abstract void GenerateArrayCreateExpression(System.CodeDom.CodeArrayCreateExpression e);
Example #2
0
        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);
        }