4. Исходный код программы:
4.1. Исходный код класса Scheme.cs:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SchemesGenerator
{
public enum BlockType { Process, Subprocess, Solution, Input, Output, HighLoopBorder, LowLoopBorder, Terminator };
public class Block
{
public BlockType Type { get; set; }
public string Text { get; set; }
public Point Start { get; set; }
public int Number { get; set; }
}
public class Scheme
{
public List<Block> Blocks;
public int Count { get; set; }
public Scheme()
{
Count = 0;
Blocks = new List<Block>();
}
public void AddBlock(ref Block CurBlock)
{
Block b = CurBlock;
if (Count > 0) { b.Number = Count; } else { b.Number = Count + 1; }
Blocks.Add(b);
Count++;
}
public void DeleteLast()
{
if (Count < 1) { return; }
Count--;
Blocks.RemoveAt(Count);
}
public void DeleteAll()
{
if (Count<1) { return; }
Blocks.RemoveRange(0,Count-1);
Count = 0;
}
}
}
4.2. Исходный код класса DrawScheme.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace SchemesGenerator
{
public class DrawScheme : Scheme
{
private Graphics Canvas { get; set; }
const int DISTANCE = 100;
const int WIDTH = 125;
const int HEIGHT = 75;
public void DrawTerminator(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font ("Arial",12);
p.Width = 2;
Canvas.DrawEllipse(p, OpBlock.Start.X , OpBlock.Start.Y, HEIGHT * 2 / 3, HEIGHT * 2 / 3);
Canvas.FillEllipse(b, OpBlock.Start.X , OpBlock.Start.Y, HEIGHT*2/3, HEIGHT*2/3);
Canvas.DrawEllipse(p, OpBlock.Start.X + WIDTH*3/5, OpBlock.Start.Y, HEIGHT*2/3, HEIGHT*2/3);
Canvas.FillEllipse(b, OpBlock.Start.X + WIDTH*3/5, OpBlock.Start.Y, HEIGHT*2/3, HEIGHT*2/3);
Canvas.DrawRectangle(p, OpBlock.Start.X + HEIGHT/3, OpBlock.Start.Y, WIDTH*3/5, HEIGHT*2/3);
Canvas.FillRectangle(b, OpBlock.Start.X + HEIGHT / 3, OpBlock.Start.Y, WIDTH * 3 / 5, HEIGHT * 2 / 3);
b.Color = System.Drawing.Color.Black;
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X, OpBlock.Start.Y + 10);
}
public void DrawProcess(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font("Arial", 12);
Canvas.DrawRectangle(p,OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);
Canvas.FillRectangle(b, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);
b.Color = System.Drawing.Color.Black;
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X+30, OpBlock.Start.Y + 30);
Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);
}
public void DrawSubprocess(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font("Arial", 12);
Canvas.DrawRectangle(p, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);
Canvas.FillRectangle(b, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);
b.Color = System.Drawing.Color.Black;
p.Color = b.Color;
Canvas.DrawLine(p, OpBlock.Start.X + 15, OpBlock.Start.Y, OpBlock.Start.X + 15, OpBlock.Start.Y + HEIGHT);
Canvas.DrawLine(p, OpBlock.Start.X + WIDTH - 15, OpBlock.Start.Y, OpBlock.Start.X + WIDTH - 15, OpBlock.Start.Y + HEIGHT);
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 30, OpBlock.Start.Y + 30);
Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);
}
public void DrawSolution(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font("Arial", 12);
Point[] Points = new Point[5];
Points[0].X = OpBlock.Start.X + WIDTH / 2;
Points[0].Y = OpBlock.Start.Y;
Points[1].X = OpBlock.Start.X + WIDTH;
Points[1].Y = OpBlock.Start.Y + HEIGHT / 2;
Points[2].X = Points[0].X;
Points[2].Y = OpBlock.Start.Y + HEIGHT;
Points[3].X = OpBlock.Start.X;
Points[3].Y = Points[1].Y;
Points[4] = Points[0];
Canvas.DrawPolygon(p, Points);
Canvas.FillPolygon(b, Points);
b.Color = System.Drawing.Color.Black;
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 28, OpBlock.Start.Y + 28);
Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);
}
public void DrawHighLoopBorder(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font("Arial", 12);
Point[] Points = new Point[7];
const int ANGLE = 15;
Points[0].X = OpBlock.Start.X + ANGLE;
Points[0].Y = OpBlock.Start.Y;
Points[1].X = OpBlock.Start.X + WIDTH - ANGLE;
Points[1].Y = OpBlock.Start.Y;
Points[2].X = OpBlock.Start.X + WIDTH;
Points[2].Y = OpBlock.Start.Y + ANGLE;
Points[3].X = OpBlock.Start.X + WIDTH;
Points[3].Y = OpBlock.Start.Y + HEIGHT;
Points[4].X = OpBlock.Start.X;
Points[4].Y = OpBlock.Start.Y + HEIGHT;
Points[5].X = OpBlock.Start.X;
Points[5].Y = OpBlock.Start.Y + ANGLE;
Points[6] = Points[0];
Canvas.DrawPolygon(p, Points);
Canvas.FillPolygon(b, Points);
b.Color = System.Drawing.Color.Black;
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 28, OpBlock.Start.Y + 28);
Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);
}
public void DrawLowLoopBorder(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font("Arial", 12);
Point[] Points = new Point[7];
const int ANGLE = 15;
Points[0].X = OpBlock.Start.X;
Points[0].Y = OpBlock.Start.Y;
Points[1].X = OpBlock.Start.X + WIDTH;
Points[1].Y = OpBlock.Start.Y;
Points[2].X = OpBlock.Start.X + WIDTH;
Points[2].Y = OpBlock.Start.Y + HEIGHT - ANGLE;
Points[3].X = OpBlock.Start.X + WIDTH - ANGLE;
Points[3].Y = OpBlock.Start.Y + HEIGHT;
Points[4].X = OpBlock.Start.X + ANGLE;
Points[4].Y = OpBlock.Start.Y + HEIGHT;
Points[5].X = OpBlock.Start.X;
Points[5].Y = OpBlock.Start.Y + HEIGHT - ANGLE;
Points[6] = Points[0];
Canvas.DrawPolygon(p, Points);
Canvas.FillPolygon(b, Points);
b.Color = System.Drawing.Color.Black;
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 28, OpBlock.Start.Y + 28);
Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);
}
public void DrawInput(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font("Arial", 12);
Point[] Points = new Point[5];
Points[0].X = OpBlock.Start.X;
Points[0].Y = OpBlock.Start.Y + HEIGHT/3;
Points[1].X = OpBlock.Start.X + WIDTH;
Points[1].Y = OpBlock.Start.Y;
Points[2].X = OpBlock.Start.X + WIDTH;
Points[2].Y = OpBlock.Start.Y + HEIGHT;
Points[3].X = OpBlock.Start.X;
Points[3].Y = OpBlock.Start.Y + HEIGHT;
Points[4] = Points[0];
Canvas.DrawPolygon(p, Points);
Canvas.FillPolygon(b, Points);
b.Color = System.Drawing.Color.Black;
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 30, OpBlock.Start.Y + 28);
Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);
}
public void DrawOutput(Block OpBlock)
{
Pen p = new Pen(System.Drawing.Color.White);
SolidBrush b = new SolidBrush(System.Drawing.Color.White);
Font f = new Font("Arial", 12);
Canvas.DrawEllipse(p, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);
Canvas.FillEllipse(b, OpBlock.Start.X, OpBlock.Start.Y, WIDTH, HEIGHT);
b.Color = System.Drawing.Color.Black;
Canvas.DrawString(OpBlock.Text, f, b, OpBlock.Start.X + 30, OpBlock.Start.Y + 28);
Canvas.DrawString(OpBlock.Number.ToString(), f, b, OpBlock.Start.X + WIDTH * 3 / 4, OpBlock.Start.Y);
}
public void DrawLine(Block SourceBlock, Block AimBlock)
{
Pen p = new Pen(System.Drawing.Color.Black);
p.Width = 2;
p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
int sy = SourceBlock.Start.Y + HEIGHT, ay = AimBlock.Start.Y;
if (SourceBlock.Type == BlockType.Terminator) { sy -= 25; }
if (AimBlock.Type == BlockType.Input) { ay += 15; }
Canvas.DrawLine(p, SourceBlock.Start.X + WIDTH / 2, sy, AimBlock.Start.X + WIDTH / 2, ay);
}
public DrawScheme(Graphics Graphics)
{
UpdateGraphics(Graphics);
}
public void DrawBlock(Block OpBlock)
{
switch (OpBlock.Type)
{
case BlockType.Process : { DrawProcess(OpBlock); break; }
case BlockType.Subprocess : { DrawSubprocess(OpBlock); break; }
case BlockType.Solution : { DrawSolution(OpBlock); break; }
case BlockType.Terminator : { DrawTerminator(OpBlock); break; }
case BlockType.HighLoopBorder : { DrawHighLoopBorder(OpBlock); break; }
case BlockType.LowLoopBorder : { DrawLowLoopBorder(OpBlock); break; }
case BlockType.Input : { DrawInput(OpBlock); break; }
case BlockType.Output : { DrawOutput(OpBlock); break; }
}
}
public void Draw()
{
Point t = new Point();
int y = 0;
for (int i = 0; i < Count; i++)
{
t.Y = DISTANCE * y;
t.X = 50;
y++;
Blocks[i].Start = t;
DrawBlock(Blocks[i]);
}
if (Count <= 1) { return; }
for (int j = 1; j < Count; j++)
{
DrawLine(Blocks[j-1], Blocks[j]);
}
}
public void UpdateGraphics(Graphics g)
{
Canvas = g;
}
}
}
4.3. Исходный код класса формы Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SchemesGenerator
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Graphics g;
Color c;
Form2 M;
public DrawScheme b;
private int h;
private void button2_Click(object sender, EventArgs e)
{
int s = pictureBox1.ClientSize.Width;
Size client = new Size();
Block bl = new Block();
h += 100;
M.ShowDialog();
Object val = Convert.ChangeType(M.Tag, typeof(Block));
bl = (Block)val;
b.AddBlock(ref bl);
client.Height = h;
client.Width = s;
pictureBox1.ClientSize = client;
g = pictureBox1.CreateGraphics();
b.UpdateGraphics(g);
b.Draw();
}
private void button1_Click(object sender, EventArgs e)
{
b.DeleteLast();
g.Clear(c);
b.Draw();
}
private void Form1_Shown(object sender, EventArgs e)
{
b = new DrawScheme(g);
c = new Color();
c = Form1.DefaultBackColor;
M = new Form2();
panel1.Controls.Add(pictureBox1);
h = pictureBox1.ClientSize.Height;
}
private void button3_Click(object sender, EventArgs e)
{
b.DeleteAll();
g.Clear(c);
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
b.Draw();
}
}
}
4.4. Исходный код класса формы Form2.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SchemesGenerator
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public int Item;
private void Form2_Shown(object sender, EventArgs e)
{
groupBox1.Controls.Add(radioButton1);
groupBox1.Controls.Add(radioButton2);
groupBox1.Controls.Add(radioButton3);
groupBox1.Controls.Add(radioButton4);
groupBox1.Controls.Add(radioButton5);
groupBox1.Controls.Add(radioButton6);
groupBox1.Controls.Add(radioButton7);
groupBox1.Controls.Add(radioButton8);
}
void radioButton_CheckedChanged(object sender, EventArgs e)
{
RadioButton rb = sender as RadioButton;
var t = typeof(int);
if (rb.Checked)
{
Object val = Convert.ChangeType(rb.Tag, t);
Item = Convert.ToInt32(val);
}
}
public BlockType GetBlockType(int Choice)
{
switch (Choice) {
case 0: { return BlockType.Terminator; }
case 1: { return BlockType.Process; }
case 2: { return BlockType.Subprocess; }
case 3: { return BlockType.Solution; }
case 4: { return BlockType.HighLoopBorder; }
case 5: { return BlockType.LowLoopBorder; }
case 6: { return BlockType.Input; }
case 7: { return BlockType.Output; }
default: return BlockType.Process;
}
}
private void button1_Click(object sender, EventArgs e)
{
Block t = new Block();
t.Text = textBox1.Text;
t.Type = GetBlockType(Item);
this.Tag = t;
this.Close();
}
}
}
5. Результаты работы:
Рисунок 6 – Общий вид главного окна приложения
Рисунок 7 – Общий вид окна выбора параметров блока
Рисунок 8 – Демонстрация простейшей схемы, созданной приложением