一.为什么 连孔加除毛刺孔

原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔,并钻进去一点(常规进去1-2mil),这样就可以将纤维毛刺去除 (没找到SLOT槽与SLOT槽的实物图.就用SLOT槽与圆孔吧,产生毛刺效果也是一样的)

PCB同行业毛刺问题处理办法 钻孔孔内毛刺问题分析改善报告

二.如何判断除毛刺孔加多少个?

在PCB行业工程加除毛刺孔加多少个也没有太明确的定义,只要满足毛刺去除即可.

这里我们把相交的SLOT槽分为2类,一类是十字形,另一类是T型,分别用实际的案例做以说明.

1.十字型交叉SLOT槽:

实例1:十字槽 加1个孔 需满足2点需求
           P1到P3 两点距离 与 P2与P4 两点距离相等
           P1与P2 两点距离 与 P2与P3两点距离相差<0.5mm

实例2:十字槽 加2个孔或4个孔, 需满足1点需求
          P1到P3 两点距离 与 P2与P4 两点距离相等

实例3:十字槽 加3个孔或4个孔,不满足以下条件时
          P1到P3 两点距离 与 P2与P4 两点距离相等
          P1与P2 两点距离 与 P2与P3两点距离相差<0.5mm

失效实例:十字槽钻1个孔失效案例

2.T字型交叉SLOT槽:

实例1: T字槽 加1个孔, 需满足以下条件时
         (W1 * 0.5 + W1 * 0.707) < W2

实例2:T字槽 加2个孔, 不满足以下条件时
           (W1 * 0.5 + W1 * 0.707) < W2

三.连孔加除毛刺孔实现关键需求出参数

除毛刺孔,这里列举几个关键参数,如下图所示(因为求解的参数太多,画图不好呈现,具体请看下方的代码)

1.T字型槽加1个孔

2.T字型槽加2个孔

3.十字型槽加孔和T字型加孔类型,具体看下方代码

四.C#简易代码实现:

1.加除毛刺孔代码

  1. #region 加除毛刺孔 mcdrl
  2. gLayer glayer = g.getFEATURES($"{"drl"}", g.STEP, g.JOB, "mm", true);
  3. gL line1 = glayer.Llist[];
  4. gL line2 = glayer.Llist[];
  5. List<gP> gpList = calc2.l2l_IntersectHole(line1, line2, 0.05);
  6. addCOM.pad(gpList);
  7. #endregion

