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