/// <summary> /// 1文字のCAMデータの生成 /// </summary> /// <param name="camdataLList"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="reverse"></param> /// <param name="code">文字コード</param> /// <param name="height">0.1μm単位</param> /// <param name="lineWidth">0.1μm単位</param> /// <remarks> /// フォントデータは高さ100を基準に作っている。 /// n(0.1μm)高さに出力するためには、n/100倍にすれば良いことになる。 /// </remarks> public void GenerateCamData(LinkedList <CamOutBaseData> camdataLList, int x, int y, bool reverse, int code, int height, int lineWidth) { if (!Ready) { return; } if (code < 0x21 || code > 0x7e) { return; } double ymag = (double)height / 100.0; double xmag = (reverse ? -ymag : ymag); int index = code - 0x21; int vectCount = fontData[index].Count; for (int i = 0; i < vectCount; i++) { Point pt0; Point pt1; fontData[index].LineData(i, out pt0, out pt1); int x0 = (int)(x + (double)pt0.X * xmag); int y0 = (int)(y + (double)pt0.Y * ymag); int x1 = (int)(x + (double)pt1.X * xmag); int y1 = (int)(y + (double)pt1.Y * ymag); pt0 = new Point(x0, y0); pt1 = new Point(x1, y1); CamOutBaseData camd = new CamOutBaseData(MbeLayer.LayerValue.NUL, CamOutBaseData.CamType.VECTOR, CamOutBaseData.Shape.Obround, lineWidth, lineWidth, pt0, pt1); camdataLList.AddLast(camd); } }
protected void OutDrillPos(StreamWriter streamWriter) { string tCode = ""; int x; int y; string str; int n = baseDataList.Count; for (int i = 0; i < n; i++) { CamOutBaseData camd = baseDataList[i]; if (camd.layer != MbeLayer.LayerValue.DRL) { continue; } if (tCode != camd.code) { tCode = camd.code; streamWriter.WriteLine(tCode); } x = convertToGerverUnitValue(camd.pt0.X + CAMOUT_XOFFSET); y = convertToGerverUnitValue(camd.pt0.Y + CAMOUT_YOFFSET); str = string.Format("X{0}Y{1}", x, y); streamWriter.WriteLine(str); } }
/// <summary> /// CAMデータの生成 /// </summary> /// <param name="camOut"></param> public override void GenerateCamData(CamOut camOut) { int drillSize = Diameter; int stSize = Diameter + DEFAULT_SRMARGIN * 2; Point pt0 = GetPos(0); Point pt1 = GetPos(0); CamOutBaseData camd; camd = new CamOutBaseData(MbeLayer.LayerValue.DRL, CamOutBaseData.CamType.DRILL, CamOutBaseData.Shape.Drill, drillSize, drillSize, pt0, pt1); camOut.Add(camd); camd = new CamOutBaseData(MbeLayer.LayerValue.STC, CamOutBaseData.CamType.FLASH, CamOutBaseData.Shape.Obround, stSize, stSize, pt0, pt1); camOut.Add(camd); camd = new CamOutBaseData(MbeLayer.LayerValue.STS, CamOutBaseData.CamType.FLASH, CamOutBaseData.Shape.Obround, stSize, stSize, pt0, pt1); camOut.Add(camd); }
/// <summary> /// CAMデータの生成 /// </summary> /// <param name="camOut"></param> public override void GenerateCamData(CamOut camOut) { Point pt0 = GetPos(0); Point pt1 = GetPos(1); Point ptVia; bool bendMode = getPointVia(out ptVia); CamOutBaseData camd; if (!bendMode) { camd = new CamOutBaseData(layer, CamOutBaseData.CamType.VECTOR, CamOutBaseData.Shape.Obround, lineWidth, lineWidth, pt0, pt1); camOut.Add(camd); } else { camd = new CamOutBaseData(layer, CamOutBaseData.CamType.VECTOR, CamOutBaseData.Shape.Obround, lineWidth, lineWidth, pt0, ptVia); camOut.Add(camd); camd = new CamOutBaseData(layer, CamOutBaseData.CamType.VECTOR, CamOutBaseData.Shape.Obround, lineWidth, lineWidth, ptVia, pt1); camOut.Add(camd); } }
/// <summary> /// CAMデータの生成 /// </summary> /// <param name="camOut"></param> public override void GenerateCamData(CamOut camOut) { int width = PadSize.Width; int height = PadSize.Height; int stWidth = PadSize.Width + SrMargin * 2; int stHeight = PadSize.Height + SrMargin * 2; int drillSize = Diameter; Point pt0 = GetPos(0); Point pt1 = GetPos(0); int innerLandDia = InnerLandDia; CamOutBaseData camd; CamOutBaseData.Shape _shape = (shape == PadShape.Rect ? CamOutBaseData.Shape.Rect : CamOutBaseData.Shape.Obround); camd = new CamOutBaseData(MbeLayer.LayerValue.DRL, CamOutBaseData.CamType.DRILL, CamOutBaseData.Shape.DrillPTH, drillSize, drillSize, pt0, pt1); camOut.Add(camd); camd = new CamOutBaseData(MbeLayer.LayerValue.CMP, CamOutBaseData.CamType.FLASH, _shape, width, height, pt0, pt1); camOut.Add(camd); if ((innerLayerConnectionInfo & (ulong)MbeLayer.LayerValue.L2) != 0) { camd = new CamOutBaseData(MbeLayer.LayerValue.L2, CamOutBaseData.CamType.FLASH, _shape, innerLandDia, innerLandDia, pt0, pt1); camOut.Add(camd); } if ((innerLayerConnectionInfo & (ulong)MbeLayer.LayerValue.L3) != 0) { camd = new CamOutBaseData(MbeLayer.LayerValue.L3, CamOutBaseData.CamType.FLASH, _shape, innerLandDia, innerLandDia, pt0, pt1); camOut.Add(camd); } camd = new CamOutBaseData(MbeLayer.LayerValue.SOL, CamOutBaseData.CamType.FLASH, _shape, width, height, pt0, pt1); camOut.Add(camd); if (!no_ResistMask) { camd = new CamOutBaseData(MbeLayer.LayerValue.STC, CamOutBaseData.CamType.FLASH, _shape, stWidth, stHeight, pt0, pt1); camOut.Add(camd); camd = new CamOutBaseData(MbeLayer.LayerValue.STS, CamOutBaseData.CamType.FLASH, _shape, stWidth, stHeight, pt0, pt1); camOut.Add(camd); } }
/// <summary> /// CAMデータの生成 /// </summary> /// <param name="camOut"></param> public override void GenerateCamData(CamOut camOut) { CamOutBaseData camd; foreach (MbeGapChkObjLine obj in fillLineList) { Point pt0 = obj.p0; Point pt1 = obj.p1; camd = new CamOutBaseData(layer, CamOutBaseData.CamType.VECTOR, CamOutBaseData.Shape.Obround, traceWidth, traceWidth, pt0, pt1); camOut.Add(camd); } }
/// <summary> /// CAMデータをソートする。 /// Shape→幅(ドリルの場合は直径)→高さの優先順位 /// </summary> /// <param name="camd0"></param> /// <param name="camd1"></param> /// <returns></returns> private static int CompareBaseDataByAperture(CamOutBaseData camd0, CamOutBaseData camd1) { if (camd0.shape != camd1.shape) { return((int)camd0.shape - (int)camd1.shape); } if (camd0.width != camd1.width) { return(camd0.width - camd1.width); } if (camd0.height != camd1.height) { return(camd0.height - camd1.height); } return(0); }
protected void OutAdCode(StreamWriter streamWriter, MbeLayer.LayerValue layer) { string dCode = ""; double width; double height; string str; int n = baseDataList.Count; for (int i = 0; i < n; i++) { CamOutBaseData camd = baseDataList[i]; if (camd.layer != layer) { continue; } if (dCode != camd.code) { dCode = camd.code; if (camd.shape == CamOutBaseData.Shape.Obround) { if (camd.width == camd.height) { width = (double)camd.width / 254000; str = string.Format("%AD{0}C,{1:0.0000}*%", dCode, width); } else { width = (double)camd.width / 254000; height = (double)camd.height / 254000; str = string.Format("%AD{0}O,{1:0.0000}X{2:0.0000}*%", dCode, width, height); } } else if (camd.shape == CamOutBaseData.Shape.Rect) { width = (double)camd.width / 254000; height = (double)camd.height / 254000; str = string.Format("%AD{0}R,{1:0.0000}X{2:0.0000}*%", dCode, width, height); } else { continue; } streamWriter.WriteLine(str); } } }
/// <summary> /// CAMデータの生成 /// </summary> /// <param name="camOut"></param> public override void GenerateCamData(CamOut camOut) { int width = PadSize.Width; int height = PadSize.Height; Point pt0 = GetPos(0); Point pt1 = GetPos(0); CamOutBaseData camd; CamOutBaseData.Shape _shape = (shape == PadShape.Rect ? CamOutBaseData.Shape.Rect : CamOutBaseData.Shape.Obround); camd = new CamOutBaseData(layer, CamOutBaseData.CamType.FLASH, _shape, width, height, pt0, pt1); camOut.Add(camd); if (layer == MbeLayer.LayerValue.CMP || layer == MbeLayer.LayerValue.SOL) { if (!no_ResistMask) //Version 0.50 { int stWidth = PadSize.Width + SrMargin * 2; int stHeight = PadSize.Height + SrMargin * 2; MbeLayer.LayerValue stLayer = (layer == MbeLayer.LayerValue.CMP ? MbeLayer.LayerValue.STC : MbeLayer.LayerValue.STS); camd = new CamOutBaseData(stLayer, CamOutBaseData.CamType.FLASH, _shape, stWidth, stHeight, pt0, pt1); camOut.Add(camd); } if (!no_MM) { int stWidth = PadSize.Width - MmReduce * 2; int stHeight = PadSize.Height - MmReduce * 2; MbeLayer.LayerValue stLayer = (layer == MbeLayer.LayerValue.CMP ? MbeLayer.LayerValue.MMC : MbeLayer.LayerValue.MMS); camd = new CamOutBaseData(stLayer, CamOutBaseData.CamType.FLASH, _shape, stWidth, stHeight, pt0, pt1); camOut.Add(camd); } } }
protected void OutDefineDrill(StreamWriter streamWriter) { string tCode = ""; double dia; string str; int n = baseDataList.Count; for (int i = 0; i < n; i++) { CamOutBaseData camd = baseDataList[i]; if (camd.layer != MbeLayer.LayerValue.DRL) { continue; } if (tCode != camd.code) { tCode = camd.code; dia = (double)camd.width / 254000; str = string.Format("{0}C{1:0.0000}", tCode, dia); streamWriter.WriteLine(str); } } streamWriter.WriteLine("%"); }
public void Add(CamOutBaseData baseData) { baseDataList.Add(baseData); }
protected CamOutResult ExcellonDrillListOut(string path) { CamOutResult result = new CamOutResult(); result.code = CamOutResult.ResultCode.NOERROR; string outpath = Path.ChangeExtension(path, "DRI"); StreamWriter streamWriter = null; try { streamWriter = new StreamWriter(outpath); streamWriter.WriteLine("Code Size(inch) Number"); //string tCode = ""; //double dia; //string str; //string platedInfo; int dataCount = baseDataList.Count; int index = 0; CamOutBaseData camd = baseDataList[index]; while (index < dataCount) { if (camd.shape == CamOutBaseData.Shape.Drill || camd.shape == CamOutBaseData.Shape.DrillPTH) { CamOutBaseData.Shape shape = camd.shape; int width = camd.width; int drillCount = 0; while (true) { index++; drillCount++; if (index >= dataCount || baseDataList[index].shape != shape || baseDataList[index].width != width) { string tCode = camd.code; double dia = (double)camd.width / 254000; string platedInfo = (camd.shape == CamOutBaseData.Shape.Drill ? "NPTH" : "PTH "); string str = string.Format("{0} {1:0.0000} {2} {3}", tCode, dia, platedInfo, drillCount); streamWriter.WriteLine(str); camd = baseDataList[index]; break; } } } else { index++; } } //string tCode = ""; //double dia; //string str; //string platedInfo; //int n = baseDataList.Count; //for (int i = 0; i < n; i++) { // CamOutBaseData camd = baseDataList[i]; // if (camd.layer != MbeLayer.LayerValue.DRL) continue; // if (tCode != camd.code) { // tCode = camd.code; // dia = (double)camd.width / 254000; // if(camd.shape == CamOutBaseData.Shape.Drill){ // platedInfo = "NPTH"; // }else{ // platedInfo = "PTH"; // } // str = string.Format("{0} {1:0.0000} {2}", tCode, dia,platedInfo); // streamWriter.WriteLine(str); // } //} } catch (Exception) { result.code = CamOutResult.ResultCode.FILEERROR; result.filename = Path.GetFileName(outpath); return(result); } finally { if (streamWriter != null) { streamWriter.Close(); } } return(result); }
protected void OutPlotData(StreamWriter streamWriter, MbeLayer.LayerValue layer) { string dCode = ""; int x1; int y1; int x2; int y2; string str; int n = baseDataList.Count; for (int i = 0; i < n; i++) { CamOutBaseData camd = baseDataList[i]; if (camd.layer != layer) { continue; } if (dCode != camd.code) { dCode = camd.code; streamWriter.WriteLine(dCode + "*"); } if (camd.ctype == CamOutBaseData.CamType.VECTOR) { if (camd.pt0.X != camd.pt1.X || camd.pt0.Y != camd.pt1.Y) //0.48.02(2009/04/24) もとの座標でゼロ長のベクトルは出力しないように変更 { x1 = convertToGerverUnitValue(camd.pt0.X + CAMOUT_XOFFSET); y1 = convertToGerverUnitValue(camd.pt0.Y + CAMOUT_YOFFSET); x2 = convertToGerverUnitValue(camd.pt1.X + CAMOUT_XOFFSET); y2 = convertToGerverUnitValue(camd.pt1.Y + CAMOUT_YOFFSET); //0.46.01(2008/12/31) ** この修正は 0.48.02 で変更した ** //ガーバーデータの座標に変換したあとに座標が一致した場合は、 //最小長線分(0.1μm)をパッドの代わりに使用している可能性もあるので、 //ガーバーデータ上でも最小長線分(2.54μm)とする。 //実際にはx2に1を足して、水平線分としている。 //0.48.02(2009/04/24) //ガーバーデータの座標に変換したあとに座標が一致した場合は、 //フラッシュデータとして出力する if (x1 == x2 && y1 == y2) { str = string.Format("X{0:000000}Y{1:000000}D03*", x1, y1); streamWriter.WriteLine(str); } else { str = string.Format("X{0:000000}Y{1:000000}D02*", x1, y1); streamWriter.WriteLine(str); str = string.Format("X{0:000000}Y{1:000000}D01*", x2, y2); streamWriter.WriteLine(str); } //if (x1 != x2 || y1 != y2) { //ガーバーデータの座標に変換したあとでも始点終点が異なる場合のみ出力する。0.46.00(2008/12/28) // str = string.Format("X{0:000000}Y{1:000000}D02*", x1, y1); // streamWriter.WriteLine(str); // str = string.Format("X{0:000000}Y{1:000000}D01*", x2, y2); // streamWriter.WriteLine(str); //} } else { System.Diagnostics.Debug.WriteLine("Gerber out: zero length vector"); } } else { x1 = convertToGerverUnitValue(camd.pt0.X + CAMOUT_XOFFSET); y1 = convertToGerverUnitValue(camd.pt0.Y + CAMOUT_YOFFSET); str = string.Format("X{0:000000}Y{1:000000}D03*", x1, y1); streamWriter.WriteLine(str); } } }
/// <summary> /// Tコード、Dコード文字列の設定 /// </summary> protected CamOutResult SetCodeString() { CamOutResult result = new CamOutResult(); result.code = CamOutResult.ResultCode.NOERROR; int n = baseDataList.Count; if (n < 1) { return(result); } baseDataList.Sort(CompareBaseDataByAperture); int tSuffix = 1; int dSuffix = 10; CamOutBaseData.Shape shape = CamOutBaseData.Shape.Err; int width = 0; int height = 0; //CamOutBaseData camd = baseDataList[0]; //string strCode; //if (shape == CamOutBaseData.Shape.Drill || shape == CamOutBaseData.Shape.DrillPTH) { // strCode = string.Format("T{0:00}", tSuffix); // tSuffix++; //} else { // strCode = string.Format("D{0}", dSuffix); // dSuffix++; //} //camd.code = strCode; string strCode = ""; for (int i = 0; i < n; i++) { CamOutBaseData camd = baseDataList[i]; if (shape != camd.shape || width != camd.width || height != camd.height) { shape = camd.shape; width = camd.width; height = camd.height; if (shape == CamOutBaseData.Shape.Drill || shape == CamOutBaseData.Shape.DrillPTH) { if (tSuffix >= 100) { result.code = CamOutResult.ResultCode.TCODEOVER; return(result); } strCode = string.Format("T{0:00}", tSuffix); tSuffix++; } else { if (dSuffix >= 1000) { result.code = CamOutResult.ResultCode.DCODEOVER; return(result); } strCode = string.Format("D{0}", dSuffix); dSuffix++; } } camd.code = strCode; } return(result); }
/// <summary> /// CAMデータの生成 /// </summary> /// <param name="camOut"></param> public override void GenerateCamData(CamOut camOut) { int _endAngle; if (LimitStartEnd()) { _endAngle = startAngle + 3600; } else { _endAngle = endAngle; if (_endAngle == startAngle) { _endAngle = startAngle + 3600; } else if (_endAngle < startAngle) { _endAngle += 3600; } } int angle = startAngle; bool endFlag = false; int x; int y; double angleRad; angleRad = (double)angle / 1800.0 * Math.PI; x = (int)Math.Round(radius * Math.Cos(angleRad)) + posArray[0].X; y = (int)Math.Round(radius * Math.Sin(angleRad)) + posArray[0].Y; Point pt0 = new Point(x, y); Point pt1; double division = radius * Math.PI * 2 / CAMOUT_MAXLINELENGTH; if (division < CAMOUT_DIVISION) { division = CAMOUT_DIVISION; } while (!endFlag) { angle += (int)Math.Round(3600 / division); if (angle >= _endAngle) { endFlag = true; angle = _endAngle; } angleRad = (double)angle / 1800.0 * Math.PI; x = (int)Math.Round(radius * Math.Cos(angleRad)) + posArray[0].X; y = (int)Math.Round(radius * Math.Sin(angleRad)) + posArray[0].Y; pt1 = new Point(x, y); if (!pt0.Equals(pt1)) //ゼロ長データは出力しない { CamOutBaseData camd = new CamOutBaseData(layer, CamOutBaseData.CamType.VECTOR, CamOutBaseData.Shape.Obround, lineWidth, lineWidth, pt0, pt1); camOut.Add(camd); pt0 = pt1; } } }