ASP.NET中Visio图形的控制与数据的动态显示

背景: 在实现应用开发中, 存在这样一种需求, 在一张图中动态显示图中图元的数据并控制图元的显示方式。比如一张电气接线图, 需要动态显示各个开关的状态及各个电气设备的参数。

问题: 如何以Web方式满足这样一个需求?

解决方案: Visio绘制图形, ASP.NET中调用Visio提供的编程接口去控制Visio图中的图元,并转换成Web上可以显示的图像格式。对于每个要动态显示数据的图形, 定义一个自定义属性标识它,比如:TagNum, 然后在程序中根据TagNum的值从数据库中读取数据来设置相应图形的数据。

参考资源:  Visio 2003 SDK

示例代码:

需要添加对Microsoft Visio 11.0 Type Library的引用(COM组件)。代码如下:

     using Microsoft.Office.Interop.Visio;

private void Button1_Click(object sender, System.EventArgs e)

         {

              Document doc=null;

              Cell cell=null;

              ApplicationClass app=new ApplicationClass();//运行Visio应用程序

              string CurrentPath=MapPath(".");

              doc=app.Documents.OpenEx(CurrentPath+"\\bin\\test2.vsd",(short)Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenCopy);//打开一个visio文件

              const string CUST_PROP_PREFIX = "Prop."; //自定义属性前缀

              try

              {   

                   for(int i=1;i<=doc.Pages[1].Shapes.Count;i++)

                   {

                        doc.Pages[1].Shapes[i].Rotate90();//将图形旋转90

                       doc.Pages[1].Shapes[i].Text="hello";//设置图形的文本

                        if(doc.Pages[1].Shapes[i].get_CellExists("TagNum",(short)Microsoft.Office.Interop.Visio.VisExistsFlags.visExistsAnywhere)!=0)//检查定制是否存在指定定制属性

                       {

                            doc.Pages[1].Shapes[i].Text=data;//在此处显示图形数据

                       }

                   }

                   doc.Saved=true;//告诉Visio应用程序该文件已保存, 不然Visio要出现是否要保存的对话框,实际上并未保存,因为我们不想对源文件作修改,只是修改过后显示一下就行了。

                   doc.Pages [1].Export(CurrentPath+"\\test.jpg");//转换成jpg格式的文件

              }

              finally

              {

                   doc.Close();//关闭打开的文件

                   app.Quit();//退出Visio应用程序

              }

             

         }

    

测试环境:

Visio 2003+IIS 5.0+.NET FrameWork 1.1

未解决的问题:

1、  即使在一个形状中定义了自定义属性, 通过get_CellExists也无法检测到

2、  不知如何通过代码改变形状的背景色

 

posted @ 2004-04-29 11:02 dudu 阅读(6311) 评论(22)  编辑 收藏 所属分类: C#

  回复  引用    
#1楼 2004-04-29 11:59 | steeven [未注册用户]
不错不错。
visio还有web浏览插件。可以拿来偷懒 :)
  回复  引用  查看    
#2楼 2004-04-29 12:58 | hBifTs      
哦..是通过Visio SDK 来做的..
好玩啊~!

  回复  引用    
#3楼 2004-04-29 13:09 | jiangyu [未注册用户]
还有这样的好东西啊,谢谢dudu
  回复  引用  查看    
#4楼 2004-04-29 14:04 | dudu      
@hBifTs
文章中的代码并未用到Visio SDK, 但Visio SDK的Code Librarian Viewer中有不少Sample Code可以参考.
  回复  引用  查看    
#5楼 2004-04-29 18:55 | hBifTs      
哦??
也就是VS.NET自带的啰??
哇,真强
  回复  引用    
#6楼 2004-06-16 17:49 | foxmain [未注册用户]
sectionIndex = (short)Microsoft.Office.Interop.Visio.VisSectionIndices.visSectionProp;
  回复  引用    
