172 lines
5.5 KiB
C#
172 lines
5.5 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
namespace CoreUnit.Control.UserControl.Canvas
|
|
{
|
|
public class DrawUtils
|
|
{
|
|
static Pen m_selectedPen = null;
|
|
static public Pen SelectedPen {
|
|
get {
|
|
if (m_selectedPen == null) {
|
|
//m_selectedPen = new Pen(Color.Magenta, 1);
|
|
//m_selectedPen.DashStyle = DashStyle.Dash;
|
|
|
|
// 선택 지역 펜 굵기 / 선 스타일 변경
|
|
m_selectedPen = new Pen(Color.Magenta, 4);
|
|
m_selectedPen.DashStyle = DashStyle.DashDotDot;
|
|
}
|
|
return m_selectedPen;
|
|
}
|
|
}
|
|
|
|
static public void DrawNode(ICanvas canvas, UnitPoint nodepoint)
|
|
{
|
|
RectangleF r = new RectangleF(canvas.ToScreen(nodepoint), new SizeF(0, 0));
|
|
r.Inflate(3, 3);
|
|
if (r.Right < 0 || r.Left > canvas.ClientRectangle.Width)
|
|
return;
|
|
if (r.Top < 0 || r.Bottom > canvas.ClientRectangle.Height)
|
|
return;
|
|
canvas.Graphics.FillRectangle(Brushes.White, r);
|
|
r.Inflate(1, 1);
|
|
canvas.Graphics.DrawRectangle(Pens.Black, ScreenUtils.ConvertRect(r));
|
|
}
|
|
|
|
static public void DrawTriangleNode(ICanvas canvas, UnitPoint nodepoint)
|
|
{
|
|
PointF screenpoint = canvas.ToScreen(nodepoint);
|
|
float size = 4;
|
|
PointF[] p = new PointF[]
|
|
{
|
|
new PointF(screenpoint.X - size, screenpoint.Y),
|
|
new PointF(screenpoint.X, screenpoint.Y + size),
|
|
new PointF(screenpoint.X + size, screenpoint.Y),
|
|
new PointF(screenpoint.X, screenpoint.Y - size),
|
|
};
|
|
canvas.Graphics.FillPolygon(Brushes.Blue, p);
|
|
}
|
|
|
|
static public void DrawArrowNode(ICanvas canvas, UnitPoint nodepoint, double Angle, Pen pen)
|
|
{
|
|
PointF screenpoint = canvas.ToScreen(nodepoint);
|
|
float size = 10;
|
|
|
|
double tiltX = (-size) * Math.Cos(Angle * Math.PI / 180) + (-size) * Math.Sin(Angle * Math.PI / 180);
|
|
double tiltY = (-1) * (-size) * Math.Sin(Angle * Math.PI / 180) + (-size) * Math.Cos(Angle * Math.PI / 180);
|
|
PointF leftPoint = new PointF((float)tiltX + screenpoint.X, (float)tiltY + screenpoint.Y);
|
|
canvas.Graphics.DrawLine(pen, screenpoint, leftPoint);
|
|
|
|
tiltX = (-size) * Math.Cos(Angle * Math.PI / 180) + (size) * Math.Sin(Angle * Math.PI / 180);
|
|
tiltY = (-1) * (-size) * Math.Sin(Angle * Math.PI / 180) + (size) * Math.Cos(Angle * Math.PI / 180);
|
|
PointF rightPoint = new PointF((float)tiltX + screenpoint.X, (float)tiltY + screenpoint.Y);
|
|
canvas.Graphics.DrawLine(pen, screenpoint, rightPoint);
|
|
|
|
}
|
|
}
|
|
|
|
interface IObjectEditInstance
|
|
{
|
|
IDrawObject GetDrawObject();
|
|
}
|
|
|
|
public abstract class DrawObjectBase
|
|
{
|
|
bool m_locked = false;
|
|
[Browsable(false)]
|
|
public bool Locked {
|
|
get { return m_locked; }
|
|
set { m_locked = value; }
|
|
}
|
|
|
|
float m_width;//선의 굵기
|
|
Color m_color = Color.Black;
|
|
DrawingLayer m_layer;
|
|
|
|
enum eFlags
|
|
{
|
|
selected = 0x00000001,
|
|
highlighted = 0x00000002,
|
|
useLayerWidth = 0x00000004,
|
|
useLayerColor = 0x00000008,
|
|
}
|
|
int m_flag = (int)(eFlags.useLayerWidth | eFlags.useLayerColor);
|
|
bool GetFlag(eFlags flag)
|
|
{
|
|
return ((int)m_flag & (int)flag) > 0;
|
|
}
|
|
|
|
void SetFlag(eFlags flag, bool enable)
|
|
{
|
|
if (enable)
|
|
m_flag |= (int)flag;
|
|
else
|
|
m_flag &= ~(int)flag;
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public bool UseLayerWidth {
|
|
get { return GetFlag(eFlags.useLayerWidth); }
|
|
set { SetFlag(eFlags.useLayerWidth, value); }
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public bool UseLayerColor {
|
|
get { return GetFlag(eFlags.useLayerColor); }
|
|
set { SetFlag(eFlags.useLayerColor, value); }
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public float Width {
|
|
set { m_width = value; }
|
|
get {
|
|
if (Layer != null && UseLayerWidth)
|
|
return Layer.Width;
|
|
return m_width;
|
|
}
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public Color Color {
|
|
set { m_color = value; }
|
|
get {
|
|
//if (Layer != null && UseLayerColor)
|
|
// return Layer.Color;
|
|
return m_color;
|
|
}
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public DrawingLayer Layer {
|
|
get { return m_layer; }
|
|
set { m_layer = value; }
|
|
}
|
|
|
|
abstract public void InitializeFromModel(UnitPoint point, DrawingLayer layer, ISnapPoint snap);
|
|
|
|
[Browsable(false)]
|
|
public virtual bool Selected {
|
|
get { return GetFlag(eFlags.selected); }
|
|
set {
|
|
SetFlag(eFlags.selected, value);
|
|
}
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public virtual bool Highlighted {
|
|
get { return GetFlag(eFlags.highlighted); }
|
|
set { SetFlag(eFlags.highlighted, value); }
|
|
}
|
|
|
|
public virtual void Copy(DrawObjectBase acopy)
|
|
{
|
|
UseLayerColor = acopy.UseLayerColor;
|
|
UseLayerWidth = acopy.UseLayerWidth;
|
|
Width = acopy.Width;
|
|
Color = acopy.Color;
|
|
}
|
|
}
|
|
}
|