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(, , , 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 = ;
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 == ) { line = new PolylineDrawing(); }
else { line = new CurvelineDrawing(); } //加入起始点
line.Points.Add(point);
//---------------------
StringBuilder builder = new StringBuilder(l.Type == ? "折" : "曲");
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 = ; i < polygon.Lines.Count; i++)
{
for (int j = ; 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 > )
add.line(polygon.Lines[i].Points[j - ].X, polygon.Lines[i].Points[j - ].Y, polygon.Lines[i].Points[j].X, polygon.Lines[i].Points[j].Y, ); }
} //加入到字符轮廓的多边形列表中
word.Polygons.Add(polygon);
}
return word;
}
PCB Genesis增加轮廓字 实现原理的更多相关文章
- PCB Genesis增加点阵字 实现原理
我们采用Genesis增加点阵字时,用Genesis增加Canned Text即可,但奥宝中文不支持,且字符种类是有限的呀 不过没关系,没有自己造呀.在这里我分享一种增加点阵字的实现方法 一.通过代码 ...
- PCB genesis自制孔点 Font字体实现方法
一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个 ...
- PCB Genesis SET拼板(圆形板拼板) 实现效果(二)
越来发现Genesis采用Surface多边形数据结构的重要性了,当撑握了多边形缩放,交集, 差集,并集等算法, 想实现PCB拼板简直轻而易举了;当然借助多边形算法可以开发出更多的PCB实用的工具出来 ...
- PCB Genesis加二维码 实现方式
使用incam可以很轻松的增加2维码,这里通过另外一种方式玩转二维码的加法, 使用谷歌zxing.dll类库实现,将文字信息转为bitmap点阵后,在Genesis绘制点即可. 一.incam增加二维 ...
- PCB Genesis加邮票孔(邮票孔增加方向判断--左右上下)实现算法
之前没解决的问题,当时一下卡在用户界面选择邮票孔增加的方向(上下左右) 与邮票孔实际方位之前的逻辑与非判断上卡壳了,导致一下没进展下去. 回头看原来如此简单 ,将此点记录一下. 1.垂直线定义:80- ...
- PCB genesis连孔加除毛刺孔(圆孔与槽孔)实现方法(二)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- PCB genesis连孔加除毛刺孔(槽孔与槽孔)实现方法(三)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- PCB genesis连孔加除毛刺孔(圆孔与圆孔)实现方法(一)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- PCB Genesis脚本 C#调用Javascript
曾经用node.js测试写Genesis脚本失败了,这次借助开发PCB规则引擎的机会(基于JS V8引擎与.net深度交互性), 验证一下Javascript是否可用于写Genesis脚本. 一.测试 ...
随机推荐
- 网络爬虫 robots协议 robots.txt
网络爬虫 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上 ...
- Git学习总结二(版本回退)
修改修改仓库中readme.txt文件,然后用git status命令看看结果: $ git status On branch master Changes not staged for commit ...
- git学习(1)
一.git fetch 和git pull 的差别 1.git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令: git fetch orgin master //将远程仓库的 ...
- 33.bucket与metric核心概念讲解
主要知识点: bucket与metric核心慨念 一.核心慨念 1.bucket:一个数据分组 比如有下面几条数据: city name 北京 小李 北京 小王 上海 小张 上海 小丽 上海 小陈 ...
- Python-----基本操作
Python是一种简单易学,且功能强大的编程语言.它是面向对象的编程语言. 对象的意义: 对象可以通过一个“.” 的方式来调用这个对象的方法. Python环境安装配置: Python是一种通用的计算 ...
- webstorm+nodejs环境中安装淘宝镜像
用过nodejs的人都知道,从node的官方模板库下载依赖包的时候,经常会遇到“假死”(页面静止不动)的状态,这种速度简直要逼死焦急地等待下班的人.还好咱们万能的淘宝提供了淘宝镜像这么一个不要更好用的 ...
- 深入浅出了解HTTP协议
深入浅出了解HTTP协议
- 清北学堂模拟赛d7t6 拯救世界
分析:如果题目中没有环的话就是一道裸的最长路的题目,一旦有环每个城市就会被救多次火了.把有向有环图变成有向无环图只需要tarjan一边就可以了. #include <bits/stdc++.h& ...
- hdu_1021_Fibonacci Again_201310232237
Fibonacci Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- [bzoj1007][HNOI2008]水平可见直线_单调栈
水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...