0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实现PCB板边倒圆角

GReq_mcu168 来源:硬件攻城狮 作者:硬件攻城狮 2022-05-07 14:28 次阅读

PCB外形是直角时,通常工程制作外形(锣带)时,会将直角或尖角的地方倒成圆角,主要是为了防止PCB容易划伤板他扎伤人。

所以当客户没有特殊要求时,PCB外形是直角一般会默认倒角0.5mm圆角(如下图所示)

3db32ea6-cdce-11ec-bce3-dac502259ad0.png

一.PCB板边倒圆角点分析

原PCB外形如下图图示:看了这个PCB外形,产生有2个问题点:

1.外形中哪些点需倒圆角?

2.如何怎么倒圆角?

3dc63546-cdce-11ec-bce3-dac502259ad0.png

1.外形中哪些点需倒圆角?

看下图: PCB外形倒圆角的点,刚好就是我们凸包需求出的点,接下来我们将玩转凸包了,只要求出凸包,那么就可以实现PCB板边倒圆角啦。

3dd71b9a-cdce-11ec-bce3-dac502259ad0.png

求凸包的算法我们可以借鉴算法导论中的查找凸包的算法(加以改进得到新的求凸包方法,详见【方法一】与【方法二】)

3de81756-cdce-11ec-bce3-dac502259ad0.png

2.如何倒圆角?

在下面有说明倒角方法.

二. 求凸点

方法一求凸点:【采用多轮遍历,一遍一遍将凹点踢除,剩于的即是凸点】

3df77002-cdce-11ec-bce3-dac502259ad0.gif

方法一求凸点: 代码

3e2aace2-cdce-11ec-bce3-dac502259ad0.jpg

        /// 
        /// 求最大多边形最大凸包1  【采用多轮遍历将凹点踢除,剩于的即是凸点】
        /// 
        /// 
        /// 
        public List s_convex_polyon1(List gSur_Point_list)
        {
            add addCOM = new add();
            bool isOK = true;
            List PointList = new List();
            var isCCW = s_isCCW(gSur_Point_list);
            int sum = gSur_Point_list.Count() - 1;
            int n = gSur_Point_list.Count();
            for (int i = 0; i < n; i++)
            {
                int IndexPre = (i - 1) % sum;
                if (IndexPre == -1) IndexPre = sum - 1;
                int IndexCurrent = i % sum;
                int IndexNext = (i + 1) % sum;
                if (gSur_Point_list[IndexPre].type_point > 0) continue;
                if (gSur_Point_list[IndexCurrent].type_point > 0) continue;
                var multiVal = multi(gSur_Point_list[IndexPre].p, gSur_Point_list[IndexCurrent].p, gSur_Point_list[IndexNext].p);
                if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0))
                    PointList.Add(gSur_Point_list[IndexCurrent]);
                else
                    isOK = false;
            }
            List Point2List = new List(PointList);
            while (!isOK)
            {
                isOK = true;
                PointList.Clear();
                PointList.AddRange(Point2List);
                Point2List.Clear();
                sum = PointList.Count() - 1;
                n = PointList.Count();
                for (int i = 0; i < n; i++)
                {
                    int IndexPre = (i - 1) % sum;
                    if (IndexPre == -1) IndexPre = sum - 1;
                    int IndexCurrent = i % sum;
                    int IndexNext = (i + 1) % sum;
                    var multiVal = multi(PointList[IndexPre].p, PointList[IndexCurrent].p, PointList[IndexNext].p);
                    if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0))
                        Point2List.Add(PointList[IndexCurrent]);
                    else
                        isOK = false;
                }
            }
            return Point2List;
        }

3e2aace2-cdce-11ec-bce3-dac502259ad0.jpg

方法二求凸包【采用一边遍历找出凸点并加入队列,并同时将队列中的凸点队列中找出凹点踢除】

3e48bfde-cdce-11ec-bce3-dac502259ad0.gif

方法二求凸包代码:

