Batentes de Borracha para Portas/Gavetas (JS)

Batentes de Borracha para Portas/Gavetas (JS)


Este UCS tem o objetivo de provocar furação para Batentes de Borracha através de um conector para o efeito. A operação é definida no modelo do conector (Diâmetro x Profundidade). 
Será disponibilizado um conector de base com a furação Ø5x10mm.

Compatibilidade do UCS:
Versão CV2025.1

Para versões antigas:
https://my.bitmind.com/knowledge/article/898

1. Permite que a furação seja efetuada na Porta ou na Caixa;
2. Opção de furar no topo e no fundo ou apenas num dos lados; 
3. Obtém o posicionamento em X e Y por defeito a partir dos parâmetros definidos no material;
4. Posicionamento por defeito para módulos com Gola e sem Gola;
5. Atributos para modificar todos os parâmetros manualmente por cada frente.


Demonstração do UCS:


Processos:

Furação nas Portas/Gavetas:


Furação na Caixa do Módulo:


Atributos disponíveis para modificação:


Operação é definida no modelo do conector, no catálogo dos materiais: 


Posicionamento (por defeito) deve ser definido nos parâmetros do material:


NOTA: Sem estes parâmetros o valor do posicionamento retornará ZERO e é obrigatório colocar a unidade de medida "mm" nos valores!


Na configuração de material dos puxadores, deve ser atribuído o material com as operações e os parâmetros ao componente Batente de Frentes (BAT):


Download do Pacote

UCS_BATENTES_JS_2026.pkg
pkg


Código do UCS

// Adiciona Furos para Batentes de Borracha
// Versão: 09012026
// Compatibilidade: CV2025.4

// --- 1. FUNÇÕES AUXILIARES ---

const setupParam = (name, value, desc, type = null) => {
    if (_this.Evaluate(name) == null) {
        type ? _this.SetParameter(name, value, type) : _this.SetParameter(name, value);
    }
    _this.ModifyParameter(name, PARMOD_STYLE, PARSTYLE_ATTRIBUTE);
    _this.ModifyParameter(name, PARMOD_DESC, desc);
};

const setupList = (name, list, desc) => {
    if (_this.Evaluate(name) == null) {
        _this.CreateChoiceList(name, list, VAL_INTEGER);
    }
    _this.ModifyParameter(name, PARMOD_STYLE, PARSTYLE_ATTRIBUTE);
    _this.ModifyParameter(name, PARMOD_DESC, desc);
};

// --- 2. LEITURA DE VALORES POR DEFEITO (DUMMY) ---

/** NOTA 'BAT_DUMMY' serve para ir ler os parâmetros _M:AfastX, etc., pertencem ao MATERIAL */
let refBAT = _this.CreateChild(OBJ_HARDWARE, 'BAT', 'BAT_DUMMY');
refBAT.VISIBLE = false;
refBAT.QTY = 0; // Impede que o objeto apareça em listas de materiais ou relatórios.

// Captura os valores dos parametros no material aplicado ao BAT
const defaultX   = refBAT.Evaluate('_M:AfastX');
const defaultY   = refBAT.Evaluate('_M:AfastY');
const defaultY2  = refBAT.Evaluate('_M:AfastY2');
const defaultY_G = refBAT.Evaluate('_M:AfastY_Gola');
const defaultY_G2 = refBAT.Evaluate('_M:AfastY2_Gola');

// --- 3. DEFINIÇÃO DOS ATRIBUTOS ---

setupParam('Batentes_Frente', 1, 'BATENTE) Ativar Batentes Borracha?', VAL_BOOL);

if (_this.Evaluate('Batentes_Frente') == 1) {

    // Configuração das Opções de Localização
    setupList('BatentesOpcoes', 'AMBOS=1|FUNDO=2|TOPO=3', 'BATENTE.1) Posição?');
    setupList('BatentesType', 'Porta=1|Módulo=2', 'BATENTE.2) Local da Operação?');
   
    // Afastamento Lateral (X) herdado do material
    setupParam('BatentesAfastX', defaultX, 'BATENTE.3) Afastamento X?');

    /**
     * LÓGICA DE DETEÇÃO DE GOLA:
     * Verifica se existe hardware de perfil Gola (SHHRDW) aplicado na face.
     * Se sim, utiliza os afastamentos específicos para evitar colisão com o perfil.
     */
    const isGola = (_this.GetParameterValue('Cab.Face.S_SHHRDW.DZ') != null || _this.GetParameterValue('Cab.Face.S_SHHRDWE.DZ') != null);

    if (!isGola) {
        setupParam('BatentesAfastY', defaultY, 'BATENTE.4) Afastamento Y do Fundo?');
        setupParam('BatentesAfastY2', defaultY2, 'BATENTE.4) Afastamento Y do Topo?');
        _this.RemoveParameter('BatentesAfastY_G');
        _this.RemoveParameter('BatentesAfastY_G2');
    } else {
        setupParam('BatentesAfastY_G', defaultY_G, 'BATENTE.4) Afastamento Y [Gola] do Fundo?');
        setupParam('BatentesAfastY_G2', defaultY_G2, 'BATENTE.4) Afastamento Y [Gola] do Topo?');
        _this.RemoveParameter('BatentesAfastY');
        _this.RemoveParameter('BatentesAfastY2');
    }

    // LIMPEZA: Remove os parâmetros irrelevantes para a escolha de Posição (Topo/Fundo)
    const opcao = _this.Evaluate('BatentesOpcoes');
    if (opcao == 2) { // Somente FUNDO
        _this.RemoveParameter('BatentesAfastY2');
        _this.RemoveParameter('BatentesAfastY_G2');
    } else if (opcao == 3) { // Somente TOPO
        _this.RemoveParameter('BatentesAfastY');
        _this.RemoveParameter('BatentesAfastY_G');
    }

} else {
    // Caso a função seja desativada, remove todos os atributos
    ['BatentesOpcoes', 'BatentesAfastX', 'BatentesAfastY', 'BatentesAfastY_G',
     'BatentesAfastY2', 'BatentesAfastY_G2', 'BatentesType'].forEach(p => _this.RemoveParameter(p));
}

// --- 4. PROCESSAMENTO (Geração da Furação/Hardware Real) ---

if (_this.Evaluate('Batentes_Frente') == 1) {

    const isGola = (_this.GetParameterValue('Cab.Face.S_SHHRDW.DZ') != null || _this.GetParameterValue('Cab.Face.S_SHHRDWE.DZ') != null);
    const posOpcao = _this.Evaluate('BatentesOpcoes');
   
    // Identifica se é uma frente de gaveta pequena (Menor que 150mm) para centralizar o batente
    const isSmallDrawer = (_this.NAME == 'DWR' && _this.DY <= _this.Evaluate('150mm'));
   
    // Seleção dinâmica das fórmulas de posição Y baseadas na presença de Gola
    const yFundo = isGola ? 'BatentesAfastY_G' : 'BatentesAfastY';
    const yTopo = isGola ? ':DY-BatentesAfastY_G2' : ':DY-BatentesAfastY2';

// Adição do batente
    const criarBatente = (x, y) => {
        let bat = _this.CreateChild(OBJ_HARDWARE, 'BAT', 'Batente Porta');
        bat.VISIBLE = true;
        bat.DX = '_M:DX'; // Herda dimensões do material do batente
        bat.DY = '_M:DY';
        bat.DZ = '_M:DZ';
        bat.X = x;
        bat.Y = isSmallDrawer ? ':DY/2' : y;
        bat.Z = 0;
        bat.AX = 0;
        // AY 180 fura pela face posterior (padrão para frentes de móveis)
        bat.AY = (_this.Evaluate('BatentesType') == 1) ? 180 : 0;
        bat.AZ = 0;
        bat.QTY = 1; // Este conta para a lista de materiais
    };

    // --- LÓGICA PARA PORTAS (DOR) ---
    if (_this.NAME == 'DOR') {
// Portas recebem batentes nos lados opostos às dobradiças
        let xPos = (_this.Evaluate('HNG') == 1) ? ':DX-BatentesAfastX' : 'BatentesAfastX';
       
        if (posOpcao == 1 || posOpcao == 2) criarBatente(xPos, yFundo);
        if (posOpcao == 1 || posOpcao == 3) criarBatente(xPos, yTopo);
    }

    // --- LÓGICA PARA GAVETAS (DWR) ---
    if (_this.NAME == 'DWR') {
        // Gavetas recebem batentes nos dois lados laterais
        let xPontos = ['BatentesAfastX', ':DX-BatentesAfastX'];
       
        xPontos.forEach(x => {
            if (posOpcao == 1 || posOpcao == 2) {
                criarBatente(x, yFundo);
            }
            // Se for gaveta pequena, ignora o topo para não duplicar o furo central
            if (!isSmallDrawer && (posOpcao == 1 || posOpcao == 3)) {
                criarBatente(x, yTopo);
            }
        });
    }
}