PCB genesis方槽加内角槽孔实现方法

一.为什么方槽孔加内角孔

如下图,客户来的方槽或Slot槽有内角尺寸要求,通常直接钻一个Slot槽孔内角是不能满足客户要求的,这时我们做CAM的需采用小钻刀进行处理.加内角孔或内角槽的方式进行处理了.

二.为什么不建议直接在4个角加内角孔

Slot槽4个角采用加内角孔的方式处理,这样会导致如下图效果,凸起.

三.方槽加内角槽孔方式(里面加4条槽)

1.常规槽宽则计算方式:

内角槽孔宽度:(W-0.1mm)/2

如:2.0X5.0mm槽宽,内角要求最大r0.5mm  那么内角槽宽为(2-0.1)/2 =0.95mm

2.特殊情况内角槽宽(不能满足内角尺寸要求):

如:2.0X3.0mm,内角要求最大r0.4mm,如按上面常规计算内角槽宽(1-0.1)/2=0.95mm

选用0.95mm钻刀,无法满足r0.4mm内角尺寸要求,这时需选用0.8mm钻刀

3.特殊情况槽宽(无槽刀):

如:1.0X3.0mm,内角要求最大r0.3mm,如按上面常规计算内角槽宽(1-0.1)/2=0.45mm

实际没有0.45mm槽刀,那这种情况,需选0.6mm槽刀,存在短槽孔时,钻刀需减速慢钻

此计算未考虑补偿,如真实计算需将钻孔补偿考虑进来.

四.C#简易代码实现:

1.方槽加内角槽孔代码

       #region 方槽  加内角孔
            gLayer glayer = g.getFEATURES($"{"drl"}", g.STEP, g.JOB, "mm", true);
            foreach (var item in glayer.Llist)
            {
                List<gL> glList = calc2.l_InnerLine(item);
                addCOM.line(glList);
            }
            #endregion

2.计算函数

/// <summary>
        /// 将线段转为内切边的4条线段
        /// </summary>
        /// <param name="l"></param>
        /// <param name="SlotWidth">4个SLOT槽宽  当为0时,自动计算SLOT槽宽</param>
        /// <param name="UpVal">单边预大值</param>
        /// <returns></returns>
        public List<gL> l_InnerLine(gL l, double SlotWidth = 0, double UpVal = 0)
        {
            List<gL> lineList = new List<gL>();
            double width = l.width * 0.001;
            if (SlotWidth < 0.001)
            {
                SlotWidth = ((width + UpVal * 2) - 0.1)*0.5;
                SlotWidth = ((int)(Math.Floor((SlotWidth * 1000) / 50)) * 50) * 0.001; ;
            }
            double val = (width - SlotWidth)* 0.5 + UpVal ;
            double ang_direction = p_ang(l);
            double length = width + UpVal * 2 - SlotWidth;
            gL gL1 = p_val_angL(l.pe, val, ang_direction, length);
            gL1.width = SlotWidth * 1000;
            gL gL2 = p_val_angL(l.ps, val, p_ang_invert(ang_direction), length);
            gL2.width = SlotWidth * 1000;
            lineList.Add(gL1);
            lineList.Add(gL2);
            lineList.Add(new gL(gL1.ps, gL2.pe, gL1.width));
            lineList.Add(new gL(gL1.pe, gL2.ps, gL1.width));
            return lineList;
        }
        /// <summary>
        /// 求方位角
        /// </summary>
        /// <param name="l"></param>
        /// <returns></returns>
        public double p_ang(gL l)//求方位角
        {
            return p_ang(l.ps, l.pe);
        }
        /// <summary>
        /// //求增量T  线L坐标
        /// </summary>
        /// <param name="ps"></param>
        /// <param name="val"></param>
        /// <param name="ang_direction"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public gL p_val_angL(gPoint ps, double val, double ang_direction, double length = 2)
        {
            gPoint pe = p_val_ang(ps, val, ang_direction);
            gL tempL;
            tempL.ps = p_val_ang(pe, length * 0.5, ang_direction + 90);
            tempL.pe = p_val_ang(pe, length * 0.5, ang_direction - 90);
            tempL.negative = false;
            tempL.attribut = "";
            tempL.symbols = "";
            tempL.width = 121;
            return tempL;
        }
        /// <summary>
        /// 求反方位角
        /// </summary>
        /// <param name="ang_direction"></param>
        /// <returns></returns>
        public double p_ang_invert(double ang_direction)//求反方位角
        {
            if (ang_direction >= 180)
                return ang_direction - 180;
            else
                return ang_direction + 180;
        }
        /// <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;Line数据结构

