Reactor e Xdata; Coisas de doido
Por estes dias me perguntaram como usar reactors. Bem, não é complicado, mas o help não ajuda muito… enfim… Considere o exemplo abaixo: ;nome da xdata(setq xdata:nome “TESTEXDATAREACTOR”) ;carrega funções vl*(vl-load-com) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;subrotina para adicionar xdata na entidade;ent -> ename, por exemplo: <Entity name: 7ffff4104e0>;xdappname -> string, nome da xdada;xdata elista da xdata, formato:;((ExtendDataDxfCode . Valor) … (ExtendDataDxfCode . Valor))(defun xdata->put (ent xdappname xdata / elist) ;garanta que o nome da xdata esta no banco de dados do cad (regapp xdappname) ;adiciona a xdata no elist da entidade (setq elist (entget ent) elist (cons (list -3 (cons xdappname xdata)) elist)) ;atualiza a entidade (entmod elist) (entupd ent) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;reactor para ação da linha sendo modificada;note que este reactor não causa modificações na LINHA, apenas no texto;se fazemos um reactor causar modificações em algo que dispara reactors,;temos de desabilitar eles antes de modificar;parametros:;linha, é o objeto que notificou o reactor, no caso a linha;rea, é o ponteiro para o objeto do reactor;par, são parâmetros adicionais que podem ser passados ao reactor;na hora que o criamos, no caso, não passamos nenhum dado extra;então não usamos o seu valor, que será nil(defun reactor->modified (linha rea par / params texto) ;obter os dados do reactor. note que não seria necessario ;pois poderiamos encontrar o texto pelo xdata. ;no caso é só para mostrar o uso da função vlr-data ;para obter o texto pela xdata, veja a subrotina reactors->aciona (setq params (vlr-data rea) texto (car params)) ;atualizar o conteudo do texto: (vla-put-textstring texto (strcat “l=” (rtos (vla-get-length linha) 2 2))) (vla-put-insertionpoint texto (vla-get-startpoint linha)) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;subrotina para “ligar” os reators para as linhas já desenhadas;em um desenho com o nosso novo comando “teste”(defun reactors->aciona (/ ss ent linha xdata texto) ;seleção das linhas que tem a nossa xdata (setq ss (ssget “X” (list ‘(0 . “LINE”) (list -3 (list xdata:nome))))) ;se ela existir, processa as linhas (if ss (repeat (sslength ss) ;pega a primeira linha (setq ent (ssname ss 0) ;ename linha (vlax-ename->vla-object ent) ;ename para vla xdata (assoc -3 (entget ent (list xdata:nome))) ;xdata da linha ;agora, pega o handle, que é string, acha o ename e obtem o vla texto (vlax-ename->vla-object (handent (cdr (cadadr xdata)))) ) ;cria o reactor para a linha (vlr-object-reactor (list linha) ;objeto modificado que notifica o reactor (list texto) ;parametros a serem passados ‘((:vlr-modified . reactor->modified))) ;tira a linha da seleção e reinicia o looping (ssdel ent ss) ) ) ;perfumaria: (princ “nReactors criados”) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;função principal(defun c:teste (/ linha texto pa pb thisdrawing model xdata) ;desenha uma lina e um texto no modelspace: (setq pa (getpoint “nPa”) pb (getpoint pa “nPb”) ;obtem o ponteiro para o modelspace thisdrawing (vla-get-activedocument(vlax-get-acad-object)) model (vla-get-modelspace thisdrawing) ;cria uma linha no model linha (vla-addline model (vlax-3d-point pa) (vlax-3d-point pb)) ;cria um texto no model texto (vla-addtext model (strcat “l=” (rtos (vla-get-length linha) 2 2)) (vlax-3d-point pa) 4) ) ;vincula a linha ao texto usando um xdata ;1005 é o dxfcode de xdata para “handle” da entidade (xdata->put (vlax-vla-object->ename linha) ;ename da linha xdata:nome ;nome da xdata (list (cons 1005 (vla-get-handle texto))) ;a xdata propriamente dita ) ;cria um reactor para linha, associando ao evento de modificar a linha (vlr-object-reactor (list linha) ;objeto modificado que notifica o reactor (list texto) ;parametros a serem passados ‘((:vlr-modified . reactor->modified) ;evento a ser chamado ao disparar o reactor )) ;perfumaria (princ “nFeito”) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sempre que a lisp for carregada com APPLOAD,;será acionada a função ‘reactors->aciona’ para “ligar” os reactors nas linhas criadas;com o comando que criamos(reactors->aciona) O exemplo pede dois pontos, por ele faz passar uma linha e […]
Reactor e Xdata; Coisas de doido Read More »