8
def findValueByKey(text, key):
9
prog = re.compile(key + "\s*=\s*([a-z,A-Z,\d,-]*)")
10
return prog.findall(text)
12
def chanellFactory(text):
13
chanell = {"name": ""}
14
chanell["name"] = findValueByKey(text, "Name")
17
def hotSpotFactory(text):
18
hotSpot = {"VRMLPointsID":-1}
19
hotSpot["VRMLPointsID"] = findValueByKey(text, "ID")
29
def __init__(self, text, beginSubstr, endSubstr):
31
self._beginSubstr = beginSubstr
32
self._endSubstr = endSubstr
34
def GetNextSubstr(self):
36
beginSubstrPos = self._text.find(self._beginSubstr, self._currentPos)
37
if(beginSubstrPos != -1):
38
logging.info( "Finded beginSubstr: " + self._beginSubstr + " in " + str(beginSubstrPos))
40
endSubstrPos = self._text.find(self._endSubstr, beginSubstrPos + len(self._beginSubstr))
41
if(endSubstrPos != -1):
42
logging.info( "Finded endSubstr: " + self._endSubstr + " in " + str(endSubstrPos))
44
logging.warning("endSubstr: " + self._endSubstr + " not finded!")
46
logging.warning("beginSubstr: " + self._beginSubstr + " not finded!")
48
if(beginSubstrPos != -1 and endSubstrPos != -1):
49
self._currentPos = endSubstrPos + len(self._endSubstr)
51
return self._text[beginSubstrPos + len(self._beginSubstr):endSubstrPos]
53
logging.warning('beginSubstr or endSubstr no finded!');
57
def getPosOpenAndCloseBracketsNear(text, beginPos, openBracket, closeBracket):
58
numberOfOpenBracket = 0;
59
numberOfCloseBracket = 0;
61
posOpenBracket = text.find(openBracket, beginPos)
64
numberOfOpenBracket = 1
66
if(posOpenBracket == -1):
67
raise Exception("I can't find open bracket - " + openBracket)
68
posOpenBracket += len(openBracket)
70
for i in range(posOpenBracket + len(openBracket), len(text)):
72
if(char == openBracket):
73
numberOfOpenBracket+=1
74
logging.info( "Fined open bracket in " + str(i))
75
logging.info( "Number of open bracket: " + str(numberOfOpenBracket))
77
if(char == closeBracket):
78
numberOfCloseBracket+=1
79
logging.info( "Fined close bracket in " + str(i))
80
logging.info( "Number of close bracket: " + str(numberOfCloseBracket))
82
if(numberOfOpenBracket == numberOfCloseBracket):
84
logging.info("Count of open bracket equal count of close bracket!")
85
logging.info("Open bracket pos: " + str(posOpenBracket) + ", Close bracket pos: " + str(posCloseBracket) )
86
return {"from": posOpenBracket, "to": posCloseBracket}
88
def getBodyOf(text, tag, openBracket, closeBracket):
89
tagPos = text.find(tag)
92
bodyPosition = getPosOpenAndCloseBracketsNear(text, tagPos + len(tag), openBracket, closeBracket)
93
bodyText = text[bodyPosition.get("from"):bodyPosition.get("to")]
96
logging.error("Can't find open bracket. Is currupted structure?")
99
logging.error("Can't find tag. Is currupted structure?")
102
def getChanells(cisFile):
103
finder = Finder(cisFile, "Begin_OLESourceBuffer", "End_olesourcebuffer")
112
OLESourceBuffer = finder.GetNextSubstr()
113
if(OLESourceBuffer == -1):
116
chanels[index] = chanellFactory(OLESourceBuffer)
121
def getHotSpots(cisFile):
122
finder = Finder(cisFile, "Begin_HotSpotSet", "End_hotspotset")
131
hotSpotText = finder.GetNextSubstr()
132
if(hotSpotText == -1):
135
hotSpots[index] = hotSpotFactory(hotSpotText)
140
def getPointPos(vrmlFIle):
141
shape = getBodyOf(vrmlFIle, "Shape", "{", "}")
142
indexedFaceSet = getBodyOf(shape, "IndexedFaceSet", "{", "}")
143
coordinate = getBodyOf(indexedFaceSet, "Coordinate", "{", "}")
144
strPointsRep = getBodyOf(coordinate, "point", "[", "]")
145
strPointsRep = strPointsRep.strip(" ")
146
strPointsRep = strPointsRep.replace("\r\n", "")
147
listOfstrRawPointRep = strPointsRep.split(", ")
149
pointsFromVRMLFile = []
150
for strPointRep in listOfstrRawPointRep:
151
pointsFromVRMLFile.append(strPointRep.split(" "))
152
return pointsFromVRMLFile
154
if(__name__ == '__main__'):
155
parser = argparse.ArgumentParser(description='Proccessing cis and VRML files')
156
parser.add_argument('CIS_File', type=str, help='path to cis file')
157
parser.add_argument('VRML_FIle', type=str, help='path to VRML file')
158
parser.add_argument('JSON_FIle', type=str, help='path to resulting JSON file')
159
args = parser.parse_args()
162
# pathToCisFile = "ms_online5.cis"#args.CIS_File
163
# pathToVRMLFIle = "MS.WRL"#args.VRML_FIle
164
# pathToJSONFile = "hotSpot.json"#args.JSON_File
166
pathToCisFile = args.CIS_File
167
pathToVRMLFIle = args.VRML_FIle
168
pathToJSONFile = args.JSON_FIle
170
logging.basicConfig(filename=str(datetime.datetime.now()) + "> " + pathToCisFile + "+" + pathToVRMLFIle + "=" + pathToJSONFile,level=logging.DEBUG)
172
f0 = open(pathToCisFile, 'r')
176
f1 = open(pathToVRMLFIle, 'r')
180
pointPosList = getPointPos(vrmlFIle)
181
chanellList = getChanells(cisFile)
182
hotSpotsList = getHotSpots(cisFile)
184
for hotSpotIndex in hotSpotsList:
185
hotSpotsList[hotSpotIndex]["VRMLPoint"] = pointPosList[int(hotSpotsList[hotSpotIndex]["VRMLPointsID"][0])]
186
hotSpotsList[hotSpotIndex]["name"] = chanellList[hotSpotIndex]["name"]
188
hotSpotsJSON = json.dumps(hotSpotsList)
190
f3 = open(pathToJSONFile, 'w+')
191
f3.write(hotSpotsJSON)
194
print "Number of hot spots from cis file: " + str(len(hotSpotsList))
195
print "Number of points in VRML file: " + str(len(pointPosList))
196
print "File " + pathToJSONFile + " have done!"
199
e = sys.exc_info()[1]