#!/usr/bin/env python2
#-*- coding: UTF-8 -*-
import math
import lxml.etree
import glob
#Извлечение числа из списка
def unlist(ar) :
return ar[0]
#Проверка существования объекта
def isObj(obj) :
if (obj) :
return 1
else :
return 2
#Перевод дюйм/см
def inch2cm(n) :
return str(float(n) * 2.54)
#Получение значений координат (х,у)
def xy2csv(x,y,moveTo,EllipticalArcTo) :
try :
x = inch2cm(x)
y = inch2cm(y)
moveTo = str(moveTo)
EllipticalArcTo = str(EllipticalArcTo)
print x + "\t" + y + "\t" + moveTo + "\t" + EllipticalArcTo
f.write(x + "\t" + y + "\t" + moveTo + "\t" + EllipticalArcTo + "\r\n")
except :
pass
#Поиск следующего шага
def nextStep(cur) :
if (cur.xpath("./following-sibling::visio:LineTo or ./following-sibling::visio:EllipticalArcTo", namespaces=NSMAP)) :
new_cur = unlist(cur.xpath("./following-sibling::visio:*", namespaces=NSMAP))
x = float(unlist(new_cur.xpath("./visio:X/text()", namespaces=NSMAP)))
y = float(unlist(new_cur.xpath("./visio:Y/text()", namespaces=NSMAP)))
xx = start_x + x * math.cos(Angle) - y * math.sin(Angle)
yy = start_y + x * math.sin(Angle) + y * math.cos(Angle)
if cur.xpath("./following-sibling::visio:LineTo", namespaces=NSMAP) :
EllipticalArcTo = 2
else :
EllipticalArcTo = 1
xy2csv(xx,yy,"TRUE",EllipticalArcTo)
nextStep(new_cur)
f = file("xy.csv","w")
f_names = glob.glob('./*.vdx')
for f_name in f_names:
print "Работаем с файлом: " + f_name + "\r\n"
tree = lxml.etree.parse(f_name)
NSMAP = {'visio': 'http://schemas.microsoft.com/visio/2003/core'}
shapes = tree.xpath("//visio:Shape", namespaces=NSMAP)
for shape in shapes :
print "Shape ID = " + str(unlist(shape.xpath("./@ID", namespaces=NSMAP))) + "\r\n"
if (shape.xpath("visio:XForm1D", namespaces=NSMAP)) :
x = unlist(shape.xpath("visio:XForm1D/visio:BeginX/text()", namespaces=NSMAP))
y = unlist(shape.xpath("visio:XForm1D/visio:BeginY/text()", namespaces=NSMAP))
xy2csv(x,y,"FALSE",2)
x = unlist(shape.xpath("visio:XForm1D/visio:EndX/text()", namespaces=NSMAP))
y = unlist(shape.xpath("visio:XForm1D/visio:EndY/text()", namespaces=NSMAP))
EllipticalArcTo = isObj(shape.xpath("visio:Geom/visio:EllipticalArcTo", namespaces=NSMAP))
xy2csv(x,y,"TRUE",EllipticalArcTo)
else :
if (shape.xpath("visio:XForm", namespaces=NSMAP)) :
PinX = float(unlist(shape.xpath("visio:XForm/visio:PinX/text()", namespaces=NSMAP)))
PinY = float(unlist(shape.xpath("visio:XForm/visio:PinY/text()", namespaces=NSMAP)))
LocPinX = float(unlist(shape.xpath("visio:XForm/visio:LocPinX/text()", namespaces=NSMAP)))
LocPinY = float(unlist(shape.xpath("visio:XForm/visio:LocPinY/text()", namespaces=NSMAP)))
Angle = float(unlist(shape.xpath("visio:XForm/visio:Angle/text()", namespaces=NSMAP)))
start_x = PinX - LocPinX * math.cos(Angle) + LocPinY * math.sin(Angle)
start_y = PinY - LocPinY * math.cos(Angle) - LocPinX * math.sin(Angle)
if (shape.xpath("visio:Geom/visio:MoveTo", namespaces=NSMAP)) :
x = float(unlist(shape.xpath("visio:Geom/visio:MoveTo/visio:X/text()", namespaces=NSMAP)))
y = float(unlist(shape.xpath("visio:Geom/visio:MoveTo/visio:Y/text()", namespaces=NSMAP)))
xx = start_x + x * math.cos(Angle) - y * math.sin(Angle)
yy = start_y + x * math.sin(Angle) + y * math.cos(Angle)
xy2csv(xx,yy,"FALSE",2)
nextStep(unlist(shape.xpath("visio:Geom/visio:MoveTo", namespaces=NSMAP)))
print "\r\n"
f.close();
сам скрипт работает в командой строке.