/// <summary> /// 计算旋转后的新坐标 /// </summary> /// <param name="angle"></param> /// <param name="rotate"></param> /// <param name="oldpxy"></param> /// <returns></returns> private pXY CalcRoateXy(int angle, RotateFlag rotate, pXY oldpxy) { pXY newpxy = new pXY(); double radx = Angel2Pi(angle); double x1 = oldpxy.X * Math.Cos(radx); double x2 = oldpxy.Y * Math.Sin(radx); double y1 = oldpxy.Y * Math.Cos(radx); double y2 = oldpxy.X * Math.Sin(radx); if (rotate == RotateFlag.EASTERN) { newpxy.X = Math.Round((x1 - x2), 0); newpxy.Y = Math.Round((y1 + y2), 0); } if (rotate == RotateFlag.CLOCKWISE) { newpxy.X = Math.Round((x1 + x2), 0); newpxy.Y = Math.Round((y1 - y2), 0); } return(newpxy); }
/// <summary> /// 判断这行文字是否含有坐标,如果有就返回坐标 /// </summary> /// <param name="linestr"></param> /// <param name="oldpxy"></param> /// <returns></returns> private bool IsLocationLine(string linestr, out pXY oldpxy) { oldpxy = new pXY(); string MatchFlag = @"[-0-9.]*, *[-0-9.]*"; if (linestr.StartsWith("!")) { return(false); } Match match = Regex.Match(linestr, MatchFlag); if (match.Success) { string xystr = match.Groups[0].Value; string x = xystr.Split(',')[0]; string y = xystr.Split(',')[1]; //if (y.Contains(",")) // y = y.Replace(",", ""); //if (y.Contains(";")) // y = y.Replace(";", ""); oldpxy.X = Convert.ToDouble(x); oldpxy.Y = Convert.ToDouble(y); return(true); } else { return(false); } }
private void btnCalcSingle_Click(object sender, EventArgs e) { if (Convert.ToInt16(txtAngle.Text.Trim()) > 360) { txtAngle.SelectAll(); txtAngle.Focus(); return; } if (string.IsNullOrEmpty(txtOldX.Text.Trim())) { return; } if (string.IsNullOrEmpty(txtOldY.Text.Trim())) { return; } if (string.IsNullOrEmpty(txtAngle.Text.Trim())) { return; } int Angle = Convert.ToInt16(txtAngle.Text.Trim()); pXY OldPxy = new pXY(); OldPxy.X = Convert.ToDouble(txtOldX.Text.Trim()); OldPxy.Y = Convert.ToDouble(txtOldY.Text.Trim()); pXY NewPxy = CalcRoateXy(Angle, _ROTATE, OldPxy, _RBIT); txtNewX.Text = NewPxy.X.ToString(); txtNewY.Text = NewPxy.Y.ToString(); }
/// <summary> /// /// </summary> /// <param name="linestr"></param> /// <param name="oldxy"></param> /// <param name="newxy"></param> /// <returns></returns> private string ReplaceOldXy2NewXy(string linestr, pXY newxy) { string MatchFlag = @"[-0-9.]*, *[-0-9.]*"; if (linestr.StartsWith("!")) { return(linestr); } Match match = Regex.Match(linestr, MatchFlag); if (match.Success) { string xystr = match.Groups[0].Value; linestr = linestr.Replace(xystr, newxy.X.ToString() + "," + newxy.Y.ToString().PadLeft(8, ' ')); } return(linestr); }
private void Rotate() { IsRotating = true; if (Convert.ToInt16(txtAngle.Text.Trim()) > 360) { updateMessage(lstMsg, "角度最大不能超過360度."); txtAngle.SelectAll(); txtAngle.Focus(); IsRotating = false; return; } if (string.IsNullOrEmpty(txtoldboardxy.Text.Trim())) { updateMessage(lstMsg, "請選擇boardxy文件."); txtoldboardxy.Focus(); IsRotating = false; return; } FileInfo fi = new FileInfo(txtoldboardxy.Text.Trim()); if (!fi.Exists) { updateMessage(lstMsg, fi.Name + "不存在."); txtoldboardxy.SelectAll(); txtoldboardxy.Focus(); IsRotating = false; return; } if (string.IsNullOrEmpty(txtAngle.Text.Trim())) { updateMessage(lstMsg, "旋轉角度不能為空."); txtAngle.Focus(); IsRotating = false; return; } int Angle = Convert.ToInt16(txtAngle.Text.Trim()); RotateXY.Clear(); OldXyList.Clear(); NewXyList.Clear(); int Rows = GetRows(fi.FullName); progressBar1.Visible = true; progressBar1.Minimum = 1; progressBar1.Maximum = Rows; string destboardxy = fi.FullName + @"." + Angle; StreamReader sr = new StreamReader(fi.FullName); StreamWriter sw = new StreamWriter(destboardxy); string line = string.Empty; int lines = 0; while (!sr.EndOfStream) { line = sr.ReadLine(); lines++; progressBar1.Value = lines; lblPercent.Visible = true; lblPercent.Text = (((double)lines) / ((double)Rows)).ToString("P2"); pXY oldpxy = new pXY(); if (IsLocationLine(line, out oldpxy)) { OldXyList.Add(oldpxy); pXY NewPxy = CalcRoateXy(Angle, _ROTATE, oldpxy); RotateXY.Add(oldpxy, NewPxy); // string nline = line.Replace(oldpxy.X.ToString(), NewPxy.X.ToString()).Replace(oldpxy.Y.ToString(), NewPxy.Y.ToString()); // nline = nline.Replace(oldpxy.Y.ToString(), NewPxy.Y.ToString()); string nline = ReplaceOldXy2NewXy(line, NewPxy); sw.WriteLine(nline); } else { sw.WriteLine(line); } } sw.Close(); sr.Close(); progressBar1.Visible = false; lblPercent.Visible = false; IsRotating = false; updateMessage(lstMsg, "新文件地址:" + destboardxy); updateMessage(lstMsg, "處理完畢..."); System.Diagnostics.Process.Start(fi.DirectoryName); }