PCB genesis自制孔点 Font字体实现方法

一.先看genesis原有Font字体

在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个性化需求,比如:孔密度,孔间距,孔形状分布,如果有一些个性化需求时必须得自己可以编辑孔点字体才可以满足要求,可以奥宝没有提供这样的工具给我们,在这里就介绍用genesis自制Font字体实现方法

二.Font字体坐标文件制作说明

Font字符坐标文件放在genesis安装目录:C:\genesis\fw\lib\fonts\下,有2个文件canned_57与canned_67,和孔符坐标一样也是明文坐标,这里我们又可以借助genesis图形界面,将Font字体坐标读入genesis,然对字体坐标进行编辑,接着再将编辑好的Font字体坐标输出来即可.

Font字符制作3步曲.

1.字体坐标读入==>2.编辑字体坐标==>3.字体坐标输出

三.Font字体编辑孔符规则说明

1.由于借助Genesis图形界面编辑Font字体,所以每一层分别带表对应的Char字符,由于Genesis层名不能使用特殊符号作为层名,这里采用ID号作对应关系作为层名,对应关系如下表.当我们编辑字体坐标时,可以通过Char字符找到对应的ID号层名。

2.Genesis第1层的层名是rect ,带表字符Char框架范围,当编辑字体时,孔的中心坐标不能超出rect范围,如超出了可能会造成字体碰撞在一起,这里编辑字体时需注意了。

3. 编辑字体比例规则:【字体宽度】字体宽度与框架宽度 有一个黄金比例关系,字体最大坐标宽度X比框架范围X比值为0.72,所以我们在编辑字体时要尽量尊守,并往这个比例靠笼,【字体高度】无特别要求,尽量保持字体高度与框架高度接近就好了

4. rect框架零点以左下角为零点位置,编辑字体时这个位置不能需随意整体移动的

四.Font字体坐标转换关系说明

这里讲一讲,Font字体坐标文件,Genesis UI界面参数,绘制字体坐标图形  三者坐标转换的计算公式

转换实例:

具体坐标转换关系转换计算器 http://pcbren.cn/CannedText/

五.C#代码实现

另一篇文章有介绍不用Genesis孔点坐标加点阵字的方法,有兴趣可以看一下  PCB Genesis增加点阵字 实现原理

canned_57   fonts 字体读入genesis

            //###canned_57 fonts 字体读入genesis
            //1.新建一个全新的job与step
            //2.读取canned_57 fonts 目录文件
            //   每一种字体对应genesis一个层
            //   rect层:定义字体范围,字宽与字高范围定义
            //   层名ID序号:例如:用1,2,3作为层名,对应字符Char ID号(由于genesis层名不能以符号显示)
            //3.接着借助genesis对字体进行编辑操作了
            string HoleFontsInputDirPath = @"C:\genesis\fw\lib\fonts\canned_57";//孔符读取markers目录
            gL RectSizeL = new gL();//rect层  做为字体坐标范围
            gP OffsetP = new gP(); //rect层  先取X值作为偏移(目前发现没作用)
            List<List<gL>> lineAllList = new List<List<gL>>();
            List<gL> lineList = new List<gL>();
            var txtList = File.ReadAllLines(HoleFontsInputDirPath);
            for (int i = 0; i < txtList.Count(); i++)
            {
                string LayerName = txtList[i];
                var arrList = txtList[i].Trim().Replace("  ", " ").Split(‘ ‘);
                string StartsWith = arrList[0];
                switch (StartsWith)
                {
                    case "CHAR":
                        lineList = new List<gL>();
                        break;
                    case "LINE":
                        gPoint ps = new gPoint(double.Parse(arrList[1]), double.Parse(arrList[2]));
                        gPoint pe = new gPoint(double.Parse(arrList[3]), double.Parse(arrList[4]));
                        double width = double.Parse(arrList[7]) * 1000;
                        gL tempL = new gL(ps, pe, width);
                        tempL.negative = arrList[7] == "N";
                        lineList.Add(tempL);
                        break;
                    case "ECHAR":
                        lineAllList.Add(lineList);
                        break;
                    case "XSIZE":
                        RectSizeL.pe.x = double.Parse(arrList[1]);
                        break;
                    case "YSIZE":
                        RectSizeL.pe.y = double.Parse(arrList[1]);
                        RectSizeL.width = 1;
                        break;
                    case "OFFSET":
                        OffsetP.p.x = double.Parse(arrList[1]);
                        OffsetP.width = 2;
                        break;
                }
            }
            g.COM($"create_layer,layer=rect");
            g.COM($"affected_layer,name=rect,mode=single,affected=yes");
            addCOM.line_rect(RectSizeL);
            addCOM.pad(OffsetP);
            g.COM($"affected_layer,name=rect,mode=single,affected=no");
            for (int i = 0; i < lineAllList.Count(); i++)
            {
                g.COM($"create_layer,layer={i }");
                g.COM($"affected_layer,name={i },mode=single,affected=yes");
                for (int j = 0; j < lineAllList[i].Count(); j++)
                {
                    addCOM.line(lineAllList[i]);
                }
                g.COM($"affected_layer,name={i},mode=single,affected=no");
            }
            var pcbren = "pcbren";

