CAD de Alerta em Dobradiças em Colisão com Prateleiras (JavaScript)
Versão: CV2025.4
Descrição:
Este UCS usa as novas funcionalidades apresentadas na versão do CV2025.4 que permite a adição de CAD via UCS JavaScript.
Tem a função de analisar a comparação dos diversos atributos entre os componentes de dobradiças (HNG) e os três tipos de prateleiras existentes: prateleiras (SH), prateleiras fixas (FS) e prateleiras ajustáveis (AS) de forma a que quando a sua posição seja coincidente, dentro de uma zona de colisão definida, seja detectada a colisão e adicione a indicação de CAD.
Estas zonas de colisão existem em altura (Y) e em profundidade (Z) que vêm como padrão 50mm cada uma. No entanto, após a ativação dos alertas, podemos manipular estes valores para aumentar ou diminuir a nossa fronteira de colisão.
Instalação:
Opção 1
Download e Importação do Pacote com o UCS:
Opção 2
Criar um novo UCS em JavaScript e configurar da seguinte maneira para funcionar, uma vez que trabalha ao nível do módulo (CAB):

Copiar o seguinte código para dentro do UCS criado (substituir tudo):
// UCS: CAD ALERTA DE DOBRADIÇAS EM COLISÃO (DOBRADIÇAS VS PRATELEIRAS)
// Versão: 06012026
// Compatibilidade: CV2025.4
// 1. GESTÃO DO ATRIBUTO DE ATIVAÇÃO
if (_this.Evaluate('_ALERTASCOLISAO_HNG') == null) {
_this.SetParameter('_ALERTASCOLISAO_HNG', 0, VAL_BOOL);
_this.ModifyParameter('_ALERTASCOLISAO_HNG', PARMOD_STYLE, PARSTYLE_ATTRIBUTE);
_this.ModifyParameter('_ALERTASCOLISAO_HNG', PARMOD_DESC, 'Alertas Colisão - Mostrar?');
}
var statusAlerta = _this.GetParameterValue('_ALERTASCOLISAO_HNG');
_this.RemoveCAD(AXIS_XY);
if (statusAlerta == 0) {
_this.RemoveParameter('_AC_ZONA_COLISAO_Y');
_this.RemoveParameter('_AC_ZONA_COLISAO_Z');
return;
}
// 2. CONFIGURAÇÕES TÉCNICAS E PARÂMETROS
var INCH_TO_MM = 25.4;
if (_this.Evaluate('_AC_ZONA_COLISAO_Y') == null) {
_this.SetParameter('_AC_ZONA_COLISAO_Y', (50/INCH_TO_MM), VAL_MEASUREMENT);
_this.ModifyParameter('_AC_ZONA_COLISAO_Y', PARMOD_STYLE, PARSTYLE_ATTRIBUTE);
_this.ModifyParameter('_AC_ZONA_COLISAO_Y', PARMOD_DESC, 'Alertas Colisão.a - Zona de Colisão Altura (Y)');
}
if (_this.Evaluate('_AC_ZONA_COLISAO_Z') == null) {
_this.SetParameter('_AC_ZONA_COLISAO_Z', (50/INCH_TO_MM), VAL_MEASUREMENT);
_this.ModifyParameter('_AC_ZONA_COLISAO_Z', PARMOD_STYLE, PARSTYLE_ATTRIBUTE);
_this.ModifyParameter('_AC_ZONA_COLISAO_Z', PARMOD_DESC, 'Alertas Colisão.b - Zona de Colisão Prof. (Z)');
}
var ZONA_COLISAO_Y = _this.GetParameterValue('_AC_ZONA_COLISAO_Y');
var ZONA_COLISAO_Z = _this.GetParameterValue('_AC_ZONA_COLISAO_Z');
// 3. ESTRUTURAS DE DADOS
var listaHng = [];
var listaShelves = [];
// 4. COLEÇÃO DE COMPONENTES (Recursividade Otimizada)
function coletarComponentes(pai) {
var filhos = pai.GetChildren();
if (!filhos) return;
var count = filhos.Count;
for (var i = 0; i < count; i++) {
var obj = filhos(i);
var nomeUpr = obj.NAME.toUpperCase();
// FILTRO HNG (Dobradiças)
if ((nomeUpr.indexOf("HNG") === 0 || nomeUpr.indexOf(".HNG") !== -1) && nomeUpr.indexOf("PLT") === -1) {
listaHng.push({
x: Number(obj.GetParameterValue("PABSX")),
y: Number(obj.GetParameterValue("PABSY")),
z: Number(obj.GetParameterValue("PABSZ"))
});
}
// FILTRO PRATELEIRAS (FS, SH, AS) - Usando Regex para velocidade
else if (/^(\.|)(FS|SH|AS)/.test(nomeUpr)) {
if (!obj.IsShaped()) {
var sdj = Number(obj.GetParameterValue("SDJ")) || 0;
// Salta se o recuo for maior que a zona de perigo
if (sdj < ZONA_COLISAO_Z) {
var dx = Number(obj.GetParameterValue("DX"));
var dy = Number(obj.GetParameterValue("DY"));
var dz = Number(obj.GetParameterValue("DZ")) || 0;
var py = Number(obj.GetParameterValue("PABSY"));
var pz = Number(obj.GetParameterValue("PABSZ"));
listaShelves.push({
x: Number(obj.GetParameterValue("PABSX")),
y: py,
dy: dy,
// PRÉ-CÁLCULO Geométrico para evitar processamento no loop cruzado
centroY: py + (dz / 2),
limiteZ: pz + dx
});
}
}
}
// Recursividade: Acessa sub-objetos se existirem
var subFilhos = obj.GetChildren();
if (subFilhos && subFilhos.Count > 0) {
coletarComponentes(obj);
}
}
}
coletarComponentes(_cab);
// 5. PROCESSAMENTO DE COLISÕES
var lenH = listaHng.length;
var lenS = listaShelves.length;
for (var h = 0; h < lenH; h++) {
var hng = listaHng[h];
var limiteHngZ = hng.z - ZONA_COLISAO_Z;
for (var s = 0; s < lenS; s++) {
var shf = listaShelves[s];
// Ordem de verificação: X (Largura) -> Y (Altura) -> Z (Profundidade)
// Comparação X
if (hng.x >= shf.x && hng.x <= (shf.x + shf.dy)) {
// Comparação Y (Usando o pré-cálculo de centro)
if (Math.abs(hng.y - shf.centroY) < ZONA_COLISAO_Y) {
// Comparação Z
if (shf.limiteZ > limiteHngZ) {
gerarCADAlerta(hng.x, hng.y);
}
}
}
}
}
// 6. FUNÇÃO DE DESENHO
function gerarCADAlerta(posX, posY) {
var leader = _cvSystem.CreateObject('cvLeader');
leader.SetOrigin(posX, posY);
leader.AddNode(posX + 2.5, posY + 2.5);
leader.AddNode(posX + 5.0, posY + 2.5);
leader.Color = 0xFF; // Vermelho
leader.Text = '!COLISÃO!';
leader.TextHeight = 1.5;
leader.ArrowType = CAD_AT_CLOSED;
leader.ArrowSize = 2;
_this.AddCAD(AXIS_XY, leader);
}