| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | __title__ = "material cards utilities" |
| | __author__ = "Bernd Hahnebach" |
| | __url__ = "https://www.freecad.org" |
| |
|
| | import os |
| | from os.path import join |
| | from pathlib import Path |
| |
|
| | import FreeCAD |
| | import Materials |
| |
|
| |
|
| | unicode = str |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | ''' |
| | data model: |
| | materials = { card_path: mat_dict, ... } |
| | cards = { card_path: card_name, ... } |
| | icons = { card_path: icon_path, ... } |
| | |
| | - duplicates are allowed |
| | - the whole card_path is saved into the combo box widget, this makes card unique |
| | - sorting happens on adding to the combo box widgets |
| | |
| | a data model which uses a class and attributes as well as methods to access the attributes |
| | would makes sense, like some material library class |
| | this has been done already by eivind see |
| | https://forum.freecad.org/viewtopic.php?f=38&t=16714 |
| | ''' |
| |
|
| | def get_material_preferred_directory(category=None): |
| | """ |
| | Return the preferred material directory. In priority order they are: |
| | 1. user specified |
| | 2. user modules folder |
| | 3. system folder |
| | """ |
| | mat_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Material/Resources") |
| | use_built_in_materials = mat_prefs.GetBool("UseBuiltInMaterials", True) |
| | use_mat_from_config_dir = mat_prefs.GetBool("UseMaterialsFromConfigDir", True) |
| | use_mat_from_custom_dir = mat_prefs.GetBool("UseMaterialsFromCustomDir", True) |
| |
|
| | preferred = None |
| |
|
| | if use_built_in_materials: |
| | if category == 'Fluid': |
| | preferred = join( |
| | FreeCAD.getResourceDir(), "Mod", "Material", "Resources", "Materials", "FluidMaterial" |
| | ) |
| |
|
| | elif category == 'Solid': |
| | preferred = join( |
| | FreeCAD.getResourceDir(), "Mod", "Material", "Resources", "Materials", "StandardMaterial" |
| | ) |
| |
|
| | else: |
| | preferred = join( |
| | FreeCAD.getResourceDir(), "Mod", "Material" |
| | ) |
| |
|
| | if use_mat_from_config_dir: |
| | user = join( |
| | FreeCAD.ConfigGet("UserAppData"), "Material" |
| | ) |
| | if os.path.isdir(user): |
| | preferred = user |
| |
|
| | if use_mat_from_custom_dir: |
| | custom = mat_prefs.GetString("CustomMaterialsDir", "") |
| | if len(custom.strip()) > 0: |
| | preferred = custom |
| |
|
| | return preferred |
| |
|
| | def get_material_preferred_save_directory(): |
| | """ |
| | Return the preferred directory for saving materials. In priority order they are: |
| | 1. user specified |
| | 2. user modules folder |
| | """ |
| | mat_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Material/Resources") |
| | use_mat_from_config_dir = mat_prefs.GetBool("UseMaterialsFromConfigDir", True) |
| | use_mat_from_custom_dir = mat_prefs.GetBool("UseMaterialsFromCustomDir", True) |
| |
|
| | if use_mat_from_custom_dir: |
| | custom = mat_prefs.GetString("CustomMaterialsDir", "") |
| | if len(custom.strip()) > 0: |
| | |
| | try: |
| | if not os.path.isdir(custom): |
| | os.makedirs(custom) |
| | return custom |
| | except Exception as ex: |
| | print(ex) |
| | pass |
| |
|
| | if use_mat_from_config_dir: |
| | user = join( |
| | FreeCAD.ConfigGet("UserAppData"), "Material" |
| | ) |
| | try: |
| | if not os.path.isdir(user): |
| | os.makedirs(user) |
| | return user |
| | except Exception as ex: |
| | print(ex) |
| | pass |
| |
|
| |
|
| | return "" |
| |
|
| |
|
| | |
| | def get_material_resources(category='Solid'): |
| |
|
| | resources = {} |
| |
|
| | mat_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Material/Resources") |
| | use_built_in_materials = mat_prefs.GetBool("UseBuiltInMaterials", True) |
| | use_mat_from_modules = mat_prefs.GetBool("UseMaterialsFromWorkbenches", True) |
| | use_mat_from_config_dir = mat_prefs.GetBool("UseMaterialsFromConfigDir", True) |
| | use_mat_from_custom_dir = mat_prefs.GetBool("UseMaterialsFromCustomDir", True) |
| |
|
| | if use_built_in_materials: |
| | if category == 'Fluid': |
| | builtin_mat_dir = join( |
| | FreeCAD.getResourceDir(), "Mod", "Material", "Resources", "Materials", "FluidMaterial" |
| | ) |
| |
|
| | else: |
| | builtin_mat_dir = join( |
| | FreeCAD.getResourceDir(), "Mod", "Material", "Resources", "Materials", "StandardMaterial" |
| | ) |
| | resources[builtin_mat_dir] = ":/icons/freecad.svg" |
| |
|
| | if use_mat_from_modules: |
| | module_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Material/Resources/Modules") |
| | module_groups = module_prefs.GetGroups() |
| | for group in module_groups: |
| | module = module_prefs.GetGroup(group) |
| | module_mat_dir = module.GetString("ModuleDir", "") |
| | module_icon_dir = module.GetString("ModuleIcon", "") |
| | if len(module_mat_dir) > 0: |
| | resources[module_mat_dir] = module_icon_dir |
| |
|
| | if use_mat_from_config_dir: |
| | config_mat_dir = join( |
| | FreeCAD.ConfigGet("UserAppData"), "Material" |
| | ) |
| | if os.path.exists(config_mat_dir): |
| | resources[config_mat_dir] = ":/icons/preferences-general.svg" |
| |
|
| | if use_mat_from_custom_dir: |
| | custom_mat_dir = mat_prefs.GetString("CustomMaterialsDir", "") |
| | if os.path.exists(custom_mat_dir): |
| | resources[custom_mat_dir] = ":/icons/user.svg" |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | return resources |
| |
|
| | def get_material_libraries(): |
| |
|
| | resources = {} |
| |
|
| | mat_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Material/Resources") |
| | use_built_in_materials = mat_prefs.GetBool("UseBuiltInMaterials", True) |
| | use_mat_from_modules = mat_prefs.GetBool("UseMaterialsFromWorkbenches", True) |
| | use_mat_from_config_dir = mat_prefs.GetBool("UseMaterialsFromConfigDir", True) |
| | use_mat_from_custom_dir = mat_prefs.GetBool("UseMaterialsFromCustomDir", True) |
| |
|
| | if use_built_in_materials: |
| | builtin_mat_dir = join( |
| | FreeCAD.getResourceDir(), "Mod", "Material", "Resources", "Materials" |
| | ) |
| | resources["System"] = (builtin_mat_dir, ":/icons/freecad.svg") |
| |
|
| | if use_mat_from_modules: |
| | module_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Material/Resources/Modules") |
| | module_groups = module_prefs.GetGroups() |
| | for group in module_groups: |
| | print("\tGroup - {0}".format(group)) |
| | module = module_prefs.GetGroup(group) |
| | module_mat_dir = module.GetString("ModuleDir", "") |
| | module_icon = module.GetString("ModuleIcon", "") |
| | if len(module_mat_dir) > 0: |
| | resources[group] = (module_mat_dir, module_icon) |
| |
|
| | if use_mat_from_config_dir: |
| | config_mat_dir = join( |
| | FreeCAD.ConfigGet("UserAppData"), "Material" |
| | ) |
| | if os.path.exists(config_mat_dir): |
| | resources["User"] = (config_mat_dir, ":/icons/preferences-general.svg") |
| |
|
| | if use_mat_from_custom_dir: |
| | custom_mat_dir = mat_prefs.GetString("CustomMaterialsDir", "") |
| | if os.path.exists(custom_mat_dir): |
| | resources["Custom"] = (custom_mat_dir, ":/icons/user.svg") |
| |
|
| | return resources |
| |
|
| |
|
| | def list_cards(mat_dir, icon): |
| | import glob |
| | a_path = mat_dir + '/**/*.FCMat' |
| | print("path = '{0}'".format(a_path)) |
| | dir_path_list = glob.glob(a_path, recursive=True) |
| | |
| |
|
| | cards = [] |
| | for a_path in dir_path_list: |
| | p = Path(a_path) |
| | relative = p.relative_to(mat_dir) |
| | cards.append(relative) |
| |
|
| | return cards |
| |
|
| | def output_resources(resources): |
| | FreeCAD.Console.PrintMessage('Directories in which we will look for material cards:\n') |
| | for path in resources.keys(): |
| | FreeCAD.Console.PrintMessage(' {}\n'.format(path)) |
| |
|
| |
|
| | |
| | |
| |
|
| | def import_materials(category='Solid', template=False): |
| | materialManager = Materials.MaterialManager() |
| | mats = materialManager.Materials |
| | materials = {} |
| | cards = {} |
| | icons = {} |
| | for matUUID in mats: |
| | mat = materialManager.getMaterial(matUUID) |
| | physicalModels = mat.PhysicalModels |
| | fluid = ('1ae66d8c-1ba1-4211-ad12-b9917573b202' in physicalModels) |
| | if (category == 'Solid' and not fluid) or (category != 'Solid' and fluid): |
| | path = mat.LibraryRoot + "/" + mat.Directory |
| |
|
| | materials[path] = mat.Properties |
| | cards[path] = mat.Name |
| | icons[path] = mat.LibraryIcon |
| |
|
| | return (materials, cards, icons) |
| |
|
| | def add_cards_from_a_dir(materials, cards, icons, mat_dir, icon, template=False): |
| | |
| | import glob |
| | from importFCMat import read |
| | dir_path_list = glob.glob(mat_dir + '/*' + ".FCMat") |
| | mat_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Material/Cards") |
| | delete_duplicates = mat_prefs.GetBool("DeleteDuplicates", True) |
| | |
| | |
| | for a_path in dir_path_list: |
| | try: |
| | mat_dict = read(a_path) |
| | except Exception: |
| | FreeCAD.Console.PrintError( |
| | 'Error on reading card data. The card data will be empty for card:\n{}\n' |
| | .format(a_path) |
| | ) |
| | mat_dict = {} |
| | card_name = os.path.splitext(os.path.basename(a_path))[0] |
| | if (card_name == 'TEMPLATE') and (template is False): |
| | continue |
| | if delete_duplicates is False: |
| | materials[a_path] = mat_dict |
| | cards[a_path] = card_name |
| | icons[a_path] = icon |
| | else: |
| | if mat_dict not in materials.values(): |
| | materials[a_path] = mat_dict |
| | cards[a_path] = card_name |
| | icons[a_path] = icon |
| |
|
| | return (materials, cards, icons) |
| |
|
| |
|
| | def output_trio(trio): |
| | materials, cards, icons = trio |
| | FreeCAD.Console.PrintMessage('\n\n') |
| | for mat_card in materials: |
| | FreeCAD.Console.PrintMessage( |
| | '{} --> {} -->{}\n' |
| | .format(cards[mat_card], mat_card, icons[mat_card]) |
| | ) |
| | FreeCAD.Console.PrintMessage('\n\n') |
| |
|
| |
|
| | def output_cards(cards): |
| | FreeCAD.Console.PrintMessage('\n\n') |
| | for mat_card in cards: |
| | FreeCAD.Console.PrintMessage('{} --> {}\n'.format(mat_card, cards[mat_card])) |
| | FreeCAD.Console.PrintMessage('\n\n') |
| |
|
| |
|
| | def output_icons(icons): |
| | FreeCAD.Console.PrintMessage('\n\n') |
| | for mat_card in icons: |
| | FreeCAD.Console.PrintMessage('{} --> {}\n'.format(mat_card, icons[mat_card])) |
| | FreeCAD.Console.PrintMessage('\n\n') |
| |
|
| |
|
| | def output_materials(materials): |
| | FreeCAD.Console.PrintMessage('\n\n') |
| | for mat_card in materials: |
| | FreeCAD.Console.PrintMessage('{}\n'.format(mat_card)) |
| | output_material_param(materials[mat_card]) |
| | FreeCAD.Console.PrintMessage('\n\n') |
| |
|
| |
|
| | def output_material_param(mat_dict): |
| | |
| | if not mat_dict: |
| | FreeCAD.Console.PrintMessage(' empty matdict\n') |
| | else: |
| | for p in mat_dict: |
| | FreeCAD.Console.PrintMessage(' {} --> {}\n'.format(p, mat_dict[p])) |
| | FreeCAD.Console.PrintMessage('\n') |
| |
|
| |
|
| | |
| | def get_material_template(withSpaces=False): |
| | |
| | |
| | |
| | |
| | |
| |
|
| | print("Call to get_material_template() successful") |
| |
|
| | import yaml |
| | template_data = yaml.safe_load( |
| | open(join(FreeCAD.ConfigGet('AppHomePath'), 'Mod/Material/Templatematerial.yml')) |
| | ) |
| | if withSpaces: |
| | |
| | |
| | import re |
| | new_template = [] |
| | for group in template_data: |
| | new_group = {} |
| | gg = list(group)[0] |
| | |
| | |
| | new_group[gg] = {} |
| | for proper in list(group[gg]): |
| | new_proper = re.sub(r"(\w)([A-Z]+)", r"\1 \2", proper) |
| | |
| | new_proper = new_proper.replace("_", " ") |
| | new_group[gg][new_proper] = group[gg][proper] |
| | new_template.append(new_group) |
| | template_data = new_template |
| | return template_data |
| |
|
| |
|
| | def create_mat_tools_header(): |
| | headers = join(get_source_path(), 'src/Mod/Material/StandardMaterial/Tools/headers') |
| | |
| | if not os.path.isfile(headers): |
| | FreeCAD.Console.PrintError( |
| | 'file not found: {}'.format(headers) |
| | ) |
| | return |
| | template_data = get_material_template() |
| | f = open(headers, "w") |
| | for group in template_data: |
| | gg = list(group)[0] |
| | |
| | if gg != 'UserDefined': |
| | for prop_name in group[gg]: |
| | if prop_name != 'None': |
| | f.write(prop_name + '\n') |
| | f.close |
| |
|
| |
|
| | def create_mat_template_card(write_group_section=True): |
| | template_card = join(get_source_path(), 'src/Mod/Material/StandardMaterial/TEMPLATE.FCMat') |
| | if not os.path.isfile(template_card): |
| | FreeCAD.Console.PrintError( |
| | 'file not found: {}'.format(template_card) |
| | ) |
| | return |
| | rev = "{}.{}.{}".format( |
| | FreeCAD.ConfigGet("BuildVersionMajor"), |
| | FreeCAD.ConfigGet("BuildVersionMinor"), |
| | FreeCAD.ConfigGet("BuildRevision") |
| | ) |
| | template_data = get_material_template() |
| | f = open(template_card, "w") |
| | f.write('; TEMPLATE\n') |
| | f.write('; (c) 2013-2015 Juergen Riegel (CC-BY 3.0)\n') |
| | f.write('; information about the content of such cards can be found on the wiki:\n') |
| | f.write('; https://www.freecad.org/wiki/Material\n') |
| | f.write(': this template card was created by FreeCAD ' + rev + '\n\n') |
| | f.write('; localized Name, Description and KindOfMaterial uses 2 letter codes\n') |
| | f.write('; defined in ISO-639-1, see https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\n') |
| | f.write('; find unit information in src/App/FreeCADInit.py') |
| | |
| | |
| | if write_group_section is False: |
| | f.write("\n[FCMat]\n") |
| | for group in template_data: |
| | gg = list(group)[0] |
| | |
| | if (gg != 'Meta') and (gg != 'UserDefined'): |
| | |
| | if write_group_section is True: |
| | f.write("\n\n[" + gg + "]") |
| | for prop_name in group[gg]: |
| | f.write('\n') |
| | description = group[gg][prop_name]['Description'] |
| | if not description.strip(): |
| | f.write('; Description to be updated\n') |
| | else: |
| | f.write('; ' + description + '\n') |
| | url = group[gg][prop_name]['URL'] |
| | if url.strip(): |
| | f.write('; ' + url + '\n') |
| | f.write(prop_name + ' =\n') |
| | f.close |
| |
|
| |
|
| | |
| | |
| | def get_source_path(): |
| | |
| | source_dir = '' |
| | make_file = join(FreeCAD.ConfigGet('AppHomePath'), 'Makefile') |
| | f = open(make_file, 'r') |
| | lines = f.readlines() |
| | f.close() |
| | for line in lines: |
| | if line.startswith('CMAKE_SOURCE_DIR'): |
| | source_dir = line.lstrip('CMAKE_SOURCE_DIR = ') |
| | source_dir = source_dir.rstrip() |
| | break |
| | |
| | return source_dir |
| |
|
| |
|
| | def get_known_material_quantity_parameter(): |
| | |
| | template_data = get_material_template() |
| | known_quantities = [] |
| | for group in template_data: |
| | gname = list(group)[0] |
| | for prop_name in group[gname]: |
| | prop_type = group[gname][prop_name]['Type'] |
| | if prop_type == 'Quantity': |
| | |
| | known_quantities.append(prop_name) |
| | return known_quantities |
| |
|
| |
|
| | |
| | def get_and_output_all_carddata(cards): |
| | print('\n\n\nSTART--get_and_output_all_carddata\n--------------------') |
| | |
| | registed_cardkeys = [] |
| | template_data = get_material_template() |
| | |
| | for group in template_data: |
| | gg = list(group)[0] |
| | for key in group[gg]: |
| | registed_cardkeys.append(key) |
| | registed_cardkeys = sorted(registed_cardkeys) |
| | |
| |
|
| | |
| | all_cards_and_data = {} |
| | for card in cards: |
| | from importFCMat import read |
| | d = read(cards[card]) |
| | all_cards_and_data[card] = [cards[card], d] |
| | ''' |
| | for card in all_cards_and_data: |
| | print(card) |
| | print(all_cards_and_data[card][0]) |
| | print(all_cards_and_data[card][1]) |
| | print('\n') |
| | ''' |
| |
|
| | |
| | used_and_registered_cardkeys = [] |
| | used_and_not_registered_cardkeys = [] |
| | registered_and_not_used_cardkeys = [] |
| | for card in all_cards_and_data: |
| | for k in all_cards_and_data[card][1]: |
| | if k in registed_cardkeys: |
| | used_and_registered_cardkeys.append(k) |
| | else: |
| | used_and_not_registered_cardkeys.append(k) |
| | for k in registed_cardkeys: |
| | if (k not in used_and_registered_cardkeys) and (k not in used_and_not_registered_cardkeys): |
| | registered_and_not_used_cardkeys.append(k) |
| |
|
| | used_and_registered_cardkeys = sorted(list(set(used_and_registered_cardkeys))) |
| | used_and_not_registered_cardkeys = sorted(list(set(used_and_not_registered_cardkeys))) |
| | registered_and_not_used_cardkeys = sorted(list(set(registered_and_not_used_cardkeys))) |
| | FreeCAD.Console.PrintMessage( |
| | '\nused_and_registered_cardkeys:\n{}\n' |
| | .format(used_and_registered_cardkeys) |
| | ) |
| | FreeCAD.Console.PrintMessage( |
| | '\nused_and_not_registered_cardkeys:\n{}\n' |
| | .format(used_and_not_registered_cardkeys) |
| | ) |
| | FreeCAD.Console.PrintMessage( |
| | '\nregistered_and_not_used_cardkeys:\n{}\n' |
| | .format(registered_and_not_used_cardkeys) |
| | ) |
| |
|
| | |
| | |
| | |
| | print('--------------------\nget_and_output_all_carddata--END\n\n\n') |
| |
|
| |
|
| | |
| | def read_cards_from_path(cards_path): |
| | from os import listdir |
| | from os.path import isfile, join, basename, splitext |
| | from importFCMat import read |
| | only_files = [f for f in listdir(cards_path) if isfile(join(cards_path, f))] |
| | |
| | mat_files = [f for f in only_files if basename(splitext(f)[1]).upper() == '.FCMAT'] |
| | |
| | mat_cards = [] |
| | for f in sorted(mat_files): |
| | mat_cards.append(read(join(cards_path, f))) |
| | return mat_cards |
| |
|
| |
|
| | def write_cards_to_path(cards_path, cards_data, write_group_section=True, write_template=False): |
| | from importFCMat import write |
| | from os.path import join |
| | for card_data in cards_data: |
| | if (card_data['CardName'] == 'TEMPLATE') and (write_template is False): |
| | continue |
| | else: |
| | card_path = join(cards_path, (card_data['CardName'] + '.FCMat')) |
| | |
| | if write_group_section is True: |
| | write(card_path, card_data, True) |
| | else: |
| | write(card_path, card_data, False) |
| |
|
| |
|
| | |
| | def check_parm_unit(param): |
| | |
| | |
| | |
| | from FreeCAD import Units |
| | if param.find("_") != -1: |
| | param = param.split("_")[0] |
| | if hasattr(Units, param): |
| | return True |
| | else: |
| | return False |
| |
|
| |
|
| | def check_value_unit(param, value): |
| | |
| | from FreeCAD import Units |
| | |
| | if hasattr(Units, param): |
| | |
| | unit = getattr(Units, param) |
| | quantity = Units.Quantity(1, unit) |
| | user_preferred_unit = quantity.getUserPreferred()[2] |
| | |
| | some_text = "Parameter: {} --> value: {} -->".format(param, value) |
| | try: |
| | param_value = Units.Quantity(value) |
| | try: |
| | user_unit = param_value.getValueAs(user_preferred_unit) |
| | if user_unit: |
| | return True |
| | elif user_unit == 0: |
| | FreeCAD.Console.PrintMessage( |
| | '{} Value {} = 0 for {}\n' |
| | .format(some_text, value, param) |
| | ) |
| | return True |
| | else: |
| | FreeCAD.Console.PrintError( |
| | '{} Unknown problem in unit conversion.\n' |
| | .format(some_text) |
| | ) |
| | except ValueError: |
| | unitproblem = value.split()[-1] |
| | FreeCAD.Console.PrintError( |
| | '{} Unit {} is known by FreeCAD, but wrong for parameter {}.\n' |
| | .format(some_text, unitproblem, param) |
| | ) |
| | except Exception: |
| | FreeCAD.Console.PrintError( |
| | '{} Unknown problem.\n' |
| | .format(some_text) |
| | ) |
| | except ValueError: |
| | unitproblem = value.split()[-1] |
| | FreeCAD.Console.PrintError( |
| | '{} Unit {} is unknown to FreeCAD.\n' |
| | .format(some_text, unitproblem) |
| | ) |
| | except Exception: |
| | FreeCAD.Console.PrintError( |
| | '{} Unknown problem.\n' |
| | .format(some_text) |
| | ) |
| | else: |
| | FreeCAD.Console.PrintError( |
| | 'Parameter {} is unknown to the FreeCAD unit system.\n' |
| | .format(param) |
| | ) |
| | return False |
| |
|
| |
|
| | def output_parm_unit_info(param): |
| | |
| | from FreeCAD import Units |
| | FreeCAD.Console.PrintMessage('{}\n'.format(param)) |
| | if hasattr(Units, param): |
| | FreeCAD.Console.PrintMessage( |
| | '\nParameter {} is known to FreeCAD unit system.' |
| | .format(param) |
| | ) |
| |
|
| | |
| | unit = getattr(Units, param) |
| | FreeCAD.Console.PrintMessage( |
| | '{}\n' |
| | .format(unit) |
| | ) |
| |
|
| | quantity = Units.Quantity(1, unit) |
| | FreeCAD.Console.PrintMessage( |
| | '{}\n' |
| | .format(quantity) |
| | ) |
| |
|
| | user_preferred_unit = quantity.getUserPreferred()[2] |
| | FreeCAD.Console.PrintMessage( |
| | '{}\n' |
| | .format(user_preferred_unit) |
| | ) |
| |
|
| | else: |
| | FreeCAD.Console.PrintMessage( |
| | 'Parameter {} is Unknown to the FreeCAD unit system.' |
| | .format(param) |
| | ) |
| |
|
| |
|
| | def output_value_unit_info(param, value): |
| | |
| | from FreeCAD import Units |
| | some_text = "Parameter: {} --> value: {} -->".format(param, value) |
| | FreeCAD.Console.PrintMessage('{} unit information:'.format(some_text)) |
| | if hasattr(Units, param): |
| |
|
| | |
| | unit = getattr(Units, param) |
| | FreeCAD.Console.PrintMessage( |
| | '{}\n' |
| | .format(unit) |
| | ) |
| |
|
| | quantity = Units.Quantity(1, unit) |
| | FreeCAD.Console.PrintMessage( |
| | '{}\n' |
| | .format(quantity) |
| | ) |
| |
|
| | user_preferred_unit = quantity.getUserPreferred()[2] |
| | FreeCAD.Console.PrintMessage( |
| | '{}\n' |
| | .format(user_preferred_unit) |
| | ) |
| |
|
| | |
| | try: |
| | param_value = Units.Quantity(value) |
| | try: |
| | user_unit = param_value.getValueAs(user_preferred_unit) |
| | FreeCAD.Console.PrintMessage( |
| | '{} Value in preferred unit: {}\n' |
| | .format(some_text, user_unit) |
| | ) |
| | except ValueError: |
| | unitproblem = value.split()[-1] |
| | FreeCAD.Console.PrintError( |
| | '{} Unit {} is known by FreeCAD, but wrong for parameter {}.\n' |
| | .format(some_text, unitproblem, param) |
| | ) |
| | except Exception: |
| | FreeCAD.Console.PrintError( |
| | '{} Unknown problem.\n' |
| | .format(some_text) |
| | ) |
| |
|
| | except ValueError: |
| | unitproblem = value.split()[-1] |
| | FreeCAD.Console.PrintError( |
| | '{} Unit {} is unknown by FreeCAD.\n' |
| | .format(some_text, unitproblem) |
| | ) |
| |
|
| | except Exception: |
| | FreeCAD.Console.PrintError( |
| | '{} Unknown problem.\n' |
| | .format(some_text) |
| | ) |
| |
|
| | else: |
| | FreeCAD.Console.PrintMessage( |
| | 'Parameter {} is unknown to the FreeCAD unit system.' |
| | .format(param) |
| | ) |
| |
|
| |
|
| | def check_mat_units(mat): |
| | known_quantities = get_known_material_quantity_parameter() |
| | |
| | |
| | |
| | units_ok = True |
| | for param, value in mat.items(): |
| | if param in known_quantities: |
| | if check_value_unit(param, value) is False: |
| | if units_ok is True: |
| | units_ok = False |
| | else: |
| | pass |
| | |
| | |
| | return units_ok |
| |
|
| |
|
| | |
| | ''' |
| | # cards, params, icons and resources ********** |
| | from materialtools.cardutils import get_material_resources as getres |
| | from materialtools.cardutils import output_resources as outres |
| | outres(getres()) |
| | |
| | |
| | from materialtools.cardutils import import_materials as getmats |
| | from materialtools.cardutils import output_materials as outmats |
| | from materialtools.cardutils import output_trio as outtrio |
| | |
| | outmats(getmats()[0]) |
| | |
| | outtrio(getmats()) |
| | |
| | a,b,c = getmats() |
| | materials, cards, icons = getmats() |
| | |
| | |
| | # param template, header, template card ********** |
| | from materialtools.cardutils import get_material_template as gettemplate |
| | gettemplate() |
| | |
| | gettemplate()[1]['General']['Description'] |
| | gettemplate()[2]['Mechanical']['FractureToughness'] |
| | |
| | |
| | from materialtools.cardutils import get_material_template as gettemplate |
| | template_data=gettemplate() |
| | for group in template_data: |
| | gname = list(group)[0] # group dict has only one key |
| | for prop_name in group[gname]: |
| | #prop_dict = group[gname][prop_name] |
| | #print(prop_dict) |
| | #print(prop_dict['Description']) |
| | print(group[gname][prop_name]['Description']) |
| | |
| | |
| | from materialtools.cardutils import create_mat_tools_header as createheader |
| | createheader() |
| | |
| | |
| | from materialtools.cardutils import create_mat_template_card as createtemplate |
| | createtemplate() |
| | createtemplate(False) |
| | |
| | |
| | from materialtools.cardutils import get_source_path as getsrc |
| | getsrc() |
| | |
| | |
| | # generate all cards ********** |
| | # run tools in source dir |
| | ./make_ods.sh |
| | ./make_FCMats.sh |
| | |
| | # read cards |
| | from materialtools.cardutils import read_cards_from_path as readcards |
| | from materialtools.cardutils import get_source_path as getsrc |
| | cards_data = readcards(getsrc() + '/src/Mod/Material/StandardMaterial/') |
| | |
| | # print cards |
| | for c in cards_data: |
| | print(c) |
| | |
| | # write cards |
| | from materialtools.cardutils import write_cards_to_path as writecards |
| | from materialtools.cardutils import get_source_path as getsrc |
| | |
| | # True writes sections ( method write_group_section is used =) |
| | writecards(getsrc() + '/src/Mod/Material/StandardMaterial/', cards_data, True) |
| | |
| | writecards(getsrc() + '/src/Mod/Material/StandardMaterial/', cards_data, False) |
| | |
| | # last True writes the TEMPLATE card which has no mat params because they have no values |
| | writecards(getsrc() + '/src/Mod/Material/StandardMaterial/', cards_data, True, True) |
| | |
| | |
| | # material quantity parameter unit checks ********** |
| | from materialtools.cardutils import output_parm_unit_info as unitinfo |
| | unitinfo('YoungsModulus') |
| | unitinfo('FractureToughness') |
| | unitinfo('PoissonRatio') |
| | |
| | from materialtools.cardutils import check_parm_unit as checkparamunit |
| | checkparamunit('YoungsModulus') |
| | checkparamunit('FractureToughness') |
| | |
| | from materialtools.cardutils import output_value_unit_info as valueunitinfo |
| | valueunitinfo('YoungsModulus', '1 MPa') |
| | valueunitinfo('FractureToughness', '25') |
| | valueunitinfo('Density', '1 kg/m^3') |
| | valueunitinfo('Density', '0 kg/m^3') |
| | |
| | from materialtools.cardutils import check_value_unit as checkvalueunit |
| | checkvalueunit('YoungsModulus', '1 MPa') |
| | checkvalueunit('FractureToughness', '25') |
| | checkvalueunit('Density', '1 kg/m^3') |
| | checkvalueunit('Density', '0 kg/m^3') |
| | |
| | # syntax error in unit system, only the try: except in the checkvalueunit let it work |
| | checkvalueunit('ThermalConductivity', '0.02583 W/m/K') |
| | checkvalueunit('ThermalConductivity', '123abc456 W/m/K') |
| | checkvalueunit('ThermalConductivity', '25.83e−3 W/m/K') |
| | checkvalueunit('ThermalConductivity', '25.83e-3 W/m/K') |
| | from FreeCAD import Units |
| | Units.Quantity('25.83e−3 W/m/K') |
| | |
| | |
| | # test mat unit properties |
| | mat = { |
| | 'Name': 'Concrete', |
| | 'AngleOfFriction' : '1 deg', |
| | 'CompressiveStrength': '1 MPa', |
| | 'Density': '1 kg/m^3', |
| | 'ShearModulus' : '1 MPa', |
| | 'UltimateTensileStrength' : '1 MPa', |
| | 'YieldStrength' : '1 MPa', |
| | 'YoungsModulus': '1 MPa', |
| | 'SpecificHeat' : '1 J/kg/K', |
| | 'ThermalConductivity' : '1 W/m/K', |
| | 'ThermalExpansionCoefficient' : '1 mm/mm/K' |
| | } |
| | from materialtools.cardutils import check_mat_units as checkunits |
| | checkunits(mat) |
| | |
| | # unknown quantities, returns True too |
| | mat = { |
| | 'Name': 'Concrete', |
| | 'FractureToughness' : '1', |
| | 'PoissonRatio': '0.17' # no unit but important too, proof somehow too |
| | } |
| | from materialtools.cardutils import check_mat_units as checkunits |
| | checkunits(mat) |
| | |
| | # wrong units |
| | mat = { |
| | 'Name': 'Concrete', |
| | 'CompressiveStrength': '12356 MBa', # type on unit, means unit not knwn |
| | 'YoungsModulus': '654321 m', # unit known, but wrong unit for this property |
| | } |
| | from materialtools.cardutils import check_mat_units as checkunits |
| | checkunits(mat) |
| | |
| | # missing unit, returns False |
| | mat = { |
| | 'Name': 'Concrete', |
| | 'YoungsModulus' : '1' |
| | } |
| | from materialtools.cardutils import check_mat_units as checkunits |
| | checkunits(mat) |
| | |
| | # empty dict, returns True |
| | from materialtools.cardutils import check_mat_units as checkunits |
| | checkunits({}) |
| | |
| | |
| | # some unit code ********** |
| | from FreeCAD import Units |
| | getattr(Units, 'Pressure') |
| | Units.Pressure |
| | Units.Quantity('25 MPa') |
| | Units.Quantity('25 MPa').getValueAs('Pa') |
| | Units.Quantity('25 MPa').getUserPreferred()[2] |
| | Units.Quantity(25000, Units.Pressure) |
| | Units.Quantity(25000, Units.Pressure).getValueAs('MPa') |
| | Units.Unit('25 MPa') |
| | Units.Unit(-1,1,-2,0,0,0,0,0) |
| | |
| | # base units |
| | from FreeCAD import Units |
| | Units.Length |
| | Units.Mass |
| | Units.TimeSpan |
| | Units.ElectricCurrent |
| | Units.Temperature |
| | Units.AmountOfSubstance |
| | Units.LuminousIntensity |
| | Units.Angle |
| | |
| | |
| | ''' |
| |
|