功能用处:

对svg文件的路径节点填充时会使用(相邻两个坐标区域内的四边形的填充颜色不重复)。

需要对svg文件中的Path节点或者 Polyline 节点做颜色填充.并且相邻的两个区域之间的颜色不允许重复。

代码如下:

        /// <summary>
/// 根据svg节点对象类型和路径值转换成标准的坐标值
/// </summary>
/// <param name="pointType">线条类型,可以是 Path 或者 Polyline</param>
/// <param name="pointValue">
/// 线条值
/// <para>如 Path 节点的“d”属性</para>
/// <para>如 Polyline 节点的“points”属性</para>
/// </param>
/// <returns>返回浮点类型的二维平面坐标点集合</returns>
IList<PointF> ConvertPoints(string pointType, string pointValue)
{
IList<PointF> points = new List<PointF>(); string[] pointArray = { }; if (pointType.ToLower() == "points")
{
//Polyline 节点
pointArray = pointValue.Split(new char[] { ' ', ',' }); for (int i = ; i < pointArray.Length; i = i + )
{
if (i + >= pointArray.Length)
break; if (string.IsNullOrEmpty(pointArray[i]) || string.IsNullOrEmpty(pointArray[i + ]))
continue; try
{
PointF item = new PointF();
item.X = float.Parse(pointArray[i]);
item.Y = float.Parse(pointArray[i + ]);
points.Add(item);
}
catch (Exception)
{
throw;
}
}
}
else if (pointType.ToLower() == "d")
{
//Path 节点 if (!pointValue.StartsWith("m"))
{
return new List<PointF>();
} pointValue = pointValue.Substring();
PointF prePos = new PointF();
//过滤掉 path 路径符号
pointArray = pointValue.Split(new char[] { ' ', 'c', 'l', 's', 'v', 'q', 't', 'm', 'z' });
foreach (string thisPoint in pointArray)
{
if (string.IsNullOrEmpty(thisPoint))
continue; try
{
string[] pThis = thisPoint.Split(',');
PointF item = new PointF();
item.X = prePos.X + float.Parse(pThis[]);
item.Y = prePos.Y + float.Parse(pThis[]);
points.Add(item); prePos = item;
}
catch (Exception)
{
throw;
}
}
} return points;
}

然后根据坐标集合获取一个 四边形的坐标对象:

        /// <summary>
/// 根据节点ID和节点坐标的二维平面x,y坐标集合获取坐标值对象
/// </summary>
/// <param name="points">浮点类型的二维平面坐标点集合</param>
/// <param name="nodeId">Svg节点ID</param>
/// <returns>Svg位置对象</returns>
public ObjectPosition GetObjectPosition(IList<PointF> points, string nodeId)
{
ObjectPosition thisPos = new ObjectPosition(nodeId); for (int i = ; i < points.Count; i++)
{
PointF pos = points[i];
if (i == )
{
thisPos.Init(pos.X, pos.Y);
}
else
{
thisPos.SetPoint(pos.X, pos.Y);
}
} return thisPos;
}

然后初始化坐标,并且获取四边形的坐标值:

        /// <summary>
/// 初始化坐标
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void Init(float x, float y)
{
X1 = x;
X2 = x;
Y1 = y;
Y2 = y;
} /// <summary>
/// 设置四边形坐标值
/// <remarks>原则:大中取大,小中取小.</remarks>
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void SetPoint(float x, float y)
{
if (x < X1) X1 = x;
else if (x > X2) X2 = x;
if (y < Y1) Y1 = y;
else if (y > Y2) Y2 = y;
}

最后使用:

        /// <summary>
/// 通过svg文件或者加载的Svg内容获取svg对象的坐标对象
/// </summary>
/// <returns>
/// <para>key:节点名称</para>
/// <para>value:节点坐标对象</para>
/// </returns>
public Dictionary<string, ObjectPosition> GetSvgObjectPositions()
{
Dictionary<string, ObjectPosition> mapList = new Dictionary<string, ObjectPosition>(); HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
//加载Svg内容
document.LoadHtml(this.SvgString); var polylines = document.DocumentNode.SelectNodes("//polyline");
if (polylines != null)
{
for (int i = ; i < polylines.Count; i++)
{
if (polylines[i].Attributes["id"] == null)
continue;
if (polylines[i].Attributes["points"] == null)
continue; string nodeId = polylines[i].Attributes["id"].Value;
IList<PointF> points = this.ConvertPoints("points", polylines[i].Attributes["points"].Value);
ObjectPosition posInfo = this.GetObjectPosition(points, nodeId);
mapList.Add(posInfo.NodeID, posInfo);
}
} var paths = document.DocumentNode.SelectNodes("//path");
if (paths != null)
{
for (int i = ; i < paths.Count; i++)
{
if (paths[i].Attributes["id"] == null)
continue;
if (paths[i].Attributes["d"] == null)
continue; string nodeId = paths[i].Attributes["id"].Value;
IList<PointF> points = this.ConvertPoints("d", paths[i].Attributes["d"].Value);
ObjectPosition posInfo = this.GetObjectPosition(points, nodeId);
mapList.Add(posInfo.NodeID, posInfo);
}
} return mapList;
}

