Hoje vou mudar um pouco o foco e voltar às raízes, hehehe
Vamos programar em Visual Lisp!!!
O desafio: numerar uma rede do SOLIDOS usando o template “CODIGO-XXX”, onde CODIGO é o código do dispositivo e XXX um contador, onde cada código diferente tem um contador.
Segue o código:
|--lsp--|
;————————————————————————————————- ;numera a rede usando um indice incremental para cada código de dispositivo encontrado ;————————————————————————————————- (defun c:numeraredeporcodigo (/ disp rede dispositivos contador ids nomeAntigo listaCodigos codigo indice novoIndice nomesAntigos novoNome) ;inicia a prevencao de erros ;para funcionar, carrege “lisps_dlls.fas” (if tbn:error-init (tbn:error-init nil)) (setq ;selecione um dispositivo na rede disp (car (entsel “;\nSelecione um dispositivo da rede”)) ;procure a rede correspondente, se nao selecionar nada ou não for dispositivo, causará erro rede (SolidosGetNodeParam disp “;RootId”) ;obtem a lista de nomes dos dispositivos desta rede dispositivos (SolidosGetChildNames rede) ;inicializa um contador para iterar os dispositivos contador 0 ;inicializa a lista de ids dos dispositivos ids nil ;inicializa a lista de nomes antigos dos dispositivos nomesAntigos nil) ;repita em todos os dispositivos, alterando o nome para algo temporário, ;evitando nomes duplicados ao numerar (prompt “;\nRenomear temporariamente…”) (repeat (length dispositivos) (setq ;obtem o enésimo nome da lista nome (nth contador dispositivos) ;obtem o ponteiro para o dispositivo em si disp (SolidosFindObjectByName rede nome) ;armazena na lista de ponteiros, uma vez que o nome vai mudar, ;a lista de nomes não terá mais validade ids (cons disp ids) ;obtem o nome antigo nomeAntigo (SolidosGetNodeParam disp “;Name”) ;incrementa a lista de nomes antigos nomesAntigos (cons nomeAntigo nomesAntigos) ;incrementa o contador contador (1+ contador) ;calcula um nomvo nome temporario, evitando duplicatas novoNome (strcat “;_TMP_” (itoa contador))) ;atribui um nome temporário ao dispositivo, para evitar duplicidade (SolidosSetNodeParams disp (list “;Name” novoNome)) (prompt (strcat “;\n\tRenomeando temporariamente ” nomeAntigo ” para ” novoNome “…”)) ) (setq ;reinicia o contador contador 0 ;inicializa a lista de contadores por codigo listaCodigos nil) ;repita para todos os ids dos dispositivos (prompt “;\nRenomear os dispositivos…”) (repeat (length ids) (setq ;obtem o enésimo dispositivo disp (nth contador ids) ;obtem o nome antigo nomeAntigo (nth contador nomesAntigos) ;obtem o código deste dispositivo codigo (SolidosGetNodeParam disp “;Code”) ;obtem o indice atual deste codigo indice (assoc codigo listaCodigos) ;incrementa o contador contador (1+ contador)) ;se tem um indice atual deste código, (if indice (setq ;incrementa o indice atual do codigo novoIndice (1+ (cdr indice)) ;atualiza a lista de indices por codigo listaCodigos (subst (cons codigo (1+ novoIndice)) indice listaCodigos)) (setq ;não tem um indice atual, então será 1 novoIndice 1 ;inicializa o indice por código na lista de codigos listaCodigos (cons (cons codigo novoIndice) listaCodigos)) ) ;calcula o nomvo nome do dispositivo ;neste template: “CODIGO-XXX” (setq novoNome (strcat codigo “;-” (if (< novoIndice 100) "0" "") (if (< novoIndice 10) "0" "") (itoa novoIndice))) ;atribui o novo nome ao dispositivo (prompt (strcat "\n\tRenomeando " nomeAntigo " para " novoNome "...")) (SolidosSetNodeParams disp (list "Name" novoNome))) ;restaura a prevencao de erros ;para funcionar, carrege "lisps_dlls.fas" (if tbn:error-restore (tbn:error-restore)) (princ) ;fim )
Analisando o código, vemos que estamos usando a API do SOLIDOS, para obter as propriedades “Code” e “Name”.
O algoritmo é bem simples:
- Pedir a seleção de um dispositivo
- Obter a rede a que pertence este dispositivo
- Iterar sobre os dispositivos da rede, primeiro renomeando os dispositivos para “_TMP_X”, para evitar duplicatas durante o processo de renomeação
- Iterar sobre os dispositivos, atribuindo um novo nome para cada código encontrado