Skip to content

Commit 5f31ee5

Browse files
committed
inp: added unbuild methods
1 parent 7f93f2e commit 5f31ee5

File tree

579 files changed

+10409
-26
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

579 files changed

+10409
-26
lines changed

scripts/inp_code.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,18 @@ def ATTRS_ASSIGN(element, t):
269269
return o.strip()
270270

271271

272+
def ATTRS_UNBUILDER(element, t):
273+
o = ''
274+
275+
for attribute in element.attributes:
276+
if attribute.type.startswith('types.'):
277+
o += f'{TABS(t)}{attribute.name}=copy.deepcopy(ast.{attribute.name}),\n'
278+
else:
279+
o += f'{TABS(t)}{attribute.name}={CAMEL(attribute.type, "Builder")}.unbuild(ast.{attribute.name}),\n'
280+
281+
return o.strip()
282+
283+
272284
# ELEMENT #
273285
def INIT(element):
274286
return f"""
@@ -311,6 +323,7 @@ class {CAMEL(element.name, "Option")}(Option):
311323
def ELEMENT(element, parent_name, depth):
312324
return f'''
313325
import re
326+
import copy
314327
import typing
315328
import dataclasses
316329
@@ -333,6 +346,8 @@ class {CAMEL(element.name)}({CAMEL(parent_name, 'Option')}):
333346
{ATTRS_COMMENT(element, 2)}
334347
"""
335348
349+
_KEYWORD = "{element.mnemonic}"
350+
336351
_ATTRS = {{{ATTRS_DICT(element)}}}
337352
338353
_REGEX = re.compile(rf"\\A{GET_REGEX(element)}\\Z")
@@ -378,6 +393,19 @@ def build(self):
378393
return {CAMEL(element.name)}(
379394
{ATTRS_ASSIGN(element, 3)}
380395
)
396+
397+
@staticmethod
398+
def unbuild(ast: {CAMEL(element.name)}):
399+
"""
400+
Unbuilds ``{CAMEL(element.name)}`` into ``{CAMEL(element.name, "Builder")}``
401+
402+
Returns:
403+
``{CAMEL(element.name, "Builder")}`` for ``{CAMEL(element.name)}``.
404+
"""
405+
406+
return {CAMEL(element.name)}(
407+
{ATTRS_UNBUILDER(element, 3)}
408+
)
381409
'''[1:]
382410

383411

src/pymcnp/Inp.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import re
2+
import copy
23
import typing
34
import dataclasses
45

@@ -250,25 +251,6 @@ class InpBuilder:
250251
message: str = ''
251252
other: str = ''
252253

253-
def from_mcnp(source: str):
254-
"""
255-
Initiailizes ``InpBuilder`` from MCNP.
256-
257-
Attributes:
258-
source: MCNP for ``Inp``.
259-
"""
260-
261-
ast = Inp.from_mcnp(source)
262-
263-
return InpBuilder(
264-
title=ast.title,
265-
cells={cell.number.value: cell for cell in ast.cells},
266-
surfaces={surface.number.value: surface for surface in ast.surfaces},
267-
data={},
268-
message=ast.message,
269-
other=ast.other,
270-
)
271-
272254
def build(self):
273255
"""
274256
Builds ``InpBuilder`` into ``Inp``.
@@ -299,7 +281,7 @@ def build(self):
299281

300282
data = []
301283
for item in self.data.values():
302-
if isinstance(item, inp.Surface):
284+
if isinstance(item, inp.Data):
303285
data.append(item)
304286
elif isinstance(item, str):
305287
data.append(inp.Data.from_mcnp(item))
@@ -318,3 +300,24 @@ def build(self):
318300
data=data,
319301
data_comments=types.Tuple([]),
320302
)
303+
304+
@staticmethod
305+
def unbuild(ast: Inp):
306+
"""
307+
Unbuilds ``Inp`` into ``InpBuilder``
308+
309+
Returns:
310+
``InpBuilder`` for ``Inp``.
311+
"""
312+
313+
return InpBuilder(
314+
title=copy.deepcopy(ast.title),
315+
cells={cell.number.value: inp.CellBuilder.unbuild(cell) for cell in ast.cells},
316+
surfaces={
317+
surface.number.value: inp.SurfaceBuilder.unbuild(surface)
318+
for surface in ast.surfaces
319+
},
320+
data={data.option._KEYWORD: inp.DataBuilder.unbuild(data) for data in ast.data},
321+
message=copy.deepcopy(ast.message),
322+
other=copy.deepcopy(ast.other),
323+
)

src/pymcnp/inp/Cell.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import re
2+
import copy
23
import dataclasses
34

45

@@ -182,3 +183,83 @@ def build(self):
182183
geometry=geometry,
183184
options=options,
184185
)
186+
187+
@staticmethod
188+
def unbuild(ast: Cell):
189+
"""
190+
Unbuilds ``Cell`` into ``CellBuilder``
191+
192+
Returns:
193+
``CellBuilder`` for ``Cell``.
194+
"""
195+
196+
options = []
197+
for option in ast.options or []:
198+
if isinstance(ast.option, cell.Imp):
199+
options.append(cell.ImpBuilder.unbuild(option))
200+
elif isinstance(ast.option, cell.Vol):
201+
options.append(cell.VolBuilder.unbuild(option))
202+
elif isinstance(ast.option, cell.Pwt):
203+
options.append(cell.PwtBuilder.unbuild(option))
204+
elif isinstance(ast.option, cell.Ext):
205+
options.append(cell.ExtBuilder.unbuild(option))
206+
elif isinstance(ast.option, cell.Fcl):
207+
options.append(cell.FclBuilder.unbuild(option))
208+
elif isinstance(ast.option, cell.Wwn):
209+
options.append(cell.WwnBuilder.unbuild(option))
210+
elif isinstance(ast.option, cell.Dxc):
211+
options.append(cell.DxcBuilder.unbuild(option))
212+
elif isinstance(ast.option, cell.Nonu):
213+
options.append(cell.NonuBuilder.unbuild(option))
214+
elif isinstance(ast.option, cell.Pd):
215+
options.append(cell.PdBuilder.unbuild(option))
216+
elif isinstance(ast.option, cell.U):
217+
options.append(cell.UBuilder.unbuild(option))
218+
elif isinstance(ast.option, cell.Trcl_0):
219+
options.append(cell.TrclBuilder_0.unbuild(option))
220+
elif isinstance(ast.option, cell.Trcl_1):
221+
options.append(cell.TrclBuilder_1.unbuild(option))
222+
elif isinstance(ast.option, cell.Trcl_2):
223+
options.append(cell.TrclBuilder_2.unbuild(option))
224+
elif isinstance(ast.option, cell.Trcl_3):
225+
options.append(cell.TrclBuilder_3.unbuild(option))
226+
elif isinstance(ast.option, cell.Trcl_4):
227+
options.append(cell.TrclBuilder_4.unbuild(option))
228+
elif isinstance(ast.option, cell.Trcl_5):
229+
options.append(cell.TrclBuilder_5.unbuild(option))
230+
elif isinstance(ast.option, cell.Lat):
231+
options.append(cell.LatBuilder.unbuild(option))
232+
elif isinstance(ast.option, cell.Fill_0):
233+
options.append(cell.FillBuilder_0.unbuild(option))
234+
elif isinstance(ast.option, cell.Fill_1):
235+
options.append(cell.FillBuilder_1.unbuild(option))
236+
elif isinstance(ast.option, cell.Fill_2):
237+
options.append(cell.FillBuilder_2.unbuild(option))
238+
elif isinstance(ast.option, cell.Fill_3):
239+
options.append(cell.FillBuilder_3.unbuild(option))
240+
elif isinstance(ast.option, cell.Fill_4):
241+
options.append(cell.FillBuilder_4.unbuild(option))
242+
elif isinstance(ast.option, cell.Fill_5):
243+
options.append(cell.FillBuilder_5.unbuild(option))
244+
elif isinstance(ast.option, cell.Fill_6):
245+
options.append(cell.FillBuilder_6.unbuild(option))
246+
elif isinstance(ast.option, cell.Elpt):
247+
options.append(cell.ElptBuilder.unbuild(option))
248+
elif isinstance(ast.option, cell.Tmp_0):
249+
options.append(cell.TmpBuilder_0.unbuild(option))
250+
elif isinstance(ast.option, cell.Tmp_1):
251+
options.append(cell.TmpBuilder_1.unbuild(option))
252+
elif isinstance(ast.option, cell.Cosy):
253+
options.append(cell.CosyBuilder.unbuild(option))
254+
elif isinstance(ast.option, cell.Bflcl):
255+
options.append(cell.BflclBuilder.unbuild(option))
256+
elif isinstance(ast.option, cell.Unc):
257+
options.append(cell.UncBuilder.unbuild(option))
258+
259+
return CellBuilder(
260+
number=copy.deepcopy(ast.number),
261+
material=copy.deepcopy(ast.material),
262+
density=copy.deepcopy(ast.density),
263+
geometry=copy.deepcopy(ast.geometry),
264+
options=options,
265+
)

src/pymcnp/inp/Comment.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import re
2+
import copy
23
import typing
34
import dataclasses
45

@@ -70,3 +71,16 @@ def build(self):
7071
text = self.text
7172

7273
return Comment(text=text)
74+
75+
@staticmethod
76+
def unbuild(ast: Comment):
77+
"""
78+
Unbuilds ``Comment`` into ``CommentBuilder``
79+
80+
Returns:
81+
``CommentBuilder`` for ``Comment``.
82+
"""
83+
84+
return CommentBuilder(
85+
text=copy.deepcopy(ast.text),
86+
)

0 commit comments

Comments
 (0)