2 //----------------------------------------------------------------------------------------------------------------
3 // Class definition include
4 //----------------------------------------------------------------------------------------------------------------
5 #include "OsirixParser.h"
10 OsirixParser::OsirixParser(std::string xsdfile, double* spacing, int* extent)
16 OSIRIX_IMAGES = "Images";
17 OSIRIX_ARRAY = "array";
18 OSIRIX_IMAGEINDEX = "ImageIndex";
19 OSIRIX_INTEGER = "integer";
20 OSIRIX_NUMBEROFROIS = "NumberOfROIs";
22 OSIRIX_POINT_MM = "Point_mm";
23 OSIRIX_POINT_PX = "Point_px";
24 OSIRIX_STRING = "string";
27 _spacing[0] = spacing[0];
28 _spacing[1] = spacing[1];
29 _spacing[2] = spacing[2];
37 _extent[0] = extent[0];
38 _extent[1] = extent[1];
39 _extent[2] = extent[2];
40 _extent[3] = extent[3];
41 _extent[4] = extent[4];
42 _extent[5] = extent[5];
55 CREACONTOUR = "--CreaContour--";
56 CREACONTOUR_VERSION = "Version 1.0.2";
57 CREACONTOUR_IMAGEDIMENSIONS = "ImageDimensions";
58 CREACONTOUR_IMAGESPACING = "ImageSpacing";
59 CREACONTOUR_NUMBEROFCONTOURS = "NumberOfContours";
61 CREACONTOUR_INSTANT = "Instant";
62 CREACONTOUR_TYPEMODEL = "TypeModel";
63 CREACONTOUR_NUMBEROFCONTROLPOINTS = "NumberOfControlPoints";
64 CREACONTOUR_TYPEVIEW = "TypeView";
66 CREACONTOUR_NUMBEROFCONTOURSSTATIC = "NumberOfContoursStatic";
71 char currentPath[_MAX_PATH];
72 GetModuleFileName(NULL, currentPath, _MAX_PATH);
73 TEMPIMPORTOSIRIXFILE = currentPath;
75 TEMPIMPORTOSIRIXFILE = TEMPIMPORTOSIRIXFILE.substr(0,TEMPIMPORTOSIRIXFILE.find_last_of("\\"));
77 TEMPIMPORTOSIRIXFILE.append("\\data\\TEMPIMPORTOSIRIXFILE.roi");
80 TEMPIMPORTOSIRIXFILE = "./data/TEMPIMPORTOSIRIXFILE";
84 OsirixParser::~OsirixParser(){
88 int OsirixParser::ParseFile(const char* xmlfile){
90 xercesc::DOMDocument *doc;
94 XMLPlatformUtils::Initialize();
96 catch (const XMLException& toCatch) {
97 char* message = XMLString::transcode(toCatch.getMessage());
98 cout << "Error during initialization! :\n"
100 XMLString::release(&message);
104 XercesDOMParser* OsirixParser = new XercesDOMParser();
107 OsirixParser->setDoNamespaces(true);
108 OsirixParser->setDoSchema(true);
109 OsirixParser->setValidationScheme(XercesDOMParser::Val_Always );
110 OsirixParser->setExternalNoNamespaceSchemaLocation(XMLString::transcode(schema.c_str()));
111 OsirixParser->setValidationSchemaFullChecking(true);
112 OsirixParser->setValidationConstraintFatal(true);
113 OsirixParser->setExitOnFirstFatalError(true);
116 ErrorHandler* errHandler = (ErrorHandler*) new OsirixParserErrorHandler();
118 OsirixParser->setErrorHandler(errHandler);
122 OsirixParser->parse(xmlfile);
125 if(OsirixParser->getErrorCount() > 0){
127 errorline = ((OsirixParserErrorHandler*)OsirixParser->getErrorHandler())->getErrorMsg();
138 catch (const XMLException& toCatch) {
139 char* message = XMLString::transcode(toCatch.getMessage());
140 cout << "Exception message is: \n"
142 XMLString::release(&message);
147 catch (const DOMException& toCatch) {
148 char* message = XMLString::transcode(toCatch.msg);
149 cout << "Exception message is: \n"
151 XMLString::release(&message);
157 cout << "Unexpected Exception \n" ;
163 std::cout<<"parsing document..."<<std::endl;
166 doc = OsirixParser->getDocument();
167 // DOMNodeList* list = doc->getChildNodes();
168 getUserData(doc->getDocumentElement());
171 saveCreaContoursFormat();
182 void OsirixParser::setErrorLine(DOMNodeList* list){
184 DOMNode* node = list->item(0);
185 this->errorline = XMLString::transcode(node->getTextContent());
188 DOMNode* OsirixParser::getLastNode(DOMNodeList* list){
192 /*for(int i = list->getLength()-1; i >= 0 ;i--){
194 node = list->item(i);
196 if(node->getNodeType() == DOMNode::ELEMENT_NODE){
201 node = list->item(list->getLength()-1);
205 if(node->getChildNodes()->getLength()>0){
206 return getLastNode(node->getChildNodes());
212 void OsirixParser::getUserData(DOMElement* element){
213 parseOSIRIX_DICT(element->getElementsByTagName(XMLString::transcode(OSIRIX_DICT)));
216 void OsirixParser::parseOSIRIX_DICT(DOMNodeList* list){
218 DOMNode* node, *childnode, *childnode1, *childarray;
219 std::string point_mm, point_px, osirixinteger, imageindex, temp;
220 DOMNodeList* childlist;
221 point_mm = OSIRIX_POINT_MM;
222 point_px = OSIRIX_POINT_PX;
223 imageindex = OSIRIX_IMAGEINDEX;
224 osirixinteger = OSIRIX_INTEGER;
228 for(i = 0; i < (int)(list->getLength()); i++){
229 node = list->item(i);
230 childlist = node->getChildNodes();
231 for(j = 0; j < (int)(childlist->getLength());j++){
232 childnode = childlist->item(j);
233 temp = XMLString::transcode(childnode->getTextContent());
236 if(point_mm.compare(temp)==0){
237 childarray = childlist->item(j+2);
238 //temp = XMLString::transcode(childarray->getNodeName());
240 parseOSIRIX_POINT_MM(childarray->getChildNodes());
242 }else if(point_px.compare(temp)==0){
243 childarray = childlist->item(j+2);
244 //temp = XMLString::transcode(childarray->getNodeName());
246 parseOSIRIX_POINT_PX(childarray->getChildNodes());
248 }else if(imageindex.compare(temp) == 0){
249 childnode1 = childlist->item(j+2);
250 if(childnode1 != NULL && osirixinteger.compare(XMLString::transcode(childnode1->getNodeName())) == 0){
251 _imageindex = atoi(XMLString::transcode(childnode1->getTextContent()));
258 void OsirixParser::parseOSIRIX_POINT_MM(DOMNodeList* list){
259 int i, stringfound0, stringfound1;
261 string temp, osirix_string, numx, numy, numz;
262 vector<double>* vectorx;
263 vector<double>* vectory;
264 vector<double>* vectorz;
268 vectorx = new vector<double>;
269 vectory = new vector<double>;
270 vectorz = new vector<double>;
272 osirix_string = OSIRIX_STRING;
274 for(i = 0; i < (int)(list->getLength()); i++){
275 node = list->item(i);
276 if(osirix_string.compare(XMLString::transcode(node->getNodeName()))==0){
277 temp = XMLString::transcode(node->getTextContent());
279 stringfound0 = temp.find(",",0);
280 numx = temp.substr(1, stringfound0-1);
282 stringfound1 = temp.find(",",stringfound0+1);
283 numy = temp.substr(stringfound0+1, stringfound1-stringfound0-1);
285 stringfound0 = temp.find(")",stringfound1+1);
286 numz = temp.substr(stringfound1+1, stringfound0-stringfound1-1);
288 x = atof(numx.c_str());
289 y = atof(numy.c_str());
290 z = atof(numz.c_str());
292 vectorx->push_back(x);
293 vectory->push_back(y);
294 vectorz->push_back(z);
297 if(vectorx->size() > 0){
298 vectorxyz.push_back(*vectorx);
299 vectorxyz.push_back(*vectory);
300 vectorxyz.push_back(*vectorz);
301 contoursmapMM.insert(pair<int, vectorXYZ>(contoursmapMM.size(), vectorxyz));
305 void OsirixParser::parseOSIRIX_POINT_PX(DOMNodeList* list){
306 int i, stringfound0, stringfound1;
308 string temp, osirix_string, numx, numy;
309 vector<double>* vectorx;
310 vector<double>* vectory;
311 vector<double>* vectorz;
315 vectorx = new vector<double>;
316 vectory = new vector<double>;
317 vectorz = new vector<double>;
319 osirix_string = OSIRIX_STRING;
321 for(i = 0; i < (int)(list->getLength()); i++){
322 node = list->item(i);
323 if(osirix_string.compare(XMLString::transcode(node->getNodeName()))==0){
324 temp = XMLString::transcode(node->getTextContent());
326 stringfound0 = temp.find(",",0);
327 numx = temp.substr(1, stringfound0-1);
329 stringfound1 = temp.find(")",stringfound0+1);
330 numy = temp.substr(stringfound0+1, stringfound1-stringfound0-1);
332 x = atof(numx.c_str());
333 y = atof(numy.c_str());
335 vectorx->push_back(x);
336 vectory->push_back(y);
337 vectorz->push_back(_imageindex);
340 if(vectorx->size() > 0){
341 vectorxyz.push_back(*vectorx);
342 vectorxyz.push_back(*vectory);
343 vectorxyz.push_back(*vectorz);
344 contoursmapPX.insert(pair<int, vectorXYZ>(contoursmapPX.size(), vectorxyz));
350 void OsirixParser::getData(DOMNodeList* list, std::vector<std::string>& vect, std::string tagname){
352 for(int i = 0; i < (int)(list->getLength()); i++){
353 DOMNode* node = list->item(i);
354 if(tagname.compare(XMLString::transcode(node->getNodeName()))==0){
355 std::cout<<"NODENAME "<<XMLString::transcode(node->getTextContent())<<std::endl;
356 vect.push_back(XMLString::transcode(node->getTextContent()));
362 void OsirixParser::saveCreaContoursFormat(){
363 FILE *pFile=fopen(TEMPIMPORTOSIRIXFILE.c_str(),"w+");
367 writeContours(pFile);
368 writeContoursStatic(pFile);
373 void OsirixParser::writeContoursStatic(FILE* pFile){
374 fprintf(pFile, CREACONTOUR_IMAGEDIMENSIONS);
375 fprintf(pFile, " %d %d %d\n", _extent[1] - _extent[0],_extent[3] - _extent[2], _extent[5] - _extent[4]);
376 fprintf(pFile, CREACONTOUR_IMAGESPACING);
377 fprintf(pFile, " %f %f %f\n", _spacing[0], _spacing[1], _spacing[2]);
378 fprintf(pFile, CREACONTOUR_NUMBEROFCONTOURSSTATIC);
379 fprintf(pFile, " 0\n");
382 void OsirixParser::writeContours(FILE* pFile){
384 map<int, vectorXYZ>::iterator itPX;
385 vector<double> vectx, vecty, vectz;
387 int dimz = 0, dimy = 0;
390 dimz = _extent[5] - _extent[4] + 1;
391 dimy = _extent[3] - _extent[2] + 1;
394 /*for (itMM = contoursmapMM.begin(), itPX = contoursmapPX.begin();
395 itMM != contoursmapMM.end(), itPX != contoursmapPX.end();
397 for (itPX = contoursmapPX.begin(); itPX != contoursmapPX.end(); itPX++ ){
399 vectx = ((*itPX).second)[0];
400 vecty = ((*itPX).second)[1];
401 vectz = ((*itPX).second)[2];
405 valuez = (int) vectz[0] / _spacing[2];
407 fprintf(pFile, CREACONTOUR_INSTANT);
408 fprintf(pFile, " 1 %d 1 1 1 1\n",dimz - valuez);
409 fprintf(pFile, CREACONTOUR_TYPEMODEL);
410 fprintf(pFile, " 1\n");
411 fprintf(pFile, CREACONTOUR_NUMBEROFCONTROLPOINTS);
412 fprintf(pFile, " %d\n", vectz.size());
413 for(i = 0; i < vectx.size(); i++){
414 fprintf(pFile, "%f %f 900.00\n", vectx[i]/ _spacing[0],dimy - vecty[i]/ _spacing[1]);
416 fprintf(pFile, CREACONTOUR_TYPEVIEW);
417 fprintf(pFile, " 1\n");
423 void OsirixParser::writeHeader(FILE* pFile){
426 fprintf(pFile, CREACONTOUR);
427 fprintf(pFile, "\n");
428 fprintf(pFile, CREACONTOUR_VERSION);
429 fprintf(pFile, "\n");
430 fprintf(pFile, CREACONTOUR_IMAGEDIMENSIONS);
431 fprintf(pFile, " %d %d %d\n", _extent[1] - _extent[0],_extent[3] - _extent[2], _extent[5] - _extent[4]);
432 fprintf(pFile, CREACONTOUR_IMAGESPACING);
433 fprintf(pFile, " %f %f %f\n", _spacing[0], _spacing[1], _spacing[2]);
434 fprintf(pFile, CREACONTOUR_NUMBEROFCONTOURS);
435 fprintf(pFile, " %d\n", contoursmapPX.size());
442 std::string OsirixParser::getContoursFileName(){
443 return TEMPIMPORTOSIRIXFILE;
447 ** The Error Handler's interface implementation
451 ** Default Constructor
453 OsirixParserErrorHandler::OsirixParserErrorHandler()
461 ** Desctructor by defect
463 OsirixParserErrorHandler::~OsirixParserErrorHandler(){
466 void OsirixParserErrorHandler::warning (const SAXParseException &exc){
469 void OsirixParserErrorHandler::error (const SAXParseException &exc){
471 errormsg = "Column ";
472 // errormsg += itoa(exc.getColumnNumber(),c,10);
473 sprintf_s(c,"%d",(int)(exc.getColumnNumber()));
474 errormsg += std::string(c);
476 errormsg += " Line ";
477 // errormsg += itoa(exc.getLineNumber(),c,10);
478 sprintf_s(c,"%d",(int)(exc.getLineNumber()));
479 errormsg += std::string(c);
482 errormsg += XMLString::transcode(exc.getMessage());
486 void OsirixParserErrorHandler::fatalError (const SAXParseException &exc){
488 errormsg = "Column ";
489 // errormsg += itoa(exc.getColumnNumber(),c,10);
490 sprintf_s(c,"%d",(int)(exc.getColumnNumber()));
491 errormsg += std::string(c);
493 errormsg += " Line ";
494 // errormsg += itoa(exc.getLineNumber(),c,10);
495 sprintf_s(c,"%d",(int)(exc.getLineNumber()));
496 errormsg += std::string(c);
499 errormsg += XMLString::transcode(exc.getMessage());
502 void OsirixParserErrorHandler::resetErrors (){
505 std::string OsirixParserErrorHandler::getErrorMsg(){
506 return this->errormsg;