CAD de Alerta em Dobradiças em Colisão com Prateleiras (JavaScript)

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:

UCS_CAD_ALERTA.pkg
pkg


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