| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | __title__ = "FreeCAD material card importer" |
| | __author__ = "Juergen Riegel" |
| | __url__ = "https://www.freecad.org" |
| |
|
| |
|
| | import os |
| |
|
| | import FreeCAD |
| |
|
| | from materialtools.cardutils import get_material_template |
| | import Materials |
| | from builtins import open as pyopen |
| |
|
| | if FreeCAD.GuiUp: |
| | from PySide import QtGui |
| |
|
| |
|
| |
|
| |
|
| |
|
| | def open(filename): |
| | "called when freecad wants to open a file" |
| | docname = os.path.splitext(os.path.basename(filename))[0] |
| | doc = FreeCAD.newDocument(docname) |
| | doc.Label = docname |
| | FreeCAD.ActiveDocument = doc |
| | read(filename) |
| | return doc |
| |
|
| |
|
| | def insert(filename, docname): |
| | "called when freecad wants to import a file" |
| | try: |
| | doc = FreeCAD.getDocument(docname) |
| | except NameError: |
| | doc = FreeCAD.newDocument(docname) |
| | FreeCAD.ActiveDocument = doc |
| | read(filename) |
| | return doc |
| |
|
| |
|
| | def export(exportList, filename): |
| | "called when freecad exports a file" |
| | return |
| |
|
| |
|
| | def decode(name): |
| | "decodes encoded strings" |
| | try: |
| | decodedName = (name.decode("utf8")) |
| | except UnicodeDecodeError: |
| | try: |
| | decodedName = (name.decode("latin1")) |
| | except UnicodeDecodeError: |
| | FreeCAD.Console.PrintError("Error: Couldn't determine character encoding") |
| | decodedName = name |
| | return decodedName |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | def read(filename): |
| | materialManager = Materials.MaterialManager() |
| | material = materialManager.getMaterialByPath(filename) |
| | return material.Properties |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | def read_old(filename): |
| | "reads a FCMat file and returns a dictionary from it" |
| |
|
| | |
| | |
| |
|
| | |
| | card_name_file = os.path.splitext(os.path.basename(filename))[0] |
| | f = pyopen(filename, encoding="utf8") |
| | try: |
| | content = f.readlines() |
| | |
| | |
| | |
| | except Exception: |
| | |
| | |
| | |
| | |
| | FreeCAD.Console.PrintError("Error on card loading. File might not utf-8.") |
| | error_message = "Error on loading. Material file '{}' might not utf-8.".format(filename) |
| | FreeCAD.Console.PrintError("{}\n".format(error_message)) |
| | if FreeCAD.GuiUp: |
| | QtGui.QMessageBox.critical(None, "Error on card reading", error_message) |
| | return {} |
| | d = {} |
| | d["CardName"] = card_name_file |
| | for ln, line in enumerate(content): |
| | |
| | ln += 1 |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | if line.startswith('#'): |
| | |
| | continue |
| | |
| | if line.startswith(';') and ln == 1: |
| | |
| | v = line.split(";")[1].strip() |
| | if hasattr(v, "decode"): |
| | v = v.decode('utf-8') |
| | card_name_content = v |
| | if card_name_content != d["CardName"]: |
| | FreeCAD.Console.PrintLog( |
| | "File CardName ( {} ) is not content CardName ( {} )\n" |
| | .format(card_name_file, card_name_content) |
| | ) |
| |
|
| | |
| | elif line.startswith(';') and ln == 2: |
| | |
| | v = line.split(";")[1].strip() |
| | if hasattr(v, "decode"): |
| | v = v.decode('utf-8') |
| | d["AuthorAndLicense"] = v |
| |
|
| | |
| | else: |
| | |
| | |
| | if line[0] not in ";[": |
| | |
| | |
| | k = line.split("=", 1) |
| | if len(k) == 2: |
| | v = k[1].strip() |
| | if hasattr(v, "decode"): |
| | v = v.decode('utf-8') |
| | d[k[0].strip()] = v |
| | return d |
| |
|
| | def read2(filename): |
| | "reads a FCMat file and returns a dictionary from it" |
| |
|
| | |
| | |
| |
|
| | |
| | card_name_file = os.path.splitext(os.path.basename(filename))[0] |
| | f = pyopen(filename, encoding="utf8") |
| | try: |
| | content = f.readlines() |
| | |
| | |
| | |
| | except Exception: |
| | |
| | |
| | |
| | |
| | FreeCAD.Console.PrintError("Error on card loading. File might not utf-8.") |
| | error_message = "Error on loading. Material file '{}' might not utf-8.".format(filename) |
| | FreeCAD.Console.PrintError("{}\n".format(error_message)) |
| | if FreeCAD.GuiUp: |
| | QtGui.QMessageBox.critical(None, "Error on card reading", error_message) |
| | return {} |
| | d = {} |
| | d["Meta"] = {} |
| | d["General"] = {} |
| | d["Mechanical"] = {} |
| | d["Fluidic"] = {} |
| | d["Thermal"] = {} |
| | d["Electromagnetic"] = {} |
| | d["Architectural"] = {} |
| | d["Rendering"] = {} |
| | d["VectorRendering"] = {} |
| | d["Cost"] = {} |
| | d["UserDefined"] = {} |
| | d["Meta"]["CardName"] = card_name_file |
| | section = '' |
| | for ln, line in enumerate(content): |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | if line.startswith('#'): |
| | |
| | continue |
| | |
| | if line.startswith(';') and ln == 0: |
| | |
| | v = line.split(";")[1].strip() |
| | if hasattr(v, "decode"): |
| | v = v.decode('utf-8') |
| | card_name_content = v |
| | if card_name_content != d["Meta"]["CardName"]: |
| | FreeCAD.Console.PrintLog( |
| | "File CardName ( {} ) is not content CardName ( {} )\n" |
| | .format(card_name_file, card_name_content) |
| | ) |
| |
|
| | |
| | elif line.startswith(';') and ln == 1: |
| | |
| | v = line.split(";")[1].strip() |
| | if hasattr(v, "decode"): |
| | v = v.decode('utf-8') |
| | d["General"]["AuthorAndLicense"] = v |
| |
|
| | |
| | else: |
| | |
| | |
| | if line[0] == '[': |
| | |
| | line = line[1:] |
| | |
| | k = line.split("]", 1) |
| | if len(k) >= 2: |
| | v = k[0].strip() |
| | if hasattr(v, "decode"): |
| | v = v.decode('utf-8') |
| | section = v |
| | |
| | elif line[0] not in ";": |
| | |
| | |
| | k = line.split("=", 1) |
| | if len(k) == 2: |
| | v = k[1].strip() |
| | if hasattr(v, "decode"): |
| | v = v.decode('utf-8') |
| | |
| | d[section][k[0].strip()] = v |
| | return d |
| |
|
| |
|
| | def write(filename, dictionary, write_group_section=True): |
| | "writes the given dictionary to the given file" |
| |
|
| | |
| | contents = [] |
| | user = {} |
| | template_data = get_material_template() |
| | for group in template_data: |
| | groupName = list(group)[0] |
| | contents.append({"keyname": groupName}) |
| | if groupName == "Meta": |
| | header = contents[-1] |
| | elif groupName == 'UserDefined': |
| | user = contents[-1] |
| | for properName in group[groupName]: |
| | contents[-1][properName] = '' |
| | for k, i in dictionary.items(): |
| | found = False |
| | for group in contents: |
| | if not found: |
| | if k in group: |
| | group[k] = i |
| | found = True |
| | if not found: |
| | user[k] = i |
| | |
| | for group in contents: |
| | |
| | |
| | for k in list(group): |
| | if group[k] == '': |
| | del group[k] |
| |
|
| | |
| | rev = "{}.{}.{}".format( |
| | FreeCAD.ConfigGet("BuildVersionMajor"), |
| | FreeCAD.ConfigGet("BuildVersionMinor"), |
| | FreeCAD.ConfigGet("BuildRevision") |
| | ) |
| | |
| | card_name_file = os.path.splitext(os.path.basename(filename))[0] |
| | |
| | if "CardName" not in header: |
| | print(header) |
| | error_message = "No card name provided. Card could not be written.".format(header) |
| | FreeCAD.Console.PrintError("{}\n".format(error_message)) |
| | if FreeCAD.GuiUp: |
| | QtGui.QMessageBox.critical(None, "No card name", error_message) |
| | return |
| | f = pyopen(filename, "w", encoding="utf-8") |
| | |
| | |
| | if header["CardName"] != card_name_file: |
| | |
| | FreeCAD.Console.PrintWarning( |
| | "The file name {} is not equal to the card name {}. The file name is used." |
| | .format(card_name_file, header["CardName"]) |
| | ) |
| | f.write("; " + card_name_file + "\n") |
| | |
| | f.write("; " + header.get("AuthorAndLicense", "no author") + "\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("; file created by FreeCAD " + rev + "\n") |
| | |
| | |
| | if write_group_section is False: |
| | f.write("\n[FCMat]\n") |
| | for s in contents: |
| | if s["keyname"] != "Meta": |
| | |
| | if len(s) > 1: |
| | |
| | if write_group_section is True: |
| | f.write("\n[" + s["keyname"] + "]\n") |
| | for k, i in s.items(): |
| | if (k != "keyname" and i != '') or k == "Name": |
| | |
| | f.write(k + " = " + i + "\n") |
| | f.close() |
| |
|
| |
|
| | |
| | ''' |
| | from materialtools.cardutils import get_source_path as getsrc |
| | from importFCMat import read, write |
| | readmatfile = getsrc() + '/src/Mod/Material/StandardMaterial/Concrete-Generic.FCMat' |
| | writematfile = '/tmp/Concrete-Generic.FCMat' |
| | matdict = read(readmatfile) |
| | matdict |
| | write(writematfile, matdict) |
| | |
| | ''' |
| |
|