2.计算函数

  1. /// <summary>
  2. /// 线段与线段(2个SLOT槽相交) 加除毛刺孔
  3. /// </summary>
  4. /// <param name="l1"></param>
  5. /// <param name="l2"></param>
  6. /// <param name="CutInner">切入值</param>
  7. /// <returns></returns>
  8. public List<gP> l2l_IntersectHole(gL l1, gL l2, double CutInner = 0.05)
  9. {
  10. add addCOM = new add();
  11. List<gP> gpList = new List<gP>();
  12. gL l1_L, l1_R, l2_L, l2_R;
  13. int jd1Type = , jd2Type = , jd3Type = , jd4Type = ;
  14. gPoint jdP1, jdP2, jdP3, jdP4;
  15. double ang1, ang2, ang3, ang4;
  16. gPoint HoleP1, HoleP2, HoleP3, HoleP4;
  17. if (multi(l1.ps, l1.pe, l2.ps) < && multi(l1.ps, l1.pe, l2.pe) > )
  18. {
  19. gL tempL = l1;
  20. l1 = l2;
  21. l2 = tempL;
  22. }
  23. double l1Rval = l1.width * 0.0005;
  24. double l2Rval = l2.width * 0.0005;
  25. double Rval = l1Rval > l2Rval ? l2Rval : l1Rval;
  26. double Hole_Radius = Rval;
  27. double HoleSize = Hole_Radius * ;
  28. l_offset(l1, l1Rval, out l1_L, out l1_R);
  29. l_offset(l2, l2Rval, out l2_L, out l2_R);
  30. jdP1 = l2l_Intersect(l1_L, l2_R, ref jd1Type);
  31. jdP2 = l2l_Intersect(l1_L, l2_L, ref jd2Type);
  32. jdP3 = l2l_Intersect(l1_R, l2_L, ref jd3Type);
  33. jdP4 = l2l_Intersect(l1_R, l2_R, ref jd4Type);
  34. jd1Type = jd1Type < ? : jd1Type;
  35. jd2Type = jd2Type < ? : jd2Type;
  36. jd3Type = jd3Type < ? : jd3Type;
  37. jd4Type = jd4Type < ? : jd4Type;
  38. if ((jd1Type + jd2Type + jd3Type + jd4Type) == ) //产生4个交点
  39. {
  40. if (Math.Abs(p2p_di(jdP1, jdP3) - p2p_di(jdP2, jdP4)) < 0.01) //4个交点且交错交点相等时 加1个孔
  41. {
  42. if (Math.Abs(p2p_di(jdP1, jdP2) - p2p_di(jdP2, jdP3)) < 0.51) //4个交点且2条槽宽相差小于0.5mm 加1个孔
  43. {
  44. gPoint PointCenter = p2p_centerP(jdP1, jdP3);
  45. Hole_Radius = p2p_di(PointCenter, jdP1) + CutInner;
  46. HoleSize = ((int)(Math.Ceiling((Hole_Radius * * ) / )) * ) * 0.001; ;
  47. gpList.Add(new gP(PointCenter, HoleSize * ));
  48. return gpList;
  49. }
  50. }
  51. }
  52. if ((jd1Type + jd2Type + jd3Type + jd4Type) == ) //产生2个交点
  53. {
  54. //P2 P3
  55. //P1 P4
  56. gPoint LineCenter = new gPoint();
  57. double AngDirdction = ;
  58. double ValDirdction = ;
  59. double ValR = ;
  60. double Lwidth = ;
  61. if (jd1Type + jd2Type == )
  62. {
  63. LineCenter = p2p_centerP(jdP1, jdP2);
  64. AngDirdction = p_ang(LineCenter, l1_R);
  65. ValDirdction = p2p_di(jdP1, jdP2) * 0.5;
  66. ValR = ValDirdction * 1.4142136;
  67. Lwidth = l1Rval * ;
  68. }
  69. if (jd2Type + jd3Type == )
  70. {
  71. LineCenter = p2p_centerP(jdP2, jdP3);
  72. AngDirdction = p_ang(LineCenter, l2_R);
  73. ValDirdction = p2p_di(jdP2, jdP3) * 0.5;
  74. ValR = ValDirdction * 1.4142136;
  75. Lwidth = l2Rval * ;
  76. }
  77. if (jd3Type + jd4Type == )
  78. {
  79. LineCenter = p2p_centerP(jdP3, jdP4);
  80. AngDirdction = p_ang(LineCenter, l1_L);
  81. ValDirdction = p2p_di(jdP3, jdP4) * 0.5;
  82. ValR = ValDirdction * 1.4142136;
  83. Lwidth = l1Rval * ;
  84. }
  85. if (jd4Type + jd1Type == )
  86. {
  87. LineCenter = p2p_centerP(jdP4, jdP1);
  88. AngDirdction = p_ang(LineCenter, l2_L);
  89. ValDirdction = p2p_di(jdP4, jdP1) * 0.5;
  90. ValR = ValDirdction * 1.4142136;
  91. Lwidth = l2Rval * ;
  92. }
  93. Hole_Radius = ValR + CutInner;
  94. HoleSize = ((int)(Math.Ceiling((Hole_Radius * * ) / )) * ) * 0.001;
  95. Hole_Radius = HoleSize * 0.5;
  96. double diffVal = Hole_Radius - (ValR + CutInner);
  97. if (diffVal > )
  98. {
  99. ValDirdction = Math.Sqrt(Math.Pow((ValR + diffVal), ) - Math.Pow((ValDirdction), ));
  100. }
  101. if ((ValDirdction + Hole_Radius - 0.1) < Lwidth) //2个交点且正交时 加1个孔
  102. {
  103.  
  104. gPoint PointCenter = p_val_ang(LineCenter, ValDirdction, AngDirdction);
  105. gpList.Add(new gP(PointCenter, HoleSize * ));
  106. return gpList;
  107. }
  108. }
  109.  
  110. //当不满足条件的,全按一个交点加一个孔的方式处理
  111. HoleSize = ((int)(Math.Ceiling((Rval * * ) / )) * ) * 0.001;
  112. Hole_Radius = HoleSize * 0.5;
  113. ang1 = a_AngleCenter_dirdction(jdP2, jdP1, jdP4);
  114. ang2 = a_AngleCenter_dirdction(jdP3, jdP2, jdP1);
  115. ang3 = p_ang_invert(ang1);
  116. ang4 = p_ang_invert(ang2);
  117. HoleP1 = p_val_ang(jdP1, Hole_Radius - CutInner, ang1);
  118. HoleP2 = p_val_ang(jdP2, Hole_Radius - CutInner, ang2);
  119. HoleP3 = p_val_ang(jdP3, Hole_Radius - CutInner, ang3);
  120. HoleP4 = p_val_ang(jdP4, Hole_Radius - CutInner, ang4);
  121. if (jd1Type == )
  122. gpList.Add(new gP(HoleP1, HoleSize * ));
  123. if (jd2Type == )
  124. gpList.Add(new gP(HoleP2, HoleSize * ));
  125. if (jd3Type == )
  126. gpList.Add(new gP(HoleP3, HoleSize * ));
  127. if (jd4Type == )
  128. gpList.Add(new gP(HoleP4, HoleSize * ));
  129. return gpList;
  130. }
  131. /// <summary>
  132. /// 线Line偏移 out 左与右偏移线Line
  133. /// </summary>
  134. /// <param name="l"></param>
  135. /// <param name="offset_val">偏移数值</param>
  136. /// <param name="left_l">out 左偏移线L</param>
  137. /// <param name="rithg_l">out 右偏移线L</param>
  138. public void l_offset(gL l, double offset_val, out gL left_l, out gL rithg_l)
  139. {
  140. left_l = l;
  141. rithg_l = l;
  142. double angle_ = p_ang(l.ps, l.pe);
  143. left_l.ps = p_val_ang(l.ps, offset_val, angle_ + );
  144. left_l.pe = p_val_ang(l.pe, offset_val, angle_ + );
  145. rithg_l.ps = p_val_ang(l.ps, offset_val, angle_ - );
  146. rithg_l.pe = p_val_ang(l.pe, offset_val, angle_ - );
  147. }
  148. /// <summary>
  149. /// 求方位角
  150. /// </summary>
  151. /// <param name="ps"></param>
  152. /// <param name="pe"></param>
  153. /// <returns></returns>
  154. public double p_ang(gPoint ps, gPoint pe)
  155. {
  156. double a_ang = Math.Atan((pe.y - ps.y) / (pe.x - ps.x)) / Math.PI * ;
  157. //象限角 转方位角 计算所属象限 并求得方位角
  158. if (pe.x >= ps.x && pe.y >= ps.y) //↗ 第一象限
  159. {
  160. return a_ang;
  161. }
  162. else if (!(pe.x >= ps.x) && pe.y >= ps.y) // ↖ 第二象限
  163. {
  164. return a_ang + ;
  165. }
  166. else if (!(pe.x >= ps.x) && !(pe.y >= ps.y)) //↙ 第三象限
  167. {
  168. return a_ang + ;
  169. }
  170. else if (pe.x >= ps.x && !(pe.y >= ps.y)) // ↘ 第四象限
  171. {
  172. return a_ang + ;
  173. }
  174. else
  175. {
  176. return a_ang;
  177. }
  178. }//求方位角
  179. /// <summary>
  180. /// 求增量坐标
  181. /// </summary>
  182. /// <param name="ps">起点</param>
  183. /// <param name="val">增量值</param>
  184. /// <param name="ang_direction">角度</param>
  185. /// <returns></returns>
  186. public gPoint p_val_ang(gPoint ps, double val, double ang_direction)
  187. {
  188. gPoint pe;
  189. pe.x = ps.x + val * Math.Cos(ang_direction * Math.PI / );
  190. pe.y = ps.y + val * Math.Sin(ang_direction * Math.PI / );
  191. return pe;
  192. }
  193. /// <summary>
  194. /// 求线段与线段相交点 (线段与线段相差微小距离误差无法可控 之前测试有发现后来没发现了,有待验证)
  195. /// </summary>
  196. /// <param name="L1"></param>
  197. /// <param name="L2"></param>
  198. /// <param name="isIntersectType">0平行无交点 1本身相交 -1本身不相交(但延长相交)</param>
  199. /// <returns></returns>
  200. public gPoint l2l_Intersect(gL L1, gL L2, ref int isIntersectType)
  201. {
  202. return l2l_Intersect(L1.ps, L1.pe, L2.ps, L2.pe, ref isIntersectType);
  203. }
  204. /// <summary>
  205. /// 求线段与线段相交点 (线段与线段相差微小距离误差无法可控 之前测试有发现后来没发现了,有待验证)
  206. /// </summary>
  207. /// <param name="l1ps"></param>
  208. /// <param name="l1pe"></param>
  209. /// <param name="l2ps"></param>
  210. /// <param name="l2pe"></param>
  211. /// <param name="isIntersectType">0平行无交点 1本身相交 -1本身不相交(但延长相交)</param>
  212. /// <returns></returns>
  213. public gPoint l2l_Intersect(gPoint l1ps, gPoint l1pe, gPoint l2ps, gPoint l2pe, ref int isIntersectType)
  214. {
  215. gL L1 = new gL(l1ps, l1pe, );
  216. gL L2 = new gL(l2ps, l2pe, );
  217. gPoint tempP = new gPoint();
  218. double ABC, ABD, CDA, CDB, T;
  219. //面积符号相同则两点在线段同侧,不相交 (对点在线段上的情况,本例当作不相交处理)
  220. ABC = (L1.ps.x - L2.ps.x) * (L1.pe.y - L2.ps.y) - (L1.ps.y - L2.ps.y) * (L1.pe.x - L2.ps.x);
  221. ABD = (L1.ps.x - L2.pe.x) * (L1.pe.y - L2.pe.y) - (L1.ps.y - L2.pe.y) * (L1.pe.x - L2.pe.x);
  222. CDA = (L2.ps.x - L1.ps.x) * (L2.pe.y - L1.ps.y) - (L2.ps.y - L1.ps.y) * (L2.pe.x - L1.ps.x); // 三角形cda 面积的2倍 // 注意: 这里有一个小优化.不需要再用公式计算面积,而是通过已知的三个面积加减得出.
  223. CDB = CDA + ABC - ABD; // 三角形cdb 面积的2倍
  224. if (Math.Abs(ABC - ABD) <= 0.000001)
  225. {
  226. isIntersectType = ; //平行
  227. return tempP;
  228. }
  229. else
  230. {
  231. if ((CDA * CDB <= 0.000001) && (ABC * ABD <= 0.000001)) //本身相交
  232. {
  233. isIntersectType = ;
  234. }
  235. else
  236. {
  237. isIntersectType = -; //延长相交
  238. }
  239. }
  240.  
  241. //计算交点
  242. T = CDA / (ABD - ABC);
  243. tempP.x = L1.ps.x + T * (L1.pe.x - L1.ps.x);
  244. tempP.y = L1.ps.y + T * (L1.pe.y - L1.ps.y);
  245. return tempP;
  246. }
  247. /// <summary>
  248. /// 返回两点之间欧氏距离
  249. /// </summary>
  250. /// <param name="p1"></param>
  251. /// <param name="p2"></param>
  252. /// <returns></returns>
  253. public double p2p_di(gPoint p1, gPoint p2)
  254. {
  255. return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
  256. }
  257. /// <summary>
  258. /// 求点到点 中心点P
  259. /// </summary>
  260. /// <param name="l"></param>
  261. /// <returns></returns>
  262. public gPoint p2p_centerP(gPoint p1, gPoint p2)
  263. {
  264. gPoint tempP;
  265. tempP.x = (p1.x + p2.x) * 0.5;
  266. tempP.y = (p1.y + p2.y) * 0.5;
  267. return tempP;
  268. }
  269. /// <summary>
  270. /// 求增量坐标
  271. /// </summary>
  272. /// <param name="ps">起点</param>
  273. /// <param name="val">增量值</param>
  274. /// <param name="ang_direction">角度</param>
  275. /// <returns></returns>
  276. public gPoint p_val_ang(gPoint ps, double val, double ang_direction)
  277. {
  278. gPoint pe;
  279. pe.x = ps.x + val * Math.Cos(ang_direction * Math.PI / );
  280. pe.y = ps.y + val * Math.Sin(ang_direction * Math.PI / );
  281. return pe;
  282. }
  283. /// <summary>
  284. /// 求弧Arc 弧中心方位角
  285. /// </summary>
  286. /// <param name="ps"></param>
  287. /// <param name="pc"></param>
  288. /// <param name="pe"></param>
  289. /// <param name="ccw"></param>
  290. /// <returns></returns>
  291. public double a_AngleCenter_dirdction(gPoint ps, gPoint pc, gPoint pe, bool ccw = false)
  292. {
  293. double angle_s, angle_e, angle_sum, center_dirdction;
  294. if (ccw)
  295. {
  296. angle_s = p_ang(pc, pe);
  297. angle_e = p_ang(pc, ps);
  298. }
  299. else
  300. {
  301. angle_s = p_ang(pc, ps);
  302. angle_e = p_ang(pc, pe);
  303. }
  304. if (angle_s == ) { angle_s = ; }
  305. if (angle_e >= angle_s)
  306. {
  307. angle_sum = - (angle_e - angle_s);
  308. center_dirdction = (angle_s + angle_e) * 0.5 + ;
  309. }
  310. else
  311. {
  312. angle_sum = angle_s - angle_e;
  313. center_dirdction = (angle_s + angle_e) * 0.5;
  314. }
  315. if (center_dirdction > ) { center_dirdction = center_dirdction - ; }
  316. return center_dirdction;
  317. }
  318. /// <summary>
  319. /// 求反方位角
  320. /// </summary>
  321. /// <param name="ang_direction"></param>
  322. /// <returns></returns>
  323. public double p_ang_invert(double ang_direction)//求反方位角
  324. {
  325. if (ang_direction >= )
  326. return ang_direction - ;
  327. else
  328. return ang_direction + ;
  329. }

