日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

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

發布時間:2023/12/24 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 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);
            else
                angle_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  negative
        public bool ccw; //direction-- cw ccw
        public 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

四.實現效果

總結

以上是生活随笔為你收集整理的PCB genesis 大孔扩孔(不用G84命令)实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久免费视频一区 | 久久综合干 | 国产网站在线免费观看 | 亚洲AV综合色区无码国产播放 | 日本熟妇毛茸茸丰满 | 青青草欧美 | 999国产精品亚洲77777 | 日本不卡一区二区三区在线观看 | 亚洲第一欧美 | 视频二区 | 欧美一区二区大片 | 极品尤物一区二区 | 91在线视频网址 | 成人资源在线观看 | 亚洲综合网站 | 天天曰夜夜操 | 亚洲av无码国产综合专区 | 日韩视频福利 | 黄色免费在线视频 | 国产视频第二页 | 91精品导航| 色香蕉网站 | 中文字幕+乱码+中文乱码www | 色av综合| 强行挺进白丝老师翘臀网站 | 国产在线拍揄自揄拍无码视频 | 亚洲第一天堂网 | 午夜视频91| 美女久久视频 | 日韩成人av片 | 蜜桃麻豆视频 | 国产一级在线观看视频 | 日本wwwxxx | 国产美女久久久 | 韩产日产国产欧产 | 伊人狼人综合 | 色一情| 手机看片国产 | 国产午夜视频在线播放 | 波多野结av衣东京热无码专区 | 日本一级黄色 | 九草网 | 欧美午夜理伦三级在线观看 | av片在线看| 麻豆免费观看视频 | 国产乱国产乱 | 人妻熟妇又伦精品视频a | 乱一色一乱一性一视频 | 亚洲第一天堂网 | 亚洲偷| 在线你懂得 | 69精品久久 | 午夜免费播放观看在线视频 | 日本三级一区二区 | 天天色成人网 | 加勒比成人av| 欧美一级专区免费大片 | 天天综合网入口 | 99精品久久| 国产精品99久久久精品无码 | 色老板精品凹凸在线视频观看 | 国产精品久久久久久久久绿色 | 在线中文字幕亚洲 | 亚洲伦理在线视频 | 中国字幕av | 日韩一区二区三区免费视频 | 久久精品99 | 欧美视频成人 | 色人人| 中文字幕一区二区三区精华液 | 亚洲一区你懂的 | 亚洲狼人伊人 | 久久精品亚洲一区 | 污版视频在线观看 | 亚洲熟妇av一区二区三区漫画 | 欧美激情videos | 精品少妇3p| 久久免费精品国产 | 男人猛吃奶女人爽视频 | 亚洲国产综合在线 | 欧美日韩一级视频 | 亚洲小说区图片区 | 色哟哟导航| 色婷婷精品国产一区二区三区 | 欧美日一区二区三区 | 色老板精品凹凸在线视频观看 | 7788色淫网站小说 | 荒野求生21天去码版网站 | 久久久久99精品成人片试看 | 日日操日日操 | 成人免费不卡视频 | 国产成人在线观看 | 影音先锋色小姐 | 国产情侣酒店自拍 | 最新黄色av网站 | 成人片黄网站久久久免费 | 有码中文 | 亚洲特级黄色片 | 日韩av视屏 |