def GetFilePathOpen(FileType, name=""):
    file_path = ""
    valid_file = False
    if name is not "":
        name = " for: " + name

    initial_directory = GetInitialDirectory()

    if (FileType == "dat"):
        file_path = tk.filedialog.askopenfilename(initialdir=initial_directory,
                                                  title="Open file" + name,
                                                  filetypes=[("salome mesh",
                                                              "*.dat")])
    elif (FileType == conv_project_file_ending):
        file_path = tk.filedialog.askopenfilename(
            initialdir=initial_directory,
            title="Open file" + name,
            filetypes=[("converter files", "*" + conv_project_file_ending)])
    elif (FileType == conv_scheme_file_ending):
        file_path = tk.filedialog.askopenfilename(
            initialdir=initial_directory,
            title="Open file" + name,
            filetypes=[("converter files", "*" + conv_scheme_file_ending)])
    else:
        print("Unsupported FileType")  # TODO make messagebox

    if file_path not in ["", ()
                         ]:  # () is the output of a cancelled file open dialog
        valid_file = FileExists(file_path)
        global_utils.LogDebug("File Path: " + file_path)
        if valid_file:
            SetInitialDirectory(file_path)

    return file_path, valid_file
    def Serialize(self):
        # This function serializes the ModelPart such that it can be saved in a json file
        global_utils.LogDebug("Serializing ModelPart")
        serialized_dict = {}
        for smp_name in sorted(self.sub_model_parts.keys()):
            smp = self.sub_model_parts[smp_name]
            serialized_dict.update(smp.Serialize())

        return serialized_dict
    def Serialize(self):
        self.__CheckIsProperlyInitialized()

        global_utils.LogDebug("Serializing " + self.smp_info_dict["smp_name"])
        serialized_smp = {}

        serialized_smp["submodelpart_information"] = self.smp_info_dict
        serialized_smp["mesh_information"] = self.mesh_dict
        serialized_smp["nodes_read"] = self.__SerializeNodesRead()
        serialized_smp[
            "geom_entities_read"] = self.__SerializeGeomEntitiesRead()

        return {self.smp_info_dict["smp_name"]: serialized_smp}
    def __WriteNodes(self, open_file, readable_mdpa):
        open_file.write("Begin Nodes\n")

        if readable_mdpa:
            max_ID = max(self.nodes.keys())
            global_utils.LogDebug("Max Node ID: " + str(max_ID))

            spaces_coords_x = '{:>' + str(
                len(str(int(self.max_node_coord_x))) + self.precision +
                self.num_spaces) + '} '
            spaces_coords_y = '{:>' + str(
                len(str(int(self.max_node_coord_y))) + self.precision +
                self.num_spaces) + '} '
            spaces_coords_z = '{:>' + str(
                len(str(int(self.max_node_coord_z))) + self.precision +
                self.num_spaces) + '} '
            format_str = '{:>' + str(
                len(str(max_ID))
            ) + '} ' + spaces_coords_x + spaces_coords_y + spaces_coords_z
        else:
            format_str = '{} {} {} {}'

        global_utils.LogDebug("Node Format String: " + str(format_str))

        for ID in sorted(list(self.nodes.keys())):
            coords = self.nodes[ID][0]

            coords = [
                round(coords[0], self.precision),
                round(coords[1], self.precision),
                round(coords[2], self.precision)
            ]

            line = format_str.format(str(ID), coords[0], str(coords[1]),
                                     str(coords[2])) + "\n"

            open_file.write(line)

        open_file.write("End Nodes\n\n")
    def Deserialize(self, serialized_dict):
        # This function constructs a modelpart from a serialized dictionary
        self.Reset()

        for smp_name in sorted(serialized_dict.keys()):
            if smp_name != "general":
                self.sub_model_parts[smp_name] = MeshSubmodelPart()
                self.sub_model_parts[smp_name].Deserialize(
                    smp_name, serialized_dict[smp_name])

        self.mesh_read = True

        global_utils.LogDebug("Deserialized ModelPart")
    def Deserialize(self, smp_name, serialized_smp):
        smp_info_dict, mesh_dict = self.__DeserializeDictionary(serialized_smp)

        nodes_read = {}
        geom_entities_read = {}
        if "nodes_read" in serialized_smp:
            nodes_read = self.__DeserializeNodesRead(
                serialized_smp["nodes_read"])
            if "geom_entities_read" in serialized_smp:  # Geometric Entities can only exist if there are nodes!
                geom_entities_read = self.__DeserializeGeomEntitiesRead(
                    serialized_smp["geom_entities_read"])

        self.FillWithEntities(smp_info_dict, mesh_dict, nodes_read,
                              geom_entities_read)

        global_utils.LogDebug("Deserialized " + smp_name)
    def __WriteConditions(self, open_file, readable_mdpa):
        if readable_mdpa:
            num_conditions = self.NumberOfConditions()
            format_str = '{:>' + str(len(str(num_conditions))) + '} {:>' + str(
                self.num_spaces) + '}'
            space = "\t"
        else:
            format_str = '{} {}'
            space = " "

        global_utils.LogDebug("Condition Format String: " + str(format_str))

        for condition_name in sorted(list(self.conditions.keys())):
            open_file.write("Begin Conditions " + condition_name + "\n")
            conditions_by_name = self.conditions[condition_name]
            for cond in conditions_by_name:
                open_file.write(cond.GetWriteLine(format_str, space) + "\n")

            open_file.write("End Conditions // " + condition_name + "\n\n")
    def __WriteElements(self, open_file, readable_mdpa):
        if readable_mdpa:
            num_elements = self.NumberOfElements()
            format_str = '{:>' + str(len(str(num_elements))) + '} {:>' + str(
                self.num_spaces) + '}'
            space = "\t"
        else:
            format_str = '{} {}'
            space = " "

        global_utils.LogDebug("Element Format String: " + str(format_str))

        for element_name in sorted(list(self.elements.keys())):
            open_file.write("Begin Elements " + element_name + "\n")
            elements_by_name = self.elements[element_name]
            for elem in elements_by_name:
                open_file.write(elem.GetWriteLine(format_str, space) + "\n")

            open_file.write("End Elements // " + element_name + "\n\n")