canned_57   fonts 字体输出

            ////###canned_ fonts字体输出
            ////1.准备编辑好的字体job
            ////2.依次遍历genesis所有层,每一层(ID对应一个Char字符) 并将所有层字体坐标合并为一个文件输出
            ////输出需注意两点
            ////一.输出孔符的genesis单位要读入孔符单位要一致(TGZ默认数据全部用inch存储,保持读取与输出统一inch)
            ////二.输出层顺序与层ID号不能修改,不然会导致异常
            ////此读取此为canned_57字符排序,输出也按此顺序输出
            string CharList = @"!""#$%&‘()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
            var HoleFontsOutputDirPath = @"C:\Users\Administrator\Desktop\markers\";//孔符输出markers目录
            LayerNameList = g.getLayerNameList(g.STEP, g.JOB);
            StringBuilder StrLineAll = new StringBuilder();
            var layer = g.getFEATURES("rect", g.STEP, g.JOB, "inch", true);
            var xList = layer.Llist.Select(tt => tt.ps.x).Union(layer.Llist.Select(tt => tt.pe.x));
            var yList = layer.Llist.Select(tt => tt.ps.y).Union(layer.Llist.Select(tt => tt.pe.y));
            StrLineAll.AppendLine($"XSIZE { (xList.Max() - xList.Min()).ToString("0.000000")}");
            StrLineAll.AppendLine($"YSIZE { (yList.Max() - yList.Min()).ToString("0.000000")}");
            StrLineAll.AppendLine($"OFFSET {  (layer.Plist[0].p.x).ToString("0.000000") }");
            StrLineAll.AppendLine("");
            StrLineAll.AppendLine("");
            for (int i = 0; i < CharList.Count(); i++)
            {
                StrLineAll.AppendLine($"CHAR {CharList[i]}");
                foreach (var line in g.getFEATURES(i.ToString(), g.STEP, g.JOB, "inch", true).Llist)
                {
                    string polarity = line.negative ? "N" : "P";
                    string symbolsStart = line.symbols.StartsWith("r") ? "R" : "S";
                    StrLineAll.AppendLine($"LINE {line.ps.x.ToString("0.000000")} {line.ps.y.ToString("0.000000")} {line.pe.x.ToString("0.000000")} {line.pe.y.ToString("0.000000")} {polarity} {symbolsStart} {(line.width * 0.001).ToString("0.000000")}");
                }
                StrLineAll.AppendLine("ECHAR");
                StrLineAll.AppendLine("");
            }
            File.WriteAllText($"{HoleFontsOutputDirPath}{"canned_pcbren"}", StrLineAll.ToString());
            var pcbren1 = "pcbren";

六.实现效果

Font坐标读入

Font坐标输出

原文地址:https://www.cnblogs.com/pcbren/p/9906573.html

时间: 2024-11-09 04:32:59

PCB genesis自制孔点 Font字体实现方法的相关文章

PCB genesis短槽加引导孔实现方法

