visio二次开发——图纸解析之形状

今天有空,下班前补齐解析visio图形形状的方法,包含图形背景色、字体颜色、备注信息、形状数据取值。

 /// <summary>
        /// 设置形状的选择属性
        /// </summary>
        /******************************************************
         * 0 仅选择组合形状。
         * 1 首先选择组合形状
         * 2 首先选择组合的组成部分
        ******************************************************/
        public static void SetGroupSelectMode(Shape targetShape, int selectMode)
        {
            targetShape.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowGroup,
                   (short)VisCellIndices.visGroupSelectMode).FormulaU = selectMode.ToString();
        }

设置打开组合的器件,然后开始取数据:

               if (sp.Shapes.Count > 0)//组合类型
                            {
                                missDevice = false;
                                ShapeInfo spG = new ShapeInfo();
                                spG.Type = "器件";
                                spG.DeviceName = sp.Name.Split(‘.‘)[0];
                                spG.DeviceDetail = "形状数据名:"+sp.Name+";";
                                addGroup(sp,spG);        //拆分组合

                                SetGroupSelectMode(sp, 0);
                                spG.DeviceDetail += GetShapeCellProp(sp);
                                spG.Position = GetShaplocationInfo(sp);
                                spG.DeviceType = getTypeByBgColor(sp);

                                if (spG.DeviceName != "")
                                {
                                    visioInfoDic[PageName].Add(spG);
                                }
                            }
addGroup方法:

 private void addGroup(Shape sp,ShapeInfo spi)
        {
            foreach (Shape childSP in sp.Shapes)
            {
                /*线类型*/
                if (childSP.Connects.Count > 0)
                {
                    ShapeLine spL = new ShapeLine();
                    spL.LPosition = GetShaplocationInfo(sp);  //位置信息
                    addLine(sp, spL, true);
                    spi.DeviceName = "";
                    visioLineDic[PageName].Add(spL);
                    break;
                }
                /*器件类型*/
                ShapeInfo spchild = new ShapeInfo();
                SetGroupSelectMode(childSP, 2);
                if (childSP.Shapes.Count > 0)
                    addGroup(childSP, spi);
                SetGroupSelectMode(childSP, 0);

                /* 根据颜色判断*/
                if(spi.DeviceType==null||spi.DeviceType=="")
                    spi.DeviceType = getTypeByBgColor(childSP);
                if(childSP.Text.Contains("dB"))
                     getDWordColor(childSP,childSP.Text,spi);

                if (childSP.Text.Contains("F"))
                {
                    spi.DeviceNum = childSP.Text.Split(‘/‘)[0];
                }
                spchild.DeviceName = childSP.Text;
                if (spchild.DeviceName != "")
                {
                    spi.Label = (spi.Label == "") ? spchild.DeviceName : spi.Label + ";" + spchild.DeviceName;
                }
            }

        }

GetShapeCellProp读取形状数据的信息:

  /// <summary>
        /// 获取图形属性
        /// </summary>
        private static string GetShapeCellProp(Shape shapeTarget)
        {
            string info = "";
            for (int i = 0; i < shapeTarget.get_RowCount((short)VisSectionIndices.visSectionProp); i++)
            {
                Cell cellKey = shapeTarget.get_CellsSRC((short)VisSectionIndices.visSectionProp, (short)i, (short)2);
                Cell cellValue = shapeTarget.get_CellsSRC((short)VisSectionIndices.visSectionProp, (short)i, (short)VisCellIndices.visUserValue);
                if (i > 0)
                    info += ";";
                info += FormulaForString(cellKey.Formula) + ":" + FormulaForString(cellValue.Formula);
            }
            return info;
        }

GetShaplocationInfo读取位置信息,前一篇已经给出。

获取文字颜色:

  if (sp.get_RowCount((short)VisSectionIndices.visSectionCharacter) == 1)
            {
                /*一个文本单个单颜色*/
                Cell wordCell = sp.get_CellsSRC((short)VisSectionIndices.visSectionCharacter, 0, (short)VisCellIndices.visCharacterColor);
                wordColor = wordCell.Formula;
                deviceType(si, wordColor,power.Replace("/",""));
            }
//多种颜色则循环取出
 for (short i = 0; i < sp.get_RowCount((short)VisSectionIndices.visSectionCharacter); i++)
                    {
                        Cell wordCells = sp.get_CellsSRC((short)VisSectionIndices.visSectionCharacter, i, (short)VisCellIndices.visCharacterColor);
                       if (wordCells.Formula.Contains("THEMEVAL()") && ((sp.get_RowCount((short)VisSectionIndices.visSectionCharacter) - 1) == i))
                        {
                            break;
                        }
                        if (i > 0)
                            wordColor += "|";
                        wordColor += wordCells.Formula;
                    }

