Nesta postagem, veremos como criar designs personalizados, BricsCAD® caixas de diálogo com DCL (Dialog Control Language). DCL permite que os programadores criem caixas de diálogo personalizadas para rotinas LISP. DCL foi adicionado a BricsCAD em V8 para compatibilidade com AutoCAD®.

DCL é uma linguagem estruturada usada para descrever os elementos (chamados “tiles” ~ mosaicos) que compõem as caixas de diálogo. Esses 'Tiles' incluem caixas de edição, caixas de listagem, botões de opção, blocos de imagem e barras de título. Cada um deles possui um ou mais atributos, como sua posição, cor de fundo e a ação que executa.

ATENÇÃO: Este artigo no Blog é transcrito aqui no idioma Português-Brasil, mas pelo fato do artigo original ter sido escrito em Inglês, é possível que algumas instruções (especialmente: códigos) possam gerar conflito entre os idiomas. Sugiro consultar também os códigos de origem (no livro ou na versão em inglês deste post) para garantir que seu trabalho esteja bem resolvido.


Os seguintes tópicos são abordados neste artigo:


UMA RÁPIDA HISTÓRIA DE DCL

Autodesk® inicialmente adicionou o DCL como um recurso não documentado para AutoCAD® Versão 11 para Windows. Ele foi projetado para criar caixas de diálogo independentes de plataforma. Naquela época, a Autodesk® produziu versões do AutoCAD® para “toda plataforma de engenharia viável”, que incluía DOS, Windows, Unix, Macintosh e OS/2, e DCL fazia parte de um projeto com o codinome “Proteus”, cujo objetivo era fazer o AutoCAD® funcionar e parecer idêntico em todos os sistemas operacionais.

Como mostram as figuras abaixo, o projeto foi um sucesso. Primeiro, aqui está o AutoCAD® Caixa de diálogo Drawing Aids da versão 11 em execução no DOS:

programando caixas de diálogo bricscad

E aqui está a mesma caixa de diálogo na versão Windows do AutoCAD® Versão 11:

codificação autocad dcl

Observe como as caixas de diálogo do DOS e do Windows se parecem. (A caixa de diálogo Drawing Aids agora é conhecida como a caixa de diálogo Options.)

Na versão 14, no entanto, Proteus tornou-se sem sentido, porque a Autodesk® optou por oferecer suporte apenas ao sistema operacional Windows. Mas DCL continuou sendo a única maneira de criar caixas de diálogo com LISP, e a Bricsys faz bom uso de DCL para seu suporte das versões Linux, macOS, e Windows.


As aplicações escritas em LISP, SDS e DRx podem usar DCL para caixas de diálogo. Macros de menu e barra de ferramentas também podem, quando se vinculam a rotinas LISP que chamam o código DCL. (O VBA não usa DCL, porque tem seu próprio ambiente de construção de diálogo.)

Bricsys não fornece nenhum ambiente de programação para ajudá-lo a criar arquivos DCL - está codificando manualmente todo o caminho.
Isso significa que um editor de texto, como Bloco de Notas no Windows e Text Edit no Linux ou Mac vai ser o seu ambiente de programação DCL.
Alguns desenvolvedores terceiros criaram ferramentas de desenvolvimento DCL.

Quando você deseja que uma rotina LISP exiba uma caixa de diálogo, você precisa escrever dois pedaços de código:

  • Código em um arquivo .dcl que define a caixa de diálogo e as funções de seus blocos.
  • Código no arquivo .lsp que carrega o arquivo .dcl e ativa os blocos.

Trabalhar com caixas de diálogo sempre envolve um par de arquivos, .dcl e .lsp, com o código LISP controlando o código da caixa de diálogo.

Uma desvantagem do DCL é que ele não pode criar caixas de diálogo que se modificam automaticamente, como aquelas que adicionam ou removem botões. Ele pode, no entanto, alterar dinamicamente o conteúdo de listas suspensas e outros.

