to3796zw 4a655ecefb fix: ScoutNormal 페이지별 필드 로드 정정 (PageIndex 주입)
증상: 운전화면 페이지 이동 후에도 SeqScoutNormal이 이전 페이지(보통 0)의
스카우트 필드로 동작.
원인: LoadScoutField()가 GUI 캐시 selectedIndexNo 의존 — WinForms 티칭
콤보에서만 갱신되어 운전화면/자동운전 경로에선 stale.

- SeqScoutNormal_InitParam에 PageIndex 추가, 실행 시점 라이브 페이지
  (GetCurrentPageIndex)를 호출부(Recipe/Test VM)에서 명시 주입
- MainPage: LoadScoutField(int) 오버로드 + GetCurrentPageIndex() 추가
- 폴백: 페이지 없으면 selectedIndexNo 로드, 그래도 null이면 빈 리스트(NRE 방지)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 17:44:35 +09:00

1534 lines
63 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;
UpdateWeldingLinesRecipe();
//// Page 불러온 후, 실행되지 않아도 됨. 왜냐하면, 어차피 SelectedIndex 쪽으로 빠짐.
//SaveAndLoadFieldScanFromLasaDb();
//ChangeScoutImage();
}
#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;
}
void SaveAndLoadFieldScanFromLasaDb(string inputStr = null)
{
string fullpath = inputStr == null ? DB.Dao.SystemRecipe.WorkRecipeFile : inputStr;
string newpath = fullpath.Replace(Path.GetFileName(fullpath), "FieldHelper.json");
DB.RecipeFieldScan.Instance.SaveFieldHelper(newpath);
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
int selectedIndexNo = 0;
private void toolStripComboBoxPage_SelectedIndexChanged(object sender, EventArgs e)
{
//1.ActiveLayer 변경
ToolStripComboBox box = (ToolStripComboBox)sender;
ScannerCanvasCtrlTeaching.Canvas.CommandChangeLayer(box.SelectedIndex);
// 1.1. 바뀔 떄마다 스카우트 관련 파라미터 저장 및 변경
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);
}
}
}