图形背景色:

Cell color = sp.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowFill, (short)VisCellIndices.visFillForegnd);
            string strColor = color.Formula;

  大多数据都可以通过像取背景色一样,将形状的属性取出,比如线段粗细、字体、字体大小等等,有兴趣的继续研究。

 
 
 
时间: 2024-10-18 16:27:04

visio二次开发——图纸解析之形状的相关文章

visio二次开发初始化问题

问题: axDrawingControl1初始化失败((System.ComponentModel.ISupportInitialize)(this.axDrawingControl1)).EndInit(); 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) 解决方法: 在项目属性里设置“生成”=>“目标平台”为x86而不是默认的ANY CPU. 问题: 拖入drawingControl控件失败 解决: 先把关于visio的引用删掉,才

QT开发(四十二)——DOM方式解析XML

QT开发(四十二)--DOM方式解析XML 一.DOM简介 1.DOM简介 DOM是Document Object Model的简写,即XML文档对象模型,是由W3C提出的一种处理XML文档的标准接口. DOM 一次性读入整个XML文档,在内存中构造为一棵树(DOM树)将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些.能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XML 文件. 2.XML DOM节

ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册(转)

ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发指南 http://wenku.baidu.com/view/785b8a1ea76e58fafab003a6.html ECMall 结构图 http://wenku.baidu.com/view/3e9d9921bcd126fff7050b10.html ECMall 数据库表结构 全面讲解 h

C#开发BIMFACE系列2 二次开发流程

BIMFACE 平台是一个对外开放的平台,建筑行业的相关公司.软件公司或者有 BIM 业务需求的公司都可以注册成为开发者并使用其提供的强大功能. 注册账号成为开发者 注册地址:http://bimface.com/register#/register 注册成功后,使用注册账号登录系统,打开“控制台”界面,提供了一个AppKey 与 AppSecret,用于二次开发调用API接口时使用.使用原理与调用微信API接口大致相同. 快速创建一个BIM应用需要以下4个步骤:  使用方式一:使用管理控制台

微信公众平台搭建与开发(二)开发模式的搭建和关键词回复

在第一部分介绍了编辑模式,但是编辑模式有较大局限性,下面主要开始介绍开发模式,这一部门先简单介绍下开发模式的环境搭建和关键词回复. 开发模式首先要有一个虚拟主机,本人使用的是新浪开发者平台的虚拟主机,使用云豆计算流量,若成为新浪开发者用户基本上就可以免费使用了,本人注册用户所赠送的云豆不知道能用多久.当然国内比较大还有就是百度开发者平台,注册后发现部署还没有新浪的方便,并且在BAE3.0以后好像也是要收费的.有兴趣的朋友可以研究下google的开发者平台,不知道是否要收费. 在注册新浪开发者平台

java快速开发平台 二次开发 SSM后台框架

获取[下载地址]     [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.

PHPCMS二次开发教程(转)

转自:http://www.cnblogs.com/semcoding/p/3347600.html PHPCMS V9 结构设计 根目录 |–api  结构文件目录 |–caches 缓存文件目录    |– configs 系统配置文件目录    |– caches_* 系统缓存目录 |–phpcms  phpcms框架主目录    |– languages 框架语言包目录    |– libs 框架主类库.主函数库目录    |– model 框架数据库模型目录    |– modules

[连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用

目       录 第十二章     二次开发及应用... 2 12.1        项目配制... 3 12.2        引用相关组件... 4 12.3        构建主程序... 5 12.4        设备驱动的开发... 6 12.4.1       假定通讯协议... 6 12.4.1.1   发送读实时数据命令协议... 6 12.4.1.2   解析实时数据协议... 6 12.4.1.3   发送和接收数据事例... 7 12.4.2       新建设备模块.

http服务器二次开发SDK

1. 概述 http协议能够将可见协议与二进制协议有效融合,并且其结构良好,分头域与实体两部分,而且头域的结构一致,并能够随意扩展.我们可以基于头域结构的形式,模拟MFC消息结构,设计一个高效,易扩展的解析架构. 本程序的设计初衷就是模拟MFC的消息机制来实现http头域的解析,并使得能够基于该结构实现私有协议的解析,实现http协议的基本框架,使得二次开发时能够基于该框架快速实现开发.使用C++开发网站,完全实现界面与数据分开,使得C++的程序员们也能够快速开发基于网页的程序. 如果需要基于本