PDA

View Full Version : tratamento de erro....



lucianno
2007-10-04, 06:28 PM
em uma rotina lisp, tenho um loop inicial que sera dado em um arquivo
txt enquanto não alcançar a linha final. Dentro desse loop existe
outro que será dado enqto houver objetos que correspondam às
características recuperadas do aquivo txt.

Porém, ao recuperar um propriedade no txt e efetuar a seleção no
desenho, caso o mesmo não exista é retornado um erro e a rotina é
cancelada.

Como poderia tratar esse erro, fazendo o lisp se comportar de maneira
que se um objeto não exista no desenho o loop externo passe para a
próxima linha efetuando tal busca até o final do arquivo.

segue abaixo um trecho do lisp para a verificação:

(while (setq linha (read-line file))
(setq elev (atoi linha)
sel (ssget "x" (list (cons 38 elev)))
)
(if (= sel nil)
(alert "Objeto não encontrado!!!")
)
(while (> (sslength sel) 0)
(setq ent (ssname sel 0))
(command "zoom" "o" ent "")
(new_dialog "dlcPlantio" dclBox)
(action_tile "sim" "(done_dialog 0)")
(action_tile "nao" "(done_dialog 1)")
(setq dlg (start_dialog))
(if (= dlg 0)
(progn
(command "chprop" ent "" "c" 6 "")
)
)
(ssdel ent sel)
)
)

Quando efetuo o comando:

(ssget "x" (list (cons 38 elev)))

e não existe nenhum objeto no desenho com tal propriedade, recebo um
erro, o que causa o cancelamento instantâneo da rotina
impossibilitando o termino do script.

; error: bad argument type: lselsetp nil

Qual seria a saída para tal situação!?!?

sei que existe um função vl-catch-all-apply

qual a forma correta de se usar?

antecipadamente, muito obrigado.

Luciano

jorgeanjos
2007-10-06, 02:57 PM
Caro Luciano,

Ainda não testei o seu código, mas à primeira vista arrisco sugerir que coloque o segundo loop dentro da função IF.

Iniciar função IF (if (= sel nil)...
- Condição verificada, mostrar caixa de alerta (alert "Objeto não ....
- Condição não verificada, correr loop (while (> (sslength sel) 0).....
Terminar função IF )


Até breve

lucianno
2007-10-07, 12:25 PM
legal, vou testar e respondo se deu certo....

obrigado

lucianno
2007-10-08, 10:23 AM
perfeito, funcionou legal,

não sei se vc esta claro o objetivo da rotina acima...

- dentre um grande número de objetos, os que não forem localizados, gostaria que fossem sinalizados de alguma forma...ou serem inseridos em algum arquivo, ou pelo serem exibidos na "dialog"...

ou seja, como passar argumentos para uma dcl..


se tive alguma sugestão, agradecerei muito.

Abração.

Luciano.

jorgeanjos
2007-10-08, 02:48 PM
Olá,

Talvez criar uma selecção vazia e adicionar posteriormente as entidades que não tenham a elevação pretendida, mas não me ocorre uma maneira de separá-las em dois tipos com filtros SSGET.
Provavelmente não será bem isto que pretende, mas envio como exemplo uma pequena rotina que filtra as entidades de uma selecção normal e adiciona (com a função SSAD) as que não correspondam aos requisitos a uma variável / selecção previamente criada.


(defun C:corelev (/)

(setq ELEVACAO (GETINT "Digite elevação:"))
; Valor dado pelo utilizador para a elevação do objectos que irão ser editados
(setq SELNOELEV (ssadd))
; Criada selecção vazia que irá conter os objectos que não têm a elevação pretendida
(princ "\n» Seleccione objectos:")
; Prompt para o utilizador seleccionar objectos pelos métodos normais
(setq SSET (ssget))
; Selecção de entidades pelo utilizador
(setq SSLEN (sslength SSET))
; Número de entidades seleccionadas
(while (> SSLEN 0)
; Enquanto o número da selecção for maior que zero, manter ciclo
(setq VERENT (ssname SSET (setq SSLEN (1- SSLEN))))
; Extrair nome da entidade com o número obtido pelo contador decrescente
(setq ELEVENT (cdr (assoc 38 (entget VERENT))))
; Atribuir variável à elevação da entidade
(if (equal ELEVENT ELEVACAO)
; Verificar se a entidade têm a elevação pretendida
(command "chprop" VERENT "" "c" 53 "")
; Se a entidade tem a elevação pretendida, alterar cor
(ssadd VERENT SELNOELEV)
; Se a entidade não tem a elevação pretendida, anexar à selecção SELNOELEV
)
; Fechar condição
)
; Fechar ciclo
(command "chprop" SELNOELEV "" "c" 11 "")
; Alterar cor de todos os objectos que não têm a elevação pretendida
)


Espero que ajude.

Até breve