/** * @brief 저장되지 않은 임시 그룹에서 임시 그룹명 제거 * @author 김민규 * @date 2017-8-1 */ public void resetTempGroupnames() { foreach (Figure currentFigure in drawnFigures) { if (currentFigure is MergedFigure) { MergedFigure currentMergedFigure = currentFigure as MergedFigure; if (currentMergedFigure.groupName.StartsWith("<")) { currentMergedFigure.recursiveGroupnameSet(""); } } } }
/** * @brief 복제 * @author 불명(김민규 담당) * @date 불명(2017-1-17 확인) * @return object 똑같은 값을 가지는 새로운 Figure를 생성해 반환한다. 사실상 팩토리 역할을 한다. */ public virtual object Clone() { Figure figure = null; if (this.GetType() == typeof(LineFigure)) { figure = new LineFigure(); } else if (this.GetType() == typeof(PolyLineFigure)) { figure = new PolyLineFigure(); } else if (this.GetType() == typeof(FreeLineFigure)) { figure = new FreeLineFigure(); } else if (this.GetType() == typeof(RectFigure)) { figure = new RectFigure(); } else if (this.GetType() == typeof(OvalFigure)) { figure = new OvalFigure(); } else if (this.GetType() == typeof(ImageFigure)) { figure = new ImageFigure(((ImageFigure)this).getImage()); } else if (this.GetType() == typeof(MergedFigure)) { FigureList figureListToClone = ((MergedFigure)this).getFigList(); figure = new MergedFigure((FigureList)figureListToClone.Clone()); } else { throw new System.NotImplementedException(); } figure.coordinates = (RectList)this.coordinates.Clone(); figure.filledColor = this.filledColor; figure.bFilled = this.bFilled; figure.groupName = this.groupName; return(figure); }
/** * @brief 복제 뒤 상대좌표 반영 * @author 김민규 * @date 2017-02-07 * @param magnificationRatio 확대 비율 * @param screenPos 화면의 현재 위치 */ public virtual Figure RelativeClone(int magnificationRatio, Pos screenPos) { Figure figure = null; if (this.GetType() == typeof(LineFigure)) { figure = new LineFigure(); } else if (this.GetType() == typeof(PolyLineFigure)) { figure = new PolyLineFigure(); } else if (this.GetType() == typeof(FreeLineFigure)) { figure = new FreeLineFigure(); } else if (this.GetType() == typeof(RectFigure)) { figure = new RectFigure(); } else if (this.GetType() == typeof(OvalFigure)) { figure = new OvalFigure(); } else if (this.GetType() == typeof(ImageFigure)) { figure = new ImageFigure(((ImageFigure)this).getImage()); } else if (this.GetType() == typeof(MergedFigure)) { FigureList figureListToClone = ((MergedFigure)this).getFigList(); figure = new MergedFigure((FigureList)figureListToClone.RelativeClone(magnificationRatio, screenPos)); } else { throw new System.NotImplementedException(); } figure.coordinates = (RectList)this.coordinates.RelativeClone(magnificationRatio, screenPos); figure.filledColor = this.filledColor; return(figure); }
/** * @brief 병합된 상태에서 크기를 조정할 때 비율을 제대로 조정하기 위해서 사용 * @details 병합된 상태에서 각 Figure의 위치의 비율값을 각 Figure에 저장한다. 병합된 상태에서 확대 축소를 올바르게 작동시키기 위해 사용한다. 각 Figure들에 대해서 현재 MergeFigure에 대한 각 객체의 상대적인 위치를 저장해서 확대 축소 시 그 값을 사용한다. * @param merged 비율을 조절하기 위한 mergedFigure * @author 방준혁 * @date 07-24 */ public void setRatio(MergedFigure merged) { Rect r = (Rect)merged.getVectorElementAt(0); int mLeft = r.getLeft(); int mRight = r.getRight(); int mTop = r.getTop(); int mBottom = r.getBottom(); int mWidth = r.getWidth(); int mHeight = r.getHeight(); for (int i = 0; i < merged.getFigList().Count; i++) { r = (Rect)((Figure)merged.getFigList()[i]).getVectorElementAt(0); r.setRatio(0, (float)(mRight - r.getLeft()) / mWidth); r.setRatio(1, (float)(mRight - r.getRight()) / mWidth); r.setRatio(2, (float)(mBottom - r.getTop()) / mHeight); r.setRatio(3, (float)(mBottom - r.getBottom()) / mHeight); } }
/** * @brief 그룹명이 부여되지 않은 그룹에 임시 그룹명 부여 * @author 김민규 * @date 2017-8-1 */ public void setTempGroupnames() { int currentUnnamedIndex = 1; foreach (Figure currentFigure in drawnFigures) { if (currentFigure is MergedFigure) { MergedFigure currentMergedFigure = currentFigure as MergedFigure; if (currentMergedFigure.groupName == "") { currentMergedFigure.recursiveGroupnameSet( "<Unnamed" + currentUnnamedIndex.ToString() + ">"); ++currentUnnamedIndex; } } else { } } }
/** * @brief mergedFigure를 unmerge된 상태의 Figure들로 분리한다. */ public void unmergeFigure() { if (drawingFigures.Count > 0) { foreach (Figure f in drawingFigures) { if (f is MergedFigure) { MergedFigure mf = f as MergedFigure; string motherGName = f.groupName; mf.deselect(); FigureList unmerge = mf.getFigList(); foreach (Figure temp in unmerge) { temp.groupName = motherGName; } drawnFigures.Remove(mf); drawnFigures.AddRange(unmerge); } } } }
/** * @brief 여러개의 객체들을 모두 합치기 위해서 사용한다. * @details figList는 현재 선택된 도형들을 담고있다. 선택된 객체가 저장된 figList에서 객체들을 선택해서 select 필드를 false로 변경하고 figList에서 삭제한다. 그리고 mergedFigure 객체를 새로 생성해서 선택되었던 객체들을 모두 포함하는 Figure를 생성한다. * @author 불분명(이혜리 확인) * @date 불분명 */ public Figure mergeFigure() { if (drawingFigures.Count > 0) { foreach (Figure f in drawingFigures) { //FreeLine은 현재 merge가 불가능하다. if (f is FreeLineFigure) { MessageBox.Show("FreeLine is not able to Merge", "Editor"); deselectAll(); UpdateAllViews(); return(null); } else if (f is MergedFigure) { MessageBox.Show("Recursive merging is not available", "Editor"); deselectAll(); UpdateAllViews(); return(null); } } MergedFigure merged = new MergedFigure(drawingFigures); merged.groupName = drawingFigures[0].groupName; setRatio(merged); for (int i = 0; i < drawingFigures.Count; i++) { drawingFigures[i].deselect(); removeOriginalFigure(drawingFigures[i].RelativeClone(magnificationRatio, screenPos)); } addFigure(merged); drawingFigures.Clear(); return(merged); } return(null); }