3.Point,PAD;Line;Arc数据结构

  1. /// <summary>
  2. /// Line 数据类型
  3. /// </summary>
  4. public struct gL
  5. {
  6. public gL(double ps_x, double ps_y, double pe_x, double pe_y, double width_)
  7. {
  8. this.ps = new gPoint(ps_x, ps_y);
  9. this.pe = new gPoint(pe_x, pe_y);
  10. this.negative = false;
  11. this.symbols = "r";
  12. this.attribut = string.Empty;
  13. this.width = width_;
  14. }
  15. public gL(gPoint ps_, gPoint pe_, double width_)
  16. {
  17. this.ps = ps_;
  18. this.pe = pe_;
  19. this.negative = false;
  20. this.symbols = "r";
  21. this.attribut = string.Empty;
  22. this.width = width_;
  23. }
  24. public gL(gPoint ps_, gPoint pe_, string symbols_, double width_)
  25. {
  26. this.ps = ps_;
  27. this.pe = pe_;
  28. this.negative = false;
  29. this.symbols = symbols_;
  30. this.attribut = string.Empty;
  31. this.width = width_;
  32. }
  33. public gPoint ps;
  34. public gPoint pe;
  35. public bool negative;//polarity-- positive negative
  36. public string symbols;
  37. public string attribut;
  38. public double width;
  39. public static gL operator +(gL l1, gPoint move_p)
  40. {
  41. l1.ps += move_p;
  42. l1.pe += move_p;
  43. return l1;
  44. }
  45. public static gL operator +(gL l1, gP move_p)
  46. {
  47. l1.ps += move_p.p;
  48. l1.pe += move_p.p;
  49. return l1;
  50. }
  51. public static gL operator -(gL l1, gPoint move_p)
  52. {
  53. l1.ps -= move_p;
  54. l1.pe -= move_p;
  55. return l1;
  56. }
  57. public static gL operator -(gL l1, gP move_p)
  58. {
  59. l1.ps -= move_p.p;
  60. l1.pe -= move_p.p;
  61. return l1;
  62. }
  63. }
  64. /// <summary>
  65. /// ARC 数据类型
  66. /// </summary>
  67. public struct gA
  68. {
  69. public gA(double ps_x, double ps_y, double pc_x, double pc_y, double pe_x, double pe_y, double width_, bool ccw_)
  70. {
  71. this.ps = new gPoint(ps_x, ps_y);
  72. this.pc = new gPoint(pc_x, pc_y);
  73. this.pe = new gPoint(pe_x, pe_y);
  74. this.negative = false;
  75. this.ccw = ccw_;
  76. this.symbols = "r";
  77. this.attribut = string.Empty;
  78. this.width = width_;
  79. }
  80. public gA(gPoint ps_, gPoint pc_, gPoint pe_, double width_, bool ccw_ = false)
  81. {
  82. this.ps = ps_;
  83. this.pc = pc_;
  84. this.pe = pe_;
  85. this.negative = false;
  86. this.ccw = ccw_;
  87. this.symbols = "r";
  88. this.attribut = string.Empty;
  89. this.width = width_;
  90. }
  91. public gPoint ps;
  92. public gPoint pe;
  93. public gPoint pc;
  94. public bool negative;//polarity-- positive negative
  95. public bool ccw; //direction-- cw ccw
  96. public string symbols;
  97. public string attribut;
  98. public double width;
  99. public static gA operator +(gA arc1, gPoint move_p)
  100. {
  101. arc1.ps += move_p;
  102. arc1.pe += move_p;
  103. arc1.pc += move_p;
  104. return arc1;
  105. }
  106. public static gA operator +(gA arc1, gP move_p)
  107. {
  108. arc1.ps += move_p.p;
  109. arc1.pe += move_p.p;
  110. arc1.pc += move_p.p;
  111. return arc1;
  112. }
  113. public static gA operator -(gA arc1, gPoint move_p)
  114. {
  115. arc1.ps -= move_p;
  116. arc1.pe -= move_p;
  117. arc1.pc -= move_p;
  118. return arc1;
  119. }
  120. public static gA operator -(gA arc1, gP move_p)
  121. {
  122. arc1.ps -= move_p.p;
  123. arc1.pe -= move_p.p;
  124. arc1.pc -= move_p.p;
  125. return arc1;
  126. }
  127. }
  128. /// <summary>
  129. /// PAD 数据类型
  130. /// </summary>
  131. public struct gP
  132. {
  133. public gP(double x_val, double y_val, double width_)
  134. {
  135. this.p = new gPoint(x_val, y_val);
  136. this.negative = false;
  137. this.angle = ;
  138. this.mirror = false;
  139. this.symbols = "r";
  140. this.attribut = string.Empty;
  141. this.width = width_;
  142. }
  143. public gPoint p;
  144. public bool negative;//polarity-- positive negative
  145. public double angle;
  146. public bool mirror;
  147. public string symbols;
  148. public string attribut;
  149. public double width;
  150. public static gP operator +(gP p1, gP p2)
  151. {
  152. p1.p += p2.p;
  153. return p1;
  154. }
  155. public static gP operator -(gP p1, gP p2)
  156. {
  157. p1.p -= p2.p;
  158. return p1;
  159. }
  160. }
  161. /// <summary>
  162. /// 点 数据类型 (XY)
  163. /// </summary>
  164. public struct gPoint
  165. {
  166. public gPoint(gPoint p_)
  167. {
  168. this.x = p_.x;
  169. this.y = p_.y;
  170. }
  171. public gPoint(double x_val, double y_val)
  172. {
  173. this.x = x_val;
  174. this.y = y_val;
  175. }
  176. public double x;
  177. public double y;
  178. public static gPoint operator +(gPoint p1, gPoint p2)
  179. {
  180. p1.x += p2.x;
  181. p1.y += p2.y;
  182. return p1;
  183. }
  184. public static gPoint operator -(gPoint p1, gPoint p2)
  185. {
  186. p1.x -= p2.x;
  187. p1.y -= p2.y;
  188. return p1;
  189. }
  190. }

