Visualizar arquivos SLD ou SLB

Dando continuidade ao post anterior, sobre slides e bibliotecas, vamos ver um visualizador de slides, bem útil quando se tem vários slides, seja em arquivos separados, ou numa SLB.

Você pode usar o Slideviewer, também se preferir.

Este programa,
;função para escolher um slide de um biblioteca
;(choose_sld "F:/autocad/drenagem e esgoto/Drenagem/de_fonts.slb")
;(choose_sld "c:/temp/")
(defun choose_sld (local / dcl dir tmp n offset slds num_col
                   num_lin img_witdh img_height img_bkgr img_off
                   key_prf key_scroll key_dlg index
)
  (
setq num_col    2   ;numero de colunas a mostrar no dcl
        num_lin    2   ;numero de linhas
        img_witdh  28  ;largura dos slides (em caracteres)
        img_height 10  ;altura dos slides (em nº de linhas)
        img_bkgr   -16 ;background color quando ativo
        img_off    -2  ;background color quando inativo
        key_prf    "S" ;prefixo das KEY das imagens
        key_scroll "SCROLL"  ;KEY do slide
        key_dlg    "exemplo" ;KEY do dialogo
;obtem a lista de slides, do diretorio, ou SLB:
        slds       (if (vl-filename-extension local);SLB?
                     (mapcar '(lambda (x) (strcat local "(" x ")"))
                             (
slb2list local))
                     (
mapcar '(lambda (x) (strcat local x))
                             (
vl-directory-files local "*.sld")))
;valor maximo do slider
        maxval     (* num_lin num_col
                      (/ (length slds) (* num_lin num_col)))
        offset     maxval
        dcl
        (choose:make_and_load_dcl))

;mostra o dcl na tela:
  (new_dialog key_dlg dcl)
;desenhas as imagens nele:
  (choose:popula_slides offset)
;inicia o dialog
  (if (/= 0 (start_dialog))
    (
setq index (nth index slds)))
;descarrega da memoria
  (unload_dialog dcl)
  index)

(
defun choose:make_and_load_dcl (/ filename file j dcl)
;cria um arquivo temporario
  (setq filename (vl-filename-mktemp "x.dcl")
        file     (open filename "w")
        j        0)
;escreve um dcl nele:
  (write-line
    (strcat key_dlg ": dialog { label = \"escolha a figura\";\n"
            ":row {\n"
            "  :column {// 1 coluna de "
 (itoa num_lin) " linhas visiveis\n")
    file)
  

;escreva uma matriz (linhas/colunas) de imagens
  (repeat num_lin
    (write-line (strcat "   :row {//uma linha de " (itoa num_col) " imagens")
      file)
    (
repeat num_col
      (write-line
        (strcat
          ":image_button {\n"
          "key = \""
 key_prf (itoa j) "\";\n" ;ID da imagem
          "height = " (itoa img_height) ";\n" ;altura, em nº de linhas de texto
          "width = " (itoa img_witdh) ";\n"   ;largura, en nº de caracteres\n
          "action = \"(choose:seleciona_img " (itoa j) ")\";}";acao
          )
        file)
      (
Setq j   (1+ j)))
    (
write-line "}" file))
  

;adiciona o slider:
  (write-line
    (strcat "}\n"
            ":slider {\n"
;barra deslizante a direita
            "layout = vertical;\n" ;barra na vertical
            "key = \"" key_scroll "\";\n"  ;ID da barrinha
            "max_value = " (itoa maxval) ";\n"
            "min_value = 0;\n"
 ;sempre zero
            "small_increment = " (itoa num_col) ";\n"
            "big_increment= "
 (itoa (* num_lin num_col))";\n"
            "action = \"(choose:popula_slides (atoi $value))\";\n"
            "value = "
 (itoa maxval) ";\n"
            "}}\n"
            ":column {:text{key=\"texto\";} ok_cancel;}}"
)
    file)
;fecha o arquivo, carrega o dcl na memoria e apaga o arquivo
  (close file)
  (
setq dcl (load_dialog filename))
  (
vl-file-delete filename)
;devolve o ID do dcl
  dcl)

