/// <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()); } }