五.在Genesis或Incam中如何判断是否为连孔

判断2个孔是否为连孔,可以自己写算法实现啦,当然更多人还是会选择奥宝提供DrillChecklist分析出来的的结果来判断是否为连孔.因为你自己写的算法效率没有奥宝的效率高呀

六.实现效果

PCB genesis连孔加除毛刺孔(槽孔与槽孔)实现方法(三)的更多相关文章

  1. PCB genesis连孔加除毛刺孔(圆孔与槽孔)实现方法(二)

    一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...

  2. PCB genesis连孔加除毛刺孔(圆孔与圆孔)实现方法(一)

    一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...

  3. PCB genesis大孔加小孔(即卸力孔)实现方法

    一.为什么 大孔中要加小孔(即卸力孔) 这其实跟钻刀的排屑有关了,当钻刀越大孔,排屑量也越大(当然这也得跟转速,下刀速的参数有关系),通常当钻刀越大,转速越慢,下刀速也越慢(因为要保证它的排屑通畅). ...

  4. PCB genesis自制孔点 Font字体实现方法

    一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个 ...

  5. PCB genesis短槽加引导孔实现方法

    一.何为短槽 短槽通常定义:槽长小于2倍槽宽      如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...

  6. PCB genesis 大孔扩孔(不用G84命令)实现方法

    PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生 ...

  7. PCB genesis孔符制作实现方法

    一.先看genesis原始孔符 孔符的作用:用于表示孔径的大小的一种代号, 当孔径检测时,可以按分孔图中的孔符对应的孔径尺寸对孔径检测. 在实际PCB行业通常不使用原始(图形)孔符,而使用字母孔符(如 ...

  8. PCB Genesis SET拼板(圆形板拼板) 实现效果(二)

    越来发现Genesis采用Surface多边形数据结构的重要性了,当撑握了多边形缩放,交集, 差集,并集等算法, 想实现PCB拼板简直轻而易举了;当然借助多边形算法可以开发出更多的PCB实用的工具出来 ...

  9. PCB genesis Slot槽转钻孔(不用G85命令)实现方法

    PCB钻Slot槽一般都采用G85命令钻槽孔,而采用G85命令工程CAM无法准确的知道Slot槽钻多少个孔,并不能决定钻槽孔的顺序,因为采用G85命令钻孔密度与钻槽顺序由钻机本身决定的.在这里介绍一种 ...

随机推荐

  1. valgrind检查代码内存泄漏,5种内存泄漏情况

    摘要: valgrind是linux下用于调试程序和查找内存泄露的常用工具.valgrind会报告5种内存泄露,"definitely lost", "indirectl ...

  2. JPQL 的基本使用

    一.概念 JPQL 语言,即 Java Persistence Query Language 的简称.JPQL 和 HQL 是非常类似的,支持以面向对象的方式来写 SQL 语句,当然也支持本地的 SQ ...

  3. kubeadmin 安装k8s集群

    系统设置 CentOS Linux release 7.6.1810 (Core) 修改主机名 vim /etc/hostname k8s-master hostname -F /etc/hostna ...

  4. iOS中NSAttributedString的使用--对关键字着色,以及处理html实例

    1,最近项目中用到了一个功能,一个很好的功能.就是用户在搜索的时候,搜索结果出来后对你输入的关键字进行红色标记.这样用户就很请楚的看到自己输入什么后会出现什么样子的结果.还有一个功能是,现在有一段文字 ...

  5. 【2018百度之星资格赛】F 三原色图 - 最小生成树

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6349 Knowledge Point: 最小生成树算法Prim&Kruskal Summari ...

  6. Java 字符串总结

    三种字符串类:String,StringBuilder,StringBuffer String类 1. 常用构造器 构造器   public String(char value[])   public ...

  7. 浅谈对java-GC的理解

    前段时间,一个线上项目忽然很卡,通过监控,发现内存很高,果不其然在几个小时后,OOM.虽说有人很快处理好了.但我还是想站在我的角度,对这件事发表一下自己的观点. 内存溢出,多发生在项目上线后,而且在系 ...

  8. linux下使用tomcat下载中文文件报404not find

    首先,大神指路:http://bbs.csdn.net/topics/391065011?page=1 相关的一些命令: 查看当前系统字符编码:env locale 查看系统支持的字符编码:local ...

  9. 【Codeforces 9989C】A Mist of Florescence

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 四个大角 然后每个大角里面包着一些其他颜色的就好 [代码] #include <bits/stdc++.h> using name ...

  10. 28、Java并发性和多线程-剖析同步器

    以下内容转自http://ifeve.com/anatomy-of-a-synchronizer/: 虽然许多同步器(如锁,信号量,阻塞队列等)功能上各不相同,但它们的内部设计上却差别不大.换句话说, ...