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,一经查实,立即删除!

相关文章

一年没做出量化策略_量化信念:如何做出更好的决定

一年没做出量化策略By Stuart George, Executive Director of Design Technology at MethodMethod设计技术执行总监Stuart George When Andrew Mason, founder of Groupon, wanted to improve his email conversion metrics, he turned to data analysis. His team tested the…

Android Jetpack组件之数据库Room详解(二)

本文涉及Library的版本如下&#xff1a; androidx.room:room-runtime:2.1.0-alpha03androidx.room:room-compiler:2.1.0-alpha03(注解编译器)回顾一下安卓的SQLiteOpenHelper相关类 首先放一个关于安卓数据库的类图: SQLiteOpenHelper是一个抽象类&#xff0c;通常自己实现数据…

图像识别中的深度学习

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

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

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

Git 学习笔记之 merge

Merge: 1、Fast-forward&#xff08;快进式&#xff09; 2、recursice strategy (策略合并&#xff0c;三方合并) Fast-forward 策略合并 //创建一个文件夹&#xff0c;并初始化 Git mkdir GitDemo cd GitDemo git init//初次提交&#xff0c;创建 master 分支 touch master.tx…

熊猫直播 使用什么sdk_没什么可花的-但是16项基本操作才能让您开始使用熊猫

熊猫直播 使用什么sdkPython has become the go-to programming language for many data scientists and machine learning researchers. One essential data processing tool for them to make this choice is the pandas library. For sure, the pandas library is so versat…

萌新一手包App前后端开发日记(一)

从事Android移动端也有些日子了&#xff0c;还记得一开始选择这份工作&#xff0c;是憧憬着有朝一日能让亲朋好友用上自己开发的软件&#xff0c;但日子久了才发现&#xff0c;并不是所有的公司&#xff0c;所有的项目的适用群体都是“亲朋好友”&#xff0c;/无奈脸 摊手。当…

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

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

关系型数据库的核心单元是_核中的数据关系

关系型数据库的核心单元是Nucleoid is an open source (Apache 2.0), a runtime environment that provides logical integrity in declarative programming, and at the same time, it stores declarative statements so that it doesn’t require external database, in shor…

MongoDB第二天

集合的操作: db.表名称 show tables / collection db.表名.drop() 文档的操作: 插入数据 db.表名.insert({"name":"jerry"}) db.insertMany([{"name":"sb",...}]) var ul {"name":"sb"} db.sb.insert(ul) db.sb.…

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 …

三. 性能测试领域

能力验证&#xff1a; 概念&#xff1a;系统能否在A条件下具备B能力 应用&#xff1a;为客户进行系统上线后的验收测试&#xff0c;作为第三方对一个已经部署系统的性能验证 特点&#xff1a;需要在已确定的环境下运行 需要根据典型场景设计测试方案和用例 一个典型场景包括操…

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;主成分分…

scp

将文件或目录从本地通过网络拷贝到目标端。拷贝目录要带 -r 参数 格式&#xff1a;scp 本地用户名IP地址:文件名1 远程用户名IP地址:文件名 2 例&#xff1a; scp media.repo root192.168.20.32:/etc/yum.repos.d/ 将远程主机文件或目录拷贝到本机&#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的…

JavaWeb--JavaEE

一、JavaEE平台安装1、升级eclipseEE插件2、MyEclipse二、配置Eclipse工作空间1.字体设置 2.工作空间编码 UTF-83.JDK版本指定 4.集成Tomcat Server运行环境5.配置server webapps目录 端口号 启动时间等三、创建第一个Web项目1.创建 Web Project2.设置 tomcat、创建web.xml3.目…

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

软件需求规格说明书通用模版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…