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.pswp.cn/news/387853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387853.shtml
英文地址,請注明出處:http://en.pswp.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…