criando caixas de diálogo personalizadas bricscad
Elementos de uma caixa de diálogo

De que são feitas as caixas de diálogo

As caixas de diálogo podem consistir em muitos elementos, como botões de rádio, controles deslizantes, imagens, guias e caixas de seleção. Esses elementos são chamados de “blocos”. O DCL permite que você crie muitos tipos diferentes de elementos, mas não possui blocos para todos os elementos encontrados nas caixas de diálogo atuais. Isso ocorre porque o DCL não foi atualizado desde que foi introduzido há cerca de 20 anos. (Esses elementos não possíveis com DCL podem ser criados por meio do VBA.)

A figura abaixo ilustra muitos dos elementos da caixa de diálogo que são possíveis com DCL, junto com alguns nomes de blocos DCL específicos.

A maioria dos blocos são visíveis, mas alguns são invisíveis, como os blocos de linha e coluna destacados na figura acima com um retângulo azul:

COMO DCL OPERA

Os dois trechos de código necessários para fazer as caixas de diálogo funcionarem são:

  • Código DCL que especifica o layout dos ladrilhos e seus atributos na caixa de diálogo.
  • Código LISP que ativa e controla a caixa de diálogo.

Você não precisa especificar o tamanho geral da caixa de diálogo; BricsCAD cuida disso, dimensionando-o automaticamente. O padrão é que os ladrilhos sejam empilhados em colunas; você só precisa especificar quando os ladrilhos devem ser alinhados em uma linha.

Algumas idas e vindas são permitidas durante a execução de DCL e LISP; isso é conhecido como "callbacks". Os retornos de chamada são usados para fornecer nomes às caixas de diálogo de arquivo, para esmaecer certos botões, para alterar o conteúdo das listas pop-up (listas suspensas) e assim por diante.

Esta postagem mostra como escrever DCL com código LISP. Um post posterior fornecerá uma referência abrangente a todos os tiles DCL, seus atributos e funções LISP relacionadas.

Seu primeiro arquivo DCL

Antes de escrever qualquer código para uma caixa de diálogo, é útil planejar os blocos. Para onde irão os botões, listas suspensas e caixas de entrada de texto na caixa de diálogo? É uma boa ideia pegar seu lápis e esboçar suas ideias no papel.

Para este tutorial, você criará uma caixa de diálogo que exibe os valores armazenados nestas variáveis de sistema:

LastPoint - armazena as coordenadas do último ponto inserido no desenho.
LastAngle - armazena o ângulo definido pelos dois últimos pontos inseridos.
LastPrompt - armazena o último texto inserido na linha de comando.

Reserve um momento para pensar sobre o design da caixa de diálogo. Teria um título que explica a finalidade da caixa de diálogo. Provavelmente deve ter três linhas de texto que relatam o nome e valor de cada variável do sistema, e deve ter um OK botão para sair da caixa de diálogo.

Pode ser assim:

como funciona uma caixa de diálogo

ESTRUTURA DE PROGRAMAÇÃO DCL

A estrutura de programação desta caixa de diálogo é semelhante a esta:

Inicie a definição da caixa de diálogo:

  • Especifique o título da caixa de diálogo
  • Especifique uma coluna:

Variável de sistema LastPoint e suas coordenadas 3D
Variável do sistema LastAngle e seu ângulo
Variável de sistema LastPrompt e seu texto

  • Localize o botão OK

Finaliza a definição da caixa de diálogo.

Neste primeiro tutorial, você escreverá código suficiente para exibir a caixa de diálogo e seu botão OK. Nos tutoriais que vêm depois, você adiciona os sinos e assobios.

Definição da caixa de diálogo Iniciar

O conteúdo de cada.dcl arquivo começa com um nome atributo. Este é o nome pelo qual o código de diálogo é chamado posteriormente pela rotina LISP associada. A função de nome se parece com isto:

nome: dialog {

Como LISP, uma chave aberta precisa de uma chave de fechamento para sinalizar o fim de uma definição de caixa de diálogo:

}

