Copie e gire de maneira fácil com o LISP

Em contraste com o exemplo do .NET que apontei para você no último episódio deste blog, aqui está um exemplo simples de um comando LISP usado para copiar e girar objetos:

 (defun c:copyrotate (/ slset pt1 pt2)
 (prompt "Select entities to Copy and Rotate:")
 (setq sset (ssget))
 (setq pt1 (getpoint "Specify copy base point:"))(terpri)
 (setq pt2 (getpoint pt1 "Specify copy second point:"))(terpri)
 (command ".copy" sset "" pt1 pt1 ".move" sset "" pt1 pt2  ".redraw")
 (setq pt2 (getpoint "Specify rotate base point:"))(terpri)
 (command ".rotate" sset "" pt2)
 )

Agora isso é um programa curto! Como eu mencionei acima, esse “comando” combina os comandos Mover e Girar em um único comando.

O mesmo programa, com comentários:

No LISP, o ponto e vírgula marca uma linha de comentário, portanto, qualquer coisa depois não é processada.

(defun c:copyrotate (/ slset pt1 pt2)
; define a função de comando “copyrotate”
(prompt "Select entities to Copy and Rotate:")
; solicitar ao usuário na linha de Comando 
(setq sset (ssget))   
; solicitar ao usuário selecionar objetos      
; variável contendo os objetos é "sset"
(setq pt1 (getpoint "Specify copy base point:"))(terpri)
; obter o ponto base da cópia "pt1"
(setq pt2 (getpoint pt1 "Specify copy second point:"))(terpri)
; obter cópia segundo ponto “pt2”
(command ".copy" sset "" pt1 pt1 ".move" sset "" pt1 pt2  ".redraw")
; copiar objetos no lugar e mova-os para longe ... 
; a maneira mais fácil de copiar e girar criado grupo de objetos
(setq pt2 (getpoint "Specify rotate base point:"))(terpri)
; obter o ponto base de rotação ... como uma nota lateral,
; Eu prefiro usar o ponto base da cópia original como o centro de rotação
; para fazer isso, simplesmente remova ou comente a linha acima  “;(setq pt2 “
(command ".rotate" sset "" pt2)
: rotacione o grupo anteriormente movido
)
; fecha a função

Para melhorar a usabilidade de nossa função, podemos adicionar um loop “while” (para continuar pedindo mais seleções), e dar opções angulares, ativar ou desativar osnaps ou Ortho, etc…

É uma rotina LISP demais?

Tendo apresentado isso, vou dizer-lhe que há muitos casos em que uma rotina LISP pode ser over-kill. Se você está simplesmente executando uma série de comandos que não exigem “manipulação” dos dados entre funções, ou onde a entrada de dados é consistente, então as macros de menu podem ser ainda mais eficientes que o LISP. Mas, as macros de menu não podem ser projetadas com opções e podem ser “frágeis” - isto é, fáceis de quebrar - já que não podem lidar com erros. Minha recomendação? Aqui está um pouco híbrido - é uma rotina LISP de uma linha:

*^c^c(command “Select” pause “copy” “p” “” “@” “@” “move” “p” “” pause pause “rotate” “p” “” “@” pause)

Esta simples, mas elegante, macro “LISP” funciona exatamente como o programa acima, com a repetição da função automática adicionada (*^c^c), e fornece todo o feedback gráfico dinâmico do usuário de um programa sofisticado. Basta adicionar um ícone a um de seus menus usando a interface CUI e conectar a linha acima na seqüência de comando, e você terá uma função de cópia / rotação super legal.

A ferramenta certa para o trabalho

Você pode estar pensando que é tão fácil usar o Grips no BricsCAD e clicar com o botão direito do mouse para percorrer todas as opções. Minha resposta seria para lembrá-lo que eu sou (realmente) old school, e enquanto eu uso Grips frequentemente, eu também sei que a tecla Esc sempre foi a primeira chave a morrer de abuso no meu teclado (OK, não realmente). O ponto principal aqui é certificar-se de que você está usando a ferramenta certa para o trabalho, e embora certamente existam usos válidos para aplicativos .NET, não consigo escrever páginas de código compilado quando posso fazer o trabalho de forma limpa com algumas linhas de LISP.

Espero que esta introdução tenha atingido o seu interesse. Acho que você encontrará algumas dicas / sugestões úteis ao mergulhar no mundo do LISP. Lembre-se, é tudo sobre como realizar seu trabalho de design com rapidez e precisão. Que melhor maneira do que usar os recursos embutidos no BricsCAD para fazê-lo funcionar do seu jeito?