PCB 内层负片散热PAD Symbols尺寸更改方法

 如下图这是我们熟悉的内层负片散热PAD Symbols,我们CAM制作时,为了满足PCB工厂生产制作能力,,会优化散热PAD尺寸,让热PAD的尺寸符合制作规范要求,通常我们只关注散热PAD的3个指标即可(外环,内环,开口),只要将这3个参数优化到位就可以了。

 常规散热PAD 尺寸规范:(在此规范中:内径与外径,是基于孔的尺寸再预大值)

一.问题来了,我们如何更改散热PAD的尺寸

     因为在CAM软件中,有N种的散热PAD类型,每一种散热PAD的Symbols对应的是一串文本,如:ths5000x3000x0x4x1000rc_ths5000x3000x0x4x1000x500xr1000, 我们关注的3个参数就藏在这个串文本中,那直接更改是不可能了。

     我们要解决这个问题。我们必须弄清楚,标准散热PAD的Symbols有多少种,每一种散热PAD 3关键参数(外环,内环,开口)所在这串文本位置, 我们可以要建立个散热PAD类,将原始Symbols字符串分解,并提取3个关键参数值, 这样才可以检测这个原始散热PAD尺寸是否符合要求了,符合要求就不更改,不符合要求就更改。

 

二.一共有多少种散热PAD,每个散热PAD的参数是什么?

    共有7种标准散热PAD Symbols

    1.Symbols名示例:

       1.  ths5000x3000x0x4x1000

      外径 内径 角度 开口个数 开口宽度 thr ths
       2.  s_tho5000x3000x45x4x1000 外径

      内径 角度 开口个数 开口宽度 s_thr s_ths s_tho
       3. s_ths5000x4000x0x4x500xr1000

     外径 内径 角度 开口个数 开口宽度 外圆角半径 s_ths
      4.  sr_ths5000x3000x0x4x1000

      外径 内径 角度 开口个数 开口宽度 sr_ths
      5.  rc_ths5000x3000x45x4x1000x500

      外径宽 外径高 角度 开口个数 开口宽度 环宽 rc_ths rc_tho
      6.  rc_ths5000x3000x0x4x1000x500xr1000

      外径宽 外径高 角度 开口个数 开口宽度 环宽 外圆角半径 rc_ths
      7.  oblong_ths5000x3000x0x4x500x500xs

     外径宽 外径高 角度 开口个数 开口宽度 环宽 尾随标识 oblong_ths(*)xs oblong_ths(*)xr

     2.Symbols参数图示:

 

 

      

 

 

 

       

 

       

 

 

      

 

        

 

 

