• PCB Genesis增加轮廓字 实现原理


    在Genesis增加汉字自带是不支持增加汉字的,如果需增加汉字需用到CAD 汉字库才可增加汉字,这里介绍一种脱离汉字库实现

    Genesis增加轮廓字(如要变为实体,填空Surface可变为实体字)

    一.增加效果图

    二.选中其中一个字放大查各节点细节

    三.字坐标树结构

    四.代码实现

          增加轮廓字

            private void button31_Click(object sender, EventArgs e)
            {
                Font font = new Font(new FontFamily("宋体"), 100f);
                tvList.Nodes.Clear();
                FillWordOutlines(10, 50, 20, font);
            }
      /// <summary>
            /// 填充所有字符轮廓
            /// </summary>
            /// <param name="x">起始X</param>
            /// <param name="y">Y值</param>
            /// <param name="spacing">字符间隔</param>
            private void FillWordOutlines(int x, int y, int spacing, Font font)    //  2步
            {
                IList<WordOutlineDrawing> wordOutlines = new List<WordOutlineDrawing>();
                string text = "pcbren共赢加油";
                if (!string.IsNullOrEmpty(text))
                {
                    foreach (char t in text)
                    {
                        TreeNode wordNode = new TreeNode(t.ToString());
                        tvList.Nodes.Add(wordNode);
    
                        //获取字符编码
                        uint ch = GetGB2312Coding(t);
    
                        //获取轮廓数据
                        DOutline outline = WordGraph.GetOutline(ch, font);
    
                        //构建轮廓实例
                        WordOutlineDrawing word = BuildWordOutline(outline, new PointF(x, y), wordNode);   // 转到 3步
                        wordOutlines.Add(word);
    
                        //下个字的起始位置=当前起始位置+宽度+间隔
                        x += (int)outline.Width + spacing;
                    }
                }
            }
          /// <summary>
            /// 通过轮廓数据构建字体轮廓
            /// </summary>
            /// <param name="outline">轮廓数据</param>
            /// <param name="offset">偏移量</param>
            /// <param name="wordNode"></param>
            /// <returns></returns>
            private WordOutlineDrawing BuildWordOutline(DOutline outline, PointF offset, TreeNode wordNode)   // 3步
            {
                //获取轮廓大小
                SizeF size = new SizeF(outline.Width, outline.Height);
    
                WordOutlineDrawing word = new WordOutlineDrawing(size);
                //---------------------
                wordNode.Tag = word;
                //---------------------
                int index = 0;
                add add = new add();
                //遍历填充轮廓数据
                foreach (DPolygon p in outline.Polygons)    //【单个字符对应poly个数  如O  有2个poly封闭圈】
                {
                    //新增多边形实例
                    PolygonDrawing polygon = new PolygonDrawing();
    
                    //---------------------
                    TreeNode polygonNode = new TreeNode("多边形" + (++index));
                    polygonNode.Tag = polygon;
                    wordNode.Nodes.Add(polygonNode);
                    //---------------------
    
                    //起始点
                    PointF start = new PointF(offset.X + ConvertUtil.FixedToFloat(p.Start.x), offset.Y - ConvertUtil.FixedToFloat(p.Start.y));
    
    
    
                    PointF point = start;
                    foreach (DLine l in p.Lines)   //【一个poly的封闭圈  线段列表】
                    {
                        LineDrawing line = null;
                        //如果类型为1则为折线,为2则为曲线
                        if (l.Type == 1) { line = new PolylineDrawing(); }
                        else { line = new CurvelineDrawing(); }
    
                        //加入起始点
                        line.Points.Add(point);
                        //---------------------
                        StringBuilder builder = new StringBuilder(l.Type == 1 ? "" : "");
                        builder.AppendFormat(" ({0},{1}) ", point.X, point.Y);
                        //---------------------
                        foreach (POINTFX fx in l.Points)
                        {
                            point = new PointF(offset.X + ConvertUtil.FixedToFloat(fx.x), offset.Y - ConvertUtil.FixedToFloat(fx.y));
                            line.Points.Add(point);
                            builder.AppendFormat("({0},{1}) ", point.X, point.Y);
                        }
                        polygon.Lines.Add(line);
    
    
                        //---------------------
                        TreeNode lineNode = new TreeNode(builder.ToString());
                        lineNode.Tag = line;
                        polygonNode.Nodes.Add(lineNode);
                        //---------------------
                    }
    
    
                    if (point != start)
                    {
                        //增加结束到开始的闭合线段
                        LineDrawing endLine = new BeelineDrawing();
                        endLine.Points.Add(point);
                        endLine.Points.Add(start);
                        polygon.Lines.Add(endLine);
    
                        //---------------------
                        TreeNode endNode = new TreeNode(string.Format("直 ({0},{1}) ({0},{1}) ", point.X, point.Y, start.X, start.Y));
                        endNode.Tag = endLine;
                        polygonNode.Nodes.Add(endNode);
                        //---------------------
                    }
    
    
    
                    for (int i = 0; i < polygon.Lines.Count; i++)
                    {
                        for (int j = 0; j < polygon.Lines[i].Points.Count; j++)
                        {
                            //add.pad(polygon.Lines[i].Points[j].X, polygon.Lines[i].Points[j].Y, 500, "r");
                            if (j > 0)
                                add.line(polygon.Lines[i].Points[j - 1].X, polygon.Lines[i].Points[j - 1].Y, polygon.Lines[i].Points[j].X, polygon.Lines[i].Points[j].Y, 500);
    
                        }
                    }
    
                    //加入到字符轮廓的多边形列表中
                    word.Polygons.Add(polygon);
                }
                return word;
            }
  • 相关阅读:
    Java8 Stream Function
    PLINQ (C#/.Net 4.5.1) vs Stream (JDK/Java 8) Performance
    罗素 尊重 《事实》
    小品 《研发的一天》
    Java8 λ表达式 stream group by max then Option then PlainObject
    这人好像一条狗啊。什么是共识?
    TOGAF TheOpenGroup引领开发厂商中立的开放技术标准和认证
    OpenMP vs. MPI
    BPMN2 online draw tools 在线作图工具
    DecisionCamp 2019, Decision Manager, AI, and the Future
  • 原文地址:https://www.cnblogs.com/pcbren/p/9436366.html
Copyright © 2020-2023  润新知