tbf/SchematicDrawing/DrawingShape.cs
2020-06-02 12:00:45 +02:00

356 lines
29 KiB
C#

///
/// Copyright (c) 2020 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SchematicDrawing
{
public class DrawingShape
{
public readonly Shape Shape; /// see enum SchematicDrawing.Shape
public readonly Sz Sz; /// see enum SchematicDrawing.Sz
public readonly int SzX; /// Size X in SchematicDrawing.Const.Step pixels
public readonly int SzY; /// Size Y in SchematicDrawing.Const.Step pixels
public readonly bool HasImg; /// True when there is an image of this item to be displayed
public readonly Image ImgRight; /// Bitmap to be drawn (in the open state in case there are two states: open/closed)
public readonly Image ImgUp;
public readonly Image ImgLeft;
public readonly Image ImgDown;
public readonly Image ImgRightFlipped;
public readonly Image ImgUpFlipped;
public readonly Image ImgLeftFlipped;
public readonly Image ImgDownFlipped;
public readonly int OffsX; /// Offset of left/top coordinate of the bitmap when rendering
public readonly int OffsY; /// Offset of left/top coordinate of the bitmap when rendering
public readonly int Wid; /// Width of the bitmap when rendering, original bitmap is resized to this size
public readonly int Hgh; /// Height of the bitmap when rendering, original bitmap is resized to this size
public readonly bool HasValue; /// true when there is a measured or setpoint value to be displayed (in any form)
public readonly Node[] Nodes; /// Nodes of this shape
public readonly Edge[] Edges; /// Edges (in the open state in case there are two states: open/closed)
public readonly bool CanBeClosed; /// true = This shape hase two states: open and closed
public readonly Edge[] EdgesClosed; /// Optional edges in the closed state
public readonly Image ImgRightClosed; /// Optional bitmap in the closed state, size should be the same as the size of Bmp
public readonly Image ImgUpClosed;
public readonly Image ImgLeftClosed;
public readonly Image ImgDownClosed;
public readonly Image ImgRightFlippedClosed;
public readonly Image ImgUpFlippedClosed;
public readonly Image ImgLeftFlippedClosed;
public readonly Image ImgDownFlippedClosed;
DrawingShape(Shape shape, Sz sz, int szX, int szY, bool hasValue, Bitmap bmp = null, int offsX = 0, int offsY = 0, int wid = 0, int hgh = 0, Node[] nodes = null, Edge[] edges = null, Bitmap bmpClosed = null, Edge[] edgesClosed = null)
{
Shape = shape;
Sz = sz;
SzX = szX;
SzY = szY;
HasValue = hasValue;
HasImg = (bmp != null);
if (HasImg)
{
ImgRight = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgDown = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgLeft = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgUp = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
ImgRightFlipped = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgDownFlipped = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgLeftFlipped = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgUpFlipped = bmp.Clone() as Image;
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
}
OffsX = offsX;
OffsY = offsY;
Wid = wid;
Hgh = hgh;
Nodes = (nodes != null) ? nodes : new Node[0];
Edges = (edges != null) ? edges : new Edge[0];
CanBeClosed = (bmpClosed != null);
EdgesClosed = CanBeClosed ? edgesClosed : Edges;
if (HasImg && CanBeClosed)
{
ImgRightClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgDownClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgLeftClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgUpClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
bmpClosed.RotateFlip(RotateFlipType.RotateNoneFlipY);
ImgRightFlippedClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgDownFlippedClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgLeftFlippedClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
ImgUpFlippedClosed = bmpClosed.Clone() as Image;
bmpClosed.RotateFlip(RotateFlipType.Rotate90FlipNone);
bmpClosed.RotateFlip(RotateFlipType.RotateNoneFlipY);
}
}
public Rectangle GetRotatedFlippedImageRectangle(Orient itemOrient, bool itemFlip)
{
if (itemFlip)
{
/// Flipped (mirror) image
switch (itemOrient)
{
default:
case Orient.R: return new Rectangle(OffsX, SchematicDrawing.Const.Step * SzY - Hgh - OffsY, Wid, Hgh);
case Orient.Up: return new Rectangle(OffsY, OffsX, Hgh, Wid);
case Orient.L: return new Rectangle(SchematicDrawing.Const.Step * SzX - Wid - OffsX, OffsY, Wid, Hgh);
case Orient.Dn: return new Rectangle(SchematicDrawing.Const.Step * SzY - Hgh - OffsY, SchematicDrawing.Const.Step * SzX - Wid - OffsX, Hgh, Wid);
}
}
else
{
/// Normal image
switch (itemOrient)
{
default:
case Orient.R: return new Rectangle(OffsX, OffsY, Wid, Hgh);
case Orient.Up: return new Rectangle(OffsY, SchematicDrawing.Const.Step * SzX - Wid - OffsX, Hgh, Wid);
case Orient.L: return new Rectangle(SchematicDrawing.Const.Step * SzX - Wid - OffsX, SchematicDrawing.Const.Step * SzY - Hgh - OffsY, Wid, Hgh);
case Orient.Dn: return new Rectangle(SchematicDrawing.Const.Step * SzY - Hgh - OffsY, OffsX, Hgh, Wid);
}
}
}
/// <summary>
/// Get coordinates and orientation of the rotated/flipped node
/// </summary>
/// <param name="nid">Node id</param>
/// <param name="itemOrient">Component orientation</param>
/// <param name="itemFlip">Component flip</param>
/// <returns>Rotated/flipped node</returns>
public Node GetRotatedFlippedNode(int nid, Orient itemOrient, bool itemFlip)
{
if (Nodes == null || nid < 0 || nid >= Nodes.Length) return new Node(0, 0, Orient.R);
Node node = Nodes[nid];
int ori = (int)itemOrient + (int)node.Orient;
///
if (itemFlip)
{
/// Flipped
if (ori % 2 == 1) ori += 2;
switch (itemOrient)
{
default:
case Orient.R: return new Node(node.X, SzY - node.Y, (Orient)(ori % 4));
case Orient.Up: return new Node(node.Y, node.X, (Orient)(ori % 4));
case Orient.L: return new Node(SzX - node.X, node.Y, (Orient)(ori % 4));
case Orient.Dn: return new Node(SzY - node.Y, SzX - node.X, (Orient)(ori % 4));
}
}
else
{
/// Normal
switch (itemOrient)
{
default:
case Orient.R: return new Node(node.X, node.Y, (Orient)(ori % 4));
case Orient.Up: return new Node(node.Y, SzX - node.X, (Orient)(ori % 4));
case Orient.L: return new Node(SzX - node.X, SzY - node.Y, (Orient)(ori % 4));
case Orient.Dn: return new Node(SzY - node.Y, node.X, (Orient)(ori % 4));
}
}
}
public static DrawingShape[] Shapes;
///
public static int DrShIx(Shape shape, Sz sz) { return (int)shape * (int)Sz.Count + (int)sz; }
///
public static DrawingShape GetDrawingShape(Shape shape, Sz sz) { return Shapes[DrShIx(shape, sz)]; }
///
public static DrawingShape GetDrawingShape(IDrawingItemCfg item) { return Shapes[DrShIx(item.Shape, item.Sz)]; }
/// <summary>
/// Static constructor that initializes Shapes[] array
/// </summary>
static DrawingShape()
{
Shapes = new DrawingShape[(int)Shape.Count * (int)Sz.Count];
/// Temperature meter
Shapes[DrShIx(Shape.TempM, Sz.S)] = new DrawingShape(Shape.TempM, Sz.S, 0, 0, true);
Shapes[DrShIx(Shape.TempM, Sz.M)] = new DrawingShape(Shape.TempM, Sz.M, 0, 0, true);
Shapes[DrShIx(Shape.TempM, Sz.L)] = new DrawingShape(Shape.TempM, Sz.L, 0, 0, true);
Shapes[DrShIx(Shape.TempM, Sz.XL)] = new DrawingShape(Shape.TempM, Sz.XL, 0, 0, true);
/// Pressure meter
Shapes[DrShIx(Shape.PressM, Sz.S)] = new DrawingShape(Shape.PressM, Sz.S, 0, 0, true);
Shapes[DrShIx(Shape.PressM, Sz.M)] = new DrawingShape(Shape.PressM, Sz.M, 0, 0, true);
Shapes[DrShIx(Shape.PressM, Sz.L)] = new DrawingShape(Shape.PressM, Sz.L, 0, 0, true);
Shapes[DrShIx(Shape.PressM, Sz.XL)] = new DrawingShape(Shape.PressM, Sz.XL, 0, 0, true);
/// Valve
Shapes[DrShIx(Shape.Valve, Sz.S)] = new DrawingShape(Shape.Valve, Sz.S, 2, 2, false, Properties.Resources.Valve_S_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(2, 1, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Valve_S_closed, new Edge[] { });
Shapes[DrShIx(Shape.Valve, Sz.M)] = new DrawingShape(Shape.Valve, Sz.M, 3, 4, false, Properties.Resources.Valve_M_open, 0, 5, 30, 30,
new Node[] { new Node(0, 2, Orient.L), new Node(3, 2, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Valve_M_closed, new Edge[] { });
Shapes[DrShIx(Shape.Valve, Sz.L)] = new DrawingShape(Shape.Valve, Sz.L, 4, 4, false, Properties.Resources.Valve_L_open, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Valve_L_closed, new Edge[] { });
Shapes[DrShIx(Shape.Valve, Sz.XL)] = new DrawingShape(Shape.Valve, Sz.XL, 5, 6, false, Properties.Resources.Valve_XL_open, 0, 5, 50, 50,
new Node[] { new Node(0, 3, Orient.L), new Node(5, 3, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Valve_XL_closed, new Edge[] { });
/// Regulation valve
Shapes[DrShIx(Shape.RegV, Sz.S)] = new DrawingShape(Shape.RegV, Sz.S, 2, 2, true, Properties.Resources.RegV_S, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(2, 1, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.RegV, Sz.M)] = new DrawingShape(Shape.RegV, Sz.M, 3, 4, true, Properties.Resources.RegV_M, 0, 5, 30, 30,
new Node[] { new Node(0, 2, Orient.L), new Node(3, 2, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.RegV, Sz.L)] = new DrawingShape(Shape.RegV, Sz.L, 4, 4, true, Properties.Resources.RegV_L, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.RegV, Sz.XL)] = new DrawingShape(Shape.RegV, Sz.XL, 5, 6, true, Properties.Resources.RegV_XL, 0, 5, 50, 50,
new Node[] { new Node(0, 3, Orient.L), new Node(5, 3, Orient.R) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
/// Pump
Shapes[DrShIx(Shape.Pump, Sz.S)] = new DrawingShape(Shape.Pump, Sz.S, 2, 2, false, Properties.Resources.Pump_S_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(2, 1, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_S_closed, new Edge[] { });
Shapes[DrShIx(Shape.Pump, Sz.M)] = new DrawingShape(Shape.Pump, Sz.M, 3, 4, false, Properties.Resources.Pump_M_open, 0, 5, 30, 30,
new Node[] { new Node(0, 2, Orient.L), new Node(3, 2, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_M_closed, new Edge[] { });
Shapes[DrShIx(Shape.Pump, Sz.L)] = new DrawingShape(Shape.Pump, Sz.L, 4, 4, false, Properties.Resources.Pump_L_open, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_L_closed, new Edge[] { });
Shapes[DrShIx(Shape.Pump, Sz.XL)] = new DrawingShape(Shape.Pump, Sz.XL, 5, 6, false, Properties.Resources.Pump_XL_open, 0, 5, 50, 50,
new Node[] { new Node(0, 3, Orient.L), new Node(5, 3, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_XL_closed, new Edge[] { });
/// Pump with frequency inverter
Shapes[DrShIx(Shape.PumpFM, Sz.S)] = new DrawingShape(Shape.PumpFM, Sz.S, 2, 2, true, Properties.Resources.Pump_S_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(2, 1, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_S_closed, new Edge[] { });
Shapes[DrShIx(Shape.PumpFM, Sz.M)] = new DrawingShape(Shape.PumpFM, Sz.M, 3, 4, true, Properties.Resources.Pump_M_open, 0, 5, 30, 30,
new Node[] { new Node(0, 2, Orient.L), new Node(3, 2, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_M_closed, new Edge[] { });
Shapes[DrShIx(Shape.PumpFM, Sz.L)] = new DrawingShape(Shape.PumpFM, Sz.L, 4, 4, true, Properties.Resources.Pump_L_open, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_L_closed, new Edge[] { });
Shapes[DrShIx(Shape.PumpFM, Sz.XL)] = new DrawingShape(Shape.PumpFM, Sz.XL, 5, 6, true, Properties.Resources.Pump_XL_open, 0, 5, 50, 50,
new Node[] { new Node(0, 3, Orient.L), new Node(5, 3, Orient.R) }, new Edge[] { new Edge(0, 1) },
Properties.Resources.Pump_XL_closed, new Edge[] { });
/// Flow meter
Shapes[DrShIx(Shape.FlowM, Sz.S)] = new DrawingShape(Shape.FlowM, Sz.S, 2, 2, true, Properties.Resources.FlowM_S, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(2, 1, Orient.R) },
new Edge[] { new Edge(0, 1) });
Shapes[DrShIx(Shape.FlowM, Sz.M)] = new DrawingShape(Shape.FlowM, Sz.M, 3, 4, true, Properties.Resources.FlowM_M, 0, 5, 30, 30,
new Node[] { new Node(0, 2, Orient.L), new Node(3, 2, Orient.R) },
new Edge[] { new Edge(0, 1) });
Shapes[DrShIx(Shape.FlowM, Sz.L)] = new DrawingShape(Shape.FlowM, Sz.L, 4, 4, true, Properties.Resources.FlowM_L, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) },
new Edge[] { new Edge(0, 1) });
Shapes[DrShIx(Shape.FlowM, Sz.XL)] = new DrawingShape(Shape.FlowM, Sz.XL, 5, 6, true, Properties.Resources.FlowM_XL, 0, 5, 50, 50,
new Node[] { new Node(0, 3, Orient.L), new Node(5, 3, Orient.R) },
new Edge[] { new Edge(0, 1) });
/// Water meter
Shapes[DrShIx(Shape.WaterM, Sz.L)] = new DrawingShape(Shape.WaterM, Sz.L, 4, 4, false, Properties.Resources.WaterM_L, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(4, 2, Orient.R) },
new Edge[] { new Edge(0, 1) });
Shapes[DrShIx(Shape.WaterM, Sz.S)] = Shapes[DrShIx(Shape.WaterM, Sz.L)];
Shapes[DrShIx(Shape.WaterM, Sz.M)] = Shapes[DrShIx(Shape.WaterM, Sz.L)];
Shapes[DrShIx(Shape.WaterM, Sz.XL)] = Shapes[DrShIx(Shape.WaterM, Sz.L)];
/// Junction
Shapes[DrShIx(Shape.Junction, Sz.S)] = new DrawingShape(Shape.Junction, Sz.S, 0, 0, false, null, 0, 0, 0, 0, new Node[] { new Node(0, 0, Orient.R) });
Shapes[DrShIx(Shape.Junction, Sz.M)] = new DrawingShape(Shape.Junction, Sz.M, 0, 0, false, null, 0, 0, 0, 0, new Node[] { new Node(0, 0, Orient.R) });
Shapes[DrShIx(Shape.Junction, Sz.L)] = new DrawingShape(Shape.Junction, Sz.L, 0, 0, false, null, 0, 0, 0, 0, new Node[] { new Node(0, 0, Orient.R) });
Shapes[DrShIx(Shape.Junction, Sz.XL)] = new DrawingShape(Shape.Junction, Sz.XL, 0, 0, false, null, 0, 0, 0, 0, new Node[] { new Node(0, 0, Orient.R) });
/// Knee
Shapes[DrShIx(Shape.Knee, Sz.K1)] = new DrawingShape(Shape.Knee, Sz.K1, 2, 2, false, Properties.Resources.Knee_S_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee_S_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.Knee, Sz.K2)] = new DrawingShape(Shape.Knee, Sz.K2, 2, 2, false, Properties.Resources.Knee_M_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee_M_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.Knee, Sz.K3)] = new DrawingShape(Shape.Knee, Sz.K3, 2, 2, false, Properties.Resources.Knee_L_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee_L_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.Knee, Sz.K4)] = new DrawingShape(Shape.Knee, Sz.K4, 4, 4, false, Properties.Resources.Knee_XL_open, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(2, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee_XL_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.Knee, Sz.K5)] = new DrawingShape(Shape.Knee, Sz.K5, 2, 2, false, Properties.Resources.Knee2_S_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee2_S_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.Knee, Sz.K6)] = new DrawingShape(Shape.Knee, Sz.K6, 2, 2, false, Properties.Resources.Knee2_M_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee2_M_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.Knee, Sz.K7)] = new DrawingShape(Shape.Knee, Sz.K7, 3, 2, false, Properties.Resources.Knee2_L_open, 0, 0, 30, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(2, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee2_L_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
Shapes[DrShIx(Shape.Knee, Sz.K8)] = new DrawingShape(Shape.Knee, Sz.K8, 4, 4, false, Properties.Resources.Knee2_XL_open, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(2, 0, Orient.Up) }, new Edge[] { new Edge(0, 1), new Edge(1, 0) },
Properties.Resources.Knee2_XL_closed, new Edge[] { new Edge(0, 1), new Edge(1, 0) });
/// Tee
Shapes[DrShIx(Shape.Tee, Sz.K1)] = new DrawingShape(Shape.Tee, Sz.K1, 2, 2, false, Properties.Resources.Tee_S_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up), new Node(2, 1, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee_S_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
Shapes[DrShIx(Shape.Tee, Sz.K2)] = new DrawingShape(Shape.Tee, Sz.K2, 2, 2, false, Properties.Resources.Tee_M_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up), new Node(2, 1, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee_M_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
Shapes[DrShIx(Shape.Tee, Sz.K3)] = new DrawingShape(Shape.Tee, Sz.K3, 2, 2, false, Properties.Resources.Tee_L_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up), new Node(2, 1, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee_L_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
Shapes[DrShIx(Shape.Tee, Sz.K4)] = new DrawingShape(Shape.Tee, Sz.K4, 4, 4, false, Properties.Resources.Tee_XL_open, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(2, 0, Orient.Up), new Node(4, 2, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee_XL_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
Shapes[DrShIx(Shape.Tee, Sz.K5)] = new DrawingShape(Shape.Tee, Sz.K5, 2, 2, false, Properties.Resources.Tee2_S_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up), new Node(2, 1, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee2_S_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
Shapes[DrShIx(Shape.Tee, Sz.K6)] = new DrawingShape(Shape.Tee, Sz.K6, 2, 2, false, Properties.Resources.Tee2_M_open, 0, 0, 20, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(1, 0, Orient.Up), new Node(2, 1, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee2_M_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
Shapes[DrShIx(Shape.Tee, Sz.K7)] = new DrawingShape(Shape.Tee, Sz.K7, 3, 2, false, Properties.Resources.Tee2_L_open, 0, 0, 30, 20,
new Node[] { new Node(0, 1, Orient.L), new Node(2, 0, Orient.Up), new Node(3, 1, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee2_L_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
Shapes[DrShIx(Shape.Tee, Sz.K8)] = new DrawingShape(Shape.Tee, Sz.K8, 4, 4, false, Properties.Resources.Tee2_XL_open, 0, 0, 40, 40,
new Node[] { new Node(0, 2, Orient.L), new Node(2, 0, Orient.Up), new Node(4, 2, Orient.R) },
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) },
Properties.Resources.Tee2_XL_closed,
new Edge[] { new Edge(0, 1), new Edge(1, 0), new Edge(0, 2), new Edge(2, 0), new Edge(2, 1), new Edge(1, 2) });
}
}
}