{"id":5,"date":"2025-11-06T17:55:33","date_gmt":"2025-11-06T17:55:33","guid":{"rendered":"https:\/\/brgt.com.br\/blog-admin\/?p=5"},"modified":"2025-11-11T13:22:07","modified_gmt":"2025-11-11T13:22:07","slug":"brgt","status":"publish","type":"post","link":"https:\/\/brgt.com.br\/blog-admin\/brgt\/","title":{"rendered":"Como criar menus em Python no TQS (EAG.PYMEN e EAGXXX.PYMEN)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A cria\u00e7\u00e3o de menus Python no TQS \u00e9 hoje um dos jeitos mais eficientes de transformar tarefas repetitivas em comandos de um clique dentro dos editores gr\u00e1ficos (EAG). Em vez de \u201crodar um script\u201d, voc\u00ea passa a ter um item de menu nativo chamando sua rotina em Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abaixo fa\u00e7o um passo a passo direto ao ponto, usando como base o manual oficial do TQS e exemplos reais (como os menus de alvenaria desenvolvidos pela BRGT).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading is-style-default has-contrast-color has-text-color has-link-color wp-elements-330d960ec256cf94754c36bd5467ca68\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">1. Onde o TQS procura seus menus em Python<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No TQS, os editores gr\u00e1ficos (EAGW.EXE) s\u00e3o configurados por menus do tipo .MEN, armazenados em TQSW\\EXEC\\EAGMENU. Eles apontam para comandos escritos em DLLs C++ \u2013 \u00e9 o menu padr\u00e3o que voc\u00ea j\u00e1 usa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A interface Python entra como uma extens\u00e3o desse menu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para cada EAGXXX.MEN carregado, o editor tenta carregar automaticamente um arquivo <em>EAGXXX.PYMEN<\/em> na pasta TQSW\\EXEC\\Python.<\/li>\n\n\n\n<li>A partir da vers\u00e3o V24, sempre que um editor gr\u00e1fico abre, ele tenta carregar antes o menu <em>EAG.PYMEN<\/em>, que \u00e9 um menu Python comum a todos os editores (formas, ferros, alvenaria, modelador etc.).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Isso significa que voc\u00ea pode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ter comandos globais (em EAG.PYMEN, valendo em qualquer editor);<\/li>\n\n\n\n<li>Ter comandos espec\u00edficos de uma aplica\u00e7\u00e3o (por exemplo, EAGALV.PYMEN s\u00f3 para Alvenaria em planta).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">2. Estrutura b\u00e1sica de um arquivo .PYMEN<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um menu Python segue praticamente a mesma l\u00f3gica dos menus .MEN, mas trocando DLL por m\u00f3dulo Python. A estrutura t\u00edpica \u00e9:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ini\n&#91;PYTHON]\nEAGALV.PY\n\n&#91;CMD]\nID_EXEMPLO,EAGALV.PY,meu_comando\nTexto de ajuda do comando\n\n&#91;MENU]\nSUBMENU,&amp;BRGT \u2013 Automa\u00e7\u00e3o\nMENUITEM,ID_EXEMPLO,Executar &amp;exemplo\nFIMSUBMENU<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pontos importantes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[PYTHON] \u2013 lista os m\u00f3dulos .PY que o menu pode chamar (devem estar em TQSW\\EXEC\\Python).<\/li>\n\n\n\n<li>[CMD] \u2013 para cada comando:<\/li>\n\n\n\n<li>um ID (ID_EXEMPLO),<\/li>\n\n\n\n<li>o nome do m\u00f3dulo (EAGALV.PY),<\/li>\n\n\n\n<li>o nome da fun\u00e7\u00e3o Python (meu_comando),<\/li>\n\n\n\n<li>e uma linha de ajuda que aparece em tooltip\/rodap\u00e9.<\/li>\n\n\n\n<li>[MENU] \u2013 monta o menu dropdown:<\/li>\n\n\n\n<li>SUBMENU abre um menu,<\/li>\n\n\n\n<li>MENUITEM associa um item ao ID,<\/li>\n\n\n\n<li>SEPARADOR insere linhas de separa\u00e7\u00e3o,<\/li>\n\n\n\n<li>FIMSUBMENU fecha o submenu.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">O &amp; no texto do menu define o atalho de teclado (Alt + letra).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">3. Assinatura das rotinas Python chamadas pelo menu<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Toda fun\u00e7\u00e3o chamada por um .PYMEN tem sempre a mesma assinatura:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python\ndef seu_comando(eag, tqsjan):\n\u2026<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Onde:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>eag \u00e9 um objeto TQSEag.Eag (controle do editor: menus, estados, entrada simulada, mensagens, execu\u00e7\u00f5es de comando etc.);<\/li>\n\n\n\n<li>tqsjan \u00e9 um objeto TQSJan.Window, que d\u00e1 acesso \u00e0 janela e ao desenho aberto;<\/li>\n\n\n\n<li>o desenho em si \u00e9 tqsjan.dwg, um TQSDwg.Dwg, permitindo ler e alterar elementos do DWG.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Exemplo simplificado baseado na l\u00f3gica dos exemplos oficiais:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python\nfrom TQS import TQSDwg, TQSEag\n\ndef meu_comando(eag, tqsjan):\ndwg = tqsjan.dwg\n# Exemplo bem simples: dar zoom total e avisar o usu\u00e1rio\ntqsjan.ZoomTotal()\neag.msg.Print(\"Comando Python executado com sucesso!\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nos menus avan\u00e7ados da BRGT (como EAGALV.PY), essa mesma assinatura \u00e9 usada para tarefas mais pesadas, como: detectar blocos por layer, corrigir escala, inserir graute e armaduras verticais automaticamente, apagar blocos sob portas, etc.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">4. Ligando o menu Python a uma aplica\u00e7\u00e3o espec\u00edfica<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O fluxo t\u00edpico para criar um menu de aplica\u00e7\u00e3o \u00e9:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Descobrir o menu do editor que voc\u00ea quer estender\n<ul class=\"wp-block-list\">\n<li>Ex.: planta de alvenaria usa o menu EAGALV.MEN.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><em>Criar o arquivo EAGALV.PYMEN<\/em> em TQSW\\EXEC\\Python\n<ul class=\"wp-block-list\">\n<li>Com as se\u00e7\u00f5es [PYTHON], [CMD], [MENU] explicadas acima.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><em>Criar o m\u00f3dulo EAGALV.PY<\/em> na mesma pasta\n<ul class=\"wp-block-list\">\n<li>Implementando as fun\u00e7\u00f5es def comando_x(eag, tqsjan): para cada ID definido em [CMD].<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Abrir um desenho correspondente (por exemplo, uma planta de alvenaria) e verificar se o novo submenu aparece no final da barra de menus.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">5. Menus globais: usando o EAG.PYMEN<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea quer comandos dispon\u00edveis em qualquer editor gr\u00e1fico (formas, ferros, alvenaria, modelador, paredes, etc.), use o menu global:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crie\/edite o arquivo EAG.PYMEN em TQSW\\EXEC\\Python;<\/li>\n\n\n\n<li>A estrutura \u00e9 a mesma ([PYTHON], [CMD], [MENU]);<\/li>\n\n\n\n<li>Esse menu \u00e9 carregado antes do menu espec\u00edfico da aplica\u00e7\u00e3o, ent\u00e3o os comandos ficam sempre vis\u00edveis.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Isso \u00e9 \u00fatil para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ferramentas gen\u00e9ricas de revis\u00e3o de desenho;<\/li>\n\n\n\n<li>Rotinas de auditoria de layers, escalas, blocos;<\/li>\n\n\n\n<li>Utilit\u00e1rios internos de escrit\u00f3rio que voc\u00ea quer padronizar em toda a equipe.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">6. Reaproveitando c\u00f3digo de menu com INCLUIR<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea tiver um conjunto de comandos comum a v\u00e1rios editores, o manual recomenda separar esse trecho em um arquivo .PYMEN \u201ccomum\u201d e incluir nos demais com:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ini\nINCLUIR,COMUM.PYMEN<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Isso evita copiar\/colar blocos gigantes de menu e facilita manter tudo padronizado.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">7. Checklist r\u00e1pido para come\u00e7ar<\/mark><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Python 3.x instalado, pacote TQSPythonInterface instalado (pasta TQSW\\EXEC\\Python).<\/li>\n\n\n\n<li>Criar\/editar <em>EAG.PYMEN<\/em> (global) ou <em>EAGXXX.PYMEN<\/em> (por aplica\u00e7\u00e3o).<\/li>\n\n\n\n<li>Apontar, em [PYTHON], para o(s) m\u00f3dulo(s) .PY que voc\u00ea vai usar.<\/li>\n\n\n\n<li>Criar IDs em [CMD], ligando cada um a uma fun\u00e7\u00e3o def \u2026 (eag, tqsjan) no seu .PY.<\/li>\n\n\n\n<li>Montar o submenu em [MENU].<\/li>\n\n\n\n<li>Abrir o editor correspondente no TQS e testar.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading is-style-text-subtitle\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f16136\" class=\"has-inline-color\">Material de Apoio:<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/drive.google.com\/drive\/folders\/192wvOMPrOG6yG3w9w5Wb0Ge56-Olhwb6?usp=drive_link\">https:\/\/drive.google.com\/drive\/folders\/192wvOMPrOG6yG3w9w5Wb0Ge56-Olhwb6?usp=drive_link<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este artigo ensina a transformar scripts Python em menus nativos nos editores gr\u00e1ficos do TQS (EAG), automatizando tarefas repetitivas com comandos de um clique. O tutorial t\u00e9cnico cobre a localiza\u00e7\u00e3o, cria\u00e7\u00e3o e estrutura\u00e7\u00e3o dos arquivos .PYMEN (tanto globais quanto espec\u00edficos por aplica\u00e7\u00e3o), al\u00e9m de detalhar a assinatura padr\u00e3o das fun\u00e7\u00f5es Python necess\u00e1rias para interagir diretamente com os desenhos.<\/p>\n","protected":false},"author":2,"featured_media":10,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"categories":[3,4],"tags":[],"class_list":["post-5","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao","category-tqs"],"_links":{"self":[{"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/posts\/5","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/comments?post=5"}],"version-history":[{"count":13,"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/posts\/5\/revisions"}],"predecessor-version":[{"id":42,"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/posts\/5\/revisions\/42"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/media\/10"}],"wp:attachment":[{"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/media?parent=5"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/categories?post=5"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/brgt.com.br\/blog-admin\/wp-json\/wp\/v2\/tags?post=5"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}