visio自动化


visio官方文档
模板

1 自动导出visio为图片

#!/usr/bin/python
# -*- coding: GBK -*-
import  logging,os,sys
import  win32com.client as win32
from    win32com.client import constants
from    logging import  debug, info

#logging.basicConfig( level = logging.DEBUG, format = '[%(levelname)s] %(message)s')
logging.basicConfig( level = logging.DEBUG, format = '[%(filename)s %(lineno)d ] %(message)s')

def export_visio_sheet(file,dir=None):
    #appVisio = win32.gencache.EnsureDispatch("Visio.InvisibleApp") #设置不可见
    appVisio = win32.gencache.EnsureDispatch("Visio.Application") #可见
    #appVisio.Visible = False #设置不可见
    try:
        fullfile = os.path.join(os.getcwd(),  file )
        logging.info(file)
        vdoc = appVisio.Documents.Open(fullfile)
        pages_num =  len( vdoc.Pages)
        debug( "pages {0}".format( pages_num ) )
        #创建目录
        if dir:
            dir = file.split('.')[0]
            if not  os.path.exists(dir): os.mkdir(dir)
        for i in range(pages_num):
            #设置主题(无主题)
            # page = vdoc.Pages()
            # page.SetTheme(0)
            page_name = vdoc.Pages(i+1).Name
            if dir:
                export_name = os.path.join(os.getcwd(),dir, "%s.png"%(page_name) )
            else:
                export_name = os.path.join(os.getcwd(),"%s.png"%(page_name) )
            logging.info(export_name)
            vdoc.Pages(i+1).Export (export_name) 
    except Exception as e:
        info(e)
    finally:
        appVisio.Quit() #退出

if __name__ == '__main__':
    export_visio_sheet("1.vsdx",dir=True)

2 打开UML类图

#!/usr/bin/env python3 
# -*- coding:GBK -*-
# Author: Zero

import win32com.client
import os, sys, logging,re
from   logging import  debug, info

logging.basicConfig( level = logging.DEBUG, format = '[%(filename)s %(lineno)d ] %(message)s')

SHAPE_CLASS  = 0
SHAPE_MEMBER = 1


class  visioumlclass(object):
    def __init__(self, filename ):
        self.filename  = filename 
        self.pagecount = 0

    def open(self, name=''):
        if(name!=''): self.filename = os.path.join(os.getcwd(), name )
        info("Drawing UML Class: %s",  self.filename )
        self.visio =  win32com.client.Dispatch("Visio.Application")
        #self.Visio = win32com.client.Dispatch("Visio.InvisibleApp")
        # add a new file using visio template name
        self.visio_template = self.visio.Documents.Add("USTRME_M.vst")   #新建一个visio文件 UML类

        for doc in self.visio.Documents :
            #find  visioStencil
            if (doc.Name == "USTRME_M.VSSX"  or doc.Name == "USTRME_M.vssx" ):
                self.visioStencil = doc
                break

        # get master and shapes
        # shape01 = self.visioStencil.Masters.ItemU("Class")      #类
        # shape02 = self.visioStencil.Masters.ItemU("Member")     #成员函数
        # shape03 = self.visioStencil.Masters.ItemU("Interface")  #接口

        #visio 2013测试过
        '''
        shape01  =  self.visioStencil.Masters.ItemU(1)  #类
        shape02  =  self.visioStencil.Masters.ItemU(2)  #成员
        shape03  =  self.visioStencil.Masters.ItemU(3)  #分隔符
        shape04  =  self.visioStencil.Masters.ItemU(4)  #接口
        shape05  =  self.visioStencil.Masters.ItemU(5)  #枚举
        shape06  =  self.visioStencil.Masters.ItemU(6)  #包(展开)
        shape07  =  self.visioStencil.Masters.ItemU(7)  #包(折叠)
        shape08  =  self.visioStencil.Masters.ItemU(8)  #注释
        shape09  =  self.visioStencil.Masters.ItemU(9)  #继承
        shape010 =  self.visioStencil.Masters.ItemU(10) #接口实现
        shape011 =  self.visioStencil.Masters.ItemU(11) #关联
        shape012 =  self.visioStencil.Masters.ItemU(12) #直接关联
        shape013 =  self.visioStencil.Masters.ItemU(13) #聚合
        shape014 =  self.visioStencil.Masters.ItemU(14) #依赖关系
        shape015 =  self.visioStencil.Masters.ItemU(15) #复合
        '''
        self.shapes = []
        for i in range(1,16,1):
            shape = self.visioStencil.Masters.ItemU(i) 
            self.shapes.append(shape)
        #
        self.pagecount = 1
        #page
        self.page = self.visio_template.Pages(self.pagecount)
        self.page.SetTheme(0,0,0,0,0)
        self.pagewidth  = self.page.PageSheet.CellsU("PageWidth").ResultIU
        self.pageheight = self.page.PageSheet.CellsU("PageHeight").ResultIU

    def new_page(self, page_name ):
        if (self.pagecount == 0):  self.open()
        # draw on the first page
        if (self.pagecount == 1):
            self.page = self.visio_template.Pages.Item(self.pagecount)
            #设置主题(无主题)
            self.page.SetTheme(0, 0, 0, 0, 0)
        else:
            #添加新的page
            self.page = self.visio_template.Pages.Add()

        self.pagecount += 1
        self.page.Name  = page_name
        self.pagewidth  = self.page.PageSheet.CellsU("PageWidth").ResultIU
        self.pageheight = self.page.PageSheet.CellsU("PageHeight").ResultIU
        debug("width : %f"%self.pagewidth  )
        debug("height: %f"%self.pageheight )
        return  self.page

    def  draw_shape(self, type, x, y, text, linewidth=0  ):
        shape = self.page.Drop( self.shapes[type], 1.5*x, self.pageheight - 1.89*y)
        shape.Text =  text
        return shape

    def draw_member(self, mlist):
        '''
        绘制shape 类成员
        :param   mlist: 成员text列表
        :return: 无
        '''
        for i in range(len(mlist)):
            #绘制成员
            member = self.page.Drop(self.shapes[SHAPE_MEMBER], 2, self.pageheight-1 - 0.3*i)
            member.Text  =  mlist[i]

    def save(self):
        info('saving visio %s',self.filename)
        self.visio.ActiveDocument.SaveAs(self.filename)
        self.visio.ActiveDocument.Close()
        self.visio.Quit()
    
    def  close(self):
        self.visio.ActiveDocument.SaveAs(self.filename)
        self.visio.ActiveDocument.Close()
        self.visio.Quit()

    #绘制继承关系demo
    def test_draw(self):
        info(self.pagewidth)
        info(self.pageheight)
        shapeclass  = self.page.Drop( self.shapes[0], 0, 0 )
        shapeclass.Text = "测试类===="
        shapeclass1  = self.page.Drop( self.shapes[0], 0, 2 )
        shapeclass1.Text = "测试类1===="
        line = self.page.Drop( self.shapes[8], 0, 0 )
        line.CellsU("BeginX").GlueTo( shapeclass.CellsU("Connections.X4") )
        line.CellsU("EndX").GlueTo( shapeclass1.CellsU("Connections.X3") )
        #shapemember = self.page.Drop( self.shapes[1], 0, 0)

    def test_draw1(self):
        for i in range(10):
            member = self.page.Drop(self.shapes[1], 2, 0.5*i)
            print(member.CellsU("Width").ResultIU)

if __name__ == "__main__":
    test  = visioumlclass( os.path.join(os.getcwd(), "uml.vsdx"))
    test.open()
    test.draw_member(["函数01","函数02","函数03","函数04"])
    test.test_draw()
    #test.save()

效果如下:
在这里插入图片描述
上面类似做法基本可以实现想要的功能了,但是官方文档中没有找到二维图形如何连接,希望有小伙伴能看到指导。类似将上述member添加到类中,没想到如何实现?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值