PCB genesis大孔加小孔(即卸力孔)实现方法
一.为什么 大孔中要加小孔(即卸力孔)
这其实跟钻刀的排屑有关了,当钻刀越大孔,排屑量也越大(当然这也得跟转速,下刀速的参数有关系),通常当钻刀越大,转速越慢,下刀速也越慢(因为要保证它的排屑通畅)。
这里科普一下钻刀的【进刀速度】,【转速】,【进刀量】之间的关系是怎样的.
进刀速度、转速之间的关系对于钻头来讲,切削量越大,产生的粉尘颗粒就会更大,部分切屑尤其是铜丝,会缠绕到钻头,从而严重影响孔壁的质量。相应的,切削量越小,在钻孔时,钻头停留在孔内的时间就会越长,产生的钻污就会越多。
进刀量、转速之间的关系如果转速太高,会导致线速度增大。从而影响钻头的平稳性和动态平衡性。合适的参数可以达到合理的切削性,保证下钻过程中受力对准度和均匀性。反之会影响孔壁的凹凸度,还会产生渗铜
为了保证大孔的排屑性能好,PCB行业作法是,在钻大孔之前,提前在大孔中间钻几个小孔,先让小孔排除一定孔屑,等再钻大孔时,孔屑变少了。不会再造成大孔排屑不畅。
二.大孔加小孔实现原理
求解方法:(具体可以看下方函数)
1.通过已知大孔6.0mm,小孔与小孔间距:0.2mm
小孔个数,求出最大内切孔尺寸=2.585mm
2.最大内切孔2.585mm,向下取整 钻刀为2.55mm
3. 求大圆中心到小圆中心距离
(6-0.1*2-2.55)*0.5=1.625mm
4.以大圆为中心,并3个小孔的以圆心角为120度依次旋转,即可得到3个小圆坐标
三.C#简易代码实现:
1.大孔加小孔代码
- #region 大孔加卸力孔 ydkdrl
- List<gP> MaxHoleList = glayer.Plist.Where(tt => tt.width >= && tt.width <= ).ToList();
- if (MaxHoleList.Count() > )
- {
- for (int i = ; i < MaxHoleList.Count; i++)
- {
- //求内切孔函数共6参数 大孔尺寸 小孔尺寸 小孔个数 小孔与小孔间距 小孔与大孔间距 旋转角度
- //当小孔尺寸不填,由函数自动计算小孔孔径,否则以填写小孔孔径为准
- List<gP> smallHoleList = calc2.p_small_hole_Plist(MaxHoleList[i], , , 0.2, 0.1,);
- addCOM.pad(smallHoleList);
- }
- }
- #endregion
2.计算函数(关键在于此函数实现)
- /// <summary>
- /// 求点P【内切圆Plist坐标】
- /// </summary>
- /// <param name="p">点P</param>
- /// <param name="small_hole_size">内切圆尺寸,填写为0时自动计算</param>
- /// <param name="small_hole_count">内切圆个数</param>
- /// <param name="small2small">内切圆与内切圆间距</param>
- /// <param name="small2big">内切圆与外圆间距</param>
- /// <param name="ang_rotate">内切圆转旋角度</param>
- /// <param name="units">单位:mm/inch</param>
- /// <returns>返回:【内切圆Plist坐标】</returns>
- public List<gP> p_small_hole_Plist(gP p, double small_hole_size, double small_hole_count = , double small2small = , double small2big = , double ang_rotate = )
- {
- List<gP> list_p = new List<gP>();
- double ang_single, ang_sum, dia_hole;
- gP tempP;
- tempP.mirror = false;
- tempP.attribut = "";
- tempP.angle = ;
- tempP.negative = false;
- tempP.symbols = "";
- dia_hole = p.width / - small2big * ; //units mm
- p.width = p.width - small2big * ; //units um
- if (small_hole_size < 0.001)
- small_hole_size = Math.Floor(p_small_hole_size(p, small2small, small_hole_count) / 0.05) * 0.05; //um-->mm
- ang_single = / small_hole_count;
- ang_sum = - ang_rotate;
- for (int i = ; i <= small_hole_count - ; i++)
- {
- tempP.p = p_val_ang(p.p, (dia_hole - small_hole_size) * 0.5, ang_sum);
- tempP.width = small_hole_size * ;
- tempP.symbols = "r" + tempP.width.ToString();
- ang_sum += ang_single;
- list_p.Add(tempP);
- }
- return list_p;
- }
- /// <summary>
- /// 求点P【最大内切圆尺寸】
- /// </summary>
- /// <param name="p">点P</param>
- /// <param name="small_hole_space">内切圆与内切圆间距</param>
- /// <param name="small_hole_count">内切圆个数</param>
- /// <returns>返回:【内切圆尺寸】</returns>
- public double p_small_hole_size(gP p, double small_hole_space = , double small_hole_count = )
- {
- double sin_val = Math.Sin( / small_hole_count * Math.PI / );
- return (sin_val * p.width * 0.0005 - 0.5 * small_hole_space) / ( + sin_val) * ;
- }
- /// <summary>
- /// 求增量坐标
- /// </summary>
- /// <param name="ps">起点</param>
- /// <param name="val">增量值</param>
- /// <param name="ang_direction">角度</param>
- /// <returns></returns>
- public gPoint p_val_ang(gPoint ps, double val, double ang_direction)
- {
- gPoint pe;
- pe.x = ps.x + val * Math.Cos(ang_direction * Math.PI / );
- pe.y = ps.y + val * Math.Sin(ang_direction * Math.PI / );
- return pe;
- }
3.Point,PAD数据结构
- /// <summary>
- /// PAD 数据类型
- /// </summary>
- public struct gP
- {
- public gP(double x_val, double y_val, double width_)
- {
- this.p = new gPoint(x_val, y_val);
- this.negative = false;
- this.angle = ;
- this.mirror = false;
- this.symbols = "r";
- this.attribut = string.Empty;
- this.width = width_;
- }
- public gPoint p;
- public bool negative;//polarity-- positive negative
- public double angle;
- public bool mirror;
- public string symbols;
- public string attribut;
- public double width;
- public static gP operator +(gP p1, gP p2)
- {
- p1.p += p2.p;
- return p1;
- }
- public static gP operator -(gP p1, gP p2)
- {
- p1.p -= p2.p;
- return p1;
- }
- }
- /// <summary>
- /// 点 数据类型 (XY)
- /// </summary>
- public struct gPoint
- {
- public gPoint(gPoint p_)
- {
- this.x = p_.x;
- this.y = p_.y;
- }
- public gPoint(double x_val, double y_val)
- {
- this.x = x_val;
- this.y = y_val;
- }
- public double x;
- public double y;
- public static gPoint operator +(gPoint p1, gPoint p2)
- {
- p1.x += p2.x;
- p1.y += p2.y;
- return p1;
- }
- public static gPoint operator -(gPoint p1, gPoint p2)
- {
- p1.x -= p2.x;
- p1.y -= p2.y;
- return p1;
- }
- }
四.大孔加小孔脚本UI
五.实现效果
PCB genesis大孔加小孔(即卸力孔)实现方法的更多相关文章
- PCB genesis 大孔扩孔(不用G84命令)实现方法
PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生 ...
- PCB genesis连孔加除毛刺孔(圆孔与槽孔)实现方法(二)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- PCB genesis连孔加除毛刺孔(圆孔与圆孔)实现方法(一)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- PCB genesis短槽加引导孔实现方法
一.何为短槽 短槽通常定义:槽长小于2倍槽宽 如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...
- PCB genesis连孔加除毛刺孔(槽孔与槽孔)实现方法(三)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- PCB genesis自制孔点 Font字体实现方法
一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个 ...
- PCB genesis孔符制作实现方法
一.先看genesis原始孔符 孔符的作用:用于表示孔径的大小的一种代号, 当孔径检测时,可以按分孔图中的孔符对应的孔径尺寸对孔径检测. 在实际PCB行业通常不使用原始(图形)孔符,而使用字母孔符(如 ...
- PCB Genesis SET拼板(圆形板拼板) 实现效果(二)
越来发现Genesis采用Surface多边形数据结构的重要性了,当撑握了多边形缩放,交集, 差集,并集等算法, 想实现PCB拼板简直轻而易举了;当然借助多边形算法可以开发出更多的PCB实用的工具出来 ...
- 转载:PCB名詞解釋:通孔、盲孔、埋孔
在[電子製造業]打滾多年,分享 SMT.焊錫.塑膠射出.產品設計.瓦楞包裝…等經驗.請注意文章內容不見得都正確,服用前請三思… 之前有網友提醒我有篇文章把PCB的盲孔(Blind hole).埋孔(B ...
随机推荐
- Spring Security 介绍与Demo
一.Spring Security 介绍 Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型.我们仅需引入spring-boot-s ...
- [Python数据结构] 使用 Circular List实现Queue
[Python数据结构] 使用 Circular List实现Queue 1. Queue队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体 ...
- uWSGI+nginx+django+virtualenv+supervisor部署项目
一.前言 在部署项目前,你已有一个能够在你本机测试过,能正常启动的Django项目(毕竟本文主要讲解部署Django项目),以及掌握了Linux系统的一些基本命令. 相关链接: Centos7安装py ...
- ubuntu 常见的操作命令
原博客地址为:https://blog.csdn.net/qq_33421080/article/details/76551554 1.cd命令: cd:切换到当前用户根目录,默认[/home/用户名 ...
- linux的ssh相关指令
1.安装ssh apt-get install openssh-server 2.备份ssh的配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_confi ...
- 简述Centos系统启动流程
1. Centos5 POST开机自检 运行CMOS中的BIOS程序,加载第一个启动磁盘的Bootloader 由Bootloader读取kernel 通过挂载临时根目录initramfs加载核心模块 ...
- L2-012. 关于堆的判断(STL中heap)
L2-012. 关于堆的判断 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ...
- juruo的刷题&博文祭
Nothing--- 祭我bzoj过66题,博文240篇(.弱.) 自娱(愚)自乐下-
- 【网络流24题】最长k可重区间集问题(费用流)
[网络流24题]最长k可重区间集问题 [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a>< ...
- Contemplation! Algebra 矩阵快速幂
Given the value of a+b and ab you will have to find the value of a n + b n Input The input file cont ...