功能用处:

对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. VS2010引用项目dll,编译时报错

    截图出处:http://www.cnblogs.com/wuhuisheng/archive/2012/02/13/2349754.html

  2. PowerDesigner使用总结 转

    PowerDesigner使用总结 (友情提示:本博文章欢迎转载,但请注明出处:陈新汉,http://www.blogjava.net/hankchen)一.使用PowerDesigner生成HTML ...

  3. ARM学习笔记9——ARM汇编汇编语言中的伪指令

    ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令.ARM伪指令包含ADR.ADRL.MOV32和LDR.一.ADR伪指令 1.作用 ADR是小范围地址读取伪指令,基于P ...

  4. 进程与线程(四) linux进程间通信的方式总结

    1概述: 上文说到,每个进程都有自己的地址空间,包括什么呢?向下生长得栈,向上生长的堆,代码段,数据段等,这些都是进程私有的,如何实现通信的呢?通信需要媒介,这个媒介很重要. 对于研发人员来说,进程不 ...

  5. CSS样式学习笔记『W3School』

    1.选择器+声明声明:属性+值eg:h1{color:red;font-size:14px;}颜色:p{color:#ff0000;}p{color:#f00;}p{color:rgb(255,0,0 ...

  6. PHP检查表单提交是否来自于本站(验证HTTP_REFERER等)

    方法一: 你可以把处理提交数据的代码写到一个单独的文件里,比如form.php.      <?php      if   (defined(’INSIDE’))   {//判断是否有定义INS ...

  7. 长沙Uber优步司机奖励政策(2月1日~2月7日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. hdoj 1827 Summer Holiday【强连通分量&&缩点】

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. action使用大全

    1.Intent的用法: (1)Action跳转 1. 使用Action跳转,当程序AndroidManifest.xml中某一个 Activity的IntentFilter定义了包含Action, ...

  10. Quartz定时任务学习(五)触发器

    顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...