KBManager,两叉

本文介绍了一个使用C#实现的流程模型绘制程序,该程序能够根据传入的数据表动态生成流程图。文章详细解释了如何初始化绘图模型、设置结点坐标、生成结点列表等关键步骤,并提供了具体的代码实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Drawing.Drawing2D;
using System.IO;
using System.Drawing.Printing;

namespace KBManager
{
    public partial class drawModel : DevExpress.XtraEditors.XtraUserControl
    {
        private string streeid = "";

        public drawModel(DataTable dt, string treeid)
        {
            this.streeid = treeid;

            this.InitDrawModel(dt);
        }

        public drawModel(DataTable dt)
        {
            this.InitDrawModel(dt);
        }

        public void InitDrawModel(DataTable dt)
        {
            if (dt == null || dt.Rows.Count == 0)
            {

            }
            else
            {
                InitializeComponent();
                if (showMode.Equals("Fill"))
                {
                    this.radioGroup1.SelectedIndex = 0;
                    this.radioGroup1.EditValue = "Fill";
                }
                else
                {
                    this.radioGroup1.SelectedIndex = 1;
                    this.radioGroup1.EditValue = "Raw";
                }
                reciveDataTable = dt;
                //reciveDataTable = testData.getDataTable("1");           
                refreshData();
                PaintTree();
            }
        }

        private string title = "";
        private DataTable reciveDataTable;
        private List<Node> nodeList;
        private int Node_Mult_X = 1;
        private int Node_Mult_Y = 1;
        private string showMode = "Raw";
        private string strSavePath = "";

        private void PaintTree(object sender, PaintEventArgs e)
        {
            if (nodeList != null)
            {
                int panelWidth = getMaxXY(nodeList, 0) + 130;
                int panelHeight = getMaxXY(nodeList, 1) + 50;

                this.Size = new System.Drawing.Size(panelWidth, panelHeight);

                Graphics g = e.Graphics; //创建画板,这里画板是由Form提供.
                DrawTree dt = new DrawTree();
                dt.paint(g, nodeList, title);
                g.Dispose();
            }
        }

        private void PaintTree()
        {
            if (nodeList != null)
            {
                int panelWidth = getMaxXY(nodeList, 0) + 200;
                int panelHeight = getMaxXY(nodeList, 1) + 50;

                Bitmap imgTemp = new Bitmap(panelWidth, panelHeight);
                Graphics g2 = Graphics.FromImage(imgTemp);

                DrawTree dt = new DrawTree();
                dt.paint(g2, nodeList, title);

                g2.Dispose();

                if (string.IsNullOrEmpty(strSavePath))
                {
                    imgTemp.Save(Application.StartupPath + "/tmp.jpg");
                }
                else
                {
                    imgTemp.Save(strSavePath);
                }

                this.pictureBox1.Location = new System.Drawing.Point(0, 0);
                if (showMode.Equals("Fill"))
                {
                    this.pictureBox1.Size = new System.Drawing.Size(771, 480);
                    this.pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
                }
                else
                {
                    this.pictureBox1.Size = new System.Drawing.Size(panelWidth, panelHeight);
                    this.pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
                }
                this.pictureBox1.Image = imgTemp;
            }
        }

        // 0:X 1:Y
        private int getMaxXY(List<Node> nodeList, int flag)
        {
            int max = 0;
            if (flag == 0)
            {
                foreach (Node n in nodeList)
                {
                    if (n.getX() > max)
                    {
                        max = n.getX();
                    }
                }
            }
            else
            {
                foreach (Node n in nodeList)
                {
                    if (n.getY() > max)
                    {
                        max = n.getY();
                    }
                }
            }
            return max;
        }

        private void cmbWidth_SelectedIndexChanged(object sender, EventArgs e)
        {
            Node_Mult_X = cmbWidth.SelectedIndex + 1;
            refreshData();
            PaintTree();
        }

        private void cmbHeight_SelectedIndexChanged(object sender, EventArgs e)
        {
            Node_Mult_Y = cmbHeight.SelectedIndex + 1;
            refreshData();
            PaintTree();
        }

