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!!!

LinkWithin

Related Posts Plugin for WordPress, Blogger...