一.何为短槽 短槽通常定义:槽长小于2倍槽宽      如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个孔时,钻头两边受力不均匀再加上是顺时针旋转,会导至第2个孔往逆时针方向偏转且变短(如下图) 短槽偏位问题如何解决呢,在我们PCB行业最佳作法是在钻槽孔之前,先在槽孔两端2个小孔(如下图). 在PCB行业已有很多短槽加工方法 具体方法请链接:PCB钻孔--超短坑槽的加工方法 机械钻孔中的短槽孔加工技术

PCB genesis连孔加除毛刺孔实现方法

一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔,并钻进去一点(常规进去1-2mil),这样就可以将纤维毛刺去除 PCB同行业毛刺问题处理办法 钻孔孔内毛刺问题分析改善报告 二.连孔加除毛刺孔实现原理 求解思路:1.已知小圆半径:1.5mm,大圆半径 2mm,2个点距离3mm 利用海伦公式(三边求高)求出除尘孔径半径:0.8887mm2.除尘孔半径

PCB genesis连孔加除毛刺孔(槽孔与槽孔)实现方法(三)

一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔,并钻进去一点(常规进去1-2mil),这样就可以将纤维毛刺去除 (没找到SLOT槽与SLOT槽的实物图.就用SLOT槽与圆孔吧,产生毛刺效果也是一样的) PCB同行业毛刺问题处理办法 钻孔孔内毛刺问题分析改善报告 二.如何判断除毛刺孔加多少个? 在PCB行业工程加除毛刺孔加多少个也没有太明确的定义,

PCB Genesis SET拼板(圆形板拼板) 实现效果(二)

越来发现Genesis采用Surface多边形数据结构的重要性了,当撑握了多边形缩放,交集, 差集,并集等算法, 想实现PCB拼板简直轻而易举了;当然还可以制作出更多的PCB实用的工具来,下面将圆形板拼板实现效果展示出来. 可参考下面另外2篇 拼板与加邮票孔方法 PCB Genesis拼SET画工艺边 实现方法(一) PCB Genesis加邮票孔(弧与弧)实现算法  拼圆板实现效果 1.邮票连接位参数设置 2.圆形拼板参数设置 皮面积对比 原文地址:https://www.cnblogs.co

解决firefox和IE9对icon font字体的跨域访问问题

何为跨域访问,为什么会有跨域限制?一切还得从浏览器的同源策略说起. 同源策略:是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响,可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现. 浏览器的同源策略:限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性.同源策略的存在,限制了“源”自A的脚本只能操作“同源”页面的DOM,“跨源”操作来源于B的页面将会被拒绝. 何为同源呢?“img.company.

icon font字体图标字库汇总

最近在研究icon font图标字库,找了一些比较好的在线字库.大都是开源的,而且各有特色! 阿里icon font字库 http://www.iconfont.cn/ 这个是阿里妈妈M2UX的一个icon font字体图标字库,包含了淘宝图标库和阿里妈妈图标库. fontello http://fontello.com/ 在线定制你自己的icon font字体图标字库,也可以直接从GitHub下载整个图标集,该项目也是开源的. icomoon http://icomoon.io/app/#/s

在web.config文件中,增加“type=&quot;APP.Modules.CommandModule,CommandModules&quot;”节点会导致awesome font字体图标显示为方框框

在配置文件中,增加以下节点,会造成awesome font字体图标不显示 <system.webServer> <modules> <add type="APP.Modules.CommandModule,CommandModules" name="CommandModule" /> </modules> </system.webServer> 解决办法:将上述节点去掉,即可.

CSS font字体知识学习

字体系列 [1]5种通用字体系列:拥有相似外观的字体系列 serif字体:字体成比例,且有上下短线(衬线字体),包括Times\Georgia\New century Schoolbook sans-serif字体:字体成比例,且没有上下短线(无衬线字体),包括Helvetica\Geneva\Verdana\Arial\Univers Monospace字体:字体不成比例,等宽字体,包括Courier\Courier New\Andale Mono Cursive字体:手写体,包括Zapf C

设定当前视图中所有控件字体的方法

     本范例实现的是对界面中所有的控件一次性的设置字体样式.思路是找到父控件,然后遍历子控件.如果子控件是可以修改文字的控件,那么就设置文字.这用到了控件的继承,很多控件都是继承与textview的,所以将控件均转为textview,最后设置字体即可. 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.