2026-06-05 13:44:39 +09:00

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