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 ...
随机推荐
- 第二章 设计高质量的React组件
第二章 设计高质量的React组件 高质量React组件的原则和方法: 划分组件边界的原则: React组件的数据种类: React组件的生命周期. 2.1 易于维护组件的设计要素 1.高内聚:指的是 ...
- TFRecordReader "OutOfRangeError (see above for traceback): RandomShuffleQueue '_1_shuffle_batch/random_shuffle_queue' is closed and has insufficient elements (requested 1, current size 0)" 问题原因总结;
1. tf.decode_raw(features['image_raw'],tf.uint8) 解码时,数据类型有没有错?tf.float32 和tf.uint8有没有弄混??? 2. tf.tra ...
- Luogu P1297 [国家集训队]单选错位
P1297 [国家集训队]单选错位 题目背景 原 <网线切割>请前往P1577 题目描述 gx和lc去参加noip初赛,其中有一种题型叫单项选择题,顾名思义,只有一个选项是正确答案.试卷上 ...
- java mysql prepareStatement模糊查询like使用注意
今天在使用mysql 的like语句是,发现prepareStatement的like语句和一般的=写法有一样. 当要使用prepareStatement的like查询时,按照一般写法,都会写成: S ...
- 泛型约束 ---类型参数上的限制(where T:class,new())
今天遇到的一个问题,找到了解决办法,收藏以后记得看一下!
- 关于jupyter notebook
直接点击进行跳转阅读:https://zhuanlan.zhihu.com/p/33105153
- Leetcode 80.删除重复数组的重复项
删除重复数组的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间 ...
- HTTP Simple Storage
ubuntu12.10桌面版 1.安装FastCGI /usr/bin/spawn-fcgi这个文件来管理 FastCGI,它原属于lighttpd这个包里面,但 9.10 后,spawn-fcgi被 ...
- kafka streams
https://docs.confluent.io/current/streams/concepts.html#ktable
- codevs——1430 素数判定
1430 素数判定 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 质数又称素数.指在一个大于1的自然数中, ...