summaryrefslogtreecommitdiff
path: root/cad/plugins/NanoVision-1/src/Plugins/OpenBabelImportExport/OpenBabelImportExport.cpp
blob: 092ab163c9e2acfc00d1ca62fb3b243f2872b2e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright 2008 Nanorex, Inc.  See LICENSE file for details.

#include "OpenBabelImportExport.h"


/* CONSTRUCTOR */
OpenBabelImportExport::OpenBabelImportExport() {
}


/* DESTRUCTOR */
OpenBabelImportExport::~OpenBabelImportExport() {
}


/* FUNCTION: importFromFile */
NXCommandResult* OpenBabelImportExport::importFromFile
		(NXMoleculeSet* moleculeSet, NXDataStoreInfo* dataStoreInfo,
		 const string& filename, int frameSetId, int frameIndex) {
			
	bool success = true;
	NXCommandResult* result = new NXCommandResult();
	result->setResult(NX_CMD_SUCCESS);

	// Check input file format
	OBConversion conv;
	OBFormat* inFormat = conv.FormatFromExt(filename.c_str());
	if (inFormat) {
		conv.SetInFormat(inFormat);
		
	} else {
		populateCommandResult(result,
							  (string("Can't read file type: ") + filename)
							  	.c_str());
		success = false;
	}
	
	// Read file into a new OpenBabel molecule
	if (success) {
		ifstream inFileStream;
		inFileStream.open(filename.c_str());
		if (!inFileStream) {
			populateCommandResult(result,
								  (string("File not found: ") + filename)
								  	.c_str());
			success = false;
			
		} else {
			conv.SetInStream(&inFileStream);
			
			OBMol* obMolecule = moleculeSet->newMolecule();
			conv.Read(obMolecule);
			inFileStream.close();
		}
	}
	
	// Set the meta information about the data store.
	if (success) {
		dataStoreInfo->setIsSingleStructure(true);
	}
	
	return result;
}


/* FUNCTION: exportToFile */
NXCommandResult* OpenBabelImportExport::exportToFile
		(NXMoleculeSet* moleculeSet, NXDataStoreInfo* dataStoreInfo,
		 const string& filename, int frameSetId, int frameIndex) {
		
	bool success = true;
	NXCommandResult* result = new NXCommandResult();
	result->setResult(NX_CMD_SUCCESS);

	// Make sure we can handle the output type.
	OBConversion conv;
	OBFormat* outFormat = conv.FormatFromExt(filename.c_str());
	if (outFormat) {
		conv.SetOutFormat(outFormat);
		
	} else {
		populateCommandResult(result,
							  (string("Can't write file type: ") + filename)
							  	.c_str());
		success = false;
	}
	
	// Write the molecule to file
	if (success) {
		ofstream outFileStream;
		outFileStream.open(filename.c_str());
		if (!outFileStream) {
			populateCommandResult(result,
								(string("Couldn't open file: ") + filename)
									.c_str());
			success = false;
	
		} else {
			conv.SetOutStream(&outFileStream);
			
			OBMolIterator moleculeIter = moleculeSet->moleculesBegin();
			OBMol* obMolecule = *moleculeIter;
			conv.Write(obMolecule);
			outFileStream.close();
		}
	}
	return result;
}	


/* FUNCTION: populateCommandResult */
void OpenBabelImportExport::populateCommandResult
		(NXCommandResult* result, const string& message) {
	result->setResult(NX_PLUGIN_REPORTS_ERROR);
	vector<QString> resultVector;
	resultVector.push_back("OpenBabelImportExport");
	resultVector.push_back(message.c_str());
	result->setParamVector(resultVector);
}

Q_EXPORT_PLUGIN2 (OpenBabelImportExport, OpenBabelImportExport)