1. 程式人生 > >PCB genesis自制孔點 Font字型實現方法

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";
View Code

     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";
View Code

 六.實現效果

     Font座標讀入

      Font座標輸出