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

244 lines
9.0 KiB
C#

using CoreUnit.Control.UserControl.Canvas;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace CoreUnit.Scanner.UserControl.ScannerCanvas
{
public partial class ScannerCanvasUserCtrl : System.Windows.Forms.UserControl, ICanvasOwner, IEditToolOwner
{
public ScannerCanvasUserCtrl(bool isReadMode = false)
{
InitializeComponent();
m_isReadMode = isReadMode;
}
#region 사용자 정의 함수 및 변수
const int CANVAS_SIZE_MARGIN = 0;
CanvasCtrl m_canvas = null;
DataModel m_data = null;
string m_toolHint = string.Empty;
string m_snapHint = string.Empty;
SizeF m_workSize;
//캔버스의 라인 정보값을 표시하는 label 선언
ToolStripLabel m_mousePosStatusLabel = null;
ToolStripLabel m_drawInfoStatusLabel = null;
ToolStripLabel m_snapInfoStatusLabel = null;
ToolStripLabel m_WeldingTImeLabel = null;
ToolStripLabel m_UploadTImeLabel = null;
public List<IDrawObject> Objects {
get { return Model.ActiveLayer.Objects; }
}
bool m_isReadMode;
public CanvasCtrl Canvas {
get { return m_canvas; }
}
public DataModel Model {
get { return m_data; }
}
public SizeF WorkSize {
get { lock (this) { return m_workSize; } }
set { lock (this) { m_workSize = value; } }
}
#region 3.레이저 마킹시 스캐너 조건 변수값
//전역변수 선언 이유는 ScnnerParamDlg에서 참조를 할 수 있어야 함.
static List<ScannerParam> m_scannerParams = new List<ScannerParam>();
public static List<ScannerParam> ScannerParams {
get { return m_scannerParams; }
set { m_scannerParams = value; }
}
#endregion
public void Initialize(SizeF workSize, int realHeight
, ToolStripLabel mousePosStatusLabel
, ToolStripLabel drawInfoStatusLabel
, ToolStripLabel snapInfoStatusLabel
, ToolStripLabel weldingTimeLabel
, ToolStripLabel uploadingTimeLabel
, CanvasCtrl.eCanvasType canvasType
, Color BackgroundColor, Color FieldColor, Color GridColor
, float backgroundSize
, bool scoutImageEnabled = false)
{
m_mousePosStatusLabel = mousePosStatusLabel;
m_drawInfoStatusLabel = drawInfoStatusLabel;
m_snapInfoStatusLabel = snapInfoStatusLabel;
m_WeldingTImeLabel = weldingTimeLabel;
m_UploadTImeLabel = uploadingTimeLabel;
m_workSize = workSize;
#region 1.사이즈에 대한 초기화 작업
double sizeRatio = (WorkSize.Width > WorkSize.Height) ? workSize.Height / workSize.Width : workSize.Width / workSize.Height;
//this.Height = realHeight - CANVAS_SIZE_MARGIN;
//this.Width = (int)(this.Height * sizeRatio); //상태 스트립 사이즈를 제외한 영역을 작업 영역으로 설정하기 위함.
//OMACS hochul.kim 20210517 - 전체 Window에서 Zooming 또는 Panning해서 Canvas 확대하더라도, 중앙의 정사각형 영역만 사용 중. 수정 필요
this.Height = Parent.ClientSize.Height;
this.Width = Parent.ClientSize.Width;
this.Location = new Point(this.Parent.ClientSize.Width / 2 - this.Size.Width / 2, this.Parent.ClientSize.Height / 2 - this.Size.Height / 2);
this.Anchor = Parent.Anchor;
this.Dock = DockStyle.Fill;
this.BackColor = Parent.BackColor;
#endregion
#region 2.CanvasCoreUnit 객체 초기화
m_data = new DataModel();
m_canvas = new CanvasCtrl(this, m_data, canvasType);
m_canvas.BackgroundSize = backgroundSize;
m_canvas.Dock = DockStyle.Fill;
m_canvas.Width = this.Width;
m_canvas.Height = this.Height;
this.Controls.Add(m_canvas);
((DataModel)Canvas.Model).CanvasImageEnable = scoutImageEnabled;
Model.ScaleToFit = m_data.Zoom = m_canvas.ScreenHeight() / m_workSize.Height;
m_canvas.SetCenter(new UnitPoint(0, 0));
SetupDrawTool();
#endregion
#region 3. CanvasLayer 초기화
m_canvas.Model.BackgroundLayer.BackgroundColor = BackgroundColor;
m_canvas.Model.BackgroundLayer.FieldColor = FieldColor;
m_canvas.Model.GridLayer.BackgroundColor = GridColor;
#endregion
}
public void SetupDrawTool() //객체 tool 타입에 작업하는 tool를 포함
{
m_data.AddDrawTool("Line", new LineEdit(true));
m_data.AddDrawTool("PolyLine", new LineEdit(false));
m_data.AddDrawTool("Dot", new Dot());
m_data.AddDrawTool("Spline", new Spline());
m_data.AddDrawTool("SnowMan", new SnowManEdit(true));
m_data.AddDrawTool("Group", new Group());
m_data.AddDrawTool("Ellipse", new EllipseTool());
m_data.AddDrawTool("Rectangle", new RectangleTool());
m_data.AddDrawTool("Arc3P123", new Arc3Point(Arc3Point.eArcType.kArc3P123));
m_data.AddDrawTool("Arc3P132", new Arc3Point(Arc3Point.eArcType.kArc3P132));
m_data.AddDrawTool("Arc2P", new Arc(Arc.eArcType.type2point));
m_data.AddDrawTool("ArcCR", new Arc(Arc.eArcType.typeCenterRadius));
m_data.AddDrawTool("ZigZag", new ZigZag());
}
#region 사용자가 canvas 외부에서 작업요청시 진행하는 함수
string mPreObjectType = string.Empty;
bool shouldGroup = false;
public void FinalizeGrouping()
{
if (shouldGroup) {
m_canvas.CommandGroup();
shouldGroup = false;
mPreObjectType = string.Empty;
}
}
public IDrawObject AddObject(AddObjectParam param)
{
if (!mPreObjectType.Contains("PolyLine") && param.ObjectType.Contains("PolyLine")) {
mPreObjectType = param.ObjectType;
m_canvas.CommandDeselectAll();
shouldGroup = true;
}
if (mPreObjectType.Contains("PolyLine") && !param.ObjectType.Contains("PolyLine") && shouldGroup) {
mPreObjectType = param.ObjectType;
m_canvas.CommandGroup();
shouldGroup = false;
}
return m_data.AddObject(param);
}
public IDrawObject AddSingleLine(PointF pt1, PointF pt2, Color color)
{
IDrawObject drawObj = m_data.AddObject("Line", new UnitPoint(pt1.X, pt1.Y), new UnitPoint(pt2.X, pt2.Y), color);
return drawObj;
}
public void DeleteAllSingleLines()
{
m_data.DeleteAllObjects();
m_canvas.DoInvalidate(true);
}
public IDrawObject AddGroup(PointF pt1, PointF pt2, Color color)
{
IDrawObject drawObj = m_data.AddObject("Group", new UnitPoint(pt1.X, pt1.Y), new UnitPoint(pt2.X, pt2.Y), color);
return drawObj;
}
#endregion
#region ICanvasOwner Members
public void SetPositionInfo(UnitPoint unitpos)
{
m_mousePosStatusLabel.Text = unitpos.PosAsString();
string s = string.Empty;
if (m_canvas.NewObject != null) {
IDrawObject obj = m_canvas.NewObject;
if (obj != null)
s = obj.GetInfoAsString();
} else {
IDrawObject obj = m_data.GetLastSelected();
if (obj != null)
s = obj.GetInfoAsString();
}
if (m_toolHint.Length > 0) {
s = m_toolHint;
}
if (s != m_drawInfoStatusLabel.Text) {
m_drawInfoStatusLabel.Text = s;
}
}
public void TimeLabelUpdate(double Weldingtime, double Uploadtime)
{
m_WeldingTImeLabel.Text = Weldingtime.ToString();
m_UploadTImeLabel.Text = Uploadtime.ToString();
}
public void SetSnapInfo(ISnapPoint snap)
{
m_snapHint = string.Empty;
if (snap != null)
m_snapHint = string.Format("Snap@{0}, {1}", snap.SnapPoint.PosAsString(), snap.GetType());
m_snapInfoStatusLabel.Text = m_snapHint;
}
#endregion
#region IEditToolOwner
public void SetHint(string text)
{
m_toolHint = text;
m_drawInfoStatusLabel.Text = m_toolHint;
}
#endregion
#endregion
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (m_data != null) {
m_canvas.SetCenter(m_data.CenterPoint);
}
}
#region 사용자 정의 함수
#endregion
}
}