Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Read parameters #728

Merged
merged 10 commits into from
Feb 18, 2025
38 changes: 4 additions & 34 deletions codegen/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@

from jinja2 import Environment, FileSystemLoader

from keyword_generation.handlers.shared_field import SharedFieldHandler
from keyword_generation.handlers.external_card import ExternalCardHandler
from keyword_generation.handlers.handler_base import KeywordHandler
from keyword_generation.handlers.external_card import ExternalCardHandler
from keyword_generation.handlers.series_card import SeriesCardHandler
from keyword_generation.handlers.shared_field import SharedFieldHandler


SKIPPED_KEYWORDS = set(
Expand Down Expand Up @@ -213,37 +214,6 @@ def handle_insert_cards(kwd_data, settings):
kwd_data["card_insertions"].append(insertion)


def handle_variable_cards(kwd_data, settings):
kwd_data["variable"] = True
dataclasses = []
for card_settings in settings:
card_index = card_settings["index"]
type_name = card_settings["type"]
variable_card = kwd_data["cards"][card_index]
if type_name == "struct":
struct_info = card_settings["struct-info"]
struct_name = struct_info["name"]
dataclass = {
"name": struct_name,
"fields": struct_info["fields"]
}
dataclasses.append(dataclass)
type_name = f"self.{struct_name}"

# use abbreviations for some fields to make the jinja template more concise
variable_card["variable"] = {
"name": card_settings["name"],
"size": card_settings["card-size"],
"width": card_settings["element-width"],
"length_func": card_settings.get("length-func", ""),
"active_func": card_settings.get("active-func", ""),
"type": type_name,
"help": card_settings["help"],
}
if len(dataclasses) > 0:
kwd_data["dataclasses"] = dataclasses


def handle_conditional_cards(kwd_data, settings):
for setting in settings:
index = setting["index"]
Expand Down Expand Up @@ -353,7 +323,7 @@ def expand(card):
"override-field": handle_override_field,
"replace-card": handle_replace_cards,
"insert-card": handle_insert_cards,
"variable-card": handle_variable_cards,
"variable-card": SeriesCardHandler(),
"add-option": handle_add_option,
"card-set": handle_card_sets,
"conditional-card": handle_conditional_cards,
Expand Down
40 changes: 40 additions & 0 deletions codegen/keyword_generation/handlers/series_card.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import typing

import keyword_generation.handlers.handler_base

class SeriesCardHandler(keyword_generation.handlers.handler_base.KeywordHandler):

def handle(self, kwd_data: typing.Dict[str, typing.Any], settings: typing.Dict[str, typing.Any]) -> None:
"""Transform `kwd_data` based on `settings`."""
kwd_data["variable"] = True
dataclasses = []
for card_settings in settings:
card_index = card_settings["index"]
type_name = card_settings["type"]
variable_card = kwd_data["cards"][card_index]
if type_name == "struct":
struct_info = card_settings["struct-info"]
struct_name = struct_info["name"]
dataclass = {
"name": struct_name,
"fields": struct_info["fields"]
}
dataclasses.append(dataclass)
type_name = f"self.{struct_name}"

# use abbreviations for some fields to make the jinja template more concise
variable_card["variable"] = {
"name": card_settings["name"],
"size": card_settings["card-size"],
"width": card_settings["element-width"],
"length_func": card_settings.get("length-func", ""),
"active_func": card_settings.get("active-func", ""),
"type": type_name,
"help": card_settings["help"],
}
if len(dataclasses) > 0:
kwd_data["dataclasses"] = dataclasses

def post_process(self, kwd_data: typing.Dict[str, typing.Any]) -> None:
"""Run after all handlers have run."""
return
29 changes: 27 additions & 2 deletions codegen/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,21 @@
},
"PARAMETER_PARAMETER": {
"generation-options": {
"duplicate-card": [
"variable-card": [
{
"index": 0,
"property-name": "parameters"
"name": "parameters",
"card-size": 8,
"element-width": 10,
"type": "struct",
"struct-info": {
"name": "Parameter",
"fields": [
{"name": "name", "type": "str"},
{"name": "val", "type": "str"}
]
},
"help": "Parameters."
}
]
}
Expand Down Expand Up @@ -270,6 +281,20 @@
]
}
},
"INCLUDE_PATH": {
"generation-options": {
"external-card-implementation": [
{
"index": 0,
"card": {
"source": "include_card",
"card-name": "IncludeCard"
},
"mixin": "IncludeCardMixin"
}
]
}
},
"PART_PART": {
"generation-options": {
"replace-card": [
Expand Down
1 change: 1 addition & 0 deletions doc/changelog/728.documentation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fix: Read parameters
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,15 @@
# SOFTWARE.

import typing
from ansys.dyna.core.lib.cards_.special.include_card import IncludeCard, IncludeCardMixin
from ansys.dyna.core.lib.card import Card, Field, Flag
from ansys.dyna.core.lib.config import use_lspp_defaults
from ansys.dyna.core.lib.keyword_base import KeywordBase

class IncludePath(KeywordBase):
class IncludePath(
KeywordBase
, IncludeCardMixin
):
"""DYNA INCLUDE_PATH keyword"""

keyword = "INCLUDE"
Expand All @@ -34,28 +38,6 @@ class IncludePath(KeywordBase):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self._cards = [
Card(
[
Field(
"path",
str,
0,
512,
kwargs.get("path")
),
],
),
IncludeCard(**kwargs)
]

@property
def path(self) -> typing.Optional[str]:
"""Get or set the define a directory in which to look for the include files.
If path length is greater then 80 chareaters, put space and '+' to continue on next line.
Lsprepost will output that format automatically
""" # nopep8
return self._cards[0].get_value("path")

@path.setter
def path(self, value: str) -> None:
self._cards[0].set_value("path", value)

39 changes: 18 additions & 21 deletions src/ansys/dyna/core/keywords/keyword_classes/auto/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

import dataclasses
import typing
from ansys.dyna.core.lib.card import Card, Field, Flag
from ansys.dyna.core.lib.config import use_lspp_defaults
from ansys.dyna.core.lib.duplicate_card import DuplicateCard
from ansys.dyna.core.lib.series_card import SeriesCard
from ansys.dyna.core.lib.keyword_base import KeywordBase

class Parameter(KeywordBase):
Expand All @@ -32,33 +33,29 @@ class Parameter(KeywordBase):
keyword = "PARAMETER"
subkeyword = "PARAMETER"

@dataclasses.dataclass
class Parameter:
name: str = None
val: str = None

def __init__(self, **kwargs):
super().__init__(**kwargs)
self._cards = [
DuplicateCard(
[
Field("prmr1", str, 0, 10),
Field("val1", str, 10, 10),
Field("prmr2", str, 20, 10),
Field("val2", str, 30, 10),
Field("prmr3", str, 40, 10),
Field("val3", str, 50, 10),
Field("prmr4", str, 60, 10),
Field("val4", str, 70, 10),
],
SeriesCard(
"parameters",
8,
10,
self.Parameter,
None,
name="parameters",
**kwargs,
),
data = kwargs.get("parameters")),
]

@property
def parameters(self):
'''Gets the table of parameters'''
return self._cards[0].table
def parameters(self) -> SeriesCard:
"""Parameters."""
return self._cards[0]

@parameters.setter
def parameters(self, df):
'''sets parameters from the dataframe df'''
self._cards[0].table = df
def parameters(self, value: typing.List) -> None:
self._cards[0].data = value

2 changes: 1 addition & 1 deletion src/ansys/dyna/core/lib/card.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from ansys.dyna.core.lib.format_type import format_type
from ansys.dyna.core.lib.io_utils import write_or_return
from ansys.dyna.core.lib.kwd_line_formatter import load_dataline, read_line
from ansys.dyna.core.lib.parameter_set import ParameterSet
from ansys.dyna.core.lib.parameters import ParameterSet


class Card(CardInterface):
Expand Down
4 changes: 1 addition & 3 deletions src/ansys/dyna/core/lib/card_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@
import typing

from ansys.dyna.core.lib.format_type import format_type
from ansys.dyna.core.lib.parameter_set import ParameterSet

# TODO - implement __repr__ on all cards
from ansys.dyna.core.lib.parameters import ParameterSet


class CardInterface(metaclass=abc.ABCMeta):
Expand Down
2 changes: 1 addition & 1 deletion src/ansys/dyna/core/lib/card_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
from ansys.dyna.core.lib.io_utils import write_or_return
from ansys.dyna.core.lib.kwd_line_formatter import at_end_of_keyword
from ansys.dyna.core.lib.option_card import OptionSpec
from ansys.dyna.core.lib.parameter_set import ParameterSet
from ansys.dyna.core.lib.parameters import ParameterSet


class CardSet(CardInterface):
Expand Down
2 changes: 1 addition & 1 deletion src/ansys/dyna/core/lib/cards.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from ansys.dyna.core.lib.format_type import format_type
from ansys.dyna.core.lib.kwd_line_formatter import read_line
from ansys.dyna.core.lib.option_card import OptionCardSet, Options, OptionsInterface, OptionSpec
from ansys.dyna.core.lib.parameter_set import ParameterSet
from ansys.dyna.core.lib.parameters import ParameterSet


class Cards(OptionsInterface):
Expand Down
9 changes: 6 additions & 3 deletions src/ansys/dyna/core/lib/deck.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from ansys.dyna.core.lib.import_handler import ImportContext, ImportHandler
from ansys.dyna.core.lib.io_utils import write_or_return
from ansys.dyna.core.lib.keyword_base import KeywordBase
from ansys.dyna.core.lib.parameter_set import ParameterSet
from ansys.dyna.core.lib.parameters import ParameterHandler, ParameterSet
from ansys.dyna.core.lib.transform import TransformHandler


Expand All @@ -46,7 +46,7 @@ def __init__(self, title: str = None, **kwargs):
self.comment_header: str = None
self.title: str = title
self.format: format_type = kwargs.get("format", format_type.default)
self._import_handlers: typing.List[ImportHandler] = list()
self._import_handlers: typing.List[ImportHandler] = [ParameterHandler()]
self._transform_handler = TransformHandler()

def __add__(self, other):
Expand Down Expand Up @@ -185,7 +185,7 @@ def _expand_helper(self, search_paths: typing.List[str], recurse: bool) -> typin
keywords.append(keyword)
continue
if keyword.subkeyword == "PATH":
search_paths.append(keyword.path)
search_paths.append(keyword.filename)
keywords.append(keyword)
continue
success = False
Expand All @@ -208,6 +208,7 @@ def _expand_helper(self, search_paths: typing.List[str], recurse: bool) -> typin
pass
if success:
if recurse:
# TODO: merge the parameters if the "LOCAL" option is not used!
expanded = include_deck._expand_helper(search_paths, True)
keywords.extend(expanded)
else:
Expand Down Expand Up @@ -348,6 +349,8 @@ def loads(
# deck_loader imports ansys.dyna.keywords
from ansys.dyna.core.lib.deck_loader import load_deck

if context is None:
context = ImportContext(None, self, None)
result = load_deck(self, value, context, self._import_handlers)
return result

Expand Down
2 changes: 1 addition & 1 deletion src/ansys/dyna/core/lib/duplicate_card.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
from ansys.dyna.core.lib.format_type import format_type
from ansys.dyna.core.lib.io_utils import write_or_return
from ansys.dyna.core.lib.kwd_line_formatter import buffer_to_lines
from ansys.dyna.core.lib.parameter_set import ParameterSet
from ansys.dyna.core.lib.parameters import ParameterSet

CHECK_TYPE = True

Expand Down
2 changes: 1 addition & 1 deletion src/ansys/dyna/core/lib/duplicate_card_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from ansys.dyna.core.lib.format_type import format_type
from ansys.dyna.core.lib.io_utils import write_or_return
from ansys.dyna.core.lib.kwd_line_formatter import buffer_to_lines
from ansys.dyna.core.lib.parameter_set import ParameterSet
from ansys.dyna.core.lib.parameters import ParameterSet


def _to_duplicate_card(card: Card, length_func: typing.Callable) -> DuplicateCard:
Expand Down
5 changes: 3 additions & 2 deletions src/ansys/dyna/core/lib/import_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
import typing
import warnings

from ansys.dyna.core.lib.keyword_base import KeywordBase
if typing.TYPE_CHECKING:
from ansys.dyna.core.lib.keyword_base import KeywordBase


@dataclasses.dataclass
Expand Down Expand Up @@ -57,7 +58,7 @@ def before_import(self, context: ImportContext, keyword: str, buffer: typing.Tex
"""
return True

def after_import(self, context: ImportContext, keyword: typing.Union[str, KeywordBase]):
def after_import(self, context: ImportContext, keyword: typing.Union[str, "KeywordBase"]):
"""Event called after a keyword is imported.

`keyword` is the imported keyword. It could be a string or a keyword object
Expand Down
2 changes: 1 addition & 1 deletion src/ansys/dyna/core/lib/keyword_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from ansys.dyna.core.lib.card_interface import CardInterface
from ansys.dyna.core.lib.cards import Cards
from ansys.dyna.core.lib.format_type import format_type
from ansys.dyna.core.lib.parameter_set import ParameterSet
from ansys.dyna.core.lib.parameters import ParameterSet


class KeywordBase(Cards):
Expand Down
Loading
Loading