Lisp

Como criar rotinas LISP para configurar o desenho.

BricsCAD Lisp

Migrar do AutoCAD

Quando você começar a migrar para o BricsCAD, você descobrirá que praticamente não há diferenças no BricsCAD LISP versus OutroLISP. Seu código é carregado e executado, e a funcionalidade é idêntica. As principais diferenças ao “portar” suas aplicações serão algumas etapas menores de configuração, estrutura de linha de Comando, e possivelmente locais dos arquivos. Para começar, vamos revisar a configuração e o lançamento de seus programas existentes no BricsCAD.

Se você estiver iniciando automaticamente seus programas usando o Acad.lsp ou Acaddoc.lsp, você precisará renomeá-los como on_start.lsp ou on_doc_load.lsp respectivamente. A melhor solução é usar on_doc_load.lsp, em vez de on_start.lsp.

Painel de Configurações do BricsCAD
Para ativar o lançamento automático do seu conjunto de programas, defina a variável de sistema ACADLSPASDOC como 1, ou simplesmente alterne a opção em Configurações/Opções do Programa/Sistema:
Também é recomendável que você gaste um pouco de tempo se familiarizando com o menu Opções/Configuração no BricsCAD, pois existem configurações e opções específicas para o ambiente BricsCAD.
A próxima etapa na caixa de diálogo de configurações seria adicionar as pastas de suporte ao caminho de pesquisa dos Arquivos, localizado em Configurações/Opções do Programa/Arquivos:
Recomenda-se usar os caminhos de suporte adicionados da maneira acima e/ou localizados um nível abaixo da pasta atual do projeto. É uma boa prática usar uma função findfile para validar se o arquivo existe antes de prosseguir com seus comandos, como no método abaixo:
(if (findfile "custom-code.lsp") (load "custom-code")) 
Esse é um dos métodos que você pode usar para carregar suas funções sob-demanda dentro do arquivo on_doc_load.lsp :

Esse é um dos métodos que você pode usar para carregar suas funções sob demanda dentro do arquivo on_start.lsp :

O comando DEFUN (DEfine FUNction) tem o mesmo nome da função dentro do seu arquivo on_doc_load.lsp e aquela função redefine a função de chamada quando esta é iniciada.

Rotinas Lisp de Configuração de Desenho para o BricsCAD

Amostra de código
A rotina simples de configuração de desenho abaixo pode ser adaptada às suas necessidades com o mínimo de mudanças.
(defun C:MYSETUP ( / )                    ;define the command line function "mysetup"
  (setvar "cmdecho" 0)
  (command "_audit" "_y")                 ;audit current drawing
  (command "_-purge" "_all" "*" "_n")     ;purge all unused styles, etc
  (command "_-layer" "_m" "1" "_c" "1" "" "")  ; create layer "1" color "1"
  (command "_-layer" "_m" "2" "_c" "2" "" "")
  (command "_-layer" "_m" "3" "_c" "3" "" "")
  (command "_-layer" "_m" "4" "_c" "4" "" "")
  (command "_viewres" "_y" "20000")        ;set view resolution to maximum
  (setvar "filedia" 1)                     ;turn file dialogs on
  (setvar "attdia" 1)                      ;turn attribute dialogs on
  (setvar "attreq" 1)                      ;enable attribute editing on placement
  (setvar "cecolor" "bylayer")             ;set current color bylayer
  (setvar "clayer" "0")                    ;set current layer to "0"
  (setvar "maxsort" 5000)                  ;set maximum layer sort to 5,000
  (command "_zoom" "_e" "_zoom" "0.95x")   ;zoom extents, then out a little
  (setvar "cmdecho" 1)
  (princ)
)
Cada linha individual nesta rotina de configuração de desenho poderia ter sido digitada na linha de Comando em BricsCAD. Ao envolvê-los em uma rotina Lisp, o defun (define function) torna a rotina de configuração do desenho "callable" (chamável) a partir de um menu ou por digitação de seu nome na linha de Comando do BricsCAD.

Se você não incluir defun, o programa será executado uma vez, quando você carrega este pelo seu nome de arquivo. Usar o defun e carregar essa rotina dentro do seu lsp vai tornar a função disponível a qualquer momento, ao digitar o nome da função: mysetup.

Os comandos com traços precedentes (por exemplo -layer e -purge) são usados para impedir que sejam iniciadas as caixas de diálogo do comando.

Note: Sempre use nomes de comando e opções em Inglês, para evitar falhas nas versões localizadas (não-Inglês) do BricsCAD.

Uma boa prática ao abrir arquivos de outras pessoas é executar uma auditoria (audit) INSPECIONAR seguida de uma limpeza (purge) ELIMINAR para remover quaisquer itens não utilizados.

O comando de limpeza ELIMINAR pode ser executado várias vezes para remover itens aninhados. Veja o exemplo abaixo:

(repeat 3 (command "-purge" "all" "*" "n"))
Note: Eliminar é feito antes de adicionar novas camadas, vazias, pois elas seriam removidas se o fizéssemos depois.

As chamadas de comando para definir camadas podem ser combinadas em uma única instrução de comando, mas é mais fácil ler quando cada linha está sozinha.

As chamadas setvar para definir uma variável de sistema para um valor especificado, por exemplo configurações de estilo para dimensões e texto, configurações de unidade, etc.

A configuração maxsort foi introduzida por dois motivos.
  1. Maxsort controla o número máximo de entradas da caixa de diálogo que serão ordenadas.
  2. O valor padrão para maxsort é 1,000. Com os computadores de hoje e os enormes arquivos de projeto frequentemente encontrados, esse número pode ficar muito baixo.
Se você abrir desenhos onde os nomes das camadas não estarão ordenados em ordem alfabética, o valor padrão Maxsort pode ser o motivo!
Um Criador de Camadas mais versátil para sua rotina de instalação de desenhos
O exemplo a seguir pode ser adicionado à sua versão do mysetup.lsp. Ao criar um arquivo de texto simples “Layers.txt” com um editor como o Bloco de Notas, você pode adicionar uma lista de nomes de camadas a ser criados quando a rotina for executada. Esta é uma alternativa ao processo codificado mostrado acima. Usando a função 'Findfile', BricsCAD vai inicialmente pesquisar na pasta atual, e então na sequencia através das pastas de suporte que você definir para encontrar o arquivo layers.txt. Você pode colocar o arquivo de texto de configuração de camada padrão no caminho de suporte e colocar versões alternativas dele em pastas individuais do projeto.

(if (not (findfile "Layers.txt"))                   ;"not" = looking for no result from findfile
(alert "Can't find Layers.txt!")                    ;No file? Yell at the user and exit!
(progn                                              ;Otherwise, do the stuff in the progn group
(setq layerfile (open (findfile "Layers.txt") "r")) ;open layers.txt to "read"
(while (setq layername (read-line layerfile))       ;while reading each line, store the text to layername
(command "-layer" "m" layername "")                 ;make layer with the layername
)                                                   ;end the while loop
(close layerfile)                                   ;close the Layers.txt file
)                                                   ;end the progn
)                                                   ;end the if