Entre as duas chaves, você escreve todo o código que define a aparência da caixa de diálogo.

Para este tutorial, nomeie a caixa de diálogo “lastInput,” da seguinte maneira:

lastInput: diálogo {}

Os nomes DCL diferenciam maiúsculas de minúsculas, então “lastInput” não é o mesmo que “LastINPUT” ou “lastinput”.

Título da caixa de diálogo

O texto da barra de título da caixa de diálogo é especificado pelo etiqueta propriedade, como segue:

nome: diálogo {

rótulo = “Título da caixa de diálogo”;

}

Rotule esta caixa de diálogo como “Última entrada” assim:

lastInput: dialog {

rótulo = “Última entrada“;

}=

O texto do título deve ser colocado entre aspas (”). A propriedade label deve terminar com um ponto e vírgula (;). E é útil recuar o código para torná-lo legível.

Botão OK

Cada caixa de diálogo precisa de um botão de saída, ou pelo menos um “OK”. (O Windows coloca um padrão X botão no canto superior direito de cada caixa de diálogo, que também funciona para sair das caixas de diálogo feitas com DCL!)

Os botões são definidos com o botão propriedade, seguida pelas propriedades do botão entre colchetes:

: botão { }

Como as caixas de diálogo podem ter vários botões, cada botão deve ser identificado por uma propriedade chamada “chave”. o tecla é como o LISP dá instruções aos botões. Use o tecla atributo para identificar este botão OK como “okButton,” da seguinte maneira:

tecla = “okButton”;

O botão precisa exibir um rótulo para os usuários lerem. Este é um botão OK, então rotule-o "OK" com o atributo label, da seguinte maneira:

rótulo = ”OK“;

Vamos colocar tudo isso junto. O código adicionado para o botão OK é mostrado aqui em cores, com os atributos key, label e is_default. (Veja abaixo informações sobre o atributo padrão.) Temos um botão identificado como “okButton,” ostentando o rótulo “OK” e é definido como o bloco padrão.

lastInput: dialog {

rótulo = “Última entrada”;

: botão {

tecla = “okButton”;

rótulo = ”OK“;

is_default = true;

}

}

DICA O código DCL para o OK botão é como uma sub-rotina. O mesmo código pode ser reutilizado sempre que uma caixa de diálogo precisa de um OK botão, que fica praticamente o tempo todo. Posteriormente, você verá como criar sub-rotinas com código DCL.

RESUMO RÁPIDO DOS METACARACTERES DCL

DCL Metacaractere Significado
// (barra-barra) Indica uma linha de comentário
/* (barra asterisco) Inicia a seção de comentários
*/ (asterisco-barra Termina a seção de comentários
: (dois pontos) Inicia uma definição de mosaico. Mosaicos predefinidos, como o espaçador, não usam os dois pontos
{ (braçadeira) Inicia o diálogo e os atributos do bloco
(espaço) Separa símbolos
= é igual a) Define valores de atributos
“” (citação direta) Inclui atributos de texto
; (ponto e vírgula) Termina a definição do atributo. Cada atributo deve terminar com um ponto e vírgula
} (braçadeira) Termina os atributos do bloco e da caixa de diálogo

CÓDIGO LISP PARA CARREGAR E EXECUTAR CAIXAS DE DIÁLOGO

O seguinte código LISP é o que você usa para carregar, executar e sair do arquivo de definição da caixa de diálogo lastInput.dcl:

(defun C: xx ()

(setq dlg-id (load_dialog “c: \\ lastInput”))

(new_dialog “lastInput” dlg-id)

(action_tile “aceitar” “(done_dialog)”)

(start_dialog)

(unload_dialog dlg-id)

)

Para ver o que significa o código LISP, vamos desmontá-lo.

A função é definida como “xx” com a função defun do LISP. Programação = depuração, então gosto de usar um nome fácil de inserir para a rotina LISP, como “xx”.

