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(); 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 m_tblPages; public Dictionary TblPages { get { return m_tblPages; } set { m_tblPages = value; } } Dictionary m_tblDialog; public Dictionary 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 objects) { try { UpdateObjetsInTreeView(); } catch (Exception ex) { UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message); } } public void EventHandlerDeleteObjects(List objects) { try { UpdateObjetsInTreeView(); } catch (Exception ex) { UtilUnit.logUnit.SetLog(LogUnit.eLogType.ALARM, MethodBase.GetCurrentMethod().Name, ex.Message); } } public void EventHandlerMoveObjects(List originalObjects, List newObjects) { drawObjectPropertyGrid.Refresh(); } public void EventHandlerMoveNodes(List nodes) { drawObjectPropertyGrid.Refresh(); } private void EventHandlerSelectObjects(List 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 defaultChildRowBufCols = null; public void UpdateScoutField(List a) { // 기존 값 Save / Load -> 값 Change -> 변경 값 Save / Load SaveAndLoadFieldScanFromLasaDb(); int selectedNo = toolStripComboBoxPage.SelectedIndex; DB.RecipeFieldScan.Instance.UpdateScoutField(a, selectedNo); SaveAndLoadFieldScanFromLasaDb(); } public void UpdateDefaultField(List childRowBufCols) { defaultScoutName = DB.Dao.SystemRecipe.ScannerFieldImageFile; defaultChildRowBufCols = childRowBufCols; } public List LoadScoutField() { return DB.RecipeFieldScan.Instance.GetPageFieldScan( DB.RecipeFieldScan.Instance.GetAutoPageName(selectedIndexNo)); } 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 GetTreeViewStatus() { List list = new List(); 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 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 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 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 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 copies = new List(); 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(); 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 nodeLevels = new List(); 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); } } }