;função que preenche as imagens com os slides
(defun choose:popula_slides (val / i w h nome)
  (
setq    i 0
    offset  val)
  (
repeat (* num_lin num_col)
;obtem as props do slide
    (setq nome (nth (+ i (- maxval offset)) slds)
          w (dimx_tile (strcat key_prf (itoa i)))
      h (dimy_tile (strcat key_prf (itoa i))))
    

;limpe de (re)desenha o slide
    (start_image (strcat key_prf (itoa i)))
    (
if nome
      (progn ;desenha
        (fill_image 0 0 w h img_bkgr)
        (
slide_image 0 0 w h nome))
      (
fill_image 0 0 w h img_off));desabilita img
    (end_image)
;desabilita imagens nao preenchidas
    (mode_tile (strcat key_prf (itoa i))
      (
if nome 0 1))
    (
setq i (1+ i))))

;função que seleciona o nome do slide
(defun choose:seleciona_img (val)
  (
setq index (+ val (- maxval offset)))
  (
set_tile "texto" (nth index  slds)))


Link(s) da(s) subrotina(s) usada(s):
slb2list
pode ser usado em programas lisp, para que você possa escolher blocos por exemplo, basta ter os slides deles, já vi vários programinhas fazerem isso.
O problema é justamente quando se tem um número elevado de blocos, fica impossível mostrar todos numa única tela, veja como funciona neste:
digamos que você tenha esta biblioteca
, para visualizar ela no autocad, faríamos:
(choose_sld "F:/autocad/drenagem e esgoto/Drenagem/de_fonts.slb")
e teríamos esta tela:


Ao clicar uma imagem em seguida pressionar o botão "OK", o dcl encerra e nos devolve o caminho completo para ele, por exemplo:
"F:/autocad/drenagem e esgoto/Drenagem/de_fonts.slb(112)"

Agora suponha que tenhamos EXTRÍDO os slides dessa SLB (sim é possível) na pasta "C:\temp\"
faríamos:
(choose_sld "c:/temp/")
E obteríamos a mesma tela!!

A resposta seria:
"c:/temp/66.sld"
neste caso.

Analise a lisp, veja que é possível alterar o número de imagens visíveis facilmente apenas alterando o valor de algumas variáveis. Está bem comentado o código, você não deverá ter dificuldades!!!

5 comentários:

  1. E ai Neyton, tudo bem?

    Cara, tu é a maior fera do Lisp que conheço, então estou recorrendo aqui ao teu blog, porém não estou encontrando...

    Lá no:
    http://www.autolisp.com.br/autolisp/modules.php?name=Forums&file=viewtopic&p=18729#18729

    Temos uma rotina que conecta ao banco de dados, mas ela está com um problema para desconectar, ou seja, para faser o close.

    Na verdade o close chama uma rotina chamada ADOM-CLOSE que não encontro de jeito nenhum...

    Por acaso tu podes ajudar neste sentido?

    Muito obrigado amigão!

    ResponderExcluir
  2. Anônimo1/5/11 07:46

    Só pensei que eu iria comentar e dizer um grande tema, não é o código por si mesmo? Realmente parece excelente!

    ResponderExcluir
  3. hola, Chicos, Como novato, siempre estoy buscando en línea para los artículos que me puede ayudar. Gracias Wow! ¡Gracias! Siempre quise escribir en mi sitio algo así. ¿Puedo tomar parte de tu post en mi blog?

    ResponderExcluir
  4. Caro Neyton,

    Como foi dito acima tentei analisar a lisp, porém clicando em VER não es´ta abrindo o arquivo. Teria como vc verificar o link.

    Tudo de bom

    Henrique

    ResponderExcluir