/// <summary>
    /// Line 数据类型
    /// </summary>
    public struct gL
    {
        public gL(double ps_x, double ps_y, double pe_x, double pe_y, double width_)
        {
            this.ps = new gPoint(ps_x, ps_y);
            this.pe = new gPoint(pe_x, pe_y);
            this.negative = false;
            this.symbols = "r";
            this.attribut = string.Empty;
            this.width = width_;
        }
        public gL(gPoint ps_, gPoint pe_, double width_)
        {
            this.ps = ps_;
            this.pe = pe_;
            this.negative = false;
            this.symbols = "r";
            this.attribut = string.Empty;
            this.width = width_;
        }
        public gL(gPoint ps_, gPoint pe_, string symbols_, double width_)
        {
            this.ps = ps_;
            this.pe = pe_;
            this.negative = false;
            this.symbols = symbols_;
            this.attribut = string.Empty;
            this.width = width_;
        }
        public gPoint ps;
        public gPoint pe;
        public bool negative;//polarity-- positive  negative
        public string symbols;
        public string attribut;
        public double width;
        public static gL operator +(gL l1, gPoint move_p)
        {
            l1.ps += move_p;
            l1.pe += move_p;
            return l1;
        }
        public static gL operator +(gL l1, gP move_p)
        {
            l1.ps += move_p.p;
            l1.pe += move_p.p;
            return l1;
        }
        public static gL operator -(gL l1, gPoint move_p)
        {
            l1.ps -= move_p;
            l1.pe -= move_p;
            return l1;
        }
        public static gL operator -(gL l1, gP move_p)
        {
            l1.ps -= move_p.p;
            l1.pe -= move_p.p;
            return l1;
        }
    }
    /// <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/9906536.html

时间: 2024-08-30 01:18:59

PCB genesis方槽加内角槽孔实现方法的相关文章

PCB Genesis 外形加内角孔实现方法

在PCB工程制作CAM时,经常会遇到外形拐角处直角的,而客户对内角是要求,比如最大内角要求R0.5mm或者不接受内角, 但成型方式为铣方式,又不是啤板成型,那怎么处理才可以达到要求效果呢,在这里介绍2种方法. 一.采用大小锣刀分2次锣外形 由于采用2次锣,此效率较低,目前PCB行业基本已放弃此方法了处理内角了, 要知道我们PCB行业是非常很重视效率,为了提高效率,PCB行业普遍采用第2种方法(详见方法2) 二.在外形拐角处加----内角孔 方槽为直角时,用直径2.0mm锣刀,内角无法锣出直角效果

PCB genesis加尾孔实现方法

一.为什么增加尾孔呢 看一看下图在panel中增加尾孔的效果;如下图所示,主要有2点原因. 1.孔径大小测量 假设如果不增加尾孔,要检测孔径大小是否符合要求,那么QA检测会选择最后钻的孔进大小进行测量, 但钻孔路径优化后,是不知道哪个孔是最后一个孔钻孔,为了让钻孔QA清楚的知道哪个孔是尾孔,CAM制作时会将每把刀最一个孔放到统一的一个区域内排列. 2.防止漏钻刀 如果最后一把刀尾孔漏钻了,那么QA一眼就看出来漏钻刀了 说一下钻孔工序QA检测孔径要求是:用针规全部测量其尾孔,并随机测量一些板内的孔

PCB genesis连孔加除毛刺孔(槽孔与槽孔)实现方法(三)

一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔,并钻进去一点(常规进去1-2mil),这样就可以将纤维毛刺去除 (没找到SLOT槽与SLOT槽的实物图.就用SLOT槽与圆孔吧,产生毛刺效果也是一样的) PCB同行业毛刺问题处理办法 钻孔孔内毛刺问题分析改善报告 二.如何判断除毛刺孔加多少个? 在PCB行业工程加除毛刺孔加多少个也没有太明确的定义,

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

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

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

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

优化加载jQuery的方法

请看下面的一段代码: 1 <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 2 <script type="text/javascript"> 3 window.jQuery || document.write("<script src='__ADMIN_JS__/jquery-2.0.3.

减短页面加载时间的方法

1>css的定义放在文件头部 2>js脚本放在文件末尾 3>压缩js,css代码 4>服务器开启giip压缩 5>尽量减少页面中重复出现的http请求数量 减短页面加载时间的方法,布布扣,bubuko.com

利用CSS、JavaScript及Ajax实现图片预加载的三大方法

原文:3 Ways to Preload Images with CSS, JavaScript, or Ajax 译文:利用CSS.JavaScript及Ajax实现图片预加载的三大方法 预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性.

jquery加载页面的方法(页面加载完成就执行)

jquery加载页面的方法(页面加载完成就执行) jquery加载页面的方法(页面加载完成就执行),建议大家看下windows.onload与$(document).ready之间的区别. 1.$(function(){  $("#a").click(function(){  //adding your code here  }); }); 2.$(document).ready(function(){  $("#a").click(function(){  //a