3e2aace2-cdce-11ec-bce3-dac502259ad0.jpg

        /// 
        /// 求最大多边形最大凸包2  【采用一边遍历找出凸点并加入队列,并同时将队列中的凸点队列中找出凹点踢除】
        /// 
        /// 
        /// 
        public List s_convex_polyon2(List gSur_Point_list)
        {
            Stack StackPoint = new Stack();
            var isCCW = s_isCCW(gSur_Point_list);
            int sum = gSur_Point_list.Count() - 1;
            int n = gSur_Point_list.Count();
            for (int i = 0; i < n; i++)
            {
                int IndexPre = (i - 1) % sum;
                if (IndexPre == -1) IndexPre = sum - 1;
                int IndexCurrent = i % sum;
                int IndexNext = (i + 1) % sum;
                if (gSur_Point_list[IndexPre].type_point > 0) continue;
                if (gSur_Point_list[IndexCurrent].type_point > 0) continue;
                var multiVal = multi(gSur_Point_list[IndexPre].p, gSur_Point_list[IndexCurrent].p, gSur_Point_list[IndexNext].p);
                if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0))
                {
                    L1:
                    if (StackPoint.Count > 1)
                    {
                        var Top1Point = StackPoint.Pop();
                        var Top2Point = StackPoint.Peek();
                        multiVal = multi(Top2Point.p, Top1Point.p, gSur_Point_list[IndexCurrent].p);
                        if ((isCCW && multiVal > 0) || (!isCCW && multiVal < 0))
                            StackPoint.Push(Top1Point);
                        else
                            goto L1;   
                    }
                    StackPoint.Push(gSur_Point_list[IndexCurrent]);
                }
            }
            return StackPoint.Reverse().ToList();
        }

3e2aace2-cdce-11ec-bce3-dac502259ad0.jpg

方法三求凸包:按算法导论Graham扫描法 各节点按方位角+距离 逆时针排序 依次检查,当不属凸点于则弹出】

3e796c88-cdce-11ec-bce3-dac502259ad0.gif

方法三求凸包代码

3e2aace2-cdce-11ec-bce3-dac502259ad0.jpg

        /// 
        /// 求最大多边形最大凸包5  【按算法导论Graham扫描法 各节点按方位角+距离 逆时针排序  依次检查,当不属凸点于则弹出】
        /// 由于把各点的排列顺序重新排序了,只支持折线节点(当存在弧节点时会出异常 !!!)
        /// 
        /// 
        /// 
        public List s_convex_polyon3(List gSur_Point_list)
        {
            var LeftBottomPoint = gSur_Point_list.OrderBy(tt => tt.p.y).ThenBy(tt => tt.p.x).FirstOrDefault();
            gSur_Point_list.RemoveAt(gSur_Point_list.Count - 1);
            gSur_Point_list.ForEach(tt =>
                                        {
                                            tt.Value = p2p_di(LeftBottomPoint.p, tt.p);
                                            tt.Angle = p_ang(LeftBottomPoint.p, tt.p);
                                        }
                );
            gSur_Point_list = gSur_Point_list.OrderBy(tt => tt.Angle).ThenBy(tt => tt.Value).ToList();
            gSur_Point_list.Add(gSur_Point_list[0]);
            Stack StackPoint = new Stack();
            var isCCW = true;
            int sum = gSur_Point_list.Count() - 1;
            int n = gSur_Point_list.Count();
            for (int i = 0; i < n; i++)
            {
                int IndexPre = (i - 1) % sum;
                if (IndexPre == -1) IndexPre = sum - 1;
                int IndexCurrent = i % sum;
                int IndexNext = (i + 1) % sum;
                var multiVal = multi(gSur_Point_list[IndexPre].p, gSur_Point_list[IndexCurrent].p, gSur_Point_list[IndexNext].p);
                if (isCCW && multiVal > 0)
                {
                    L1:
                    if (StackPoint.Count > 1)
                    {
                        var Top1Point = StackPoint.Pop();
                        var Top2Point = StackPoint.Peek();
                        multiVal = multi(Top2Point.p, Top1Point.p, gSur_Point_list[IndexCurrent].p);
                        if (isCCW && multiVal > 0)
                            StackPoint.Push(Top1Point);
                        else
                            goto L1;
                    }
                    StackPoint.Push(gSur_Point_list[IndexCurrent]);
                }
            }
            return StackPoint.Reverse().ToList();
        }

3e2aace2-cdce-11ec-bce3-dac502259ad0.jpg

公共方法与数据结构

3ec8fc30-cdce-11ec-bce3-dac502259ad0.jpg View Code

三.板边凸点倒圆角方法

方法一:也最简单的倒角方法,我们将PCB板边凸点找出来后,可以直接借助genesis倒角功能就可以实现了

当然但偶尔会报错的, 且当N个小线段组成的尖角倒角会出错(要实现完美效果只有自己写倒角算法啦)

3ed7367e-cdce-11ec-bce3-dac502259ad0.png

方法二:自己写倒角算法,这个算法和加内角孔算法类似(这里只是介绍简单的倒角)考虑特殊的需要扩展

可以参考这篇文章:https://www.cnblogs.com/pcbren/p/9665304.html

3eec441a-cdce-11ec-bce3-dac502259ad0.png