三.代码实现更改散热PAD symbols尺寸

    1.更改散热PAD symbols类:

 public class symbolsThr
    {
        /// <summary>
        /// 是否外形尺寸(即无外径长宽)
        /// </summary>
        public bool isOuterSize
        {
            get
            {
                return _isOuterSize;
            }
            set
            {
                this._isOuterSize = value;
            }
        }
        private bool _isOuterSize = true;
        /// <summary>
        /// 散热PAD 外径
        /// </summary>
        public double OuterSize
        {
            get
            {
                return _OuterSize;
            }
            set
            {
                this._OuterSize = value;
                this._OuterWidthSize = this._OuterSize;
                this._OuterHeightSize = this._OuterSize;
                this._isOuterSize = true;
            }
        }
        private double _OuterSize;
        /// <summary>
        /// 散热PAD 外径宽
        /// </summary>
        public double OuterWidthSize
        {
            get
            {
                return _OuterWidthSize;
            }
            set
            {
                this._OuterWidthSize = value;
                this._isOuterSize = false;
            }
        }
        private double _OuterWidthSize;
        /// <summary>
        /// 散热PAD 外径高
        /// </summary>
        public double OuterHeightSize
        {
            get
            {
                return _OuterHeightSize;
            }
            set
            {
                this._OuterHeightSize = value;
                this._isOuterSize = false;
            }
        }
        private double _OuterHeightSize;

        /// <summary>
        /// 散热PAD 内径  即(外径-环宽*2)
        /// </summary>
        public double InnerSize
        {
            get
            {
                return _InnerSize;
            }
            set
            {
                this._InnerSize = value;
                this._RingWidth = (this._OuterSize - this._InnerSize) * 0.5;
            }
        }
        private double _InnerSize;

        /// <summary>
        /// 散热PAD 环宽  
        /// </summary>
        public double RingWidth
        {
            get
            {
                return _RingWidth;
            }
            set
            {
                this._RingWidth = value;
                this._InnerSize = this._OuterSize - this._RingWidth * 2;
            }
        }
        private double _RingWidth;


        /// <summary>
        /// 散热PAD  开口宽   
        /// </summary>
        public double GapWidth
        {
            get
            {
                return _GapWidth;
            }
            set
            {
                this._GapWidth = value;
            }
        }
        private double _GapWidth;

        /// <summary>
        /// 散热PAD  角度 
        /// </summary>
        public double Angle { get; set; }
        /// <summary>
        /// 散热PAD  开口个数 
        /// </summary>
        public double GapCount { get; set; }
        /// <summary>
        /// 散热PAD  外圆角半径 
        /// </summary>
        public double OuterRoundRadius { get; set; }

        /// <summary>
        /// 散热PAD  尾随标识
        /// </summary>
        public string SymbolsEndString { get; set; } = "";

        private string _SymbolsStart;
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="SymbolsName">原散热PAD symbols</param>
        public symbolsThr(string SymbolsName)
        {
            List<string> symbolsStartList = new List<string>() { "thr", "ths", "s_thr", "s_ths", "s_tho", "sr_ths", "rc_ths", "rc_tho", "rc_ths", "oblong_ths" };
            SymbolsName = SymbolsName.Trim().ToLower();
            int symbolsID = symbolsStartList.FindIndex(tt => SymbolsName.StartsWith(tt));
            if (symbolsID >= 0)
            {
                _SymbolsStart = symbolsStartList[symbolsID];
                var MathesList = Regex.Matches(SymbolsName, "\\d+\\.?\\d*");
                if (symbolsID >= 6)
                {
                    this.OuterWidthSize = double.Parse(MathesList[0].Value);
                    this.OuterHeightSize = double.Parse(MathesList[1].Value);
                    this.Angle = double.Parse(MathesList[2].Value);
                    this.GapCount = double.Parse(MathesList[3].Value);
                    this.GapWidth = double.Parse(MathesList[4].Value);
                    this.RingWidth = double.Parse(MathesList[5].Value);
                    if (MathesList.Count == 7 && _SymbolsStart == "rc_ths")
                        this.OuterRoundRadius = double.Parse(MathesList[6].Value);
                    if (_SymbolsStart == "oblong_ths")
                        this.SymbolsEndString = SymbolsName.Substring(SymbolsName.Length - 1, 1);
                
                }
                else
                {
                    this.OuterSize = double.Parse(MathesList[0].Value);
                    this.InnerSize = double.Parse(MathesList[1].Value);
                    this.Angle = double.Parse(MathesList[2].Value);
                    this.GapCount = double.Parse(MathesList[3].Value);
                    this.GapWidth = double.Parse(MathesList[4].Value);
                    if (MathesList.Count == 5 && _SymbolsStart == "s_ths")
                        this.OuterRoundRadius = double.Parse(MathesList[6].Value);
                }
            }
        }

        /// <summary>
        /// 获取Symbols
        /// </summary>
        /// <returns></returns>
        public string GetSymbolsThr
        {
            get
            {
                string symbolsName = "";
                if (_isOuterSize)
                {
                    symbolsName = $"{this._SymbolsStart}{this.OuterSize}x{this._InnerSize}x{this.Angle}x{this.GapCount}x{this.GapWidth}";
                    symbolsName += this.OuterRoundRadius < 0.01 ? "" : $"xr{this.OuterRoundRadius}";
                }
                else
                {
                    symbolsName = $"{this._SymbolsStart}{this.OuterWidthSize}x{this.OuterHeightSize}x{this.Angle}x{this.GapCount}x{this.GapWidth}x{this.RingWidth}";
                    symbolsName += this.OuterRoundRadius < 0.01 ? "" : $"xr{this.OuterRoundRadius}";
                    symbolsName += string.IsNullOrEmpty(SymbolsEndString) ? "" : $"x{this.SymbolsEndString}";
                }
                return symbolsName;
            }
        }
        /// <summary>
        /// 更改圆形(方形)散热PAD
        /// </summary>
        /// <param name="OuterSize_">外形</param>
        /// <param name="InnerSize_">内径</param>
        /// <param name="GapWidth_">开口宽度</param>
        /// <returns></returns>
        public string SetThrSize(double OuterSize_, double InnerSize_, double GapWidth_)
        {
            this.OuterSize = (this.OuterSize < OuterSize_) ? OuterSize_ : this.OuterSize;
            this.InnerSize = (this.InnerSize < InnerSize_) ? InnerSize_ : this.InnerSize;
            this.GapWidth = (this.GapWidth < GapWidth_) ? GapWidth_ : this.GapWidth;
            return this.GetSymbolsThr;
        }
        /// <summary>
        /// 更改矩形散热PAD
        /// </summary>
        /// <param name="OuterWidthSize_">外径宽</param>
        /// <param name="OuterHeightSize_">外径高</param>
        /// <param name="RingWidth_">环宽</param>
        /// <param name="GapWidth_">开口宽度</param>
        /// <returns></returns>
        public string SetThrSize(double OuterWidthSize_, double OuterHeightSize_, double RingWidth_, double GapWidth_)
        {
            this.OuterWidthSize = (this.OuterWidthSize < OuterWidthSize_) ? OuterWidthSize_ : this.OuterWidthSize;
            this.OuterHeightSize = (this.OuterHeightSize < OuterHeightSize_) ? OuterHeightSize_ : this.OuterHeightSize;
            this.RingWidth = (this.RingWidth < RingWidth_) ? RingWidth_ : this.RingWidth;
            this.GapWidth = (this.GapWidth < GapWidth_) ? GapWidth_ : this.GapWidth;
            return this.GetSymbolsThr;
        }
    }
View Code

   2.调用例子:

            symbolsThr symThr = new symbolsThr("s_ths5000x4000x0x4x500xr1000");
            string symbols = symThr.SetThrSize(6000, 5000, 1000); //更改:外径  内径  开口   改后symbls为  s_ths6000x5000x0x4x1000xr1000  

 

posted @ 2018-11-12 22:42  pcbren  阅读(1384)  评论(0编辑  收藏  举报