PCB genesis加尾孔实现方法

一.为什么增加尾孔呢

看一看下图在panel中增加尾孔的效果;如下图所示,主要有2点原因.

1.孔径大小测量

假设如果不增加尾孔,要检测孔径大小是否符合要求,那么QA检测会选择最后钻的孔进大小进行测量, 但钻孔路径优化后,是不知道哪个孔是最后一个孔钻孔,为了让钻孔QA清楚的知道哪个孔是尾孔,CAM制作时会将每把刀最一个孔放到统一的一个区域内排列。

2.防止漏钻刀

如果最后一把刀尾孔漏钻了,那么QA一眼就看出来漏钻刀了

说一下钻孔工序QA检测孔径要求是:用针规全部测量其尾孔,并随机测量一些板内的孔,检查有无孔大孔小

二.增加尾孔有哪些要求

1.尾孔钻刀大小排序

正常是尾孔的钻刀排序和钻孔输出的钻刀排序一致,每个工厂钻刀排序不同,需结合每个工厂排刀要求而定,通常钻孔是:先排工具孔,再排圆孔,再排槽孔,接着再排除尘孔。这里测试代码钻刀从小到大排列(见下方代码)。

2.尾孔间距

尾孔间距要求比较宽松,0.5-2.0mm之间,一般取中间值就好了,但如遇到钻刀数太多了,会导致孔整个尾孔区域的长度超长了,尾孔会与其它图形或钻孔重叠,这时候可以考虑钻孔间距减少一些了.

3.尾孔位置

通常尾孔加到板角, 尾孔的方向如下图所示

三.C#简易代码实现:

1.方槽加内角槽孔代码

            //钻孔尺寸按小到大排序      实际钻刀输出钻刀排序进行排序
            var OrderSizeList = symbolsList.OrderBy(tt => tt.width).Select(tt=>tt.width *0.001 ).ToList();

            gPoint StartPoint = new gPoint(300, 100); //起点
            double Hole2Hole = 1;//孔边到孔边
            double Ang_direction = 45; //方位角
            List<gP> HoleList =  calc2.p_2plist(OrderSizeList, StartPoint, Hole2Hole, Ang_direction);
            addCOM.pad(HoleList);

2.计算函数

        /// <summary>
        /// 通过已排序孔大小列表生成点链
        /// </summary>
        /// <param name="OrderSizeList">已排序钻孔</param>
        /// <param name="StartPoint">起始点</param>
        /// <param name="Hole2Hole">孔边到孔边</param>
        /// <param name="Ang_direction">方位角</param>
        /// <returns></returns>
        public List<gP> p_2plist(List<double> OrderSizeList, gPoint StartPoint, double Hole2Hole, double Ang_direction)
        {
            List<gP> HoleList = new List<gP>();
            gPoint newP = StartPoint;
            int HoleSizeCount = OrderSizeList.Count();
            double PreRadSize = 0;
            if (HoleSizeCount > 0)
            {
                HoleList.Add(new gP(newP, OrderSizeList[0] * 1000));
                PreRadSize = OrderSizeList[0] * 0.5;
            }
            for (int i = 1; i < HoleSizeCount; i++)
            {
                var val = PreRadSize + Hole2Hole + OrderSizeList[i] * 0.5;
                newP = p_val_ang(newP, val, Ang_direction);
                HoleList.Add(new gP(newP, OrderSizeList[i] * 1000));
                PreRadSize = OrderSizeList[i] * 0.5;
            }
            return HoleList;
        }
       /// <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 / 180);
            pe.y = ps.y + val * Math.Sin(ang_direction * Math.PI / 180);
            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 = 0;
            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;
        }
    }

四.实现效果

原文地址:https://www.cnblogs.com/pcbren/p/9906545.html

时间: 2024-10-08 17:56:22

PCB genesis加尾孔实现方法的相关文章

PCB Genesis加邮票孔(邮票孔增加方向判断--左右上下)实现算法

