/// <summary>
        /// 根据FCBlock构造Symbol
        /// </summary>
        /// <param name="textWriter"></param>
        /// <param name="fcblock"></param>
        private static void GenerateCommonBlock(Cld_FCBlock block, ArrayList symbols)
        {
            // 开始构造一个Symbol
            LogicSymbol symbolTemp = new LogicSymbol(LogicSymbolType.GeneralSymbol);
            symbolTemp.Location = block.Location;
            symbolTemp.Size = block.Size;

            // 主体矩形
            LogicRectangle symbolBody = new LogicRectangle();
            symbolBody.Location = block.Location;
            symbolBody.Size = block.Size;
            symbolTemp.Graphics.Add(symbolBody);

            #region 模块名称(内部,上中)

            // SymbolName
            LogicText symbolNameText = new LogicText();
            symbolNameText.Location = new PointF(block.X + 2f, block.Y + 1f);
            symbolNameText.Width = block.Width - 4f;
            symbolNameText.Height = LogicSymbol.HeadHeight - 3f;
            symbolNameText.Text = block.FunctionName;
            symbolNameText.Font = new Font(LogicText.DefaultFamily, 12, FontStyle.Bold);
            symbolNameText.Alignment = Align.TopCenter;
            symbolNameText.ForeColor = Color.Black;
            symbolTemp.Graphics.Add(symbolNameText);

            #endregion

            #region I/O引脚

            // 遍历输入引脚
            foreach (Cld_FCInput input in block.Cld_FCInput_List)
            {
                bool isConnected = input.PointName != null ? LogicPin.RegPointName.IsMatch(input.PointName) : false;
                if (input.Visible || isConnected)
                {
                    LogicPin pin = new LogicPin(input, symbolTemp);
                    symbolTemp.Graphics.Add(pin);

                    symbolTemp.InputCount++;
                }
            }

            // 遍历输出引脚
            foreach (Cld_FCOutput output in block.Cld_FCOutput_List)
            {
                bool enable = false;
                if (!output.Visible)
                {
                    foreach (Cld_FCInput input in block.Cld_FCInput_List)
                    {
                        if (input.Visible && input.PointName == output.PointName)
                        {
                            enable = true;
                            break;
                        }
                    }
                }
                if (output.Visible || enable)
                {
                    LogicPin pin = new LogicPin(output, symbolTemp);
                    symbolTemp.Graphics.Add(pin);
                    symbolTemp.OutputCount++;
                }
            }
            #endregion

            #region 输出块号

            // 块号:序号
            LogicText symbolIndexText = new LogicText();
            symbolIndexText.Location = new PointF(block.X + 2f, block.Y + block.Height - LogicSymbol.FootHeight + 2f);
            symbolIndexText.Width = block.Width - 4f;
            symbolIndexText.Height = LogicSymbol.FootHeight - 3f;
            symbolIndexText.Text = block.AlgName.Substring(block.AlgName.LastIndexOf('-') + 1) + ":" + block.Sequence;
            symbolTemp.Graphics.Add(symbolIndexText);

            #endregion

            #region 输出块的参数信息

            IList fcParameters = block.Cld_FCParameter_List;
            if (fcParameters.Count > 0)
            {
                symbolTemp.Height += LogicSymbol.ParaHeight;
                LogicText symbolParaText = new LogicText();
                symbolParaText.Location = new PointF(block.X, block.Y + block.Height + 1f);
                symbolParaText.Width = block.Width;
                symbolParaText.Height = LogicSymbol.ParaHeight - 2f;
                symbolParaText.Alignment = Align.TopCenter;
                symbolParaText.Text = "";

                foreach (Cld_FCParameter para in block.Cld_FCParameter_List)
                {
                    if (para.Name == "Num")
                    {
                        if (symbolParaText.Text.Length == 0)
                        {
                            symbolParaText.Text = "Num=" + para.PValue;
                        }
                        else
                        {
                            symbolParaText.Text = "Num=" + para.PValue + "," + symbolParaText.Text;
                        }
                    }
                    if (para.Name == "Mode")
                    {
                        if (symbolParaText.Text.Length == 0)
                        {
                            symbolParaText.Text = "Num=" + para.PValue;
                        }
                        else
                        {
                            symbolParaText.Text += ",Num=" + para.PValue;
                        }
                    }
                }

                symbolTemp.Graphics.Add(symbolParaText);
            }

            #endregion

            LogicPoke poke = new LogicPoke(block);
            // 操作方式
            symbolTemp.Graphics.Add(poke);

            symbols.Add(symbolTemp);
        }
        /// <summary>
        /// XPI
        /// </summary>
        /// <param name="textWriter"></param>
        /// <param name="fcblock"></param>
        /// <param name="bll"></param>
        private static void GenerateXPIBlock(Cld_FCBlock block, ArrayList symbols)
        {
            // Body大小:75 x 15
            // 输入:1 + 1; 输出:1; 参数:n

            block.Size = new SizeF(75f, 15f);

            LogicSymbol symbolTemp = new LogicSymbol(LogicSymbolType.IOSymbol);
            symbolTemp.Location = block.Location;
            symbolTemp.Size = new SizeF(75f, 28f);

            LogicRectangle bodyRectangle = new LogicRectangle();
            bodyRectangle.Location = block.Location;
            bodyRectangle.Size = new SizeF(67.5f, 15f);

            // 右端的半圆


            LogicArc bodyArc = new LogicArc();
            bodyArc.CentrePoint = new PointF(block.X + 67.5f, block.Y + 7.5f);
            bodyArc.Radius = 7.5f;
            bodyArc.StartAngle = -90;
            bodyArc.EndAngle = 90;

            // GID,块中间显示的文本


            LogicText bodyText = new LogicText();
            bodyText.Location = new PointF(bodyRectangle.X + 2f, bodyRectangle.Y + 2f);
            bodyText.Width = bodyRectangle.Width - 4f;
            bodyText.Height = bodyRectangle.Height - 4f;

            // Addr,块下方显示的参数文本(数据存储位置不确定) //WangXiang
            LogicText parameterText = new LogicText();
            parameterText.Location = new PointF(bodyRectangle.X + 2f, bodyRectangle.Y + bodyRectangle.Height + 1f);
            parameterText.Width = bodyText.Width;
            parameterText.Height = 11f;
            parameterText.Alignment = Align.TopCenter;

            LogicPin inputPin = null;
            foreach (Cld_FCInput pin in block.Cld_FCInput_List)
            {
                if (pin.PinName == "Rst")
                {
                    if (pin.Visible || (pin.PointName != null && LogicPin.RegPointName.IsMatch(pin.PointName)))
                    {
                        pin.Point = "0_7.5";
                        inputPin = new LogicPin(pin, symbolTemp);
                    }
                }
                else if (pin.PinName == "GID")
                {
                    if (pin.PointName != null && pin.PointName != "?")
                    {
                        bodyText.Text = pin.PointName;
                    }
                    else
                    {
                        bodyText.Text = "Null";
                    }
                }
            }

            LogicPin outputPin = null;
            foreach (Cld_FCOutput pin in block.Cld_FCOutput_List)
            {
                if (pin.PinName == "Y")
                {
                    pin.Point = "75_7.5";
                    outputPin = new LogicPin(pin, symbolTemp);
                }
            }

            foreach (Cld_FCParameter para in block.Cld_FCParameter_List)
            {
                if (para.Name == "Addr")
                {
                    parameterText.Text = GetAddr(para.PValue);
                }
            }

            symbolTemp.Graphics.Add(bodyRectangle);
            symbolTemp.Graphics.Add(bodyArc);
            symbolTemp.Graphics.Add(bodyText);
            symbolTemp.Graphics.Add(parameterText);
            if (inputPin != null)
            {
                symbolTemp.Graphics.Add(inputPin);
            }
            if (outputPin != null)
            {
                symbolTemp.Graphics.Add(outputPin);
            }

            IList<Cld_FCBlock> referenceBlocks = CrossReference.GetOutputReference(block);
            LogicPoke poke = NewSymbolPoke(block, bodyText, referenceBlocks);
            symbolTemp.Graphics.Add(poke);

            symbols.Add(symbolTemp);

            if (referenceBlocks.Count > 0)
            {
                for (int i = 0; i < referenceBlocks.Count; i++)
                {
                    GenerateXPgAIReferer(block, i, referenceBlocks[i], symbols);
                }
            }
        }
        /// <summary>
        /// Prj_Sheet to Xml
        /// </summary>
        /// <param name="sheet"></param>
        public static void GenerateXinHuaSheets(BllManager bll, Prj_Document documet, string outPath)
        {
            string pagesPath = outPath + "\\data\\xinhua\\Pages\\";
            if (!Directory.Exists(pagesPath))
            {
                Directory.CreateDirectory(pagesPath);
            }

            if (session == null)
            {
                session = bll.manager.session;
            }

            try
            {
                // 每个Document只包含一个Sheet
                int sheetID = bll.manager.SheetCRUD.GetPrj_Sheets_By_Prj_Document_ID(documet.ID)[0].ID;
                Prj_Sheet sheet = bll.manager.SheetCRUD.Load_Sheet(sheetID);

                ArrayList symbols = new ArrayList();

                // 算法块

                foreach (Cld_FCBlock block in sheet.Cld_FCBlock_List)
                {

                    #region if(特殊块)
                    if (block.FunctionName == "XAI")
                    {
                        GenerateXAIBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XAO")
                    {
                        GenerateXAOBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XDI")
                    {
                        GenerateXDIBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XDO")
                    {
                        GenerateXDOBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XPI")
                    {
                        GenerateXPIBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XPgAI")
                    {
                        GenerateXPgAIBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XPgAO")
                    {
                        GenerateXPgAOBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XPgDI")
                    {
                        GenerateXPgDIBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XPgDO")
                    {
                        GenerateXPgDOBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XNetAI")
                    {
                        GenerateXNetAIBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XNetAO")
                    {
                        GenerateXNetAOBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XNetDI")
                    {
                        GenerateXNetDIBlock(block, symbols);
                    }
                    else if (block.FunctionName == "XNetDO")
                    {
                        GenerateXNetDOBlock(block, symbols);
                    }
                    #endregion
                    else
                    {
                        bll.generate_Rec_symbol(block, BllManager.rela_pos.UPLEFT);
                        GenerateCommonBlock(block, symbols);
                    }
                }

                // 文本块

                foreach (Cld_Graphic graphic in sheet.Cld_Graphic_List)
                {
                    if (graphic.Type == "Text")
                    {
                        GenerateText(graphic, symbols);
                    }
                }

                //IList constants = sheet.Cld_Constant_List;

                // 信号线

                IDictionary<string, Cld_Signal> signalTable = bll.GenerateSignalLines(sheet);
                foreach (Cld_Signal signal in signalTable.Values)
                {
                    string[] signalDataList = signal.Data.TrimEnd(' ', ';').Split(';');
                    foreach (string signalData in signalDataList)
                    {
                        LogicSignalLine signalline = new LogicSignalLine(signalData, signal.Name, signal.SignalType);
                        symbols.Add(signalline);
                    }
                }

                // 创建XmlTextWriter类的实例对象
                XmlTextWriter textWriter = new XmlTextWriter(pagesPath + documet.DocumentName.Replace('-', '_') + ".xfig", Encoding.UTF8);
                textWriter.Indentation = 4;
                textWriter.Formatting = Formatting.Indented;

                textWriter.WriteStartElement("document");
                textWriter.WriteAttributeString("Type", "BeginNode");
                textWriter.WriteAttributeString("GraphicName", documet.DocumentCaption);
                textWriter.WriteAttributeString("BackColor", "FF FF FF FF");
                textWriter.WriteAttributeString("width", Convert.ToString(sheet.Width * 10));
                textWriter.WriteAttributeString("heigth", Convert.ToString(sheet.Height * 10));

                LogicRectangle pageBounds0 = new LogicRectangle();
                pageBounds0.Location = new PointF(0, 0);
                pageBounds0.Size = new SizeF(sheet.Width, sheet.Height);
                pageBounds0.LineWidth = 1;
                pageBounds0.GetXinhuaGraphicXml(textWriter);

                LogicRectangle pageBounds1 = new LogicRectangle();
                pageBounds1.Location = new PointF(30, 30);
                pageBounds1.Size = new SizeF(sheet.Width - 60f, sheet.Height - 60f);
                pageBounds1.LineWidth = 2;
                pageBounds1.GetXinhuaGraphicXml(textWriter);

                foreach (object obj in symbols)
                {
                    ((ILogicGraphicFormat)obj).GetXinhuaGraphicXml(textWriter);
                }
                textWriter.WriteEndElement();
                textWriter.Close();
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }