PCB genesis 大孔扩孔(不用G84命令)实现方法

PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生成小孔钻孔达到扩孔的目的。

一.我们先了解一下G84命令扩孔

   孔尺寸大小

      孔密度

连一篇文章有关于孔数计算方式:  https://www.cnblogs.com/pcbren/p/9379178.html

二.求解思路

     1.通过孔密度,求出孔与孔中心距离

     2.求出单次增量方位角

     3.以大孔中心为,长度为(大孔半径-小孔半径), 任选择一个方位角作为起始方位角,并增加一个起始孔,并围绕这个起始方位角不断递增方位角,直到360度递增完成后即结束。

三.C#简易代码实现:

1.扩孔钻孔代码

            string drilllayer = "drl";gLayer layer = g.getFEATURES($"{drilllayer}", g.STEP, g.JOB, "mm", true);List<gPP> pList = new List<gPP>();double HoleSize = 3175;  //扩孔所用钻刀大小foreach (var pad in layer.Plist){if (pad.width > 6300)  //钻孔>6300需扩孔
                {gA arc = calc2.p_2A(new gP(pad.p, pad.width - HoleSize));arc.width = HoleSize;var HoleCenterDi = calc2.p_Convex(arc.width * 0.0005)*3;pList.AddRange(calc2.a_2Plist(arc, HoleCenterDi, 2, true));}}addCOM.pad(pList);
View Code

2.计算函数

/// <summary>/// 通过孔半径与凸高位求  孔中心距/// </summary>/// <param name="Rradius">孔半径</param>/// <param name="tol_">凸位高度值</param>/// <returns></returns>public double p_Convex(double Rradius, double tol_ = 0.0127){return Math.Sqrt(Math.Pow(Rradius, 2) - Math.Pow(Rradius - tol_, 2)) * 2;}/// <summary>/// 求方位角/// </summary>/// <param name="ps"></param>/// <param name="pe"></param>/// <returns></returns>public double p_ang(gPoint ps, gPoint pe){double a_ang = Math.Atan((pe.y - ps.y) / (pe.x - ps.x)) / Math.PI * 180;//象限角  转方位角   计算所属象限   并求得方位角if (pe.x >= ps.x && pe.y >= ps.y)  //↗    第一象限
            {return a_ang;}else if (!(pe.x >= ps.x) && pe.y >= ps.y)  // ↖   第二象限
            {return a_ang + 180;}else if (!(pe.x >= ps.x) && !(pe.y >= ps.y))  //↙   第三象限
            {return a_ang + 180;}else if (pe.x >= ps.x && !(pe.y >= ps.y))  // ↘   第四象限
            {return a_ang + 360;}else{return a_ang;}}//求方位角/// <summary>/// 求增量坐标/// </summary>/// <param name="ps">起点</param>/// <param name="val">增量值</param>/// <param name="ang_direction">角度</param>/// <returns></returns>public gPP p_val_ang(gPP ps, double val, double ang_direction){gPP pe = ps;pe.p.x = ps.p.x + val * Math.Cos(ang_direction * Math.PI / 180);pe.p.y = ps.p.y + val * Math.Sin(ang_direction * Math.PI / 180);return pe;}/// <summary>/// 弧Arc 转点P组集/// </summary>/// <param name="a"></param>/// <param name="val_">此数值表示:分段数值</param>/// <param name="type_">代表值数值类型 【0】弧长 【1】角度  【2】弦长 </param>/// <param name="is_avg">是否平均分布 </param>/// <returns></returns>public List<gPP> a_2Plist(gA a, double val_ = 0.1d, int type_ = 0, bool is_avg = false){List<gPP> list_point = new List<gPP>();gPP tempP;tempP.p = a.ps;tempP.symbols = a.symbols;tempP.width = a.width;list_point.Add(tempP);double avg_count;double angle_val = 0;double rad_ = p2p_di(a.pc, a.pe);double sum_alge = a_Angle(a);if (type_ == 1)  //    【1】角度  
            {angle_val = val_;avg_count = (int)(Math.Ceiling(sum_alge / angle_val)) - 1;  //  总角度/单角度
            }else if (type_ == 2)  //【2】弦长
            {angle_val = Math.Asin(val_ / (rad_ * 2)) * 360 / pi;avg_count = (int)(Math.Ceiling(sum_alge / angle_val)) - 1;  //  总角度/单角度
            }else  //                【0】弧长 
            {angle_val = val_ * 180 / (pi * rad_);avg_count = (int)(Math.Ceiling(sum_alge / angle_val)) - 1;  //  总角度/单角度//avg_count = (int)(Math.Ceiling(a_Lenght(a) / val_)) - 1;  //  或  总弧长/单弧长
            }if (is_avg)angle_val = sum_alge / avg_count;if (avg_count > 1){gPP centerP = tempP;centerP.p = a.pc;double angle_s = p_ang(a.pc, a.ps);if (a.ccw) { angle_val = 0 - angle_val; }for (int i = 1; i < avg_count; i++){tempP = p_val_ang(centerP, rad_, angle_s - angle_val * i);list_point.Add(tempP);}}if (!(zero(a.ps.x - a.pe.x) && zero(a.ps.y - a.pe.y))){tempP.p = a.pe;list_point.Add(tempP);}return list_point;}/// <summary>/// 返回两点之间欧氏距离/// </summary>/// <param name="p1"></param>/// <param name="p2"></param>/// <returns></returns>public double p2p_di(gPoint p1, gPoint p2){return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));}/// <summary>/// 求弧Arc圆心角       //后续改进  用叉积 与3P求角度求解  验证哪个效率高/// </summary>/// <param name="a"></param>/// <returns></returns>public double a_Angle(gA a){double angle_s, angle_e, angle_sum;if (a.ccw){angle_s = p_ang(a.pc, a.pe);angle_e = p_ang(a.pc, a.ps);}else{angle_s = p_ang(a.pc, a.ps);angle_e = p_ang(a.pc, a.pe);}if (angle_s == 360) { angle_s = 0; }if (angle_e >= angle_s)angle_sum = 360 - Math.Abs(angle_s - angle_e);elseangle_sum = Math.Abs(angle_s - angle_e);return angle_sum;}/// <summary>///  检查值决对值 小于 (eps = 0.001)    浮点误差处理/// </summary>/// <param name="x"></param>/// <returns></returns>public bool zero(double x){return (((x) > 0 ? (x) : (-x)) < eps);}
View Code

3.Point,PAD,Arc数据结构

/// <summary>/// 精简 PAD  数据类型/// </summary>public struct gPP{public gPP(double x_val, double y_val, double width_){this.p = new gPoint(x_val, y_val);this.symbols = "r";this.width = width_;}public gPP(gPoint p_, double width_){this.p = p_;this.symbols = "r";this.width = width_;}public gPP(gPoint p_, string symbols_, double width_){this.p = p_;this.symbols = symbols_;this.width = width_;}public gPoint p;public string symbols;public double width;public static gPP operator +(gPP p1, gPP p2){p1.p += p2.p;return p1;}public static gPP operator +(gPP p1, gPoint p2){p1.p += p2;return p1;}public static gPP operator -(gPP p1, gPP p2){p1.p -= p2.p;return p1;}public static gPP operator -(gPP p1, gPoint p2){p1.p -= p2;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;}}/// <summary>/// ARC 数据类型/// </summary>public struct gA{public gA(double ps_x, double ps_y, double pc_x, double pc_y, double pe_x, double pe_y, double width_, bool ccw_){this.ps = new gPoint(ps_x, ps_y);this.pc = new gPoint(pc_x, pc_y);this.pe = new gPoint(pe_x, pe_y);this.negative = false;this.ccw = ccw_;this.symbols = "r";this.attribut = string.Empty;this.width = width_;}public gA(gPoint ps_, gPoint pc_, gPoint pe_, double width_, bool ccw_ = false){this.ps = ps_;this.pc = pc_;this.pe = pe_;this.negative = false;this.ccw = ccw_;this.symbols = "r";this.attribut = string.Empty;this.width = width_;}public gPoint ps;public gPoint pe;public gPoint pc;public bool negative;//polarity-- positive  negativepublic bool ccw; //direction-- cw ccwpublic string symbols;public string attribut;public double width;public static gA operator +(gA arc1, gPoint move_p){arc1.ps += move_p;arc1.pe += move_p;arc1.pc += move_p;return arc1;}public static gA operator +(gA arc1, gP move_p){arc1.ps += move_p.p;arc1.pe += move_p.p;arc1.pc += move_p.p;return arc1;}public static gA operator -(gA arc1, gPoint move_p){arc1.ps -= move_p;arc1.pe -= move_p;arc1.pc -= move_p;return arc1;}public static gA operator -(gA arc1, gP move_p){arc1.ps -= move_p.p;arc1.pe -= move_p.p;arc1.pc -= move_p.p;return arc1;}}
View Code

四.实现效果

转载于:https://www.cnblogs.com/pcbren/p/10017968.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像识别中的深度学习

来源&#xff1a;《中国计算机学会通讯》第8期《专题》 作者&#xff1a;王晓刚 深度学习发展历史 深度学习是近十年来人工智能领域取得的重要突破。它在语音识别、自然语言处理、计算机视觉、图像与视频分析、多媒体等诸多领域的应用取得了巨大成功。现有的深度学习模型属于神…

多个css样式合并到一个“目录”css文件中

执行访问jsp后发现没有效果 同样的代码&#xff0c;在html中效果对比如下&#xff1a; 具体原因&#xff1a;不清楚&#xff0c;暂时记着~~~在jsp中不支持import这种css样式的引用 转载于:https://www.cnblogs.com/mangwusuozhi/p/10050108.html

方差,协方差 、统计学的基本概念

一、统计学的基本概念 统计学里最基本的概念就是样本的均值、方差、标准差。首先&#xff0c;我们给定一个含有n个样本的集合&#xff0c;下面给出这些概念的公式描述&#xff1a; 均值&#xff1a; 标准差&#xff1a; 方差&#xff1a; 均值描述的是样本集合的中间点&#xf…

Python 主成分分析PCA

Python 主成分分析PCA 主成分分析&#xff08;PCA&#xff09;是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法&#xff0c;PCA的思想是将n维特征映射到k维上&#xff08;k<n&#xff09;&#xff0c;这k维特征称为主元&#xff0c;是旧特征的线性组合&#xf…

小程序 国际化_在国际化您的应用程序时忘记的一件事

小程序 国际化The hidden bugs waiting to be found by your international users您的国际用户正在等待发现的隐藏错误 While internationalizing our applications, we focus on the things we can see: text, tool-tips, error messages, and the like. But, hidden in our …

PCA主成分分析Python实现

作者&#xff1a;拾毅者 出处&#xff1a;http://blog.csdn.net/Dream_angel_Z/article/details/50760130 Github源码&#xff1a;https://github.com/csuldw/MachineLearning/tree/master/PCA PCA&#xff08;principle component analysis&#xff09; &#xff0c;主成分分…

robo 3t连接_使用robo 3t studio 3t连接到地图集

robo 3t连接Robo 3T (formerly Robomongo) is a graphical application to connect to MongoDB. The newest version now includes support for TLS/SSL and SNI which is required to connect to Atlas M0 free tier clusters.Robo 3T(以前称为Robomongo )是用于连接MongoDB的…

软件需求规格说明书通用模版_通用需求挑战和机遇

软件需求规格说明书通用模版When developing applications there will be requirements that are needed on more than one application. Examples of such common requirements are non-functional, cookie consent and design patterns. How can we work with these types of…

python版PCA(主成分分析)

python版PCA&#xff08;主成分分析&#xff09; 在用统计分析方法研究这个多变量的课题时&#xff0c;变量个数太多就会增加课题的复杂性。人们自然希望变量个数较少而得到的信息较多。在很多情形&#xff0c;变量之间是有一定的相关关系的&#xff0c;当两个变量之间有一定…

干货|Spring Cloud Bus 消息总线介绍

2019独角兽企业重金招聘Python工程师标准>>> 继上一篇 干货&#xff5c;Spring Cloud Stream 体系及原理介绍 之后&#xff0c;本期我们来了解下 Spring Cloud 体系中的另外一个组件 Spring Cloud Bus (建议先熟悉 Spring Cloud Stream&#xff0c;不然无法理解 Spr…

主成份分析(PCA)详解

主成分分析法&#xff08;Principal Component Analysis&#xff09;大多在数据维度比较高的时候&#xff0c;用来减少数据维度&#xff0c;因而加快模型训练速度。另外也有些用途&#xff0c;比如图片压缩&#xff08;主要是用SVD&#xff0c;也可以用PCA来做&#xff09;、因…

如何安装pylab:python如何导入matplotlib模块

pylab是python下挺不错的一个画图模块&#xff0c;使用也非常简单&#xff0c;记得Mit的计算机科学及编程导论有节课也是用到了这个工具&#xff0c;但这个工具安装不象用起来那么方便&#xff0c;小编就图文全程直播下吧 工具/原料 python2.7.10win10 32位方法/步骤 1缺省状态…

BP神经网络python简单实现

BP神经网络的原理在网上有很详细的说明&#xff0c;这里就不打算细说&#xff0c;这篇文章主要简单的方式设计及实现BP神经网络&#xff0c;并简单测试下在恒等计算&#xff08;编码&#xff09;作测试。 BP神经网络模型图如下 BP神经网络基本思想 BP神经网络学习过程由信息的…

golang的reflection(转)(一)

2019独角兽企业重金招聘Python工程师标准>>> 反射reflection 可以大大提高程序的灵活性&#xff0c;使得interface{}有更大的发挥余地反射可以使用TypeOf和ValueOf函数从接口中获取目标对象信息反射会将匿名字段作为独立字段&#xff08;匿名字段的本质&#xff09;…

datatables.js 简单使用--多选框和服务器端分页

说明&#xff1a;datatables是一款jQuery表格插件。感觉EasyUI的datagrid更易用 内容&#xff1a;多选框和服务器端分页 缘由&#xff1a;写这篇博客的原因是datatables的文档写的不怎么样&#xff0c;找东西很麻烦 环境&#xff1a;asp.net mvc , vs2015sqlserver2012 显示效…

python异常(高级) Exception

异常(高级) Exception 异常回顾:     try-except 语句 捕获(接收)异常通知,把异常流程变为正常流程     try-finally 语句 执行必须要执行的语句.     raise 语句 发送异常通知,同时进入异常流程     assert 语句 发送AssertionError异常     with 语句 wi…

从BMW Vision iNEXT 看宝马如何进军自动驾驶

安全很重要&#xff0c;空间也要很大&#xff0c;砍掉大量物理按键&#xff0c;内饰材料要环保&#xff0c;还要提供自动和主动两套驾驶方案。这些描述仅是BMW Vision iNEXT&#xff08;下称Vision iNEXT&#xff09;概念车的设计之冰山一角。 一款概念车当然无法完全代表未来…

CSS浮动(二)---Float

重新认识float 2.1. 误解和“误用” 既然提到“误用”&#xff0c;各位看官就此想想&#xff0c;自己平日是怎么使用float的&#xff1f;另外&#xff0c;既然“误用”加了引号&#xff0c;就说明这样的使用并不是真正的误用&#xff0c;而是误打误撞使用之后&#xff0c;带…

云原生生态周报 Vol. 2

业界要闻 Kubernetes External Secrets 近日&#xff0c;世界上最大的域名托管公司 Godaddy公司&#xff0c;正式宣布并详细解读了其开源的K8s外部 Secrets 管理项目&#xff1a; Kubernetes External Secrets&#xff0c;简称KES。这个项目定义了ExternalSecrets API&#xff…

centos 7新机使用前操作

关闭防火墙 systemctl stop firewalld&#xff08;停服务&#xff09; systemctl status firewalld&#xff08;看状态&#xff09; systemctl disable firewalld.service &#xff08;永久关闭&#xff09; selinux getenforce&#xff08;查状态&#xff09; vi /etc/selinux…