之前没解决的问题,当时一下卡在用户界面选择邮票孔增加的方向(上下左右) 与邮票孔实际方位之前的逻辑与非判断上卡壳了,导致一下没进展下去. 回头看原来如此简单 ,将此点记录一下. 1.垂直线定义:80--100 或 260--2802 水平线定义:<10 或 >350 或 170--1903.两个外形中心作一条中心分割线,4.计算此分割线角度来判断是否垂直或水平 那么就可以判断加邮标孔是上下左右方向了 如果非垂直或水平 分割线,即无法有效判断邮票孔增加的方位了(默认为2边加) 原文地址:http

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

越来发现Genesis采用Surface多边形数据结构的重要性了,当撑握了多边形缩放,交集, 差集,并集等算法, 想实现PCB拼板简直轻而易举了;当然还可以制作出更多的PCB实用的工具来,下面将圆形板拼板实现效果展示出来. 可参考下面另外2篇 拼板与加邮票孔方法 PCB Genesis拼SET画工艺边 实现方法(一) PCB Genesis加邮票孔(弧与弧)实现算法  拼圆板实现效果 1.邮票连接位参数设置 2.圆形拼板参数设置 皮面积对比 原文地址:https://www.cnblogs.co

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

一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个性化需求,比如:孔密度,孔间距,孔形状分布,如果有一些个性化需求时必须得自己可以编辑孔点字体才可以满足要求,可以奥宝没有提供这样的工具给我们,在这里就介绍用genesis自制Font字体实现方法 二.Font字体坐标文件制作说明 Font字符坐标文件放在genesis安装目录:C:\genesis\

Android处理延时加载的方法

在项目开发中,经常需要通过延时加载来实现满足我们的项目要求.那到底怎样来实现延时,下面结合java与android的相关方法来实现延时问题. 一.利用线程的Sleep方法 <span style="font-family:Microsoft YaHei;font-size:18px;"><span style="white-space:pre"> </span>new Thread(new Runnable(){ @Overrid

js jquery 页面加载初始化方法

一.js页面加载初始化方法 // 1.在body里面写初始化方法. <body onload='init()'> </body> <script type="text/javascript"> function init(){ // 初始化内容 } </script> // 2.window.onload=function(){} <script type="text/javascript"> window

php利用自定义key,对数据加解密的方法

客户端和服务端通信时,有个场景很常见,通过一个id作为url参数来回传递.假设现在业务上只有这个id标识,那么需要稍微安全一点的通信,对这个id进行加密传输,到服务端再进行解密.这里需要一个服务端进行保密的key,利用这个key进行加密和解密. 加解密的方法如下:$str是需要加解密的字符串,$key是自己定义的一个key // 加密 function encryptStr($str, $key){ $block = mcrypt_get_block_size('des', 'ecb'); $p

Fragment的可见再加载的方法(真正的Fragment的OnResume和OnPause)

一 起因 我们在做应用的过程中,一个应用的界面可能是多个Fragment切换而成的,但是如果在每次应用启动的时候就去加载大量的网络数据(假设你的每个Fragment都需要加载网络数据,你也可以理解为初始化大量资源)肯定是不好的,能不能有一种方法可以在我们看到我们的Fragment时再去加载对应的Fragment的数据呢? 当然是有的. 二 解决 Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPage

html页面加载初始化方法

js: 方法一: window.onload=function(){内容} 方法二(自己定义方法): function onload(){内容} onload(); jQuery: 方法一: $(document).ready(function(){内容}); 方法二: $(function(){内容}); 方法三: jQuery(function($){内容}); 注意:由于jquery使用$符号,这样和有些组件 ,例如dwr就有冲突,为了解决这个问题,可以使用:var j = jQuery.

使用CSS、JavaScript及Ajax实现图片预加载的方法详解 

预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享使用CSS.JavaScript及Ajax实现图片预加载的三个不同技术,来增强网站的性能与可用性.一起来看看吧,希望对大家学习web前端有所帮助. 方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS