/dev/adei/adei-katrinTankViewer

To get this branch, use:
bzr branch http://darksoft.org/webbzr/dev/adei/adei-katrinTankViewer

« back to all changes in this revision

Viewing changes to modules/katrinTankViewer/cis+wrl2json.py

  • Committer: Aleksander Lizin
  • Date: 2014-02-27 13:52:46 UTC
  • Revision ID: sogimu@nxt.ru-20140227135246-16j0dlbvdcy9acqk
Added: exporter cis + wrl to json file

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import argparse
 
2
import logging
 
3
import re
 
4
import sys
 
5
import json
 
6
import datetime
 
7
 
 
8
def findValueByKey(text, key):
 
9
    prog = re.compile(key + "\s*=\s*([a-z,A-Z,\d,-]*)")
 
10
    return prog.findall(text)
 
11
 
 
12
def chanellFactory(text):
 
13
    chanell = {"name": ""}
 
14
    chanell["name"] = findValueByKey(text, "Name")
 
15
    return chanell
 
16
 
 
17
def hotSpotFactory(text):
 
18
    hotSpot = {"VRMLPointsID":-1}
 
19
    hotSpot["VRMLPointsID"] = findValueByKey(text, "ID")
 
20
    return hotSpot
 
21
 
 
22
 
 
23
class Finder:
 
24
    _text = ""
 
25
    _beginSubstr=""
 
26
    _endSubstr=""
 
27
    _currentPos = 0
 
28
 
 
29
    def __init__(self, text, beginSubstr, endSubstr):
 
30
        self._text = text
 
31
        self._beginSubstr = beginSubstr
 
32
        self._endSubstr = endSubstr
 
33
 
 
34
    def GetNextSubstr(self):
 
35
 
 
36
        beginSubstrPos = self._text.find(self._beginSubstr, self._currentPos)
 
37
        if(beginSubstrPos != -1):
 
38
            logging.info( "Finded beginSubstr: " + self._beginSubstr + " in " + str(beginSubstrPos))
 
39
 
 
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))
 
43
            else:
 
44
                logging.warning("endSubstr: " + self._endSubstr + " not finded!")
 
45
        else:
 
46
            logging.warning("beginSubstr: " + self._beginSubstr + " not finded!")
 
47
 
 
48
        if(beginSubstrPos != -1 and endSubstrPos != -1):
 
49
            self._currentPos = endSubstrPos + len(self._endSubstr)
 
50
 
 
51
            return self._text[beginSubstrPos + len(self._beginSubstr):endSubstrPos]
 
52
        else:
 
53
            logging.warning('beginSubstr or endSubstr no finded!');
 
54
            return -1
 
55
 
 
56
 
 
57
def getPosOpenAndCloseBracketsNear(text, beginPos, openBracket, closeBracket):
 
58
    numberOfOpenBracket = 0;
 
59
    numberOfCloseBracket = 0;
 
60
 
 
61
    posOpenBracket = text.find(openBracket, beginPos)
 
62
    posCloseBracket = 0
 
63
 
 
64
    numberOfOpenBracket = 1
 
65
 
 
66
    if(posOpenBracket == -1):
 
67
        raise Exception("I can't find open bracket - " + openBracket)
 
68
    posOpenBracket += len(openBracket)
 
69
 
 
70
    for i in range(posOpenBracket + len(openBracket), len(text)):
 
71
        char = text[i:i+1]
 
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))
 
76
 
 
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))
 
81
 
 
82
        if(numberOfOpenBracket == numberOfCloseBracket):
 
83
            posCloseBracket = i
 
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}
 
87
 
 
88
def getBodyOf(text, tag, openBracket, closeBracket):
 
89
    tagPos = text.find(tag)
 
90
    if(tagPos != -1):
 
91
        try:
 
92
            bodyPosition = getPosOpenAndCloseBracketsNear(text, tagPos + len(tag), openBracket, closeBracket)
 
93
            bodyText = text[bodyPosition.get("from"):bodyPosition.get("to")]
 
94
            return bodyText
 
95
        except:
 
96
            logging.error("Can't find open bracket. Is currupted structure?")
 
97
            sys.exit(2)
 
98
    else:
 
99
        logging.error("Can't find tag. Is currupted structure?")
 
100
        sys.exit(2)
 
101
 
 
102
def getChanells(cisFile):
 
103
    finder = Finder(cisFile, "Begin_OLESourceBuffer", "End_olesourcebuffer")
 
104
 
 
105
    chanels = {}
 
106
 
 
107
    index = 0;
 
108
 
 
109
    canFindYet = 1;
 
110
 
 
111
    while(canFindYet):
 
112
        OLESourceBuffer = finder.GetNextSubstr()
 
113
        if(OLESourceBuffer == -1):
 
114
            canFindYet = 0
 
115
            break
 
116
        chanels[index] = chanellFactory(OLESourceBuffer)
 
117
        index+=1;
 
118
 
 
119
    return chanels
 
120
 
 
121
def getHotSpots(cisFile):
 
122
    finder = Finder(cisFile, "Begin_HotSpotSet", "End_hotspotset")
 
123
 
 
124
    hotSpots = {}
 
125
 
 
126
    index = 1;
 
127
 
 
128
    canFindYet = 1;
 
129
 
 
130
    while(canFindYet):
 
131
        hotSpotText = finder.GetNextSubstr()
 
132
        if(hotSpotText == -1):
 
133
            canFindYet = 0
 
134
            break
 
135
        hotSpots[index] = hotSpotFactory(hotSpotText)
 
136
        index+=1
 
137
 
 
138
    return hotSpots
 
139
 
 
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(", ")
 
148
 
 
149
    pointsFromVRMLFile = []
 
150
    for strPointRep in listOfstrRawPointRep:
 
151
        pointsFromVRMLFile.append(strPointRep.split(" "))
 
152
    return pointsFromVRMLFile
 
153
 
 
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()
 
160
 
 
161
    try:
 
162
    #     pathToCisFile = "ms_online5.cis"#args.CIS_File
 
163
    #     pathToVRMLFIle = "MS.WRL"#args.VRML_FIle
 
164
    #     pathToJSONFile = "hotSpot.json"#args.JSON_File
 
165
 
 
166
        pathToCisFile = args.CIS_File
 
167
        pathToVRMLFIle = args.VRML_FIle
 
168
        pathToJSONFile = args.JSON_FIle
 
169
 
 
170
        logging.basicConfig(filename=str(datetime.datetime.now()) + "> " + pathToCisFile + "+" + pathToVRMLFIle + "=" + pathToJSONFile,level=logging.DEBUG)
 
171
 
 
172
        f0 = open(pathToCisFile, 'r')
 
173
        cisFile = f0.read()
 
174
        f0.close()
 
175
 
 
176
        f1 = open(pathToVRMLFIle, 'r')
 
177
        vrmlFIle = f1.read()
 
178
        f1.close()
 
179
 
 
180
        pointPosList = getPointPos(vrmlFIle)
 
181
        chanellList = getChanells(cisFile)
 
182
        hotSpotsList = getHotSpots(cisFile)
 
183
 
 
184
        for hotSpotIndex in hotSpotsList:
 
185
            hotSpotsList[hotSpotIndex]["VRMLPoint"] = pointPosList[int(hotSpotsList[hotSpotIndex]["VRMLPointsID"][0])]
 
186
            hotSpotsList[hotSpotIndex]["name"] = chanellList[hotSpotIndex]["name"]
 
187
 
 
188
        hotSpotsJSON = json.dumps(hotSpotsList)
 
189
 
 
190
        f3 = open(pathToJSONFile, 'w+')
 
191
        f3.write(hotSpotsJSON)
 
192
        f3.close()
 
193
 
 
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!"
 
197
 
 
198
    except:
 
199
        e = sys.exc_info()[1]
 
200
        print(e)
 
201
        sys.exit(2)