Results 1 to 5 of 5

Thread: tratamento de erro....

  1. #1
    Login to Give a bone
    0

    Default tratamento de erro....

    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

  2. #2
    Active Member
    Join Date
    2007-08
    Posts
    54
    Login to Give a bone
    0

    Default Re: tratamento de erro....

    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

  3. #3
    Login to Give a bone
    0

    Smile Re: tratamento de erro....

    legal, vou testar e respondo se deu certo....

    obrigado

  4. #4
    Login to Give a bone
    0

    Thumbs up Re: tratamento de erro....

    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.
    Last edited by lucianno; 2007-10-08 at 10:54 AM.

  5. #5
    Active Member
    Join Date
    2007-08
    Posts
    54
    Login to Give a bone
    0

    Default Re: tratamento de erro....

    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

Similar Threads

  1. 2012: ERRO FATAL
    By fernanda.fsp350622 in forum Revit - Platform
    Replies: 1
    Last Post: 2012-11-05, 02:35 PM
  2. Tratamento de erro - lisp.
    By ed_cristian.dwg in forum AutoLISP
    Replies: 1
    Last Post: 2011-06-01, 11:01 PM
  3. Erro Inventor
    By ivsoteju in forum Inventor - General
    Replies: 0
    Last Post: 2009-11-09, 06:01 PM
  4. fdo wfs - erro de conexão
    By hugo.pereira in forum AutoCAD Civil 3D - General
    Replies: 0
    Last Post: 2009-09-06, 05:03 PM
  5. Erro no ADT2004
    By tito_freitas in forum ACA General
    Replies: 1
    Last Post: 2009-07-16, 02:57 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •