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
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);
}
});
}
}