def profileFormulaMenuCommand(cntlr):
    # save DTS menu item has been invoked
    if cntlr.modelManager is None or cntlr.modelManager.modelXbrl is None:
        cntlr.addToLog("No taxonomy loaded.")
        return

    # get file name into which to save log file while in foreground thread
    profileReportFile = cntlr.uiFileDialog("save",
            title=_("arelle - Save Formula Profile Report"),
            initialdir=cntlr.config.setdefault("formulaProfileReportDir","."),
            filetypes=[(_("Profile report file .log"), "*.log")],
            defaultextension=".log")
    if not profileReportFile:
        return False
    errMsg = ""
    maxRunTime = 0
    while (1):
        timeout = simpledialog.askstring(_("arelle - Set formula run time limit"),
                _("{0}You may enter the maximum number of minutes to run formulas.\n"
                  "(Leave empty for no run time limitation.)".format(errMsg)),
                parent=cntlr.parent)
        if timeout:
            try:
                maxRunTime = float(timeout)
                break
            except __HOLE__ as err:
                errMsg = str(err) + "\n\n"
                
    excludeCompileTime = messagebox.askyesno(_("arelle - Exclude formula compile statistics"),
                _("Should formula compiling be excluded from the statistics?\n"
                  "(Yes will make a separate compiling \"pass\" so that statistics include execution only.)".format(errMsg)),
                parent=cntlr.parent)
            
    cntlr.config["formulaProfileReportDir"] = os.path.dirname(profileReportFile)
    cntlr.saveConfig()

    # perform validation and profiling on background thread
    import threading    
    thread = threading.Thread(target=lambda c=cntlr, f=profileReportFile, t=maxRunTime, e=excludeCompileTime: backgroundProfileFormula(c,f,t,e))
    thread.daemon = True
    thread.start()
dataset/ETHPy150Open Arelle/Arelle/arelle/plugin/profileFormula.py/profileFormulaMenuCommand