From 98a5ce71e38165f82176d38f38126fce3579cb42 Mon Sep 17 00:00:00 2001 From: henrique Date: Mon, 23 Feb 2026 10:00:14 -0300 Subject: [PATCH] a --- install_vr4life.py | 77 ++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/install_vr4life.py b/install_vr4life.py index b7eff62..3e426df 100644 --- a/install_vr4life.py +++ b/install_vr4life.py @@ -3,31 +3,31 @@ import sys from pymxs import runtime as rt def log(msg): - """Função auxiliar para imprimir logs claros no Listener (F11)""" + """Função para imprimir no Listener (F11) com prefixo identificável""" print(f"[VR4Life Install Log] {msg}") def install_plugin(): rt.clearListener() - log("Iniciando fase final de instalação e configuração de interface...") + log("=== INICIANDO FASE DE CONFIGURAÇÃO DE INTERFACE (UNIVERSAL) ===") - # 1. Configuração de Caminhos + # 1. Configuração de Caminhos Locais user_scripts_dir = rt.getDir(rt.name("userScripts")) plugin_dir = os.path.join(user_scripts_dir, "VR4Life_Plugin").replace("\\", "/") if plugin_dir not in sys.path: sys.path.append(plugin_dir) - log(f"Pasta adicionada ao Path do Python: {plugin_dir}") + log(f"Path Python atualizado: {plugin_dir}") run_script = os.path.join(plugin_dir, "run_vr4life.py").replace("\\", "/") - log(f"Caminho do script de execução: {run_script}") + log(f"Caminho do script de execução detectado: {run_script}") - # Nome solicitado para o topo da lista + # Definições do Produto product_name = "1-VR4Life" category = "Immerse Games" macro_name = "VR4Life_Launcher" - # 2. Registo da Macro (MacroScript) - log(f"A registar MacroScript '{macro_name}' na categoria '{category}'...") + # 2. Registro do MacroScript (Obrigatório para o comando existir no sistema) + log(f"Registando MacroScript '{macro_name}'...") macro_code = f''' macroScript {macro_name} category:"{category}" @@ -43,40 +43,49 @@ def install_plugin(): except Exception as e: log(f"ERRO ao registar MacroScript: {str(e)}") - # 3. Lógica de Menu para 3ds Max 2025/2026 (Sistema CUI) + # 3. Lógica de Menu para 3ds Max 2025/2026 (CUI Content Manager) try: - log("A tentar detetar sistema CUI (3ds Max 2025+)...") + log("Tentando configurar via CUI Content Manager (3ds Max 2025+)...") cui_mgr = rt.cui.getContentManager() main_menu_bar = cui_mgr.mainMenuBar - log("Sistema CUI detetado.") - # Verificação de duplicados - menu_exists = False + # Verificar e remover duplicados para evitar menus 'fantasmas' + existing_item = None for i in range(main_menu_bar.numItems): - if main_menu_bar.getItem(i).displayText == product_name: - menu_exists = True - log("O menu já existe na barra CUI. A ignorar criação para evitar duplicados.") + item = main_menu_bar.getItem(i) + if item.displayText == product_name: + existing_item = item + log("Menu já existente detectado. Removendo para reinstalação limpa...") break - if not menu_exists: - log(f"A criar novo menu '{product_name}' no 3ds Max 2026...") - new_menu = cui_mgr.createCustomMenu(product_name) - new_menu.addActionItem(macro_name, category) - - # Insere logo após o menu 'File' - main_menu_bar.addItem(new_menu, 1) - log("Menu CUI criado e inserido na posição 1.") + if existing_item: + main_menu_bar.removeItem(existing_item) + log("Menu antigo removido da barra CUI.") + + # Criação do Menu Moderno + log(f"Criando novo menu '{product_name}'...") + new_menu = cui_mgr.createCustomMenu(product_name) + new_menu.addActionItem(macro_name, category) + + # Insere na posição 1 (logo após o 'File') + main_menu_bar.addItem(new_menu, 1) + log(f"Menu '{product_name}' adicionado à barra principal.") + + # Forçar o 3ds Max a redesenhar a barra de menus (Crucial para o 2026) + log("Solicitando atualização forçada da barra de menus...") + rt.execute("cui.getContentManager().updateMainMenuBar()") + log("Comando 'updateMainMenuBar' enviado.") except AttributeError: - # 4. Lógica Legada para 3ds Max 2024 e anteriores - log("Sistema CUI não encontrado. A mudar para modo legado (menuMan)...") + # 4. Lógica Legada (3ds Max 2024 e anteriores) + log("CUI Manager não disponível. Usando modo legado 'menuMan'...") try: main_menu = rt.menuMan.getMainMenuBar() existing_menu = rt.menuMan.findMenu(product_name) if existing_menu: rt.menuMan.unRegisterMenu(existing_menu) - log("Menu antigo removido para atualização.") + log("Menu legado antigo removido.") new_menu = rt.menuMan.createMenu(product_name) menu_item = rt.menuMan.createActionItem(macro_name, category) @@ -85,19 +94,19 @@ def install_plugin(): sub_menu_item = rt.menuMan.createSubMenuItem(product_name, new_menu) main_menu.addItem(sub_menu_item, 1) rt.menuMan.updateMenuBar() - log("Menu legado criado com sucesso via menuMan.") + log("Menu legado criado e atualizado com sucesso.") except Exception as e: - log(f"ERRO FATAL ao criar menu legado: {str(e)}") + log(f"ERRO na criação de menu legado: {str(e)}") - # 5. Execução Automática + # 5. Inicialização pós-instalação if os.path.exists(run_script): - log("A abrir a interface do VR4Life pela primeira vez...") + log("Abrindo interface VR4Life para teste imediato...") rt.python.ExecuteFile(run_script) else: - log(f"AVISO: O ficheiro {run_script} não foi encontrado para execução imediata.") + log(f"AVISO: Arquivo de execução não encontrado em: {run_script}") - log("PROCESSO DE INSTALAÇÃO FINALIZADO.") - rt.messageBox(f"Instalação do '{product_name}' concluída!\nConsulte o log (F11) em caso de dúvidas.", title=product_name) + log("=== PROCESSO DE INSTALAÇÃO FINALIZADO ===") + rt.messageBox(f"Instalação do '{product_name}' concluída!\nSe o menu não aparecer imediatamente, verifique o Listener (F11).", title=product_name) if __name__ == "__main__": install_plugin() \ No newline at end of file