        private void refreshData()
        {
            makeData md = new makeData(Node_Mult_X, Node_Mult_Y, this.panel1.Width * Node_Mult_X, 100);
            List<List<string>> data = getData(reciveDataTable);
            if (data != null)
            {
                title = data[0][0] + ":";
                title = title + data[0][1];

                nodeList = md.reMakeList(data);
            }
            this.Refresh();
        }

        private List<List<string>> getData(DataTable reciveDataTable)
        {
            List<List<string>> reMakeData = new List<List<string>>();
            for (int i = 0; i < reciveDataTable.Rows.Count; i++)
            {
                DataRow dr = reciveDataTable.Rows[i];
                List<string> oneRow = new List<string>();
                for (int j = 0; j < 11; j++)
                {
                    string s = dr[j].ToString();
                    oneRow.Add(s);
                }
                // Flag
                oneRow.Add("N");
                // RealLevel
                oneRow.Add("0");
                // RX
                oneRow.Add("0");
                // RY
                oneRow.Add("0");
                // PX
                oneRow.Add("0");
                // PY
                oneRow.Add("0");
                reMakeData.Add(oneRow);
            }
            return reMakeData;
        }

        private void radioGroup1_SelectedIndexChanged(object sender, EventArgs e)
        {
            showMode = this.radioGroup1.EditValue.ToString();
            PaintTree();
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            saveFileDialog1.FileName = title.Replace(':', '_');
            if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                strSavePath = saveFileDialog1.FileName;
                PaintTree();
                strSavePath = "";
            }
        }

        private PrintDocument pd;
        private void btnPrint_Click(object sender, EventArgs e)
        {
            pd = new PrintDocument();
            pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
            printPreviewDialog1.Document = this.pd;
            printPreviewDialog1.FormBorderStyle = FormBorderStyle.Fixed3D;
            this.printPreviewDialog1.PrintPreviewControl.Zoom = 1;
            ((System.Windows.Forms.Form)printPreviewDialog1).WindowState = FormWindowState.Maximized;
            //printPreviewDialog1.ShowDialog();                       
            if (printPreviewDialog1.ShowDialog(this) == DialogResult.OK)
            {
                PreviewPrintController c = printPreviewDialog1.Document.PrintController as PreviewPrintController;
                PreviewPageInfo[] ia = c.GetPreviewPageInfo();
            }
        }

        private void pd_PrintPage(object sender, PrintPageEventArgs e)
        {
            try
            {
                if (File.Exists(Application.StartupPath + "/copy_tmp.jpg"))
                {
                    File.Delete(Application.StartupPath + "/copy_tmp.jpg");
                }
                File.Copy(Application.StartupPath + "/tmp.jpg", Application.StartupPath + "/copy_tmp.jpg");
                Image temp = Image.FromFile(Application.StartupPath + "/copy_tmp.jpg");
                int x = e.MarginBounds.X;
                int y = e.MarginBounds.Y;
                int width = temp.Width;
                int height = temp.Height;
                int[] newSize = reSetPrintSize(width, height);
                Rectangle destRect = new Rectangle(x, y, newSize[0], newSize[1]);
                e.Graphics.DrawImage(temp, destRect, 0, 0, temp.Width, temp.Height, System.Drawing.GraphicsUnit.Pixel);
                //e.Graphics.DrawImage(pictureBox1.Image, e.MarginBounds.Left, e.MarginBounds.Top);  
            }
            catch
            {
                return;
            }
        }

        private int[] reSetPrintSize(int width, int height)
        {
            int[] size = { width, height };

            while (width > PrintUtil.PRINT_MAX_WIDTH || height > PrintUtil.PRINT_MAX_HEIGTH)
            {
                width = Convert.ToInt16(width * 0.95);
                height = Convert.ToInt16(height * 0.95);
            }

            size[0] = width;
            size[1] = height;

            return size;
        }