四.凸点加倒圆角实现效果

3efbd40c-cdce-11ec-bce3-dac502259ad0.gif

——End——

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • pcb
    pcb
    +关注

    关注

    4220

    文章

    22472

    浏览量

    385744
  • PCB板
    +关注

    关注

    27

    文章

    1372

    浏览量

    50335

原文标题:很好的实现PCB板边倒圆角~

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    布置在PCB板边缘的敏感线为何容易ESD干扰

    布置在PCB板边缘的敏感线为何容易ESD干扰 [现象描述] 某接地台式产品,对接地端子处进行测
    发表于 10-07 10:53 1378次阅读

    基于PCB 板的边倒圆角实现方案解析

    PCB 外形是直角时, 通常工程制作外形 (锣带) 时, 会将直角或尖角的地方倒成圆角, 主要是为了防止板边容易划伤板且容易扎伤人。
    的头像 发表于 03-02 14:11 5008次阅读

    pcb圆角边设置

    `请问各位高手,protel里如何将pcb的板的四个角边设置成圆角边啊?`
    发表于 03-08 18:38

    DXP2004怎么设置PCB板边

    急急急!在PCB板里我在Design 命令里重新裁剪了图纸大小但是主管说要设置出板边不然不知道板子大小求解
    发表于 08-09 14:11

    PCB生产为什么要做拼板及板边

    1、为什么PCB生产时要做「拼板(panelization)」?2、PCB板边(break-away/coupon)又是做什么用的呢?3、不是说板材使用得越少就越便宜吗?板材使用率又是怎么一回事
    发表于 10-01 18:39

    请问AD PCB直角布线怎么批量改为圆角

    `AD PCB 直角布线批量改为圆角,怎么批量修改呢? `
    发表于 03-19 00:25

    PCB板电镀时板边烧焦的原因

    `请问PCB板电镀时板边烧焦的原因有哪些?`
    发表于 03-16 17:13

    PCB板边又是做什么用的呢?

    为什么PCB生产时要做「拼板(panelization)」作业?然后打好SMT后又要再麻烦的裁切成单板?PCB板边(break-away/coupon)又是做什么用的呢?不是说板材使用得越少就越便宜吗?板材使用率又是怎么一回事
    发表于 03-10 06:00

    PCB设计问题案例:板边异常分析

    板边异常结构问题的原因究竟什么?通过华秋DFM最详细的关键点进行解剖,了解方便的板边异常解决方法。PCB设计分析软件(华秋DFM)官方下载地址:https://dfm.elecfans.com/?from=BBS
    发表于 05-21 18:00

    CAD制图中倒圆角的技巧

    圆角命令是FILLET,圆角功能可使用与对象相切且指定半径的圆弧来连接两个对象。可以创建两种圆角,内角点称为内圆角,外角点称为外圆角。可以
    发表于 10-19 15:03 1.8w次阅读
    CAD制图中<b class='flag-5'>倒圆角</b>的技巧

    基于proe技术的倒圆角特征建模范例

    本文介绍了基于proe技术的倒圆角特征建模的范例。
    发表于 11-17 15:19 0次下载
    基于proe技术的<b class='flag-5'>倒圆角</b>特征建模范例

    CAD编辑器怎么使用倒圆角命令将矩形变成圆角矩形

    CAD怎么使用倒圆角命令将矩形变成圆角矩形?我们在进行CAD绘制图纸的时候,总会遇到很多需要进行编辑器或者是修改的地方,那我们在CAD图纸中要是遇到需要将图纸上的矩形,看着实在不是很顺眼,想要转换成圆角矩形,那我们又该如何进行操
    发表于 12-07 08:00 1次下载

    如何实现PCB板边倒圆角

    PCB外形是直角时,通常工程制作外形(锣带)时,会将直角或尖角的地方倒成圆角,主要是为了防止PCB容易划伤板他扎伤人。
    发表于 11-14 11:58 4906次阅读

    很好的实现PCB板边倒圆角

    PCB外形是直角时,通常工程制作外形(锣带)时,会将直角或尖角的地方倒成圆角,主要是为了防止PCB容易划伤板他扎伤人。
    发表于 01-15 15:37 998次阅读
    很好的<b class='flag-5'>实现</b><b class='flag-5'>PCB</b><b class='flag-5'>板边</b><b class='flag-5'>倒圆角</b>

    pcb板边安全距离是多少合适?

    pcb板边安全距离是多少合适? PCB板边安全距离是指PCB板上电路的边缘与板的边界之间的最小安全距离,该距离的确定对于确保电路的可靠性和防
    的头像 发表于 01-17 16:38 1418次阅读