/// <summary> /// 형상 입력때나 수정때 형상을 다시 그린다 /// - 수정 부품만 빼고 타 부품들은 다시 그리고, 수정 부품은 창에 기록된 값을 그린다. /// </summary> /// <param name="pointControl">좌표점 PointControl</param> /// <param name="bRedraw">형상 수정이 없어도 강제로 ARC 변경때 강제로 수정함</param> internal void drawTemporaryFace(CPointControl pointControl, bool bRedraw = false) { try { /// [문제] /// - Form 에서는 Parent를 사용할 수 없어 Owner 속성을 사용하지만 /// 종종 Owner 가 null 로 넘어오는 문제가 발생한다. /// [해결] /// - PopupShape 창을 생성하기 전에 Owner 속성을 FormMain 으로 초기화 해 두어야 /// 확실하게 FormMain 을 얻을 수 있다. FormMain formMain = ((FormMain)this.Owner); if (formMain == null) { CNotice.printTraceID("CNGM"); return; } CScriptFEMM femm = formMain.m_femm; CNode nodeParts = formMain.m_design.getNode(m_strPartName); /// 0. 해당 좌표점의 수정이 있었는지를 판단한다. /// - 수정이 있는 경우만 다시 그리기 위해서이다. bool retCheck = false; /// 초기 생성때는 이전 nodeParts 가 없음으로 사용하지 않고, 기존 노드의 수정때만 사용한다. if (nodeParts != null) { /// 좌표 Control 에 빈칸이 존재하는 지를 확인함 for (int i = 0; i < ListPointControl.Count; i++) { /// 해당 좌표점만 비교한다. /// 만약, Parts 의 모든 좌표점을 비교하면 다른 좌표점이 수정되었을때 나머지 좌표점의 수정이 없어도 다시 그리기가 된다. if (ListPointControl[i] == pointControl) { if (((CParts)nodeParts).Face.RelativePointList[i].m_dX != Double.Parse(ListPointControl[i].StrCoordX.Trim())) { retCheck = true; } if (((CParts)nodeParts).Face.RelativePointList[i].m_dY != Double.Parse(ListPointControl[i].StrCoordY.Trim())) { retCheck = true; } } } } // Arc 관련 이벤트 호출이면 강제로 다시그리기를 한다. if (bRedraw == true) { retCheck = true; } if (retCheck == true) { femm.deleteAll(); /// 1. 혹시 수정중이라면, 현재 작업 중인 Face 를 제외하고 형상 그리기 foreach (CNode node in formMain.m_design.NodeList) { if (node.GetType().BaseType.Name == "CParts") { if (node.NodeName != m_strPartName) { ((CParts)node).Face.drawFace(femm); } } } } /// 2. 현재 수정중이거나 생성중인 Face 의 형상 그리기 retCheck = true; /// 좌표 Control 에 빈칸이 존재하는 지를 확인함 for (int i = 0; i < ListPointControl.Count; i++) { if (ListPointControl[i].StrCoordX.Trim().Length == 0) { retCheck = false; } if (ListPointControl[i].StrCoordY.Trim().Length == 0) { retCheck = false; } } double dBase_X, dBase_Y; dBase_X = dBase_Y = 0; dBase_X = Double.Parse(textBoxBaseX.Text.Trim()); dBase_Y = Double.Parse(textBoxBaseY.Text.Trim()); CFace face = null; // 모든 데이터가 입력된 경우는 폐곡선의 정상적인 Face 를 그린다. if (retCheck == true) { face = makeFace(); if (null != face) { face.drawFace(femm); } else { CNotice.printTraceID("TSWN"); } } // 모든 데이터가 아직 입력되지 않은 상태는 입력중인 데이터만으로 그림을 그린다. else { double dP1_X, dP1_Y, dP2_X, dP2_Y; bool bArc, bArcDirection; dP1_X = dP1_Y = dP2_X = dP2_Y = 0; bArc = bArcDirection = false; for (int i = 0; i < ListPointControl.Count; i++) { retCheck = true; if (ListPointControl[i].StrCoordX.Trim().Length == 0) { retCheck = false; } else { dP1_X = Double.Parse(ListPointControl[i].StrCoordX.Trim()) + dBase_X; } if (ListPointControl[i].StrCoordY.Trim().Length == 0) { retCheck = false; } else { dP1_Y = Double.Parse(ListPointControl[i].StrCoordY.Trim()) + dBase_Y; } /// X, Y 값이 모두 입력된 Point Control 인 경우 if (retCheck == true) { if (i == 0) { /// 사각형, 다각형 모두 적용된다. femm.drawPoint(dP1_X, dP1_Y); } else { if (this.FaceType == EMFaceType.RECTANGLE) { CNotice.printTraceID("ATTW"); } /// 다각형만 적용된다. /// 만약 사각형의 경우 i = 1 까지 모두 채워지면 모두 입력된 상태로 if 문의 위에처 처리되기 때문이다. bArc = ListPointControl[i].IsArc; bArcDirection = ListPointControl[i].IsArcDirection; if (bArc == true) { femm.drawArc(dP2_X, dP2_Y, dP1_X, dP1_Y, bArcDirection); } else { femm.drawLine(dP2_X, dP2_Y, dP1_X, dP1_Y); } } // 이번 점을 이전 점으로 저장한다. dP2_X = dP1_X; dP2_Y = dP1_Y; } /// 채워지지 않은 좌표값을 발견하면 바로 빠져 나간다 else { break; } } } /// 선택된 좌표점을 붉은 색으로 표시한다. /// /// Base X, Y 변경 할때나 Leave 이벤트는 제외해야 함으로 null 을 넘겨오도록 되어 있다. if (pointControl != null) { /// XY 값 모두 들어 있는 경우에만 표시를 한다. if (pointControl.StrCoordX != "" && pointControl.StrCoordY != "") { CPoint selectedPoint = new CPoint(); selectedPoint.m_dX = Double.Parse(pointControl.StrCoordX) + dBase_X; selectedPoint.m_dY = Double.Parse(pointControl.StrCoordY) + dBase_Y; femm.clearSelected(); femm.selectPoint(selectedPoint); } } } catch (Exception ex) { CNotice.printTrace(ex.Message); } }
/// <summary> /// 좌표입력 컨트롤을 하나 추가한다 /// </summary> /// <param name="pointControl">좌표 객체</param> /// <param name="panel">좌표를 추가할 Panel</param> private CPointControl addPointControl(CPointControl pointControl, bool showButton, Panel panel) { pointControl.Dock = DockStyle.Top; pointControl.IsRectangle = showButton; try { #region ------------------------- 이벤트 호출 영역 ------------------------------ /// 이벤트 호출 영역은 addControlPoint() 안에 있으나 호출 때 동작하는 영역이 아니다. /// 단, 함수내에 있는 이유는 addControlPoint() 안에 있어서 /// 파라메터로 넘어오는 변수를 직접 접근할 수 있어, 이벤트 함수의 변수 접근 문제를 해결했다. /// pointControl.AddCoordinates += (s, e) => { /// 추가 버튼 클릭했을때 현재 컨트롤 아래 추가 /// - 컨트롤 추가 /// * addPointControl() 의 호출 영역을 호출 한다. CPointControl current = this.addPointControl(new CPointControl(), showButton, panel); /// - 컨트롤 정렬 List <CPointControl> sortList = new List <CPointControl>(); for (int i = 0; i < panel.Controls.Count; i++) { CPointControl c = panel.Controls[i] as CPointControl; if (c.Equals(current)) { continue; // 현재 추가된 항목은 통과 } if (c.Equals(pointControl)) { break; // 버튼 클릭한 항목을때 그 위쪽은 탐색할 필요 없으므로 루프 종료 } sortList.Add(c); } for (int i = sortList.Count - 1; i >= 0; i--) { sortList[i].BringToFront(); } this.resetSequence(); }; /// addPointControl() 이 호출될 때 실행되지 않고 이벤트가 발생할 때 동작한다. pointControl.RemoveCoordinates += (s, e) => { if (this.m_faceType == EMFaceType.RECTANGLE) { if (this.panelPointControl.Controls.Count == RECTANGLE_CONTROL_COUNT) { e.Cancel = true; CNotice.noticeWarningID("RRAL"); return; } } else { if (this.panelPointControl.Controls.Count <= MIN_POLYGON_CONTROL_COUNT) { e.Cancel = true; CNotice.noticeWarningID("PRAL"); return; } } }; /// addControlPoint() 이 호출될 때 실행되지 않고 이벤트가 발생할 때 동작한다. pointControl.RemoveComplete += (s, e) => { this.resetSequence(); // 생성창에서만 Add 버튼을 하나로 표시한다 if (m_bCreatePopupWindow == true) { /// PointControl 삭제때 Add 버튼 하나만 표시하기 /// /// 정렬이 끝난 후에 PointControl Panel 의 가장 아래 PointControl ADD 버튼만 보이게 하여 /// PointControl 의 삽입이 항상 아래에서만 이루어지도록 해서 Tab 의 문제를 해결 했다. for (int i = 0; i < panelPointControl.Controls.Count; i++) { if (i == 0) { ((CPointControl)panelPointControl.Controls[i]).showAddButton(); } else { ((CPointControl)panelPointControl.Controls[i]).hideAddButton(); } } } }; #endregion #region ------------------------ 함수 호출 영역 ----------------------------- panel.Controls.Add(pointControl); pointControl.BringToFront(); this.resetSequence(); // 생성창에서만 Add 버튼을 하나로 표시한다 if (m_bCreatePopupWindow == true) { /// 2. PointControl 추가때 Add 버튼 하나만 표시하기 /// /// 정렬이 끝난 후에 PointControl Panel 의 가장 아래 PointControl ADD 버튼만 보이게 하여 /// PointControl 의 삽입이 항상 아래에서만 이루어지도록 해서 Tab 의 문제를 해결 했다. for (int i = 0; i < panelPointControl.Controls.Count; i++) { if (i == 0) { ((CPointControl)panelPointControl.Controls[i]).showAddButton(); } else { ((CPointControl)panelPointControl.Controls[i]).hideAddButton(); } } } return(pointControl); #endregion } catch (Exception ex) { CNotice.printTrace(ex.Message); return(null); } }