Updated some of the internal documentation (comments, etc) to better describe what...
[blender-addons-contrib.git] / add_mesh_rocks / settings.py
1 # Paul "BrikBot" Marshall
2 # Created: July 1, 2011
3 # Last Modified: November 17, 2011
4 # Homepage (blog): http://post.darkarsenic.com/
5 #                       //blog.darkarsenic.com/
6 # Thanks to Meta-Androco, RickyBlender, Ace Dragon, and PKHG for ideas
7 #   and testing.
8 #
9 # Coded in IDLE, tested in Blender 2.59.  NumPy Recommended.
10 # Search for "@todo" to quickly find sections that need work.
11 #
12 # ##### BEGIN GPL LICENSE BLOCK #####
13 #
14 #  The Blender Rock Creation tool is for rapid generation of
15 #  mesh rocks in Blender.
16 #  Copyright (C) 2011  Paul Marshall
17 #
18 #  This program is free software: you can redistribute it and/or modify
19 #  it under the terms of the GNU General Public License as published by
20 #  the Free Software Foundation, either version 3 of the License, or
21 #  (at your option) any later version.
22 #
23 #  This program is distributed in the hope that it will be useful,
24 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
25 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26 #  GNU General Public License for more details.
27 #
28 #  You should have received a copy of the GNU General Public License
29 #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
30 #
31 # ##### END GPL LICENSE BLOCK #####
32
33 # <pep8 compliant>
34
35 import inspect
36 import shutil
37 from add_mesh_rocks import utils
38 from xml.dom import minidom
39
40 basePath = inspect.getfile(inspect.currentframe())[0:-len("settings.py")]
41 path = basePath + "add_mesh_rocks.xml"
42
43 try:
44     source = minidom.parse(path)
45     print("Rock generator settings file found:\n" + path)
46 except:
47     print("Rock generator settings file not found.  Creating settings file.")
48     shutil.copy(basePath + "factory.xml", path)
49     source = minidom.parse(path)
50
51 xmlDefault = source.getElementsByTagName('default')[0]
52 xmlPresets = source.getElementsByTagName('preset')
53 default = []
54 presets = []
55
56 #----- Gets and Sets -----#
57
58
59 def getDefault():
60     global default
61     return default
62
63
64 def getPresetLists():
65     global presets
66     return presets
67
68
69 def getPreset(ID=0):
70     global presets
71     return presets[ID]
72
73 #---------- Core ----------#
74
75
76 def parse():
77     global xmlDefault
78     global xmlPresets
79     global default
80     global presets
81
82     # Parse default values
83     default = parseNode(xmlDefault)
84
85     # Parse preset values
86     for setting in xmlPresets:
87         presets.append(parseNode(setting))
88
89     return '{FINISHED}'
90
91
92 # Takes a node and parses it for data.  Relies on that setting.xml has
93 #   a valid format as specified by the DTD.
94 # For some reason minidom places an empty child node for every other node.
95 def parseNode(setting, title=True):
96     loc = 1
97
98     if title:
99         # Preset name (xmlPreset.childNodes[1]):
100         title = setting.childNodes[loc].childNodes[0].data
101         loc += 2
102
103     # Preset size values (xmlPreset.childNodes[3]):
104     scaleX = [float(setting.childNodes[loc].childNodes[1].childNodes[3].childNodes[0].data),
105               float(setting.childNodes[loc].childNodes[1].childNodes[5].childNodes[0].data)]
106     scaleY = [float(setting.childNodes[loc].childNodes[3].childNodes[3].childNodes[0].data),
107               float(setting.childNodes[loc].childNodes[3].childNodes[5].childNodes[0].data)]
108     scaleZ = [float(setting.childNodes[loc].childNodes[5].childNodes[3].childNodes[0].data),
109               float(setting.childNodes[loc].childNodes[5].childNodes[5].childNodes[0].data)]
110     skewX = float(setting.childNodes[loc].childNodes[7].childNodes[3].childNodes[0].data)
111     skewY = float(setting.childNodes[loc].childNodes[9].childNodes[3].childNodes[0].data)
112     skewZ = float(setting.childNodes[loc].childNodes[11].childNodes[3].childNodes[0].data)
113     if setting.childNodes[loc].childNodes[13].childNodes[0].data == 'False':
114         use_scale_dis = False
115     else:
116         use_scale_dis = True
117     scale_fac = utils.toList(setting.childNodes[loc].childNodes[15].childNodes[0].data)
118     loc += 2
119
120     # Presst shape values (xmlPreset.childNodes[5]):
121     deform = float(setting.childNodes[loc].childNodes[1].childNodes[0].data)
122     rough = float(setting.childNodes[loc].childNodes[3].childNodes[0].data)
123     detail = int(setting.childNodes[loc].childNodes[5].childNodes[0].data)
124     display_detail = int(setting.childNodes[loc].childNodes[7].childNodes[0].data)
125     smooth_fac = float(setting.childNodes[loc].childNodes[9].childNodes[0].data)
126     smooth_it = int(setting.childNodes[loc].childNodes[11].childNodes[0].data)
127     loc += 2
128
129     # Preset material values (xmlPreset.childNodes[7]):
130     if setting.childNodes[loc].childNodes[1].childNodes[0].data == 'False':
131         mat_enable = False
132     else:
133         mat_enable = True
134     mat_color = utils.toList(setting.childNodes[loc].childNodes[3].childNodes[0].data)
135     mat_bright = float(setting.childNodes[loc].childNodes[5].childNodes[0].data)
136     mat_rough = float(setting.childNodes[loc].childNodes[7].childNodes[0].data)
137     mat_spec = float(setting.childNodes[loc].childNodes[9].childNodes[0].data)
138     mat_hard = int(setting.childNodes[loc].childNodes[11].childNodes[0].data)
139     mat_use_trans = bool(setting.childNodes[loc].childNodes[13].childNodes[0].data)
140     mat_alpha = float(setting.childNodes[loc].childNodes[15].childNodes[0].data)
141     mat_cloudy = float(setting.childNodes[loc].childNodes[17].childNodes[0].data)
142     mat_IOR = float(setting.childNodes[loc].childNodes[19].childNodes[0].data)
143     #mat_use_mirror = float(setting.childNodes[loc].childNodes[21].childNodes[0].data)
144     #mat_mossy = float(setting.childNodes[loc].childNodes[23].childNodes[0].data)
145     #mat_mossy = float(setting.childNodes[loc].childNodes[25].childNodes[0].data)
146     mat_mossy = float(setting.childNodes[loc].childNodes[21].childNodes[0].data)
147     loc += 2
148
149     # Preset random values (xmlPreset.childNodes[9]):
150     if setting.childNodes[loc].childNodes[1].childNodes[0].data == 'True':
151         use_generate = True
152     else:
153         use_generate = False
154     if setting.childNodes[loc].childNodes[3].childNodes[0].data == 'False':
155         use_random_seed = False
156     else:
157         use_random_seed = True
158     user_seed = int(setting.childNodes[loc].childNodes[5].childNodes[0].data)
159
160     if title:
161         parsed = [title, scaleX, scaleY, scaleZ, skewX, skewY, skewZ,
162                   use_scale_dis, scale_fac, deform, rough, detail,
163                   display_detail, smooth_fac, smooth_it, mat_enable, mat_color,
164                   mat_bright, mat_rough, mat_spec, mat_hard, mat_use_trans,
165                   mat_alpha, mat_cloudy, mat_IOR, mat_mossy, use_generate,
166                   use_random_seed, user_seed]
167     else:
168         parsed = [scaleX, scaleY, scaleZ, skewX, skewY, skewZ, use_scale_dis,
169                   scale_fac, deform, rough, detail, display_detail, smooth_fac,
170                   smooth_it, mat_enable, mat_color, mat_bright, mat_rough,
171                   mat_spec, mat_hard, mat_use_trans, mat_alpha, mat_cloudy,
172                   mat_IOR, mat_mossy, use_generate, use_random_seed, user_seed]
173
174     return parsed
175
176
177 def save():
178     return '{FINISHED}'
179
180
181 def _print():
182     for i in presets:
183         print(i)
184     return '{FINISHED}'