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