#7楼 2004-10-13 17:54 | okpol [未注册用户]
请问用winform(c#)开发的带visio插件的项目,打包时怎么才能把visio程序一起打进去。我打完包试了一下,不安装visio还是用不了。拜托各位了
  回复  引用    
#8楼 2004-10-22 15:47 | 考拉 [未注册用户]
doc.Pages[1].Shapes[i].Text=data;//在此处显示图形数据
~~~~这里的data在哪里赋值的呀??编译通不过呀!!
  回复  引用    
#9楼 2004-11-01 16:01 | 学中飞 [未注册用户]
我用的是windows2003+IIS6.0+visio2003+VS2003为什么老是在
ApplicationClass app=new ApplicationClass();//运行Visio应用程序

出现权限错误,我已经把ofiice2003的目录权限付给了iusr
  回复  引用  查看    
#10楼 2005-04-26 19:37 | Jacky      
象这样ApplicationClass app=new ApplicationClass();//运行Visio应用程序 操作excel,应该怎样做?thanks
  回复  引用    
#11楼 2005-06-14 19:16 | prolead [未注册用户]
web.config
**************************************************
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<identity impersonate="true" userName="TEST\VisioUser" _
password="visiorocks" />

</system.web>
</configuration>

设置上面的用户对 文件夹C:\WIN2K\Microsoft.NET\Framework\v1.1.4322 有全部权限

  回复  引用    
#12楼 2005-08-13 20:35 | tank3210 [未注册用户]
我在visual studio .net 2003中调试,怎么老是报application 无效引用呢,请老师指点!急!
  回复  引用    
#13楼 2005-08-30 21:39 | rocyle_hunu [未注册用户]
报application 无效,就是需要添加相应的using语句
我想请教dudu兄,若是一副随意的VISIO图文件,是否可以把其中的每个图元都提出出来,分别保存!请赐教。
  回复  引用    
#14楼 2005-08-30 21:49 | rocyle_hunu [未注册用户]
dudu兄在这个实例中是不是就是隐式的在程序中打开VISIO2003 然后就用VISIO 对图片进行操作转换。是否可以直接使用SDK 从一副VISIO图中对图元进行提取?赐教
  回复  引用  查看    
#15楼 [楼主]2005-08-30 21:51 | dudu      
@rocyle_hunu
抱歉!我后来没有研究这个, 不能解答你的问题。
  回复  引用    
#16楼 2005-08-31 10:02 | rocyle_hunu [未注册用户]
仍然表示感谢!
  回复  引用    
#18楼 2005-10-28 14:09 | xxx [未注册用户]
不是我想要的资料
  回复  引用    
#19楼 2006-02-20 10:42 | falcon [未注册用户]
菜菜的问:运行的时候发生这种错误是怎么会事,如何解决?

异常详细信息: System.Runtime.InteropServices.COMException: 服务器运行失败

源错误:

行 61:Cell cell=null;
行 62:
行 63:ApplicationClass app=new ApplicationClass();//运行Visio应用程序
行 64:
行 65: string CurrentPath=MapPath(".");


源文件: d:\hr项目支持\projtech\reports\visio_test.aspx.cs 行: 63

堆栈跟踪:

[COMException (0x80080005): 服务器运行失败]



  回复  引用    
#20楼 2006-12-18 10:12 | zyhomepage [未注册用户]
我的是这个:using Microsoft.Office.Interop.VisOcx;
不是这个:using Microsoft.Office.Interop.Visio;
怎么回事?
  回复  引用    
#21楼 2007-06-26 16:23 | ellen [未注册用户]
@steeven 各位我有很好的职位是关于.NET方面的,有兴趣的可以沟通一下啊. feildingellen@163.com 要快啊,否则没沙发可坐拉.

  回复  引用    
#22楼 2007-08-10 08:47 | 无 [未注册用户]
谢谢!太好了

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-04-29 11:15 编辑过
 
另存  打印