分享:根据svg节点对象类型和路径值转换坐标值的更多相关文章

  1. 分享:Svg文件转换为图片(调用 Inkscape 命令行)

    其实只是做了简单封装,可以方便进行批量转换. 获取Svg对象坐标的代码请看:根据svg节点对象类型和路径值转换坐标值, DrawingColor方法是进行颜色填充的. /// <summary& ...

  2. 转载:as3.0下对象类型返回值与变量默认值的详细说明

    转自:http://www.cuplayer.com/player/PlayerCodeAs/2012/0905367.html Null.NaN.undefined 及各自应用对象:变量的默认值: ...

  3. PHP之对象类型

    PHP之object对象 对象初始化 要创建一个新的对象object,使用new语句实例化一个类: 转化为对象 如果讲一个对象转化成对象,它将不会有任何变化.如果其它任何类型的值被转化成对象,将会创建 ...

  4. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. JavaScript判断对象类型及节点类型、节点名称和节点值

    一.JavaScript判断对象类型 1.可以使用typeof函数判断对象类型 function checkObject1(){ var str="str"; console.lo ...

  6. SAP CRM 用户界面对象类型和设计对象

    在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...

  7. (87)Wangdao.com第二十天_JavaScript document 节点对象

    document 节点对象, 代表整个文档,每张网页都有自己的 document 对象. window.document 当浏览器开始加载文档时就存在了 正常的网页使用 document 或者 win ...

  8. 复杂对象类型的WebService高级部分

    从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件. (1)定义一个对象实现了serializable 接口package cn.com.chenlly.s ...

  9. JS框架设计之对象类型判断一种子模块

    Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型.基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型 ...

随机推荐

  1. UVA_393_Doors_(计算几何基础+最短路)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page ...

  2. windows下 破解 Sublime Text3 和汉化

    这货已经出到3了. windows下载,破解,使用方法: 一:破解 1: 去官网下载最新版本 http://www.sublimetext.com/3 2:下载破解器(SublimeTextKeyge ...

  3. linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析

    在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...

  4. 作品第二课----点击DIV显示其内容

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JavaScript---网络编程(6)-Dom和Bom模型概念讲解(节点获取,window对象)

    本节讲Dom和Bom模型概念讲解(节点获取,window对象). out.js: 写了2个输出到页面的函数. function println(param){ document.write(param ...

  6. 哈希(1) hash的基本知识回顾

    好久没看数据结构了,现在也打不起精神来,翻了一下书,严蔚敏那本书.,以下是书的第9章,发现自己很多时候对知识的认识无法结构化和系统化,都是零散的,模糊的混乱的记忆,以后要有体系, 第9章 查找     ...

  7. SDPLR的安装过程(matlab)

    SDPLR 半正定规划优化工具的安装过程很简单,只要按照SDPLR 1.03-beta User's Guide (short version).pdf的介绍安装就可以. 运行在下载的工具包目录里运行 ...

  8. Centos系统python2.x升级python3.x

    1. Centos7初始安装的python版本为2.7.5 2.下载最新的python3.5.2,解压到/usr/local/src 3. 配置.编译.测试.安装(根据软件的README说明) ./c ...

  9. SQL查询记录添加序号(HANA)

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) row_number() OVER() 从1开始,为每一条分组记录返回一个数字,这里 ...

  10. linux杂谈(十九):DNSserver的配置(二)

    1.本机和外网的解析 ​ ​之前讨论了DNS的正向解析和反向解析,但有的时候我们想让DNSserver对于server本机的解析和对于外网的解析是不同的.那就须要在主配置文件里对本机和外网进行不同的配 ...