1572 lines
66 KiB
C#
1572 lines
66 KiB
C#
using CoreUnit.Common;
|
|
using CoreUnit.Control.Dialog;
|
|
using CoreUnit.Control.UserControl.Canvas;
|
|
using CoreUnit.Control.UserControl.Canvas.Dialog;
|
|
using CoreUnit.Scanner.UserControl.Canvas.Dialog;
|
|
using CoreUnit.Scanner.UserControl.ScannerCanvas;
|
|
using DB.Recipe;
|
|
using GUI.Common;
|
|
using GUI.Dialog;
|
|
using GUI.Properties;
|
|
using IxMilia.Dxf;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using System.Windows.Forms;
|
|
using System.Xml;
|
|
using VisionCommon;
|
|
|
|
namespace GUI
|
|
{
|
|
public partial class MainPage : FormBase
|
|
{
|
|
public int iLaserNumberCnt = 0; //LJB 티칭 화면 Laser1, 2, 3, 4 LaserEmission Label에 상태 표시하기 위함
|
|
|
|
public MainPage()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
#region 2.메인화면: 다이얼로그 및 페이지 초기화 함수
|
|
|
|
private void ClearDisplayedError()
|
|
{
|
|
UtilUnit.logUnit.ClearDisplayerErrorLog();
|
|
}
|
|
|
|
private void ResetError()
|
|
{
|
|
|
|
}
|
|
private void InstanceDialog()
|
|
{
|
|
Form fm = null;
|
|
|
|
m_tblDialog = new Dictionary<string, Form>();
|
|
|
|
fm = new SystemParameterDlg(this);
|
|
TblDialog[fm.Name] = fm;
|
|
|
|
fm = new ScannerParameterDlg();
|
|
TblDialog[fm.Name] = fm;
|
|
|
|
// 각각의 Dialog를 Main Form의 소유로 지정해서
|
|
// MainPage Dispose 시에 각각의 Form도 Dispose 되도록 한다
|
|
foreach (Form dlg in TblDialog.Values) {
|
|
dlg.Owner = this;
|
|
}
|
|
}
|
|
private void InstancePages()
|
|
{
|
|
}
|
|
private void HideAllDialog()
|
|
{
|
|
foreach (Form dlg in TblDialog.Values) {
|
|
dlg.Hide();
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 3.메인화면: 페이지 기본 설정 함수
|
|
private void MainPage_Load(object sender, EventArgs e)
|
|
{
|
|
Initialize();
|
|
|
|
ScannerCanvasCtrlTeaching.Canvas.RunningSnaps = new Type[] { typeof(VertextSnapPoint), typeof(CenterSnapPoint) };
|
|
ScannerCanvasCtrlTeaching.Canvas.RunningSnapsEnabled = true;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 4.메인화면: 페이지 화면 전환 기능 함수
|
|
//1.페이지 설정 함수
|
|
string m_currPage = ""; // 현재 activated page의 text값을 저장함
|
|
Dictionary<string, Form> m_tblPages;
|
|
public Dictionary<string, Form> TblPages {
|
|
get { return m_tblPages; }
|
|
set { m_tblPages = value; }
|
|
}
|
|
Dictionary<string, Form> m_tblDialog;
|
|
public Dictionary<string, Form> TblDialog {
|
|
get { return m_tblDialog; }
|
|
set { m_tblDialog = value; }
|
|
}
|
|
private void ChangePage(string pageName)
|
|
{
|
|
if (pageName == m_currPage) {
|
|
return;//현재 페이지를 다시 선택한 경우
|
|
}
|
|
|
|
HideAllPage();
|
|
ShowPage(pageName);
|
|
}
|
|
private void HideAllPage()
|
|
{
|
|
foreach (Form frm in TblPages.Values) {
|
|
frm.Hide();
|
|
}
|
|
|
|
m_currPage = "";
|
|
}
|
|
private void ShowPage(string frmName)
|
|
{
|
|
foreach (Form frm in TblPages.Values) {
|
|
if (frm.Name.ToString() == frmName) {
|
|
frm.Show();
|
|
m_currPage = frmName;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
public Form GetPage(string frmName)
|
|
{
|
|
foreach (Form frm in TblPages.Values) {
|
|
if (frm.Name.ToString() == frmName) {
|
|
return frm;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
#endregion
|
|
|
|
#region 6.메인화면: 장비 및 운용 프로그램 상태 업데이트
|
|
DateTime m_lastEncRecordTime = DateTime.Now;
|
|
|
|
private void DeleteLogOverUserPeriod()
|
|
{
|
|
DateTime currDateTime = DateTime.Now;
|
|
|
|
// 마지막 삭제 날짜보다 하루 지났을 경우 삭제
|
|
if (m_initDateTime.Day < currDateTime.Day) {
|
|
// 사용자가 지정한 날짜 이후의 로그 history을 삭제
|
|
UtilUnit.logUnit.DeleteLogOverUserPeriod(Settings.Default.EQPDataFolder, (int)DB.Dao.SystemRecipe.LogDeletePeriod);
|
|
|
|
m_initDateTime = currDateTime;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 7.메인화면: 초기화
|
|
private void Initialize()
|
|
{
|
|
try {
|
|
#region 1. 페이지 초기화
|
|
InstancePages();
|
|
#endregion
|
|
|
|
#region 2.다이얼로그 초기화
|
|
InstanceDialog();
|
|
#endregion
|
|
|
|
#region 4. 스캐너 Canvas 초기화
|
|
InitializeScannerCanvas();
|
|
#endregion
|
|
|
|
#region 5.레시피 로딩
|
|
DB.Dao.WeldingLinesRecipe.Model = (DataModel)ScannerCanvasCtrlTeaching.Canvas.Model;
|
|
UpdateWeldingLinesRecipe();
|
|
#endregion
|
|
|
|
#region 12. 파워 캘리브레이션 테이블 로딩
|
|
DB.Dao.WeldingLinesRecipe.laserPowerCalibrationParam.Initialize
|
|
(DB.Dao.SystemRecipe.PowerCalibrationCenterBeamCSVFile,
|
|
DB.Dao.SystemRecipe.PowerCalibrationRingBeamCSVFile);
|
|
#endregion
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 8.메인화면: 기타
|
|
DateTime m_initDateTime = DateTime.Now;
|
|
|
|
void ActivateButton(Button btn, bool isActive = true)
|
|
{
|
|
btn.Enabled = isActive;
|
|
btn.Visible = isActive;
|
|
}
|
|
#endregion
|
|
|
|
#region 1.장비특성:스캐너 canvas 사용자 정의 함수
|
|
ScannerCanvasUserCtrl m_scannerCanvasCtrlTeaching = null; //스캐너 동작관련 객체 선언
|
|
public ScannerCanvasUserCtrl ScannerCanvasCtrlTeaching {
|
|
get { lock (this) { return m_scannerCanvasCtrlTeaching; } }
|
|
set { lock (this) { m_scannerCanvasCtrlTeaching = value; } }
|
|
}
|
|
|
|
ScannerCanvasUserCtrl m_scannerCanvasCtrlAutoPage = null; //스캐너 동작관련 객체 선언
|
|
public ScannerCanvasUserCtrl ScannerCanvasCtrlAutoPage {
|
|
get { lock (this) { return m_scannerCanvasCtrlAutoPage; } }
|
|
set { lock (this) { m_scannerCanvasCtrlAutoPage = value; } }
|
|
}
|
|
private void InitializeScannerCanvas()
|
|
{
|
|
#region 1-1.Scanner Canvas Teaching 객체 선언 및 이벤트 처리 함수 선언
|
|
ScannerCanvasCtrlTeaching = new ScannerCanvasUserCtrl();
|
|
panelContainerLeft.Controls.Add(ScannerCanvasCtrlTeaching);
|
|
ScannerCanvasCtrlTeaching.Initialize(DB.Dao.SystemRecipe.ScoutFieldCal
|
|
, panelContainerLeft.Height, toolStripMousePos, toolStripDrawInfo, toolStripSnapInfo, toolStripWeldingTime, toolStripUploadingTime, CanvasCtrl.eCanvasType.Teach
|
|
, DB.Dao.SystemRecipe.CanvasBackgroundColor, DB.Dao.SystemRecipe.CanvasFieldColor, DB.Dao.SystemRecipe.CanvasGridColor
|
|
, DB.Dao.SystemRecipe.CanvasBackgroundSize
|
|
, DB.Dao.SystemRecipe.EnableCanvasFieldImage);
|
|
ScannerCanvasCtrlTeaching.Model.evtAddObject += new DataModel.EventHandlerAddObject(EventHandlerAddObject);
|
|
ScannerCanvasCtrlTeaching.Model.evtCopyObjects += new DataModel.EventHandlerCopyObjects(EventHandlerCopyObjects);
|
|
ScannerCanvasCtrlTeaching.Model.evtDeleteObjects += new DataModel.EventHandlerDeleteObjects(EventHandlerDeleteObjects);
|
|
ScannerCanvasCtrlTeaching.Model.evtMoveObjects += new DataModel.EventHandlerMoveObjects(EventHandlerMoveObjects);
|
|
ScannerCanvasCtrlTeaching.Model.evtMoveNodes += new DataModel.EventHandlerMoveNodes(EventHandlerMoveNodes);
|
|
ScannerCanvasCtrlTeaching.Model.evtSelectObjects += new DataModel.EventHandlerSelectObjects(EventHandlerSelectObjects);
|
|
ScannerCanvasCtrlTeaching.Model.evtDeselectAllObjects += new DataModel.EventHandlerDeselectAllObjects(EventHandlerDeselectAllObjects);
|
|
ScannerCanvasCtrlTeaching.Model.evtRedo += new DataModel.EventHandlerRedo(EventHandlerRedoUndo);
|
|
ScannerCanvasCtrlTeaching.Model.evtUndo += new DataModel.EventHandlerUndo(EventHandlerRedoUndo);
|
|
|
|
ScannerCanvasCtrlTeaching.Canvas.evtGetOffsetValue += new CanvasCtrl.EventHandlerGetOffsetValue(EventHandleGetOffsetValue);
|
|
ScannerCanvasCtrlTeaching.Canvas.evtGetAngleOffsetValue += new CanvasCtrl.EventHandlerGetAngleOffsetValue(EventHandleGetOffsetAngle);
|
|
ScannerCanvasCtrlTeaching.Canvas.evtSnapModeChanged += new CanvasCtrl.EventHandlerChangeSnapMode(EventHandleChangeSnapMode);
|
|
#endregion
|
|
|
|
#region 1-2.Scanner Canvas Auto 객체 선언 및 이벤트 처리 함수 선언
|
|
ScannerCanvasCtrlAutoPage = new ScannerCanvasUserCtrl();
|
|
panelContainerLeft.Controls.Add(ScannerCanvasCtrlAutoPage);
|
|
ScannerCanvasCtrlAutoPage.Initialize(DB.Dao.SystemRecipe.ScoutFieldCal
|
|
, panelContainerLeft.Height, toolStripMousePos, toolStripDrawInfo, toolStripSnapInfo, toolStripWeldingTime, toolStripUploadingTime, CanvasCtrl.eCanvasType.Monitor
|
|
, DB.Dao.SystemRecipe.CanvasBackgroundColor, DB.Dao.SystemRecipe.CanvasFieldColor, DB.Dao.SystemRecipe.CanvasGridColor
|
|
, DB.Dao.SystemRecipe.CanvasBackgroundSize
|
|
, DB.Dao.SystemRecipe.EnableCanvasFieldImage);
|
|
|
|
#endregion
|
|
|
|
#region 2.스캔 필드 이미지 설정
|
|
|
|
Image scoutCanvasDisplayImage = null;
|
|
|
|
if (File.Exists(DB.Dao.SystemRecipe.ScannerFieldImageFile)) {
|
|
try {
|
|
scoutCanvasDisplayImage = CompressImageResolution(DB.Dao.SystemRecipe.ScannerFieldImageFile, DB.Dao.SystemRecipe.CanvasImageResolutionRatio);
|
|
} catch (FileNotFoundException ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
} else {
|
|
string strDefaultFileName = "D:\\ILSOSConfig\\ILSOS_PrismaticScanner\\_vision\\FieldScanImage\\Default\\DefaultFieldScanImage.Jpeg";
|
|
scoutCanvasDisplayImage = CompressImageResolution(strDefaultFileName, DB.Dao.SystemRecipe.CanvasImageResolutionRatio);
|
|
}
|
|
|
|
ScannerCanvasCtrlTeaching.Model.CanvasImage = (Bitmap)scoutCanvasDisplayImage.Clone();
|
|
ScannerCanvasCtrlTeaching.Model.CanvasImageEnable = DB.Dao.SystemRecipe.EnableCanvasFieldImage; //시스템 레시피에 캔버스 이미지 DISPLAY ON/OFF값 읽기
|
|
|
|
ScannerCanvasCtrlAutoPage.Model.CanvasImage = (Bitmap)scoutCanvasDisplayImage.Clone();
|
|
ScannerCanvasCtrlAutoPage.Model.CanvasImageEnable = DB.Dao.SystemRecipe.EnableCanvasFieldImage; //시스템 레시피에 캔버스 이미지 DISPLAY ON/OFF값 읽기
|
|
|
|
scoutCanvasDisplayImage.Dispose();
|
|
|
|
//ScoutFieldCal Size를 DB에서 받아오는 것으로 수정함
|
|
ScannerCanvasCtrlTeaching.Model.CanvasImageSize = DB.Dao.SystemRecipe.ScoutFieldCal;
|
|
ScannerCanvasCtrlAutoPage.Model.CanvasImageSize = DB.Dao.SystemRecipe.ScoutFieldCal;
|
|
#endregion
|
|
|
|
#region 3.자동운전화면에 PictureBox image 설정
|
|
//picBoxScannerCanvas.Image = image;
|
|
#endregion
|
|
|
|
#region 4. Canvas 설정
|
|
ScannerCanvasCtrlTeaching.Canvas.Model.GridLayer.Spacing = new SizeF((float)DB.Dao.SystemRecipe.CanvasGridSpace, (float)DB.Dao.SystemRecipe.CanvasGridSpace);
|
|
ScannerCanvasCtrlTeaching.Canvas.Model.BackgroundLayer.BackgroundColor = DB.Dao.SystemRecipe.CanvasBackgroundColor;
|
|
ScannerCanvasCtrlTeaching.Model.BackgroundLayer.FieldColor = DB.Dao.SystemRecipe.CanvasFieldColor;
|
|
ScannerCanvasCtrlTeaching.Model.GridLayer.BackgroundColor = DB.Dao.SystemRecipe.CanvasGridColor;
|
|
ScannerCanvasCtrlTeaching.Canvas.MinZoom = (float)DB.Dao.SystemRecipe.CanvasZoomMin;
|
|
ScannerCanvasCtrlTeaching.Canvas.MaxZoom = (float)DB.Dao.SystemRecipe.CanvasZoomMax;
|
|
|
|
ScannerCanvasCtrlAutoPage.Canvas.Model.GridLayer.Spacing = new SizeF((float)DB.Dao.SystemRecipe.CanvasGridSpace, (float)DB.Dao.SystemRecipe.CanvasGridSpace);
|
|
ScannerCanvasCtrlAutoPage.Canvas.Model.BackgroundLayer.BackgroundColor = DB.Dao.SystemRecipe.CanvasBackgroundColor;
|
|
ScannerCanvasCtrlAutoPage.Model.BackgroundLayer.FieldColor = DB.Dao.SystemRecipe.CanvasFieldColor;
|
|
ScannerCanvasCtrlAutoPage.Model.GridLayer.BackgroundColor = DB.Dao.SystemRecipe.CanvasGridColor;
|
|
ScannerCanvasCtrlAutoPage.Canvas.MinZoom = (float)DB.Dao.SystemRecipe.CanvasZoomMin;
|
|
ScannerCanvasCtrlAutoPage.Canvas.MaxZoom = (float)DB.Dao.SystemRecipe.CanvasZoomMax;
|
|
|
|
ScannerCanvasCtrlTeaching.Model.EnableCanvasGrid = DB.Dao.SystemRecipe.EnableCanvasGrid;
|
|
ScannerCanvasCtrlAutoPage.Model.EnableCanvasGrid = DB.Dao.SystemRecipe.EnableCanvasGrid;
|
|
ScannerCanvasCtrlTeaching.Model.EnableCanvasColor = DB.Dao.SystemRecipe.EnableCanvasColor;
|
|
ScannerCanvasCtrlAutoPage.Model.EnableCanvasColor = DB.Dao.SystemRecipe.EnableCanvasColor;
|
|
#endregion
|
|
}
|
|
|
|
public void EventHandlerAddObject(IDrawObject obj)
|
|
{
|
|
try {
|
|
UpdateObjetsInTreeView();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
public void EventHandlerCopyObjects(List<IDrawObject> objects)
|
|
{
|
|
try {
|
|
UpdateObjetsInTreeView();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
public void EventHandlerDeleteObjects(List<IDrawObject> objects)
|
|
{
|
|
try {
|
|
UpdateObjetsInTreeView();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
public void EventHandlerMoveObjects(List<IDrawObject> originalObjects, List<IDrawObject> newObjects)
|
|
{
|
|
drawObjectPropertyGrid.Refresh();
|
|
}
|
|
public void EventHandlerMoveNodes(List<INodePoint> nodes)
|
|
{
|
|
drawObjectPropertyGrid.Refresh();
|
|
}
|
|
private void EventHandlerSelectObjects(List<IDrawObject> objects)
|
|
{
|
|
try {
|
|
UpdateObjetsInTreeView();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
public TreeNode LoopNodesRecursive(TreeNode parentNode, string id)
|
|
{
|
|
// Start recursion on all subnodes.
|
|
foreach (TreeNode subNode in parentNode.Nodes) {
|
|
if (subNode.Text == id) {
|
|
return subNode;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
public void UpdateLayersInfo()
|
|
{
|
|
|
|
toolStripComboBoxPage.Items.Clear();
|
|
|
|
int index = 0;
|
|
|
|
foreach (ICanvasLayer layer in ScannerCanvasCtrlTeaching.Model.Layers) {
|
|
toolStripComboBoxPage.Items.Add(string.Format("Page {0:D2}", layer.No + 1));
|
|
|
|
if (layer.No == ScannerCanvasCtrlTeaching.Model.ActiveLayer.No) {
|
|
toolStripComboBoxPage.SelectedIndex = index;
|
|
}
|
|
index++;
|
|
}
|
|
}
|
|
private void EventHandlerDeselectAllObjects()
|
|
{
|
|
|
|
}
|
|
private void EventHandlerRedoUndo()
|
|
{
|
|
try {
|
|
|
|
UpdateObjetsInTreeView();
|
|
drawObjectPropertyGrid.Refresh();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
private float EventHandleGetOffsetValue()
|
|
{
|
|
return Single.Parse(toolStripTextBoxMoveOffset.Text);
|
|
}
|
|
private float EventHandleGetOffsetAngle()
|
|
{
|
|
return 90.0f;
|
|
//return Single.Parse(toolStripTextBoxMoveOffsetAngle.Text);
|
|
}
|
|
|
|
private void EventHandleChangeSnapMode(bool snapMode)
|
|
{
|
|
if (snapMode) {
|
|
toolStripButtonSnapMode.BackColor = Color.Red;
|
|
toolStripButtonSnapMode.Text = "Snap Mode : ON";
|
|
} else {
|
|
toolStripButtonSnapMode.BackColor = Color.Black;
|
|
toolStripButtonSnapMode.Text = "Snap Mode : OFF";
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 2.장비특성:레시피 관련 운용 함수
|
|
private delegate void UpdateWeldingLinesRecipeCallBack();
|
|
public void UpdateWeldingLinesRecipe()
|
|
{
|
|
try {
|
|
ChangeOrderForDrawObjectsNo();
|
|
UpdateLayersInfo();
|
|
UpdateObjetsInTreeView();
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
drawObjectPropertyGrid.SelectedObjects = null;
|
|
} catch (Exception ex) {
|
|
throw ex;
|
|
}
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region 레시피 관리 버튼(저장/열기/다른 이름으로 저장)
|
|
|
|
public void SaveRecipe(string fullpath, bool includeModel = true)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandEscape();
|
|
|
|
DB.Dao.WeldingLinesRecipe.Save(fullpath, includeModel);
|
|
|
|
string newpath = fullpath.Replace(Path.GetFileName(fullpath), "FieldHelper.json");
|
|
|
|
SaveAndLoadFieldScanFromLasaDb(fullpath);
|
|
}
|
|
public void UpdateAutoRunPage()
|
|
{
|
|
var teachingDataModel = ScannerCanvasCtrlTeaching.Canvas.Model as DataModel;
|
|
var autoPageDataMdoel = ScannerCanvasCtrlAutoPage.Canvas.Model as DataModel;
|
|
autoPageDataMdoel.Clone(teachingDataModel);
|
|
ScannerCanvasCtrlAutoPage.Canvas.CommandScaleToFit();
|
|
ScannerCanvasCtrlAutoPage.Canvas.DoInvalidate(true);
|
|
}
|
|
public void ReloadSetting()
|
|
{
|
|
try {
|
|
// 1. 스카우트 관련 기존 값 Save / Load -> 값 Change -> 변경 값 Save / Load
|
|
int selectedIndex = toolStripComboBoxPage.SelectedIndex;
|
|
SaveAndLoadFieldScanFromLasaDb();
|
|
DB.RecipeFieldScan.Instance.ChangeFieldString(
|
|
DB.RecipeFieldScan.Instance.GetAutoPageName(selectedIndex),
|
|
DB.Dao.SystemRecipe.ScannerFieldImageFile);
|
|
SaveAndLoadFieldScanFromLasaDb();
|
|
|
|
ChangeScoutImage();
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
} catch (FileNotFoundException ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
public void ReloadRecipe(string fullpath)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandEscape();
|
|
|
|
DB.Dao.WeldingLinesRecipe.Load(fullpath);
|
|
|
|
DB.Dao.SystemRecipe.WorkRecipeFile = fullpath;
|
|
|
|
// [변경 2026-06-20] 전환 중 콤보박스 SelectedIndexChanged 핸들러가
|
|
// SaveAndLoadFieldScanFromLasaDb()로 stale 데이터를 새 레시피 FieldHelper.json에
|
|
// 덮어쓰는 것을 막기 위해 동기화 억제. (UpdateWeldingLinesRecipe → UpdateLayersInfo →
|
|
// 콤보박스 SelectedIndex 설정 → 핸들러 발화 경로 차단)
|
|
_suppressPageFieldSync = true;
|
|
try {
|
|
UpdateWeldingLinesRecipe();
|
|
} finally {
|
|
_suppressPageFieldSync = false;
|
|
}
|
|
|
|
//// Page 불러온 후, 실행되지 않아도 됨. 왜냐하면, 어차피 SelectedIndex 쪽으로 빠짐.
|
|
//SaveAndLoadFieldScanFromLasaDb();
|
|
//ChangeScoutImage();
|
|
// [추가 2026-06-20] 레시피 전환 시 필드 싱글톤이 이전 레시피 값으로 남는 버그(레시피축 stale) 수정.
|
|
// 저장 없이 "로드 전용"으로 새 레시피의 FieldHelper.json 만 싱글톤에 반영.
|
|
// 순서 주의: WorkRecipeFile 갱신 + UpdateWeldingLinesRecipe(Layers 채움) 이후라야 pageCount 정합.
|
|
LoadFieldScanFromLasaDb();
|
|
}
|
|
#endregion
|
|
|
|
public RecipeWeldingLines getRecipeInfo(string fullpath)
|
|
{
|
|
var recipe = new RecipeWeldingLines();
|
|
recipe.LoadFileReadOnly(fullpath);
|
|
return recipe;
|
|
}
|
|
|
|
#region 필드 스캔 레시피
|
|
string defaultScoutName = null;
|
|
List<ChildBufRowCol> defaultChildRowBufCols = null;
|
|
public void UpdateScoutField(List<ChildBufRowCol> a)
|
|
{
|
|
// 기존 값 Save / Load -> 값 Change -> 변경 값 Save / Load
|
|
SaveAndLoadFieldScanFromLasaDb();
|
|
int selectedNo = toolStripComboBoxPage.SelectedIndex;
|
|
DB.RecipeFieldScan.Instance.UpdateScoutField(a, selectedNo);
|
|
SaveAndLoadFieldScanFromLasaDb();
|
|
}
|
|
public void UpdateDefaultField(List<ChildBufRowCol> childRowBufCols)
|
|
{
|
|
defaultScoutName = DB.Dao.SystemRecipe.ScannerFieldImageFile;
|
|
defaultChildRowBufCols = childRowBufCols;
|
|
}
|
|
public List<ChildBufRowCol> LoadScoutField()
|
|
{
|
|
// [기존 보존 2026-06-19] selectedIndexNo(GUI 캐시) 기반. 하위 호환용으로 남겨둠.
|
|
return DB.RecipeFieldScan.Instance.GetPageFieldScan(
|
|
DB.RecipeFieldScan.Instance.GetAutoPageName(selectedIndexNo));
|
|
}
|
|
// [추가 2026-06-19] 페이지 인덱스를 명시 지정해 스카우트 필드 로드 (시퀀스 PageIndex 주입용)
|
|
public List<ChildBufRowCol> LoadScoutField(int pageIndex)
|
|
{
|
|
return DB.RecipeFieldScan.Instance.GetPageFieldScan(
|
|
DB.RecipeFieldScan.Instance.GetAutoPageName(pageIndex));
|
|
}
|
|
// [추가 2026-06-19] 현재 화면에 표시 중인 페이지 인덱스(라이브). 콤보박스 우선, 없으면 ActiveLayer.No.
|
|
// 로드 키를 stale 캐시(selectedIndexNo) 대신 라이브 값으로 얻기 위함.
|
|
public int GetCurrentPageIndex()
|
|
{
|
|
int idx = toolStripComboBoxPage.SelectedIndex;
|
|
if (idx < 0) {
|
|
var active = ScannerCanvasCtrlTeaching?.Model?.ActiveLayer;
|
|
idx = active != null ? active.No : 0;
|
|
}
|
|
return idx;
|
|
}
|
|
// ═══ [진단계측 2026-08-04] 시작 ═══════════════════════════════════════
|
|
// WeldingCommon(RecipeTrace)이 LASAGUI 를 참조하므로 역방향 호출이 불가능하다.
|
|
// 델리게이트로 우회한다. CommonHelper.SetMainPage 에서 RecipeTrace.Mark 가 꽂힌다.
|
|
// 원복 : 이 블록과 SaveAndLoadFieldScanFromLasaDb 안의 Tracer?.Invoke 블록을 삭제.
|
|
public static Action<string, string> Tracer;
|
|
// ═══ [진단계측 2026-08-04] 끝 ═════════════════════════════════════════
|
|
void SaveAndLoadFieldScanFromLasaDb(string inputStr = null)
|
|
{
|
|
string fullpath = inputStr == null ? DB.Dao.SystemRecipe.WorkRecipeFile : inputStr;
|
|
string newpath = fullpath.Replace(Path.GetFileName(fullpath), "FieldHelper.json");
|
|
// ═══ [진단계측 2026-08-04] 시작 — 원복 시 이 블록 삭제 ═══
|
|
Tracer?.Invoke("PAGE 저장 FieldHelper",
|
|
$"경로={newpath} 기준={(inputStr == null ? "WorkRecipeFile" : "인자지정")}");
|
|
// ═══ [진단계측 2026-08-04] 끝 ═══
|
|
DB.RecipeFieldScan.Instance.SaveFieldHelper(newpath);
|
|
DB.RecipeFieldScan.Instance.LoadFieldHelper(newpath, ScannerCanvasCtrlTeaching.Model.Layers.Count()
|
|
, defaultScoutName, defaultChildRowBufCols);
|
|
}
|
|
// [추가 2026-06-20] 로드 전용. SaveFieldHelper 호출 없음 → 레시피 전환 시 새 레시피 필드를
|
|
// 이전(stale) 싱글톤 데이터로 덮어쓰는 사고를 방지. ReloadRecipe 에서만 사용.
|
|
void LoadFieldScanFromLasaDb(string inputStr = null)
|
|
{
|
|
string fullpath = inputStr == null ? DB.Dao.SystemRecipe.WorkRecipeFile : inputStr;
|
|
string newpath = fullpath.Replace(Path.GetFileName(fullpath), "FieldHelper.json");
|
|
DB.RecipeFieldScan.Instance.LoadFieldHelper(newpath, ScannerCanvasCtrlTeaching.Model.Layers.Count()
|
|
, defaultScoutName, defaultChildRowBufCols);
|
|
}
|
|
|
|
Bitmap canvasTeachingBitmapBuffer1 = null;
|
|
Bitmap canvasTeachingBitmapBuffer2 = null;
|
|
Bitmap canvasAutoBitmapBuffer1 = null;
|
|
Bitmap canvasAutoBitmapBuffer2 = null;
|
|
void ChangeScoutImage()
|
|
{
|
|
Image scoutCanvasDisplayImage = null;
|
|
|
|
string temp = DB.Dao.SystemRecipe.ScannerFieldImageFile;
|
|
string canvasImagePath = DB.RecipeFieldScan.Instance.GetPageImageName(
|
|
DB.RecipeFieldScan.Instance.GetAutoPageName(toolStripComboBoxPage.SelectedIndex)
|
|
, ref temp);
|
|
|
|
if (File.Exists(canvasImagePath)) {
|
|
try {
|
|
scoutCanvasDisplayImage = CompressImageResolution(canvasImagePath, DB.Dao.SystemRecipe.CanvasImageResolutionRatio);
|
|
} catch (FileNotFoundException ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
} else {
|
|
string strDefaultFileName = "D:\\ILSOSConfig\\ILSOS_PrismaticScanner\\_vision\\FieldScanImage\\Default\\DefaultFieldScanImage.Jpeg";
|
|
scoutCanvasDisplayImage = CompressImageResolution(strDefaultFileName, DB.Dao.SystemRecipe.CanvasImageResolutionRatio);
|
|
}
|
|
|
|
if(scoutCanvasDisplayImage != null) {
|
|
if (canvasTeachingBitmapBuffer1 == null) {
|
|
canvasTeachingBitmapBuffer1 = (Bitmap)scoutCanvasDisplayImage.Clone();
|
|
canvasTeachingBitmapBuffer2?.Dispose();
|
|
canvasTeachingBitmapBuffer2 = null;
|
|
} else {
|
|
canvasTeachingBitmapBuffer2 = (Bitmap)scoutCanvasDisplayImage.Clone();
|
|
ScannerCanvasCtrlTeaching.Model.CanvasImage = canvasTeachingBitmapBuffer2;
|
|
canvasTeachingBitmapBuffer1?.Dispose();
|
|
canvasTeachingBitmapBuffer1 = null;
|
|
}
|
|
ScannerCanvasCtrlTeaching.Model.CanvasImage = canvasTeachingBitmapBuffer1 != null ?
|
|
canvasTeachingBitmapBuffer1: canvasTeachingBitmapBuffer2;
|
|
ScannerCanvasCtrlTeaching.Model.CanvasImageEnable = DB.Dao.SystemRecipe.EnableCanvasFieldImage; //시스템 레시피에 캔버스 이미지 DISPLAY ON/OFF값 읽기
|
|
|
|
if (canvasAutoBitmapBuffer1 == null) {
|
|
canvasAutoBitmapBuffer1 = (Bitmap)scoutCanvasDisplayImage.Clone();
|
|
ScannerCanvasCtrlAutoPage.Model.CanvasImage = canvasAutoBitmapBuffer1;
|
|
canvasAutoBitmapBuffer2?.Dispose();
|
|
canvasAutoBitmapBuffer2 = null;
|
|
} else {
|
|
canvasAutoBitmapBuffer2 = (Bitmap)scoutCanvasDisplayImage.Clone();
|
|
ScannerCanvasCtrlAutoPage.Model.CanvasImage = canvasAutoBitmapBuffer2;
|
|
canvasAutoBitmapBuffer1?.Dispose();
|
|
canvasAutoBitmapBuffer1 = null;
|
|
}
|
|
ScannerCanvasCtrlAutoPage.Model.CanvasImage = canvasAutoBitmapBuffer1 != null?
|
|
canvasAutoBitmapBuffer1 : canvasAutoBitmapBuffer2;
|
|
ScannerCanvasCtrlAutoPage.Model.CanvasImageEnable = DB.Dao.SystemRecipe.EnableCanvasFieldImage; //시스템 레시피에 캔버스 이미지 DISPLAY ON/OFF값 읽기
|
|
|
|
scoutCanvasDisplayImage.Dispose();
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
private void picBoxScannerCanvas_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
|
|
}
|
|
#region List View 에서 Draw Object 관리하는 함수 및 변수
|
|
|
|
|
|
#endregion
|
|
#region TREE VIEW에서 노드 관리하는 함수 및 변수
|
|
|
|
private List<string> GetTreeViewStatus()
|
|
{
|
|
List<string> list = new List<string>();
|
|
|
|
for (int i = 0; i < drawObjectsTreeView.Nodes[0].Nodes.Count - 1; i++) {
|
|
if (drawObjectsTreeView.Nodes[0].Nodes[i].IsExpanded) {
|
|
string str = drawObjectsTreeView.Nodes[0].Nodes[i].Text;
|
|
list.Add(str);
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
private void SetTreeViewStatus(List<string> list)
|
|
{
|
|
for (int i = 0; i < drawObjectsTreeView.Nodes[0].Nodes.Count - 1; i++) {
|
|
for (int j = 0; j < list.Count; j++) {
|
|
if (drawObjectsTreeView.Nodes[0].Nodes[i].Text == list[j]) {
|
|
drawObjectsTreeView.Nodes[0].Nodes[i].Expand();
|
|
}
|
|
}
|
|
}
|
|
drawObjectsTreeView.Nodes[0].Expand();
|
|
}
|
|
public void UpdateObjetsInTreeView()
|
|
{
|
|
try {
|
|
drawObjectsTreeView.Nodes.Clear();
|
|
TreeNode rootNode = new TreeNode("Root");
|
|
drawObjectsTreeView.Nodes.Add(rootNode);
|
|
|
|
UpdateSubObjectsInTreeView(ScannerCanvasCtrlTeaching.Objects, rootNode);
|
|
|
|
drawObjectsTreeView.ExpandAll();
|
|
|
|
m_coll.Clear();
|
|
|
|
foreach (IDrawObject drawObj in ScannerCanvasCtrlTeaching.Model.SelectedObjects) {
|
|
string key = string.Format("{0:D3}\t[{1}]", drawObj.No + 1, drawObj.Type);
|
|
|
|
foreach (TreeNode subNode in drawObjectsTreeView.Nodes) {
|
|
TreeNode node = LoopNodesRecursive(subNode, key);
|
|
|
|
if (node != null) {
|
|
m_coll.Add(node);
|
|
}
|
|
}
|
|
}
|
|
|
|
paintSelectedNodes(m_coll);
|
|
|
|
drawObjectPropertyGrid.SelectedObjects =
|
|
ScannerCanvasCtrlTeaching.Model.SelectedObjects?.Count > 0
|
|
? ScannerCanvasCtrlTeaching.Model.SelectedObjects.ToArray()
|
|
: null;
|
|
|
|
drawObjectPropertyGrid.Refresh();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
|
|
private void UpdateSubObjectsInTreeView(List<IDrawObject> objects, TreeNode parentNode)
|
|
{
|
|
foreach (IDrawObject obj in objects) {
|
|
TreeNode node = new TreeNode(string.Format("{0:D3}\t[{1}]", obj.No + 1, obj.Type));
|
|
parentNode.Nodes.Add(node);
|
|
|
|
if (obj is Group) {
|
|
UpdateSubObjectsInTreeView(((Group)obj).SubObjects, node);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawObjectPropertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
|
|
{
|
|
try {
|
|
PropertyGrid grid = (PropertyGrid)s;
|
|
|
|
switch (e.ChangedItem.Label) {
|
|
case "용접 조건 변수":
|
|
break;
|
|
case "용접 조건 ID": {
|
|
int index = Convert.ToInt16(e.ChangedItem.Value) - 1;
|
|
ScannerParam param = ScannerCanvasUserCtrl.ScannerParams[index];
|
|
ScannerCanvasCtrlTeaching.Canvas.CanvasWrapper.UpdateObjectsColor(param.Color, index);
|
|
break;
|
|
}
|
|
|
|
case "Parameter ID": {
|
|
int index = Convert.ToInt16(e.ChangedItem.Value) - 1;
|
|
ScannerParam param = ScannerCanvasUserCtrl.ScannerParams[index];
|
|
ScannerCanvasCtrlTeaching.Canvas.CanvasWrapper.UpdateObjectsColor(param.Color, index);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
|
|
|
|
drawObjectPropertyGrid.Refresh();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 2-1.티칭화면에 View 메뉴
|
|
private void scaleToFitToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandScaleToFit();
|
|
}
|
|
private void zoomInToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandZoomIn();
|
|
}
|
|
private void zoomOutToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandZoomOut();
|
|
}
|
|
private void panToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandPan();
|
|
}
|
|
private void centerToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandCenter();
|
|
}
|
|
private void userLogOnToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
private void scannerOperationToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
private void scoutToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
private void scannerCameraLiveToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 2-2.티칭화면에서 편집 메뉴 기능
|
|
private void groupToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandGroup();
|
|
}
|
|
private void unGroupToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
try {
|
|
if (drawObjectsTreeView.SelectedNode != null && drawObjectsTreeView.SelectedNode.Parent.Text != "Root") {
|
|
MessageDlg.messageDlg.RunDlg("그룹 객체의 ungroup 작업은 최상위 수준에서만 가능합니다.!!!", true);
|
|
return;
|
|
}
|
|
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandUngroup();
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDeselectAll();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
private void selectToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandEscape();
|
|
}
|
|
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectAll();
|
|
}
|
|
private void deselectAllToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDeselectAll();
|
|
}
|
|
private void moveToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandMove();
|
|
}
|
|
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandCopy();
|
|
}
|
|
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDeleteSelected();
|
|
}
|
|
private void arrayCopyToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
try {
|
|
ArrayCopyDialog dlg = new ArrayCopyDialog();
|
|
dlg.Run(ScannerCanvasCtrlTeaching.Canvas);
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
private void undoToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDoUndo();
|
|
}
|
|
private void redoToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDoRedo();
|
|
}
|
|
#endregion
|
|
|
|
#region 2-3.티칭화면에서 도구 메뉴 기능
|
|
private void lineToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Line");
|
|
}
|
|
private void dotToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Dot");
|
|
}
|
|
|
|
private void polylineToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("PolyLine");
|
|
}
|
|
|
|
private void splineToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Spline");
|
|
}
|
|
|
|
private void ellipseToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Ellipse");
|
|
}
|
|
|
|
private void rectangleToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Rectangle");
|
|
}
|
|
|
|
private void snowManToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("SnowMan");
|
|
}
|
|
private void Arc3P123ToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Arc3P123");
|
|
}
|
|
|
|
private void Arc3P132ToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Arc3P132");
|
|
}
|
|
|
|
private void ArcCRToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("ArcCR");
|
|
}
|
|
|
|
private void Arc2PToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("Arc2P");
|
|
}
|
|
private void zigZagToolStripButton_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSelectDrawTool("ZigZag");
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region 2-4.티칭 화면에 Layer 메뉴
|
|
private void newPageToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Model.CreateLayer();
|
|
UpdateLayersInfo();
|
|
}
|
|
private void deletePageToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
try {
|
|
int index = toolStripComboBoxPage.SelectedIndex;
|
|
if (MessageDlg.messageDlg.RunDlg(string.Format("현재 선택된 {0}를 삭제하시겠습니까?", toolStripComboBoxPage.Text), false, CoreUnit.Control.Dialog.MessageDlg.DialogMode.MODAL) == DialogResult.Yes) {
|
|
ScannerCanvasCtrlTeaching.Model.DeleteLayer(index);
|
|
DB.RecipeFieldScan.Instance.DeleteFieldScanData(
|
|
DB.RecipeFieldScan.Instance.GetAutoPageName(index));
|
|
UpdateLayersInfo();
|
|
}
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
private void copyPageToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
try {
|
|
ScannerCanvasCtrlTeaching.Model.CopyLayer(toolStripComboBoxPage.SelectedIndex);
|
|
UpdateLayersInfo();
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 2-5.티칭화면에서 Setup 메뉴 항목
|
|
|
|
|
|
private void paramtersToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
int paramId = ScannerCanvasCtrlTeaching.Model.SelectedObjects.Count == 0 ? 1 : ScannerCanvasCtrlTeaching.Model.SelectedObjects[0].ScannerParamID;
|
|
|
|
WeldingParamDlg weldingParamDlg = new WeldingParamDlg(paramId, true);
|
|
DialogResult result = weldingParamDlg.ShowDialog();
|
|
if (result == DialogResult.OK) {
|
|
UpdateObjetsInTreeView();
|
|
UpdateWeldingLinesRecipe();
|
|
}
|
|
|
|
}
|
|
|
|
private void toolStripButtonParameterAutoPage_Click(object sender, EventArgs e)
|
|
{
|
|
int paramId = ScannerCanvasCtrlTeaching.Model.SelectedObjects.Count == 0 ? 1 : ScannerCanvasCtrlTeaching.Model.SelectedObjects[0].ScannerParamID;
|
|
|
|
WeldingParamDlg weldingParamDlg = new WeldingParamDlg(paramId, false);
|
|
|
|
if (weldingParamDlg.ShowDialog() == DialogResult.OK) {
|
|
UpdateObjetsInTreeView();
|
|
UpdateWeldingLinesRecipe();
|
|
}
|
|
}
|
|
|
|
private void systemParameterToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
private void scannerParameterToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void PlcInterfaceMapToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
//#if _NO_USE_PLC
|
|
//#else
|
|
// if (RscPlc.InitializeState)
|
|
// {
|
|
// TblDialog["PlcInterfaceMap"].Show();
|
|
// }
|
|
//#endif
|
|
}
|
|
|
|
private void userAccountToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
TblDialog["UserAccount"].Show();
|
|
}
|
|
#endregion
|
|
|
|
#region 2-7.기타
|
|
//1: Layer 선택하는 콤보 박스 기능
|
|
private void cbPageList_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
//1.ActiveLayer 변경
|
|
ComboBox box = (ComboBox)sender;
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandChangeLayer(box.SelectedIndex);
|
|
|
|
//2.Tree/PropertyGrid값 변경
|
|
UpdateObjetsInTreeView();
|
|
}
|
|
|
|
private void toolStripButtonSelection_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region TreeNode에서 마우스로 클릭한 후 각 노드값을 변경
|
|
private void drawObjectsTreeView_DragOver(object sender, DragEventArgs e)
|
|
{
|
|
// Get the tree.
|
|
TreeView tree = (TreeView)sender;
|
|
|
|
// Drag and drop denied by default.
|
|
e.Effect = DragDropEffects.None;
|
|
|
|
// Is it a valid format?
|
|
if (e.Data.GetData(typeof(TreeNode)) != null) {
|
|
// Get the screen point.
|
|
Point pt = new Point(e.X, e.Y);
|
|
|
|
// Convert to a point in the TreeView's coordinate system.
|
|
pt = tree.PointToClient(pt);
|
|
|
|
// Is the mouse over a valid node?
|
|
TreeNode node = tree.GetNodeAt(pt);
|
|
if (node != null) {
|
|
e.Effect = DragDropEffects.Copy;
|
|
tree.SelectedNode = node;
|
|
}
|
|
}
|
|
}
|
|
private void drawObjectsTreeView_DragDrop(object sender, DragEventArgs e)
|
|
{
|
|
TreeView tree = (TreeView)sender;
|
|
|
|
tree.BeginUpdate();
|
|
|
|
try {
|
|
// Get the screen point.
|
|
Point pt = new Point(e.X, e.Y);
|
|
|
|
// Convert to a point in the TreeView's coordinate system.
|
|
pt = tree.PointToClient(pt);
|
|
|
|
// Get the node underneath the mouse.
|
|
TreeNode targetNode = tree.GetNodeAt(pt);
|
|
TreeNode moveNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
|
|
|
|
if ((targetNode != null) && (moveNode != null)) {
|
|
if ((targetNode.Parent != null) && (targetNode.Level == moveNode.Level) && (targetNode.Text != moveNode.Text)) {
|
|
// Remoce this node
|
|
tree.Nodes.Remove(moveNode);
|
|
|
|
// Add the node to the new parent
|
|
targetNode.Parent.Nodes.Insert(targetNode.Index, moveNode);
|
|
targetNode.Expand();
|
|
|
|
ChangeLevelForDrawObjects(targetNode, moveNode);
|
|
}
|
|
}
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
UpdateObjetsInTreeView();
|
|
} finally {
|
|
tree.EndUpdate();
|
|
}
|
|
}
|
|
private void drawObjectsTreeView_ItemDrag(object sender, ItemDragEventArgs e)
|
|
{
|
|
TreeView tree = (TreeView)sender;
|
|
|
|
// Get the node underneath the mouse.
|
|
TreeNode node = (TreeNode)e.Item;// tree.GetNodeAt(e.X, e.Y);
|
|
|
|
// Start the drag-and-drop operation with a cloned copy of the node.
|
|
if (node != null) {
|
|
tree.DoDragDrop(node, DragDropEffects.Copy);
|
|
}
|
|
}
|
|
|
|
private void ChangeLevelForDrawObjects(TreeNode targetNode, TreeNode originalNode)
|
|
{
|
|
// Drawing object 순서가 바뀌면 No 를 재정렬해주는 함수
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDeselectAll();
|
|
|
|
if (targetNode.Level == originalNode.Level) //group에 포함된 객체
|
|
{
|
|
List<IDrawObject> objects = null;
|
|
|
|
if (originalNode.Parent.Level == 0) //Root 최상위단위
|
|
{
|
|
objects = ScannerCanvasCtrlTeaching.Objects;
|
|
} else {
|
|
IDrawObject parentObj = GetDrawObjectForNode(originalNode.Parent);
|
|
objects = ((Group)parentObj).SubObjects;
|
|
}
|
|
|
|
IDrawObject originalObj = objects[GetDrawObjectIDForNode(originalNode)];
|
|
IDrawObject targetObj = originalObj.Clone();
|
|
|
|
objects.RemoveAt(GetDrawObjectIDForNode(originalNode));
|
|
objects.Insert(GetDrawObjectIDForNode(targetNode), targetObj);
|
|
|
|
int index = 0;
|
|
foreach (IDrawObject obj in objects) {
|
|
obj.No = index;
|
|
index++;
|
|
}
|
|
}
|
|
|
|
UpdateObjetsInTreeView();
|
|
}
|
|
|
|
private void ChangeOrderForDrawObjectsNo()
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDeselectAll();
|
|
foreach (ICanvasLayer layer in ScannerCanvasCtrlTeaching.Model.Layers) {
|
|
ChangeOrderForDrawObjectsNo(layer.Objects);
|
|
}
|
|
//ChangeOrderForDrawObjectsNo(ScannerCanvasCtrlTeaching.Objects);
|
|
UpdateObjetsInTreeView();
|
|
}
|
|
|
|
private void ChangeOrderForDrawObjectsNo(List<IDrawObject> lsDrawObject)
|
|
{
|
|
// Drawing object No로 순서를 재정렬해주는 함수. 정렬방향은 고정.
|
|
// Group 은 Recursive 로 처리.
|
|
lsDrawObject.Sort((item1, item2) =>
|
|
item1.No.CompareTo(item2.No));
|
|
|
|
foreach (IDrawObject obj in lsDrawObject) {
|
|
if (obj is Group) {
|
|
Group groupobj = (Group)obj;
|
|
ChangeOrderForDrawObjectsNo(groupobj.SubObjects);
|
|
}
|
|
}
|
|
}
|
|
|
|
private List<IDrawObject> copies = new List<IDrawObject>();
|
|
private double iterationOffsetValue = 0;
|
|
private void drawObjectsTreeView_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
e.Handled = true;
|
|
double offsetValue = 0;
|
|
if (e.KeyCode == Keys.Delete) {
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDeleteSelected();
|
|
} else if (e.KeyCode == Keys.Up) {
|
|
//선택된 객체를 지정된 위치값 만큼 상승
|
|
offsetValue = double.Parse(toolStripTextBoxMoveOffset.Text);
|
|
ScannerCanvasCtrlTeaching.Model.MoveObjects(new UnitPoint(0, offsetValue), ScannerCanvasCtrlTeaching.Model.SelectedObjects, true);
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
} else if (e.KeyCode == Keys.Down) {
|
|
//선택된 객체를 지정된 위치값 만큼 하강
|
|
offsetValue = double.Parse(toolStripTextBoxMoveOffset.Text);
|
|
ScannerCanvasCtrlTeaching.Model.MoveObjects(new UnitPoint(0, -1 * offsetValue), ScannerCanvasCtrlTeaching.Model.SelectedObjects, true);
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
} else if (e.KeyCode == Keys.Right) {
|
|
//선택된 객체를 지정된 위치값 만큼 오른쪽 이동
|
|
offsetValue = double.Parse(toolStripTextBoxMoveOffset.Text);
|
|
ScannerCanvasCtrlTeaching.Model.MoveObjects(new UnitPoint(offsetValue, 0), ScannerCanvasCtrlTeaching.Model.SelectedObjects, true);
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
} else if (e.KeyCode == Keys.Left) {
|
|
//선택된 객체를 지정된 위치값 만큼 왼쪽 이동
|
|
offsetValue = double.Parse(toolStripTextBoxMoveOffset.Text);
|
|
ScannerCanvasCtrlTeaching.Model.MoveObjects(new UnitPoint(-1 * offsetValue, 0), ScannerCanvasCtrlTeaching.Model.SelectedObjects, true);
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
}
|
|
|
|
if ((System.Windows.Forms.Control.ModifierKeys & Keys.Control) == Keys.Control) {
|
|
if (e.KeyCode == Keys.C) {
|
|
copies = new List<IDrawObject>();
|
|
foreach (IDrawObject obj in ScannerCanvasCtrlTeaching.Model.SelectedObjects) {
|
|
copies.Add(obj.Clone());
|
|
}
|
|
iterationOffsetValue = 0;
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
} else if (e.KeyCode == Keys.V) {
|
|
if (copies.Count != 0) {
|
|
offsetValue = 3;
|
|
ScannerCanvasCtrlTeaching.Model.CopyObjects(new UnitPoint(iterationOffsetValue + offsetValue, iterationOffsetValue + offsetValue), copies);
|
|
iterationOffsetValue = iterationOffsetValue + offsetValue;
|
|
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
private void drawObjectsTreeView_KeyPress(object sender, KeyPressEventArgs e)
|
|
{
|
|
// 250331
|
|
// Treeview 선택된 상태에서 키보드 누를 경우 해당 부분으로 들어오게 구현되어있음.
|
|
double offsetValue = 90;
|
|
|
|
if (e.KeyChar == 'e' || e.KeyChar == 'E' || e.KeyChar == 'ㄷ') {
|
|
ScannerCanvasCtrlTeaching.Model.RotateObjects((float)offsetValue, ScannerCanvasCtrlTeaching.Model.SelectedObjects, true);
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true); ;
|
|
} else if (e.KeyChar == 'q' || e.KeyChar == 'Q' || e.KeyChar == 'ㅂ') {
|
|
ScannerCanvasCtrlTeaching.Model.RotateObjects(-1 * (float)offsetValue, ScannerCanvasCtrlTeaching.Model.SelectedObjects, true);
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true); ;
|
|
}
|
|
|
|
}
|
|
|
|
private int GetDrawObjectIDForNode(TreeNode node)
|
|
{
|
|
return Convert.ToInt16(node.Text.Split('\t')[0]) - 1;
|
|
}
|
|
|
|
#region TreeView에서 다중 노드 선택 기능
|
|
protected ArrayList m_coll = new ArrayList();
|
|
protected TreeNode m_lastNode, m_firstNode;
|
|
protected ArrayList m_coll_ = new ArrayList();
|
|
private void drawObjectsTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e)
|
|
{
|
|
try {
|
|
bool bControl = (ModifierKeys == Keys.Control);
|
|
bool bShift = (ModifierKeys == Keys.Shift);
|
|
|
|
// selecting twice the node while pressing CTRL ?
|
|
if (bControl && m_coll.Contains(e.Node)) {
|
|
// unselect it (let framework know we don't want selection this time)
|
|
e.Cancel = true;
|
|
|
|
// update nodes
|
|
removePaintFromNodes(m_coll);
|
|
m_coll.Remove(e.Node);
|
|
paintSelectedNodes(m_coll);
|
|
return;
|
|
}
|
|
|
|
if ((bControl || bShift) && (m_lastNode.Level != e.Node.Level)) //같은 레벨에서의 노드들만 다중선택이 가능함
|
|
{
|
|
e.Cancel = true;
|
|
return;
|
|
}
|
|
|
|
m_lastNode = e.Node;
|
|
|
|
if (!bShift) m_firstNode = e.Node; // store begin of shift sequence
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
private void drawObjectsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
|
|
{
|
|
try {
|
|
bool bControl = (ModifierKeys == Keys.Control);
|
|
bool bShift = (ModifierKeys == Keys.Shift);
|
|
|
|
if (bControl) {
|
|
if (!m_coll.Contains(e.Node)) // new node ?
|
|
{
|
|
m_coll.Add(e.Node);
|
|
} else // not new, remove it from the collection
|
|
{
|
|
removePaintFromNodes(m_coll);
|
|
m_coll.Remove(e.Node);
|
|
}
|
|
|
|
paintSelectedNodes(m_coll);
|
|
} else {
|
|
// SHIFT is pressed
|
|
if (bShift) {
|
|
Queue myQueue = new Queue();
|
|
|
|
TreeNode uppernode = m_firstNode;
|
|
TreeNode bottomnode = e.Node;
|
|
// case 1 : begin and end nodes are parent
|
|
bool bParent = isParent(m_firstNode, e.Node); // is m_firstNode parent (direct or not) of e.Node
|
|
if (!bParent) {
|
|
bParent = isParent(bottomnode, uppernode);
|
|
if (bParent) // swap nodes
|
|
{
|
|
TreeNode t = uppernode;
|
|
uppernode = bottomnode;
|
|
bottomnode = t;
|
|
}
|
|
}
|
|
if (bParent) {
|
|
TreeNode n = bottomnode;
|
|
while (n != uppernode.Parent) {
|
|
if (!m_coll.Contains(n)) // new node ?
|
|
myQueue.Enqueue(n);
|
|
|
|
n = n.Parent;
|
|
}
|
|
}
|
|
// case 2 : nor the begin nor the end node are descendant one another
|
|
else {
|
|
if ((uppernode.Parent == null && bottomnode.Parent == null) || (uppernode.Parent != null && uppernode.Parent.Nodes.Contains(bottomnode))) // are they siblings ?
|
|
{
|
|
int nIndexUpper = uppernode.Index;
|
|
int nIndexBottom = bottomnode.Index;
|
|
if (nIndexBottom < nIndexUpper) // reversed?
|
|
{
|
|
TreeNode t = uppernode;
|
|
uppernode = bottomnode;
|
|
bottomnode = t;
|
|
nIndexUpper = uppernode.Index;
|
|
nIndexBottom = bottomnode.Index;
|
|
}
|
|
|
|
TreeNode n = uppernode;
|
|
while (nIndexUpper <= nIndexBottom) {
|
|
if (!m_coll.Contains(n)) // new node ?
|
|
myQueue.Enqueue(n);
|
|
|
|
n = n.NextNode;
|
|
|
|
nIndexUpper++;
|
|
} // end while
|
|
|
|
} else {
|
|
if (!m_coll.Contains(uppernode)) myQueue.Enqueue(uppernode);
|
|
if (!m_coll.Contains(bottomnode)) myQueue.Enqueue(bottomnode);
|
|
}
|
|
}
|
|
|
|
m_coll.AddRange(myQueue);
|
|
|
|
paintSelectedNodes(m_coll);
|
|
m_firstNode = e.Node; // let us chain several SHIFTs if we like it
|
|
|
|
} // end if m_bShift
|
|
else {
|
|
// in the case of a simple click, just add this item
|
|
if (m_coll != null && m_coll.Count > 0) {
|
|
removePaintFromNodes(m_coll);
|
|
m_coll.Clear();
|
|
}
|
|
|
|
m_coll.Add(e.Node);
|
|
}
|
|
}
|
|
|
|
SelectDrawObjects(m_coll);
|
|
} catch (Exception ex) {
|
|
UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message);
|
|
}
|
|
}
|
|
private void SelectDrawObjects(ArrayList selectedNodes)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandDeselectAll();
|
|
|
|
foreach (TreeNode node in selectedNodes) {
|
|
if (node != null && node.Level != 0)//root node
|
|
{
|
|
IDrawObject obj = GetDrawObjectForNode(node);
|
|
ScannerCanvasCtrlTeaching.Model.AddSelectedObject(obj);
|
|
}
|
|
}
|
|
drawObjectPropertyGrid.SelectedObjects =
|
|
ScannerCanvasCtrlTeaching.Model.SelectedObjects?.Count > 0
|
|
? ScannerCanvasCtrlTeaching.Model.SelectedObjects.ToArray()
|
|
: null;
|
|
|
|
}
|
|
protected bool isParent(TreeNode parentNode, TreeNode childNode)
|
|
{
|
|
if (parentNode == childNode)
|
|
return true;
|
|
|
|
TreeNode n = childNode;
|
|
bool bFound = false;
|
|
while (!bFound && n != null) {
|
|
n = n.Parent;
|
|
bFound = (n == parentNode);
|
|
}
|
|
return bFound;
|
|
}
|
|
protected void paintSelectedNodes(ArrayList coll)
|
|
{
|
|
foreach (TreeNode n in coll) {
|
|
n.BackColor = SystemColors.Highlight;
|
|
n.ForeColor = SystemColors.HighlightText;
|
|
}
|
|
}
|
|
protected void removePaintFromNodes(ArrayList coll)
|
|
{
|
|
if (coll.Count == 0) return;
|
|
|
|
TreeNode n0 = (TreeNode)coll[0];
|
|
Color back = n0.TreeView.BackColor;
|
|
Color fore = n0.TreeView.ForeColor;
|
|
|
|
foreach (TreeNode n in coll) {
|
|
n.BackColor = back;
|
|
n.ForeColor = fore;
|
|
}
|
|
|
|
}
|
|
|
|
private IDrawObject GetDrawObjectForNode(TreeNode node)
|
|
{
|
|
IDrawObject obj = null;
|
|
|
|
List<int> nodeLevels = new List<int>();
|
|
nodeLevels.Add(Convert.ToInt16(node.Text.Split('\t')[0]) - 1);
|
|
|
|
TreeNode parentNode = node.Parent;
|
|
|
|
while (parentNode.Level != 0) // 0이면 root 임.
|
|
{
|
|
nodeLevels.Insert(0, Convert.ToInt16(parentNode.Text.Split('\t')[0]) - 1);
|
|
parentNode = parentNode.Parent;
|
|
}
|
|
|
|
obj = ScannerCanvasCtrlTeaching.Objects[Convert.ToInt16(nodeLevels[0])];
|
|
|
|
for (int i = 1; i < nodeLevels.Count; i++) {
|
|
int index = Convert.ToInt16(nodeLevels[i]);
|
|
|
|
if (obj is Group) {
|
|
obj = ((Group)obj).SubObjects[index];
|
|
} else {
|
|
throw new Exception("ERR_MAIN_PAGE_NOT_SELECT_GROUP_TYPE_OBJECT");
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
#endregion
|
|
|
|
#endregion
|
|
// [추가 2026-06-20] 레시피 전환(ReloadRecipe) 중 콤보박스 SelectedIndexChanged가
|
|
// SaveAndLoadFieldScanFromLasaDb()로 stale 데이터를 새 레시피 FieldHelper.json에
|
|
// 덮어쓰는 것을 차단하기 위한 가드. 평상시 페이지 전환에는 영향 없음.
|
|
private bool _suppressPageFieldSync = false;
|
|
int selectedIndexNo = 0;
|
|
private void toolStripComboBoxPage_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
//1.ActiveLayer 변경
|
|
ToolStripComboBox box = (ToolStripComboBox)sender;
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandChangeLayer(box.SelectedIndex);
|
|
|
|
// 1.1. 바뀔 떄마다 스카우트 관련 파라미터 저장 및 변경
|
|
// [변경 2026-06-20] 레시피 전환 중에는 stale 저장 방지 위해 스킵 (기존 호출은 보존)
|
|
if (!_suppressPageFieldSync)
|
|
SaveAndLoadFieldScanFromLasaDb();
|
|
|
|
// 1.2. 너무 많은 시간이 소비되므로, 달라질 경우에만 ChangeScoutImage()
|
|
if(selectedIndexNo != box.SelectedIndex) ChangeScoutImage();
|
|
|
|
// 1.3. selectedIndex 값 저장
|
|
selectedIndexNo = box.SelectedIndex;
|
|
|
|
//2.Tree/PropertyGrid값 변경
|
|
UpdateObjetsInTreeView();
|
|
}
|
|
|
|
private void canvasParamToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
CanvasCtrlDialog CanvasCtrlDialog = new CanvasCtrlDialog(ScannerCanvasCtrlTeaching.Canvas);
|
|
CanvasCtrlDialog.Show();
|
|
}
|
|
|
|
Image CompressImageBuffer1 = null;
|
|
Image CompressImageBuffer2 = null;
|
|
public Image CompressImageResolution(string imageFileNames, double compressRatio)
|
|
{
|
|
// 파일 존재 여부 확인
|
|
if (!File.Exists(imageFileNames)) {
|
|
throw new FileNotFoundException("이미지 파일 경로에 이미지 파일을 찾을 수 없습니다.", imageFileNames);
|
|
}
|
|
|
|
double ratio = 0;
|
|
if (compressRatio > 1) {
|
|
ratio = 1;
|
|
} else if (compressRatio < 0.1) {
|
|
ratio = 0.1;
|
|
} else {
|
|
ratio = compressRatio;
|
|
}
|
|
Image image = Image.FromFile(imageFileNames);
|
|
|
|
Size newSize = new Size((int)(image.Width * ratio), (int)(image.Height * ratio));
|
|
|
|
if(CompressImageBuffer1 == null) {
|
|
CompressImageBuffer2 = new Bitmap(image, newSize);
|
|
CompressImageBuffer1?.Dispose();
|
|
CompressImageBuffer1 = null;
|
|
} else {
|
|
CompressImageBuffer1 = new Bitmap(image, newSize);
|
|
CompressImageBuffer2?.Dispose();
|
|
CompressImageBuffer2 = null;
|
|
}
|
|
image.Dispose();
|
|
return CompressImageBuffer1 != null ? CompressImageBuffer1 : CompressImageBuffer2;
|
|
}
|
|
public Image CompressImageResolution(Bitmap imageBitmap, double compressRatio)
|
|
{
|
|
double ratio = 0;
|
|
if (compressRatio > 1) {
|
|
ratio = 1;
|
|
} else if (compressRatio < 0.1) {
|
|
ratio = 0.1;
|
|
} else {
|
|
ratio = compressRatio;
|
|
}
|
|
Image image = new Bitmap(imageBitmap);
|
|
|
|
|
|
Size newSize = new Size((int)(image.Width * ratio), (int)(image.Height * ratio));
|
|
|
|
return new Bitmap(image, newSize);
|
|
}
|
|
private void toolStripTextBoxMoveOffset_Leave(object sender, EventArgs e)
|
|
{
|
|
double offset = 0;
|
|
if (!double.TryParse(toolStripTextBoxMoveOffset.Text, out offset)) {
|
|
toolStripTextBoxMoveOffset.Text = 0.ToString();
|
|
}
|
|
}
|
|
|
|
private void toolStripButtonSnapMode_Click(object sender, EventArgs e)
|
|
{
|
|
ScannerCanvasCtrlTeaching.Canvas.RunningSnapsModeChange();
|
|
}
|
|
|
|
public void DxfParser(string fileName)
|
|
{
|
|
//1. DXF 파일 읽기
|
|
var dxfFile = DxfFile.Load(fileName);
|
|
|
|
//2-1. 오브젝트 목록 가져오기
|
|
var objectEntity = dxfFile.Entities.GetEntity();
|
|
|
|
//2-2. 캔버스에 오브젝트 추가하기
|
|
var resultAddedObjects = objectEntity.AddObjects(ScannerCanvasCtrlTeaching);
|
|
|
|
//3-1. 블록 목록 가져오기
|
|
var blockEntities = dxfFile.Blocks
|
|
.Where(block => !block.Name.Contains("*D6")) // 가이드 블록 필터
|
|
.Where(block => !block.Name.Contains("GENAXEH")) // 임시로 블록 필터
|
|
.Where(block => !block.Name.Contains("space")) // 임시로 블록 필터
|
|
.SelectMany(block => block.Entities.GetEntity());
|
|
|
|
//3-2. 'Insert'가 포함된 리스트
|
|
var insertEntities = blockEntities
|
|
.Where(param => param.ObjectType.Contains("Insert"));
|
|
|
|
//3-3. 'Insert'가 포함되지 않는 리스트
|
|
var nonInsertEntities = blockEntities
|
|
.Where(param => !param.ObjectType.Contains("Insert"));
|
|
|
|
//3-4. 오브젝트 목록들의 전체 영역 가져오기
|
|
var rect = resultAddedObjects.GetRect();
|
|
|
|
//3-5. 'Insert' 시작점 기준으로 'Non Insert' 을 새로 구성함
|
|
var candidate = insertEntities
|
|
.SelectMany(insert => nonInsertEntities
|
|
.Select(nonInsert => insert.GetCandidate(nonInsert, rect)));
|
|
|
|
//3-6. 캔버스에 오브젝트 추가하기
|
|
candidate.AddObjects(ScannerCanvasCtrlTeaching);
|
|
|
|
//4. 캔버스 옆에 있는 트리 뷰를 업데이트 하기
|
|
UpdateObjetsInTreeView();
|
|
|
|
//5-1. objects 들의 위치로 이동하기
|
|
ScannerCanvasCtrlTeaching.Canvas.CommandSetCenter(new UnitPoint(rect.X, rect.Y));
|
|
|
|
//5-2. 캔버스 업데이트하기
|
|
ScannerCanvasCtrlTeaching.Canvas.DoInvalidate(true);
|
|
}
|
|
}
|
|
}
|