(defun C: xx ()

O arquivo lastInput.dcl é carregado com a função load_dialog. Não há necessidade de especificar a extensão “.dcl” porque este é o único propósito desta função: carregar arquivos DCL.

  • No Windows, inclua o nome da unidade, C: \\. Lembre-se de que o LISP requer que você use \\ em vez de \ para separar os nomes das pastas.

    (setq dlg-id (load_dialog “c: \\ lastInput”))

  • No Linux, omita o nome da unidade:

    (setq dlg-id (load_dialog “lastInput”))

Os arquivos DCL podem conter mais de uma definição de caixa de diálogo e, portanto, a próxima etapa é usar a função new_dialog para informar a BricsCAD qual você deseja acessar. Nesse caso, há apenas um, “lastInput”.

(new_dialog “lastInput” dlg-id)

A caixa de diálogo contém um botão denominado “okButton,” e sua finalidade é definida por LISP - não DCL! Aqui você usa a função action_tile para atribuir uma ação ao bloco “okButton”. O objetivo do botão na vida é executar a função done_dialog que sai da caixa de diálogo. Resumindo, clique em OK para sair da caixa de diálogo. Você pode ler isso da seguinte maneira: “a ação para o bloco chamado okButton é ...”.

(action_tile “okButton” “(done_dialog)”)

Depois de todas essas preliminares, chega o grande momento. A função start_dialog abre a caixa de diálogo e espera então que você clique em seu botão.

(start_dialog)

Como programadores habilidosos, descarregamos a caixa de diálogo da memória com a função unload_dialog.

(unload_dialog dlg-id)

E um último parêntese encerra a função xx.

)


Teste de código DCL

Você tem código DCL suficiente para testá-lo agora, o que permite ver como a caixa de diálogo está se desenvolvendo. Para testar o código, siga estas etapas:

  1. Abra o bloco de notas, Edição de Texto, ou outro editor de texto ASCII.
  2. Insira o código DCL que desenvolvemos anteriormente:código dclImportante: Certifique-se de que este arquivo DCL e o arquivo LSP usem aspas retas que se parecem com isto: “. Se eles contiverem aspas curvas (“ou”), as rotinas falharão. LISP irá reclamar, “erro: tipo de argumento ruim; esperado ”enquanto o DCL apresentará uma caixa de diálogo reclamando, erro de sintaxe: inesperado“ ”.
  3. Salve o arquivo como lastinput.dcl. Para que a rotina LISP xx.lsp possa encontrá-lo facilmente, salve o arquivo em uma pasta de nível superior:
    • No Windows, salve o arquivo DCL na unidade C: \.
    • No Linux e Mac, salve o arquivo DCL em sua pasta de início. Por exemplo, eu loguei no Linux com o nome de usuário “ralphg,” então salvei o arquivo na pasta ralphg.
  4. Agora, abra um novo arquivo e, em seguida, insira o código LISP descrito no “Código LISP para carregar e executar caixas de diálogo seção." codificação para CAD
  5. Salve o arquivo como xx.lsp, também na mesma pasta do arquivo DCL.
  6. Mude para BricsCAD e abra o arquivo xx.lsp em BricsCAD:
    • No Windows, use o Explorer para arrastar o arquivo xx.lsp para a janela de desenho BricsCAD. (Arrastar o arquivo é muito mais rápido do que entrar no AppLoad comando ou usando o LISP load função!)
    • No Linux, você deve usar o load , porque os arquivos não podem ser arrastados para a versão Linux de BricsCAD. Digite o seguinte no prompt ':':

      : (carregar “xx”)

  7. Digite xx para executar a rotina, que então carrega a caixa de diálogo:

    : xx

    Observe que a caixa de diálogo aparece! Bem, deveria, se você não cometeu nenhum erro de codificação.

O Que vem a Seguir?

No próximo post, veremos como adicionar todos os sinos e assobios à sua caixa de diálogo.