        private void btn_Detail_Click(object sender, EventArgs e)
        {
            TestMDIForm tmdi = new TestMDIForm(this.streeid);
            tmdi.Show();
        }
    }

    public class PrintUtil
    {
        public static int multiple = 1;


        // 结点半径
        public const int R = 16;

        // 结点与结点的间距
        public const int disY = 80;
        public const int disX = 30;

        // 画面大小
        public const int X = 1000;
        public const int Y = 600;

        // 线幅
        public const int lineWidge = 1;

        // 成员在大小
        // member width
        public const int M_Width = 86;
        // member height
        public const int M_Height = 40;

        // 成员与圆心的偏移
        public const int XP = 5;

        // Green,state
        public const string STATE0 = "0";
        // Pink ,Need IE value (algorithm) to decide next status
        public const string STATE1 = "1";
        // Blue,Procedure
        public const string STATE2 = "2";

        public const string Member_Type_Event = "1";
        public const string Member_Type_Message = "0";

        public const int PRINT_MAX_WIDTH = 700;
        public const int PRINT_MAX_HEIGTH = 1100;
    }

    public class DrawTree
    {
        // 画直线
        public void drawLine(Graphics g, int x1, int y1, int x2, int y2)
        {
            Pen p = new Pen(Color.Black, 2);//定义了个蓝色,宽度为画笔
            g.DrawLine(p, x1 * PrintUtil.multiple, y1 * PrintUtil.multiple, x2 * PrintUtil.multiple, y2 * PrintUtil.multiple);
            p.Dispose();
        }

        // 画箭线
        public void drawArrowLine(Graphics g, int x1, int y1, int x2, int y2)
        {
            Pen p = new Pen(Color.Black, 4);//定义了个蓝色,宽度为画笔
            p.EndCap = LineCap.ArrowAnchor;//定义线尾样式为箭头
            g.DrawLine(p, x1 * PrintUtil.multiple, y1 * PrintUtil.multiple, x2 * PrintUtil.multiple, y2 * PrintUtil.multiple);
            p.Dispose();
        }


        // 画圆
        public void drawNode(Graphics g, int centerX, int centerY, int radius,
                Color color)
        {
            int x1 = centerX * PrintUtil.multiple - radius;
            int y1 = centerY * PrintUtil.multiple - radius;

            if (x1 < 0)
            {
                x1 = 0;
            }
            if (y1 < 0)
            {
                y1 = 0;
            }
            SolidBrush b = new SolidBrush(color);
            g.FillEllipse(b, x1, y1, radius * 2, radius * 2);
            Pen p = new Pen(Color.Black, 1);//定义了个蓝色,宽度为画笔
            g.DrawEllipse(p, x1, y1, radius * 2, radius * 2);
            p.Dispose();
        }


        // 画方框
        public void drawEvent(Graphics g, int x1, int y1, Color color)
        {
            SolidBrush b = new SolidBrush(color);
            g.FillRectangle(b, x1 * PrintUtil.multiple + PrintUtil.R, y1 * PrintUtil.multiple - PrintUtil.R - PrintUtil.M_Height, PrintUtil.M_Width, PrintUtil.M_Height);
            Pen p = new Pen(Color.Black, 1);
            g.DrawRectangle(p, x1 * PrintUtil.multiple + PrintUtil.R, y1 * PrintUtil.multiple - PrintUtil.R - PrintUtil.M_Height, PrintUtil.M_Width, PrintUtil.M_Height);
            p.Dispose();
            b.Dispose();
        }


        // 写字
        public void drawstring(Graphics g, int x, int y, string strCon, int size)
        {
            // 绘制文本
            SolidBrush b = new SolidBrush(Color.Black);
            g.DrawString(strCon, new Font("Times New Roman", size), b, x - PrintUtil.R / 2, y - PrintUtil.R / 2);
            b.Dispose();
        }

        // 画坐标
        public void drawCoordinates(Graphics g, int x, int y)
        {
            Pen p = new Pen(Color.Blue, 1);//定义了个蓝色,宽度为画笔
            p.DashStyle = DashStyle.Dot;//定义虚线样式为点
            g.DrawLine(p, x * PrintUtil.multiple, 0, x * PrintUtil.multiple, 600);
            drawstring(g, x * PrintUtil.multiple, 10, " x = " + x * PrintUtil.multiple, 10);
            g.DrawLine(p, 0, y * PrintUtil.multiple, 800, y * PrintUtil.multiple);
            drawstring(g, 0, y * PrintUtil.multiple, " y = " + y * PrintUtil.multiple, 10);
            p.Dispose();
        }

        // 画图
        public void paint(Graphics g, List<Node> nodeList, string title)
        {
            // 使用抗混叠技术,即平滑形状和文本的粗超像素边缘
            //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            //        RenderingHints.VALUE_ANTIALIAS_ON);

            foreach (Node oneNode in nodeList)
            {

                if (oneNode.getState().Equals("1"))
                {
                    drawstring(g, oneNode.getX(), 10, title, 15);

                }
                else
                {
                    drawLine(g, oneNode.getX(), oneNode.getY(), oneNode.getPx(),
                            oneNode.getPy());
                }
            }

            foreach (Node oneNode in nodeList)
            {
                //drawCoordinates(g, 150, 50);
                Color color;
                if (oneNode.getStateType().Equals(PrintUtil.STATE0))
                {
                    color = Color.Lime;
                }
                else if (oneNode.getStateType().Equals(PrintUtil.STATE1))
                {
                    color = Color.Pink;
                }
                else
                {
                    color = Color.Turquoise;
                }
                drawNode(g, oneNode.getX(), oneNode.getY(), 20, color);
                drawstring(g, oneNode.getX() * PrintUtil.multiple, oneNode.getY() * PrintUtil.multiple, oneNode.getState(),
                        15);

                if (oneNode.getMember().getMemberType().Equals(
                        PrintUtil.Member_Type_Message))
                {
                    color = Color.Yellow;
                }
                else if (oneNode.getStateType().Equals(PrintUtil.STATE1))
                {
                    color = Color.Pink;
                }
                else
                {
                    color = Color.Turquoise;
                }

                drawEvent(g, oneNode.getX(), oneNode.getY(), color);

                string strMember = oneNode.getMember().getMemberName();
                string[] strMemberName = new string[3];
                if (strMember.Length > 36)
                {
                    strMemberName[2] = strMember.Substring(28, 8) + "...";
                    strMemberName[1] = strMember.Substring(14, 14);
                    strMemberName[0] = strMember.Substring(0, 14);
                }
                else if (strMember.Length > 28)
                {
                    strMemberName[2] = strMember.Substring(28, strMember.Length - 28);
                    strMemberName[1] = strMember.Substring(14, 14);
                    strMemberName[0] = strMember.Substring(0, 14);
                }
                else if (strMember.Length > 14)
                {
                    strMemberName[2] = "";
                    strMemberName[1] = strMember.Substring(14, strMember.Length - 14);
                    strMemberName[0] = strMember.Substring(0, 14);
                }
                else
                {
                    strMemberName[2] = "";
                    strMemberName[1] = "";
                    strMemberName[0] = strMember;
                }

                for (int i = 0; i < 3; i++)
                {
                    drawstring(g, oneNode.getX() * PrintUtil.multiple + PrintUtil.R + PrintUtil.R / 2,
                            oneNode.getY() * PrintUtil.multiple - PrintUtil.M_Height - PrintUtil.R / 2 + 12 * i,
                            strMemberName[i] + "", 10);
                }
            }
            // drawEvent(g, 130, 130, 50, 30, Color.green);
        }
    }

    public class Node
    {
        // 结点成员
        private Event Member;

        // 结点圆心
        private int x;
        private int y;

        // 子结点个数
        public int childCount = 0;

        // 父结点圆心
        private int Px;
        private int Py;

        // 结点类型
        private string stateType = "";

        // 结点编号
        private string state = "";

        public string getStateType()
        {
            return stateType;
        }

        public void setStateType(string stateType)
        {
            this.stateType = stateType;
        }

        public int getPx()
        {
            return Px;
        }

        public void setPx(int px)
        {
            Px = px;
        }

        public int getPy()
        {
            return Py;
        }

        public void setPy(int py)
        {
            Py = py;
        }

        public string getState()
        {
            return state;
        }

        public void setState(string state)
        {
            this.state = state;
        }

        public int getX()
        {
            return x;
        }

        public void setX(int x)
        {
            this.x = x;
        }

        public int getY()
        {
            return y;
        }

        public void setY(int y)
        {
            this.y = y;
        }

        public int getChildCount()
        {
            return childCount;
        }

        public void setChildCount(int childCount)
        {
            this.childCount = childCount;
        }

        public Event getMember()
        {
            return Member;
        }

        public void setMember(Event member)
        {
            Member = member;
        }
    }

    public class Event
    {
        // 1: event
        // 0: message
        private string MemberType;

        private string MemberName;

        public string getMemberType()
        {
            return MemberType;
        }

        public void setMemberType(string memberType)
        {
            MemberType = memberType;
        }

        public string getMemberName()
        {
            return MemberName;
        }

        public void setMemberName(string memberName)
        {
            MemberName = memberName;
        }
    }

    public class makeData
    {
        public const int TreeId = 0;
        public const int TreeName = 1;
        public const int State = 2;
        public const int PreState = 3;
        public const int MemberNo = 4;
        public const int MemberName = 5;
        public const int MemberType = 6;
        public const int Level = 7;
        public const int IsFinal = 8;
        public const int TransitionType = 9;
        public const int Style = 10;
        public const int Flag = 11;
        public const int RealLevel = 12;
        public const int RX = 13;
        public const int RY = 14;
        public const int PX = 15;
        public const int PY = 16;

        private List<Node> nodeList;

        private int Node_Mult_X = 1;
        private int Node_Mult_Y = 1;

        private int intPanelWidth = 0;

        // 根结点圆心坐标
        private int X0 = 300;
        private int Y0 = 100;

        public makeData(int Mult_X, int Mult_Y, int x0, int y0)
        {
            Node_Mult_Y = Mult_Y;
            Node_Mult_X = Mult_X;
            X0 = x0 / 2;
            Y0 = y0;
            intPanelWidth = x0 / Mult_X;
        }

        public List<Node> reMakeList(List<List<string>> data)
        {
            // 为原始数据加上真实层级
            makeRealLev(data);
            // 计算结点坐标
            calculateNodeCoordinates(data);
            // 给原始数据打上父结点的坐标
            setPreCoordinates(data);
            //printData(data);

            // 生成结点队列
            nodeList = getNodeList(data);
            printNode(nodeList);
            nodeList = reLocateNode(nodeList);
            printNode(nodeList);

            Console.WriteLine("/nFinish");
            return nodeList;
        }

        private List<Node> reLocateNode(List<Node> nodeList)
        {
            int intMinX = int.MaxValue;
            for (int i = 0; i < nodeList.Count; i++)
            {
                if (nodeList[i].getX() < intMinX)
                {
                    intMinX = nodeList[i].getX();
                }
            }

            if (intMinX < PrintUtil.R)
            {
                for (int i = 0; i < nodeList.Count; i++)
                {
                    nodeList[i].setX(nodeList[i].getX() + System.Math.Abs(intMinX));
                    nodeList[i].setPx(nodeList[i].getPx() + System.Math.Abs(intMinX));
                }
            }

            intMinX = int.MaxValue;
            for (int i = 0; i < nodeList.Count; i++)
            {
                if (nodeList[i].getX() < intMinX)
                {
                    intMinX = nodeList[i].getX();
                }
            }

            int intMaxX = 0;
            for (int i = 0; i < nodeList.Count; i++)
            {
                if (nodeList[i].getX() > intMaxX)
                {
                    intMaxX = nodeList[i].getX();
                }
            }

            int intNodeX0 = nodeList[0].getX();
            int intPos = intNodeX0 - intPanelWidth / 2;

            if (intPos < 0)
            {
                for (int i = 0; i < nodeList.Count; i++)
                {
                    nodeList[i].setX(nodeList[i].getX() + System.Math.Abs(intPos));
                    nodeList[i].setPx(nodeList[i].getPx() + System.Math.Abs(intPos));
                }
            }
            else
            {
                if (intMinX - intPos < PrintUtil.R)
                {
                    for (int i = 0; i < nodeList.Count; i++)
                    {
                        nodeList[i].setX(nodeList[i].getX() - System.Math.Abs(intMinX) + PrintUtil.R);
                        nodeList[i].setPx(nodeList[i].getPx() - System.Math.Abs(intMinX) + PrintUtil.R);
                    }
                }
                else
                {
                    for (int i = 0; i < nodeList.Count; i++)
                    {
                        nodeList[i].setX(nodeList[i].getX() - intPos);
                        nodeList[i].setPx(nodeList[i].getPx() - intPos);
                    }
                }
            }

            //if (intMaxX > PrintUtil.X)
            //{
            //    for (int i = 0; i < nodeList.Count; i++)
            //    {
            //        nodeList[i].setX(nodeList[i].getX() - intMinX + PrintUtil.R + 2);
            //        nodeList[i].setPx(nodeList[i].getPx() - intMinX + PrintUtil.R + 2);
            //    }
            //}
            return nodeList;
        }

        // 计算结点坐标
        private void calculateNodeCoordinates(List<List<string>> data)
        {
            int intMaxLev = getMaxLev(data);
            string strState = "";
            string strPreState = "";
            string x0;
            string y0;
            string rx;
            string ry;

            for (int i = 0; i < data.Count; i++)
            {
                List<string> oneLine = data[i];

                strState = oneLine[State];
                strPreState = oneLine[PreState];

                if (strState.Equals("0"))
                {
                    continue;
                }

                if (strState.Equals("1"))
                {
                    x0 = X0.ToString();
                    y0 = Y0.ToString();
                    this.setCoordinates(data, "1", x0, y0);
                    continue;
                }

                int intSameLevNodeCount = getSameLevNodeCount(data, "", strPreState);

                if (intSameLevNodeCount == 1)
                {
                    rx = getRx(data, strPreState);
                    ry = (int.Parse(getRy(data, strPreState)) + PrintUtil.disY * Node_Mult_Y).ToString();
                    setCoordinates(data, strState, rx, ry);
                }
                else if (intSameLevNodeCount == 2)
                {
                    if (getFlag(data, strPreState).Equals("L"))
                    {
                        rx = (int.Parse(getRx(data, strPreState)) + PrintUtil.disX * Node_Mult_X * getDisRate(intMaxLev, getRealLev(data, strState))).ToString();
                        ry = (int.Parse(getRy(data, strPreState)) + PrintUtil.disY * Node_Mult_Y).ToString();
                        setCoordinates(data, strState, rx, ry);
                    }
                    else if (getFlag(data, strPreState).Equals("R"))
                    {
                        rx = (int.Parse(getRx(data, strPreState))
                                        - PrintUtil.disX * Node_Mult_X
                                        * getDisRate(intMaxLev, getRealLev(data,
                                                strState))).ToString();
                        ry = (int.Parse(getRy(data, strPreState))
                                + PrintUtil.disY * Node_Mult_Y).ToString();
                        setCoordinates(data, strState, rx, ry);
                    }
                    else
                    {
                        rx = (int.Parse(getRx(data, strPreState))
                                        + PrintUtil.disX * Node_Mult_X
                                        * getDisRate(intMaxLev, getRealLev(data,
                                                strState))).ToString();
                        ry = (int.Parse(getRy(data, strPreState))
                                + PrintUtil.disY * Node_Mult_Y).ToString();
                        setCoordinates(data, strState, rx, ry);
                    }
                    setFlag(data, strPreState, "R");
                }
                else
                {

                }
            }
        }

        private int getDisRate(int intMaxLev, int realLev)
        {
            return (int)Math.Pow(2, intMaxLev - realLev);
        }

        // 生成结点队列
        private List<Node> getNodeList(List<List<string>> data)
        {
            List<Node> nodeList = new List<Node>();
            Node node;
            foreach (List<string> oneLine in data)
            {
                node = new Node();
                // 结点名
                node.setState(oneLine[State]);
                // 结点圆心坐标
                node.setX(int.Parse(oneLine[RX]));
                node.setY(int.Parse(oneLine[RY]));
                // 父结点圆心坐标
                node.setPx(int.Parse(oneLine[PX]));
                node.setPy(int.Parse(oneLine[PY]));
                // 结点类型判断
                if (oneLine[TransitionType].Equals("1"))
                {
                    node.setStateType(PrintUtil.STATE1);
                }
                else
                {
                    if (oneLine[Style].Equals("0"))
                    {
                        node.setStateType(PrintUtil.STATE2);
                    }
                    else
                    {
                        node.setStateType(PrintUtil.STATE0);
                    }
                }

                // 结点成员设定
                node.setMember(makeNodeMember(oneLine));

                // 填加一个结点
                nodeList.Add(node);
            }
            return nodeList;
        }

        private Event makeNodeMember(List<string> oneLine)
        {
            Event member = new Event();

            string strMember = oneLine[MemberNo];
            strMember = strMember + "." + oneLine[MemberName];
            member.setMemberName(strMember);
            member.setMemberType(oneLine[MemberType]);

            return member;
        }

        // 给原始数据打上坐标
        private void setCoordinates(List<List<string>> data, string strNode, string x, string y)
        {
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals(strNode))
                {
                    oneLine[RX] = x;
                    oneLine[RY] = y;
                    break;
                }
            }
        }

        // 给原始数据打上父结点的坐标
        private void setPreCoordinates(List<List<string>> data)
        {
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals("1"))
                {
                    oneLine[PX] = X0.ToString();
                    oneLine[PY] = Y0.ToString();
                    continue;
                }
                oneLine[PX] = getRx(data, oneLine[PreState]);
                oneLine[PY] = getRy(data, oneLine[PreState]);
            }
        }

        // 取得一个结点的横坐标
        private string getRx(List<List<string>> data, string strNode)
        {
            string x = "";
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals(strNode))
                {
                    x = oneLine[RX];
                    break;
                }
            }

            if (x.Trim().Length == 0)
            {
                x = "0";
            }

            return x.Trim();
        }

        // 取一个结点的纵坐标
        private string getRy(List<List<string>> data, string strNode)
        {
            string y = "";
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals(strNode))
                {
                    y = oneLine[RY];
                    break;
                }
            }

            if (y.Trim().Length == 0)
            {
                y = "0";
            }
            return y.Trim();
        }

        // 给原始数据加上FLAG
        private void setFlag(List<List<string>> data, string strNode, string flag)
        {
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals(strNode))
                {
                    oneLine[Flag] = flag;
                    break;
                }
            }
        }

        // 取得一个结点的FLAG
        private string getFlag(List<List<string>> data, string strNode)
        {
            string strFlag = "";
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals(strNode))
                {
                    strFlag = oneLine[Flag];
                    break;
                }
            }
            return strFlag;
        }

        // 给原始数据设上真实的层数
        private void setRealLev(List<List<string>> data, string strNode,
                string strLev)
        {
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals(strNode))
                {
                    oneLine[RealLevel] = strLev;
                    break;
                }
            }
        }

        // 取得一个结点的真实层数
        private int getRealLev(List<List<string>> data, string strNode)
        {
            int strRealLev = 0;
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals(strNode))
                {
                    strRealLev = int.Parse(oneLine[RealLevel]);
                    break;
                }
            }
            return strRealLev;
        }

        // 为原始数据加上真实层级
        private void makeRealLev(List<List<string>> data)
        {
            foreach (List<string> oneLine in data)
            {
                if (oneLine[State].Equals("1"))
                {
                    setRealLev(data, oneLine[State], "1");
                }
                else
                {
                    string lev = (getRealLev(data, oneLine[PreState]) + 1).ToString();
                    setRealLev(data, oneLine[State], lev);
                }
            }
        }

        // 取得最大层数
        private int getMaxLev(List<List<string>> data)
        {
            int maxLev = 0;
            int realLev = 0;
            foreach (List<string> oneLine in data)
            {
                realLev = int.Parse(oneLine[RealLevel]);
                if (realLev > maxLev)
                {
                    maxLev = realLev;
                }
            }
            return maxLev;
        }

        // 打印数据
        private void printData(List<List<string>> data)
        {
            Console.WriteLine("===================== DATA INFO=======================");
            foreach (List<string> oneLine in data)
            {
                foreach (string s in oneLine)
                {
                    Console.Write(s + ", ");
                }
                Console.WriteLine(" ");
            }
        }

        // get children count of one node
        private int getSameLevNodeCount(List<List<string>> data, string strNodeNo,
                string strPreNode)
        {
            int intSameLevNodeCount = 0;
            foreach (List<string> oneLine in data)
            {
                if (oneLine[PreState].Equals(strPreNode))
                {
                    intSameLevNodeCount++;
                }
            }
            return intSameLevNodeCount;
        }

        // 打印结点信息
        private void printNode(List<Node> nodeList)
        {
            Console.WriteLine("===================== NODE INFO=======================");
            foreach (Node node in nodeList)
            {
                Console.WriteLine(node.getState() + ", (" + node.getX() + ","
                        + node.getY() + "), (" + node.getPx() + "," + node.getPy()
                        + "), " + node.getChildCount() + ", "
                        + node.getMember().getMemberName() + ", "
                        + node.getMember().getMemberType());
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值