zoukankan      html  css  js  c++  java
  • 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;
            }
  • 相关阅读:
    html和css基础
    Chrome的插件使用
    04
    03
    MySQL的下载与安装(超完整)
    IDEA运行单元测试报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    IDEA 快捷键合集
    IDEA + Spring的安装以及入门案例创建(超详细)
    Java NullPointerException异常的原因
    Eclipse 显示 错误:找不到或无法加载主类
  • 原文地址:https://www.cnblogs.com/pcbren/p/9436366.html
Copyright © 2011-2022 走看看