using CoreUnit.Common; using CoreUnit.Scanner.UserControl.ScannerCanvas; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace CoreUnit.Scanner.UserControl.Canvas.Dialog { public partial class SnowmanEditorDlg : FormBase { public SnowmanEditorDlg(int selectedIndex) { InitializeComponent(); m_selectedIndex = selectedIndex; if (m_selectedIndex < 1) { m_scannerParam = ScannerCanvasUserCtrl.ScannerParams[0].Clone(); } else { m_scannerParam = ScannerCanvasUserCtrl.ScannerParams[m_selectedIndex - 1].Clone(); } Initialize(); } ScannerParam m_scannerParam; int m_selectedIndex = 0; private void Initialize() { ScannerParamToDialog(); InitializeProfileTab(); InitializeRotationTab(); } private void ScannerParamToDialog() { tbHeadWidth.Text = (m_scannerParam.HorizontalRadiusOfHead * 2).ToString("F2"); tbHeadHeight.Text = (m_scannerParam.VerticalRadiusOfHead * 2).ToString("F2"); tbBodyWidth.Text = (m_scannerParam.HorizontalRadiusOfBody * 2).ToString("F2"); tbBodyHeight.Text = (m_scannerParam.VerticalRadiusOfBody * 2).ToString("F2"); tbHeadVelocity.Text = m_scannerParam.HeadVelocity.ToString("F2"); tbBodyVelocity.Text = m_scannerParam.BodyVelocity.ToString("F2"); tbHeadVelocity2.Text = m_scannerParam.HeadVelocity.ToString("F2"); tbBodyVelocityPercent.Text = (m_scannerParam.BodyVelocity / m_scannerParam.HeadVelocity * 100).ToString("F1"); lbFrequency.Text = (1 / m_scannerParam.SnowManCycleTime).ToString("F2"); lbAngle.Text = m_scannerParam.TiltingAngle.ToString(); lbPitch.Text = (m_scannerParam.SnowManCycleTime * m_scannerParam.MarkSpeed).ToString("F2"); } private void DialogToScannerParam() { try { m_scannerParam.HorizontalRadiusOfHead = Convert.ToDouble(tbHeadWidth.Text) * 0.5; m_scannerParam.VerticalRadiusOfHead = Convert.ToDouble(tbHeadHeight.Text) * 0.5; m_scannerParam.HorizontalRadiusOfBody = Convert.ToDouble(tbBodyWidth.Text) * 0.5; m_scannerParam.VerticalRadiusOfBody = Convert.ToDouble(tbBodyHeight.Text) * 0.5; m_scannerParam.HeadVelocity = Convert.ToDouble(tbHeadVelocity.Text); m_scannerParam.BodyVelocity = Convert.ToDouble(tbBodyVelocity.Text); ScannerCanvasUserCtrl.ScannerParams[m_selectedIndex - 1] = m_scannerParam.Clone(); } catch { MessageBox.Show("Check the Paramter Value"); } } private void InitializeRotationTab() { tbRotationAngle.Text = m_scannerParam.TiltingAngle.ToString(); UpLoadPictureBoxList(); Bitmap canvas = new Bitmap(pbRotationAngle.Width, pbRotationAngle.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } //pbRotationAnlge 그리기 DrawSnowManAngle(pbRotationAngle, canvas, m_scannerParam.TiltingAngle); canvas = new Bitmap(pbAngle0.Width, pbAngle0.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } //이외 모든 pictureBox 그리기 foreach (PictureBox pb in pbList) { DrawSnowManAngle(pb, canvas); } } //Dictionary pbList = new Dictionary(); List pbList = new List(); private void InitializeProfileTab() { #region pbShapeOfSnowMan 업데이트 Bitmap canvas = new Bitmap(pbShapeOfSnowMan.Width, pbShapeOfSnowMan.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } double angle = Convert.ToDouble(lbAngle.Text); double headWidth = Convert.ToDouble(tbHeadWidth.Text); double headHeight = Convert.ToDouble(tbHeadHeight.Text); double bodyWidth = Convert.ToDouble(tbBodyWidth.Text); double bodyHeight = Convert.ToDouble(tbBodyHeight.Text); DrawSnowManAngle(pbShapeOfSnowMan, canvas, angle, headWidth, headHeight, bodyWidth, bodyHeight); #endregion #region pbShowPitch 업데이트 canvas = new Bitmap(pbShowPitch.Width, pbShowPitch.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } angle = Convert.ToDouble(lbAngle.Text); headWidth = Convert.ToDouble(tbHeadWidth.Text); headHeight = Convert.ToDouble(tbHeadHeight.Text); bodyWidth = Convert.ToDouble(tbBodyWidth.Text); bodyHeight = Convert.ToDouble(tbBodyHeight.Text); double pitch = Convert.ToDouble(lbPitch.Text); DrawSnowManPitch(pbShowPitch, canvas, angle, headWidth, headHeight, bodyWidth, bodyHeight, pitch); #endregion } private void DrawArrow(Graphics g, int width, int height) { int arrowBodyHeight = (int)(height * 0.2); int arrowBodyWidth = (int)(width * 0.6); Rectangle rect = new Rectangle(10, (int)(height / 2 - arrowBodyHeight / 2), arrowBodyWidth, arrowBodyHeight); g.FillRectangle(Brushes.LimeGreen, rect); int arrowHeadHeight = arrowBodyHeight * 2; int arrowHeadWidth = (int)(arrowBodyWidth * 0.5); Point[] p = new Point[] { new Point(arrowBodyWidth, (int)(height/2 - arrowHeadHeight/2)), new Point(arrowBodyWidth, (int)(height/2 + arrowHeadHeight/2)), new Point(arrowBodyWidth + arrowHeadWidth , height/2) }; g.FillPolygon(Brushes.LimeGreen, p); } private void DrawSnowManAngle(PictureBox pictureBox, Bitmap canvas) { int imageWidth = canvas.Width; int imageHeight = canvas.Height; int size = (int)(imageWidth * 0.4); Bitmap snowMan = new Bitmap(imageWidth, imageHeight); using (Graphics g = Graphics.FromImage(snowMan)) { using (Pen p = new Pen(Color.Blue, 3)) { g.TranslateTransform(imageWidth / 2, imageHeight / 2); int angle = Convert.ToInt16(pictureBox.Name.ToString().Substring(7)); g.RotateTransform(-angle); g.DrawEllipse(p, -size / 2, -size, size, size); g.DrawEllipse(p, -size / 2, 0, size, size); } } Bitmap finalImage = (Bitmap)canvas.Clone(); using (Graphics g = Graphics.FromImage(finalImage)) { g.DrawImage(snowMan, 0, 0); } pictureBox.Image = finalImage; } private void DrawSnowManAngle(PictureBox pictureBox, Bitmap canvas, double angle) { int imageWidth = canvas.Width; int imageHeight = canvas.Height; int size = (int)(imageWidth * 0.4); Bitmap snowMan = new Bitmap(imageWidth, imageHeight); using (Graphics g = Graphics.FromImage(snowMan)) { using (Pen p = new Pen(Color.Blue, 3)) { g.TranslateTransform(imageWidth / 2, imageHeight / 2); g.RotateTransform(-(int)angle); g.DrawEllipse(p, -size / 2, -size, size, size); g.DrawEllipse(p, -size / 2, 0, size, size); } } Bitmap finalImage = (Bitmap)canvas.Clone(); using (Graphics g = Graphics.FromImage(finalImage)) { g.DrawImage(snowMan, 0, 0); } pictureBox.Image = finalImage; } private void DrawSnowManAngle(PictureBox pictureBox, Bitmap canvas, double angle, double headWidth, double headHeight, double bodyWidth, double bodyHeight) { int imageWidth = canvas.Width; int imageHeight = canvas.Height; //이미지 크기에 맞춰서 타원 크기 정하기 List sizeList = new List(); sizeList.Add(headWidth); sizeList.Add(headHeight); sizeList.Add(bodyWidth); sizeList.Add(bodyHeight); double maxSize = 0; for (int i = 0; i < sizeList.Count; i++) { if (sizeList[i] > maxSize) { maxSize = sizeList[i]; } } double ratio = imageHeight * 0.4 / maxSize; int headWidthImage = (int)(headWidth * ratio); int headHeightImage = (int)(headHeight * ratio); int bodyWidthImage = (int)(bodyWidth * ratio); int bodyHeightImage = (int)(bodyHeight * ratio); Bitmap snowMan = new Bitmap(imageWidth, imageHeight); using (Graphics g = Graphics.FromImage(snowMan)) { using (Pen p = new Pen(Color.Blue, 3)) { g.TranslateTransform(imageWidth / 2, imageHeight / 2); g.RotateTransform(-(int)angle); g.DrawEllipse(p, -headWidthImage / 2, -headHeightImage, headWidthImage, headHeightImage); g.DrawEllipse(p, -bodyWidthImage / 2, 0, bodyWidthImage, bodyHeightImage); } } Bitmap finalImage = (Bitmap)canvas.Clone(); using (Graphics g = Graphics.FromImage(finalImage)) { g.DrawImage(snowMan, 0, 0); } pictureBox.Image = finalImage; } private void DrawSnowManPitch(PictureBox pictureBox, Bitmap canvas, double angle, double headWidth, double headHeight, double bodyWidth, double bodyHeight, double pitch) { int imageWidth = canvas.Width; int imageHeight = canvas.Height; //이미지 크기에 맞춰서 타원 크기 정하기 List sizeList = new List(); sizeList.Add(headWidth); sizeList.Add(headHeight); sizeList.Add(bodyWidth); sizeList.Add(bodyHeight); sizeList.Add(pitch); double maxSize = 0; for (int i = 0; i < sizeList.Count; i++) { if (sizeList[i] > maxSize) { maxSize = sizeList[i]; } } double ratio = imageHeight * 0.4 / maxSize; int headWidthImage = (int)(headWidth * ratio); int headHeightImage = (int)(headHeight * ratio); int bodyWidthImage = (int)(bodyWidth * ratio); int bodyHeightImage = (int)(bodyHeight * ratio); int pitchImage = (int)(pitch * ratio); Bitmap snowMan = new Bitmap(imageWidth, imageHeight); using (Graphics g = Graphics.FromImage(snowMan)) { //첫번째 using (Pen p = new Pen(Color.Pink, 3)) { g.TranslateTransform(imageWidth / 2 - pitchImage, imageHeight / 2); g.RotateTransform(-(int)angle); g.DrawEllipse(p, -headWidthImage / 2, -headHeightImage, headWidthImage, headHeightImage); g.DrawEllipse(p, -bodyWidthImage / 2, 0, bodyWidthImage, bodyHeightImage); } } using (Graphics g = Graphics.FromImage(snowMan)) { //두번째 (가운데) using (Pen p = new Pen(Color.Blue, 3)) { g.TranslateTransform(imageWidth / 2, imageHeight / 2); g.RotateTransform(-(int)angle); g.DrawEllipse(p, -headWidthImage / 2, -headHeightImage, headWidthImage, headHeightImage); g.DrawEllipse(p, -bodyWidthImage / 2, 0, bodyWidthImage, bodyHeightImage); } } using (Graphics g = Graphics.FromImage(snowMan)) { //세번째 using (Pen p = new Pen(Color.Red, 3)) { g.TranslateTransform(imageWidth / 2 + pitchImage, imageHeight / 2); g.RotateTransform(-(int)angle); g.DrawEllipse(p, -headWidthImage / 2, -headHeightImage, headWidthImage, headHeightImage); g.DrawEllipse(p, -bodyWidthImage / 2, 0, bodyWidthImage, bodyHeightImage); } } Bitmap finalImage = (Bitmap)canvas.Clone(); using (Graphics g = Graphics.FromImage(finalImage)) { g.DrawImage(snowMan, 0, 0); } pictureBox.Image = finalImage; } private void UpLoadPictureBoxList() { pbList.Clear(); pbList.Add(pbAngle0); pbList.Add(pbAngle15); pbList.Add(pbAngle30); pbList.Add(pbAngle45); pbList.Add(pbAngle60); pbList.Add(pbAngle75); pbList.Add(pbAngle90); pbList.Add(pbAngle105); pbList.Add(pbAngle120); pbList.Add(pbAngle135); pbList.Add(pbAngle150); pbList.Add(pbAngle165); pbList.Add(pbAngle180); pbList.Add(pbAngle195); pbList.Add(pbAngle210); pbList.Add(pbAngle225); pbList.Add(pbAngle240); pbList.Add(pbAngle255); pbList.Add(pbAngle270); pbList.Add(pbAngle285); pbList.Add(pbAngle300); pbList.Add(pbAngle315); pbList.Add(pbAngle330); pbList.Add(pbAngle345); } private void ApplyRotationAngle(int iAngle) { Bitmap canvas = new Bitmap(pbRotationAngle.Width, pbRotationAngle.Height); #region Rotation Tab using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } //pbRotationAnlge 그리기 DrawSnowManAngle(pbRotationAngle, canvas, m_scannerParam.TiltingAngle); trackBarAngle.Value = (int)m_scannerParam.TiltingAngle; #endregion #region Profile Tab canvas = new Bitmap(pbShapeOfSnowMan.Width, pbShapeOfSnowMan.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } double angle = iAngle; double headWidth = Convert.ToDouble(tbHeadWidth.Text); double headHeight = Convert.ToDouble(tbHeadHeight.Text); double bodyWidth = Convert.ToDouble(tbBodyWidth.Text); double bodyHeight = Convert.ToDouble(tbBodyHeight.Text); DrawSnowManAngle(pbShapeOfSnowMan, canvas, angle, headWidth, headHeight, bodyWidth, bodyHeight); #endregion } private void btnApplyRotationAngle_Click(object sender, EventArgs e) { try { m_scannerParam.TiltingAngle = Convert.ToInt16(tbRotationAngle.Text); lbAngle.Text = tbRotationAngle.Text; ApplyRotationAngle(m_scannerParam.TiltingAngle); } catch { MessageBox.Show("Check the Paramter Value"); } } private void btnOk_Click(object sender, EventArgs e) { DialogToScannerParam(); this.DialogResult = DialogResult.OK; this.Close(); } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; this.Close(); } private void btnApplySize_Click(object sender, EventArgs e) { try { Bitmap canvas = new Bitmap(pbShapeOfSnowMan.Width, pbShapeOfSnowMan.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } m_scannerParam.TiltingAngle = Convert.ToInt32(lbAngle.Text); m_scannerParam.HorizontalRadiusOfHead = Convert.ToDouble(tbHeadWidth.Text) * 0.5; m_scannerParam.VerticalRadiusOfHead = Convert.ToDouble(tbHeadHeight.Text) * 0.5; m_scannerParam.HorizontalRadiusOfBody = Convert.ToDouble(tbBodyWidth.Text) * 0.5; m_scannerParam.VerticalRadiusOfBody = Convert.ToDouble(tbBodyHeight.Text) * 0.5; lbFrequency.Text = (1 / m_scannerParam.SnowManCycleTime).ToString("F2"); lbAngle.Text = m_scannerParam.TiltingAngle.ToString(); lbPitch.Text = (m_scannerParam.SnowManCycleTime * m_scannerParam.MarkSpeed).ToString("F2"); DrawSnowManAngle(pbShapeOfSnowMan, canvas, m_scannerParam.TiltingAngle, m_scannerParam.HorizontalRadiusOfHead * 2, m_scannerParam.VerticalRadiusOfHead * 2, m_scannerParam.HorizontalRadiusOfBody * 2, m_scannerParam.VerticalRadiusOfBody * 2); canvas = new Bitmap(pbShowPitch.Width, pbShowPitch.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } DrawSnowManPitch(pbShowPitch, canvas, m_scannerParam.TiltingAngle, m_scannerParam.HorizontalRadiusOfHead * 2, m_scannerParam.VerticalRadiusOfHead * 2, m_scannerParam.HorizontalRadiusOfBody * 2, m_scannerParam.VerticalRadiusOfBody * 2, Convert.ToDouble(lbPitch.Text)); } catch { MessageBox.Show("Check the Paramter Value"); } } private void btnApplyVelocityAbsolute_Click(object sender, EventArgs e) { try { m_scannerParam.HeadVelocity = Convert.ToDouble(tbHeadVelocity.Text); m_scannerParam.BodyVelocity = Convert.ToDouble(tbBodyVelocity.Text); tbHeadVelocity2.Text = tbHeadVelocity.Text; lbFrequency.Text = (1 / m_scannerParam.SnowManCycleTime).ToString("F2"); lbAngle.Text = m_scannerParam.TiltingAngle.ToString(); lbPitch.Text = (m_scannerParam.SnowManCycleTime * m_scannerParam.MarkSpeed).ToString("F2"); Bitmap canvas = new Bitmap(pbShowPitch.Width, pbShowPitch.Height); using (Graphics g = Graphics.FromImage(canvas)) { //흰 색으로 배경 채우기 g.FillRectangle(Brushes.White, 0, 0, canvas.Width, canvas.Height); DrawArrow(g, canvas.Width, canvas.Height); } DrawSnowManPitch(pbShowPitch, canvas, m_scannerParam.TiltingAngle, m_scannerParam.HorizontalRadiusOfHead * 2, m_scannerParam.VerticalRadiusOfHead * 2, m_scannerParam.HorizontalRadiusOfBody * 2, m_scannerParam.VerticalRadiusOfBody * 2, Convert.ToDouble(lbPitch.Text)); } catch { MessageBox.Show("Check the Paramter Value"); } } private void btnApplyVelocityByRatio_Click(object sender, EventArgs e) { try { double percent = Convert.ToDouble(tbBodyVelocityPercent.Text); m_scannerParam.BodyVelocity = m_scannerParam.HeadVelocity * percent * 0.01; tbBodyVelocity.Text = m_scannerParam.BodyVelocity.ToString("F2"); } catch { MessageBox.Show("Check the Paramter Value"); } } private void trackBarAngle_Scroll(object sender, EventArgs e) { tbRotationAngle.Text = trackBarAngle.Value.ToString(); } private void rbAngle_CheckedChanged(object sender, EventArgs e) { try { RadioButton rbAngle = (RadioButton)sender; if (rbAngle.Checked) { int angle = Convert.ToInt16(rbAngle.Text); m_scannerParam.TiltingAngle = angle; lbAngle.Text = angle.ToString(); tbRotationAngle.Text = angle.ToString(); ApplyRotationAngle(angle); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }