Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3662 | schaersvoo | 1 | /* |
2 | WIMSchem Elements: Chemistry molecular diagram drawing tool. |
||
3 | |||
4 | (c) 2005 Dr. Alex M. Clark |
||
5 | |||
6 | Released as GNUware, under the Gnu Public License (GPL) |
||
7 | |||
8 | See www.gnu.org for details. |
||
9 | */ |
||
10 | |||
11 | package WIMSchem; |
||
12 | |||
13 | import java.io.*; |
||
14 | import java.net.*; |
||
15 | import java.util.*; |
||
16 | |||
17 | // For obtaining the template list. |
||
18 | |||
19 | public class Templates{ |
||
20 | |||
21 | ArrayList<Molecule> templ=new ArrayList<Molecule>(); |
||
22 | |||
23 | // jm.evers: copies... of functions in applet. Should be reorganised !! |
||
24 | public static byte [] loadURL(URL url) throws IOException { |
||
25 | int bufSize = 1024 * 2; |
||
26 | byte [] buf = new byte[bufSize]; |
||
27 | ByteArrayOutputStream bout = new ByteArrayOutputStream(); |
||
28 | BufferedInputStream in = new BufferedInputStream(url.openStream()); |
||
29 | int n; |
||
30 | while ((n = in.read(buf)) > 0){ |
||
31 | bout.write(buf, 0, n); |
||
32 | } |
||
33 | try |
||
34 | { in.close(); } catch (Exception ignored) { } |
||
35 | return bout.toByteArray(); |
||
36 | } |
||
37 | |||
38 | public static String loadFile(String fname) throws IOException { |
||
39 | byte[] bytes = loadURL(new URL("file:" + fname)); |
||
40 | return new String(bytes); |
||
41 | } |
||
42 | |||
43 | public static String load(String fileOrURL) throws IOException { |
||
44 | try { |
||
45 | URL url = new URL(fileOrURL); |
||
46 | return new String(loadURL(url)); |
||
47 | } catch (Exception e) { return loadFile(fileOrURL);} |
||
48 | } |
||
49 | |||
50 | |||
51 | public Templates(Class cls){ |
||
52 | |||
53 | ArrayList<String> list=new ArrayList<String>(); |
||
54 | |||
55 | // jm.evers : if an param template is defined, load them in the ArrayList. |
||
56 | boolean inapplet=false; |
||
57 | if(MainApplet.templateURL != null){ |
||
58 | for(int p=0; p<MainApplet.templateURL.length ;p++ ){ |
||
59 | try { |
||
60 | Molecule mol=MoleculeStream.ReadUnknown(new BufferedReader(new StringReader((load(MainApplet.templateURL[p]))))); |
||
61 | templ.add(mol); |
||
62 | inapplet=true; |
||
63 | System.out.println("loading template"+p); |
||
64 | } catch (IOException e) {System.out.println("FAILED loading template"+p+"\n Are you using correct MDLMol or Native files??");} |
||
65 | } |
||
66 | // if this was not successfull: maybe the templates are javascript strings? |
||
67 | // not tested 30/12/2008 !!! |
||
68 | if(!inapplet){ |
||
69 | for(int p=0; p<MainApplet.templateURL.length ;p++ ){ |
||
70 | try { |
||
71 | System.out.println("MainApplet.templateURL[p]="+MainApplet.templateURL[p]); |
||
72 | Molecule mol=MoleculeStream.ReadUnknown(new BufferedReader(new StringReader(MainApplet.templateURL[p].toString()))); |
||
73 | templ.add(mol); |
||
74 | inapplet=true; |
||
75 | System.out.println("loading template"+p); |
||
76 | } catch (IOException e) {System.out.println("FAILED loading template"+p+"\n Are you using correct javascript strings??");} |
||
77 | } |
||
78 | } |
||
79 | } |
||
80 | |||
81 | if(!inapplet){ |
||
82 | // read the list of molecules from the directory file, then create each one of them |
||
83 | try { |
||
84 | InputStream istr=cls.getResourceAsStream("/templ/list"); |
||
85 | BufferedReader in=new BufferedReader(new InputStreamReader(istr)); |
||
86 | String line; |
||
87 | while ((line=in.readLine())!=null) {list.add(line);} |
||
88 | istr.close(); |
||
89 | } |
||
90 | catch (IOException e) { |
||
91 | System.out.println("Failed to obtain list of templates:\n"+e.toString()); |
||
92 | return; |
||
93 | } |
||
94 | |||
95 | try { |
||
96 | for (int n=0;n<list.size();n++){ |
||
97 | InputStream istr=cls.getResourceAsStream("/templ/"+list.get(n)); |
||
98 | Molecule mol=MoleculeStream.ReadNative(istr); |
||
99 | templ.add(mol); |
||
100 | istr.close(); |
||
101 | } |
||
102 | } |
||
103 | catch (IOException e){ |
||
104 | System.out.println("Failed to obtain particular template:\n"+e.toString()); |
||
105 | return; |
||
106 | } |
||
107 | } |
||
108 | // sort the molecules by an index of "complexity" (smaller molecules first, carbon-only favoured) |
||
109 | |||
110 | int[] complex=new int[templ.size()]; |
||
111 | for (int n=0;n<templ.size();n++) |
||
112 | { |
||
113 | Molecule mol=templ.get(n); |
||
114 | complex[n]=mol.NumAtoms()*100; |
||
115 | boolean nonCH=false; |
||
116 | for (int i=1;i<=mol.NumAtoms();i++) |
||
117 | if (mol.AtomElement(i).compareTo("C")!=0 && mol.AtomElement(i).compareTo("H")!=0) nonCH=true; |
||
118 | if (!nonCH) complex[n]-=1000; |
||
119 | for (int i=1;i<=mol.NumBonds();i++) complex[n]=complex[n]+mol.BondOrder(i); |
||
120 | } |
||
121 | |||
122 | int p=0; |
||
123 | while (p<templ.size()-1) |
||
124 | { |
||
125 | if (complex[p]>complex[p+1]) |
||
126 | { |
||
127 | int i=complex[p]; complex[p]=complex[p+1]; complex[p+1]=i; |
||
128 | Molecule mol=templ.get(p); templ.set(p,templ.get(p+1)); templ.set(p+1,mol); |
||
129 | if (p>0) p--; |
||
130 | } |
||
131 | else p++; |
||
132 | } |
||
133 | } |
||
134 | public int NumTemplates() {return templ.size();} |
||
135 | public Molecule GetTemplate(int N) {return templ.get(N);} |
||
136 | public void AddTemplate(Molecule Mol) {templ.add(Mol);} |
||
137 | } |
||
138 | |||
139 | |||
140 | |||
141 |