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脚本. 一.测试 ...
随机推荐
- 如何描述bug
清晰的标题 环境描述 已经采取了什么措施 结果 日志 Coredump 截图
- TCP报文到达确认(ACK)机制
TCP数据包中的序列号(Sequence Number)不是以报文段来进行编号的,而是将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节流中每个字节的编号.一个TCP数据包中包含多个字节 ...
- day07补充-数据类型总结及拷贝
目录 数据类型总结 按照存一个值 OR 多个值来分 按照有序 OR 无序来分 按照可变 OR 不可变来分 拷贝 && 浅拷贝 && 深拷贝&& .cop ...
- apache配置多域名二级域名
nginx配置多域名泛解析的看这个链接:https://www.cnblogs.com/Crazy-Liu/p/10879740.html 下面直接来操作: [root@localhost ~]# f ...
- Self-Attetion
四.self-attention 1.是什么? attention机制通常用在encode与decode之间,但是self-attention则是输入序列与输出序列相同,寻找序列内部元素的关系即 K= ...
- How To: Multipath Linux x86-64 Release 6.4
[root@node01 ~]# lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0 ...
- 最小生成树算法Kruskal详解
要讲Kruskal,我们先来看下面一组样例. 4 5 1 2 3 1 4 5 2 4 7 2 3 6 3 4 8 14 画出来更直观一些,就是上面的这张图. 智商只要不是0的(了解最小生成树是什么的童 ...
- 浏览器控制之 selenium,phantomJs谷无头浏览器
目录 浏览器控制之 selenium,phantomJs谷无头浏览器 selenium phantomJs 需求是尽可能多的爬取豆瓣网中的电影信息 谷歌无头浏览器 浏览器控制之 selenium,ph ...
- STM32串口通信配置(USART1+USART2+USART3+UART4)
一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...
- jquery源码分析(四)——回调对象 Callbacks
借用百度百科来说明下回调函数: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...