Learning Autolisp & Visual Lisp - Josh Modglin - Lynda.com
LINKS
FORMATOS DE ARQUIVOS
- LSP é um arquivo de texto ASCII que contém a codificação de programa AutoLISP.
- FAS é uma versão binária, compilada de um único arquivo de programa LSP.
- VLX é um conjunto compilado de um ou mais arquivos LSP e/ou linguagem de controle de diálogo (DCL).
VLIDE - LOAD ACTIVE EDIT WINDOW
- Carregar código da janela atual no autocad
- É possível chamar o comando no autocad sem necessidade de utilizar previamente o appload no arquivo lisp
VLIDE - INSPECT
- Verificar o resultado de parte do código selecionado
- Exibir valor das variáveis ou resultado dos processos definidos
DEFUN
- Argumento inicial para definição da lista/comando
(Defun c:principal ( entradas / var_locais)) ;Função principal
(Defun auxiliar ( entradas / var_locais)) ;Comando auxiliar para chamar na função principal
PRINC
- Print to Command Line
- Quando aplicado no fim da lisp
- Retornar nada
- Evitar "eco"
- "\n" -> Pular linha
- "\p" -> tabulação/ coluna de célula
VARIÁVEIS
- Globais
- Presentes em todo o desenho
- Podem ser utilizadas em outras lisp
- Locais
- Apenas no comando em execução
- Necessário escrever nos argumentos de definição da função
(Defun c:titulo ( entradas / var_locais))
Strings
STRCASE
- Alterar a capitulação/caixa de uma string
(strcase "string") ;maiúscula
(strcase "string" T) ;minúscula
STRCAT
- concatenar strings
(strcat "concatenar" " strings")
STRLEN
- Retornar o comprimento de uma string
- (STRLEN (GETVAR "savename")) = 0
- Arquivo ainda não foi salvo pela primeira vez
SUBSTR
- retornar uma parte da string
- O número inicial da posição é 1
- o comprimento da string a ser coletado é 4 caracteres (se não for informado, pega até o fim da string)
- (SUBSTR (GETVAR "acadver") 1 4)
- Retornar a versão do autocad que está sendo rodado
VL-STRING-SUBST
- Substituir um texto especifico dentro da string
- (VL-STRING-SUBST "new-str" "pattern" "string")
VL-STRING-TRANSLATE
- Substituir um texto especifico dentro da string
- (VL-STRING-TRANSLATE "\\" "/" (GETVAR "dwgprefix"))
- para o autocad os símbolos "\\" ou "/" representam "\"
VL-STRING-SEARCH
- Retorna a posição de um texto especifico dentro da string
- (VL-STRING-SEARCH texto-procurado string)
- O número inicial da posição é 0
- (VL-STRING-SEARCH (GETVAR "LOGINNAME") (GETVAR "dwgprefix"))
Lists
CRIAÇÃO
- (setq list1 (LIST 1 2))
- retorna (1 2)
- (setq list2 '(3 4))
- retorna (3 4)
- (setq dp (cons 5 6))
- retorna (5 . 6)
- (código . valor)
- Construir par pontuado
- usar quando houver variáveis em uma lista
NTH
- Retorna o enésimo elemento da lista
- O número inicial da posição é 0
- (nth 2 (LIST 3 4 5 6 7))
- retorna 5
VL-POSITION
- Retorna a posição na lista a partir do elemento informado
- O número inicial da posição é 0
- (VL-POSITION 52 (LIST 50 51 52 53 54 55))
- retorna 2
LENGTH
- Retorna o tamanho da lista
CAR e CDR
- CAR -> Retorna o primeiro elemento da lista
- CDR -> Retorna toda lista, exceto o primeiro elemento
- É possível fazer combinações para pegar elementos intermediários
- (cadr '(1 2 3))
- retorna 2
APPEND
- Acrescentar elemento/lista para primeira posição da lista
- (append '(1 2) (list 3 4 5))
- retorna '(1 2 3 4 5)
SUBST
- Substituir um valor especifico da lista por outro definido
- (SUBST 20 5 (list 1 2 3 4 5))
- retorna (1 2 3 4 20)
VL-REMOVE
- Remove um elemento da lista a partir do valor do elemento informado
- (vl-remove 52 (LIST 50 51 52 53 54 55))
- retorna (50 51 53 54 55)
Recebendo dados do usuário
GETSTRING
- Receber o texto digitado e retorna como uma STRING
- (getstring T "\nInsira seu nome: ")
- Usuário pode digitar "Espaço' na sequência de caracteres sem ser considerado como um "Enter"
- Argumento opcional
- Apertar ENTER sem digitar algo retorna ""
GETPOINT
- Recebe as coordenadas do ponto marcado e retorna uma LISTA (X Y Z)
- (getpoint "\nInforme o ponto de interesse: ")
- Apertar ENTER sem definir um ponto retorna nil
GETANGLE
- Pega um ângulo e retorna o valor em radianos
- Valor pode ser digitado
- Valor pode ser tomado a partir de um ponto de referência (dois cliques)
- (getangle ponto_ref "\nInforme o ponto de interesse: ")
- Argumentos opcionais
- Apertar ENTER sem definir um ponto retorna nil
GETDIST
- Recebe um texto digitado como valor REAL
- ou Recebe a distância entre dois pontos marcados no desenho
- (getdist Ponto_Inicial "\nInforme a distância: ")
- Argumento opcional
- Informar previamente qual o ponto inicial a ser considerado no cálculo da distância
- Elástico Virtual
- Apertar ENTER sem definir um ponto retorna nil
GETREAL / GETINT
- Recebe um texto digitado como valor REAL ou INTEGER
- Se ao pedir um número inteiro o usuário digitar um valor real, o programa avisará que o valor inserido deve ser um número inteiro
- (getreal "\nInforme a distância: ")
- (getint "\nInforme o número de repetições: ")
- Apertar ENTER sem definir um ponto retorna nil
INITGET
- Define a resposta inicial para ação do GETKWORD
- (initget num "opções")
GETKWORD
- Validação de uma resposta pré-configurada
- (setq resposta (getkword "\nEntre com uma resposta: "))
- Apertar ENTER sem definir um ponto retorna nil
ENTSEL + ENTGET
- (setq entidade (entsel "\nSelecione a entidade: "))
- Seleciona uma entidade e retorna uma lista com duas informações:
- Nome da entidade
- Coordenadas do ponto onde o usuário clicou para selecionar a entidade
- (entget (car entidade))
- -> Retorna a lista de dados da entidade através do nome previamente informado (entsel)
- Dados DXF -> pares pontuados
(setq entobj (entsel "\nSelecione a entidade: "))
(setq entdata (entget (car entobj)))
NENTSEL
- Funciona de forma igual ao entsel
- porém é capaz de selecionar um objeto dentro de um bloco
ENTDEL
- Deletar entidade através da manipulação de seu código de ID
(entdel(handent "handleID"))
GETFILED
- Janela de dialogo para selecionar um arquivo
- Retorna uma string como o caminho até o arquivo
- Lembrar que "\\" => "\"
- (setq filepath (getfiled "\nSelecione um arquivo: " "C:/" "csv" 12))
- Local inicial do janela
- Formato do arquivo procurado
Laços de repetição
WHILE -> Repetir instruções enquanto uma condição é atendida
- (WHILE condição instruções)
- Hint : Have you ever wondered how to make an AutoLisp routine Auto-Repeat?
- Enclose the whole function or sub-function in a (while) loop.
- This way, the function will keep on repeating until Enter or Cancel is hit.
(defun c:loop1 ()
(while
(setq pt (getpoint "\nChoose a point : "))
(command "point" pt)
)
(princ)
)
In this example, you can continue to pick points until you press Enter.
(AutoLisp treats Enter as nil). When you press enter the loop will terminate.
REPEAT
Repetir instruções uma determinada quantidade de vezes
(REPEAT Nrepetições instruções)
FOREACH
Executar um conjunto de instruções para cada elemento da lista
(FOREACH forVAR lista instruções)
Atribui cada elemento da lista na variável
escrever as instruções a partir desta variável
Conversão de dados
FIX
Converter REAL para INTEGER
(FIX número_real)
(fix 2.9) -> resultado é 12
semelhante a Truncar
fique ligado que esse método não arredondará o número, ao invés disso vai truncar
ITOA
Converter integer para string
(ITOA inteiro)
ATOI
Converter string para integer
(ATOI string)
(atoi "3.9") -> resultado é 3
semelhante a Truncar
RTOS
Converter real para string
(RTOS distância sistema_unidades precisão)
Argumentos opcionais (unidades e precisão)
(princ (strcat "\n A distância é: " (RTOS dist (getvar "AUNITS") (getvar "AUPREC") )))
ATOF
Converter string para real (float)
(ATOF string)
ver distof
ANGTOS
Converter ângulo em radianos para string
Ângulo em radianos
(ANGTOS angulo_rad sistema_unidades precisão )
Argumentos opcionais (unidades e precisão)
(princ (strcat "\n O ângulo é: " (ANGTOS angret (getvar "AUNITS") (getvar "AUPREC") )))
Selection Sets
SSGET
Capturar entidades no desenho
Retorna lista de entidades
Apertar ENTER sem selecionar um elemento retorna nil
(setq ssval (ssget))
Filtros de seleção
Códigos DXF de propriedades da entidade
Seleciona apenas entidades na layer 0
(setq ssval (ssget '((8 . "0")) ))
;Lista com propriedades que as entidades devem possuir para serem adicionadas a SelectionSet
Argumento opcional
SSLENGTH
Retorna o número total de entidades dentro da selection set
(sslength ssval)
SSNAME
Retorna os dados de uma entidade em uma determinada posição da Selection Set informada
(ssname Selection_Set posição)
(setq ssval (ssget))
(if (/= ssval nil)
(progn
(setq CNTR 0)
(while (< CNTR (sslength ssval))
(setq entobj (entget (ssname ssval cntr)))
(princ (strcat "\nObjeto selecionado é " (cdr (cadr entobj))))
(setq cntr (+ 1 cntr)
)
) ;end progn
) ;end if
Geometria
POLAR
Retorna a lista de coordenadas xyz de um ponto a partir da definição de suas coordenadas polares
Necessário inserir ângulo em radianos
(setq endpt (polar ponto_inicial ângulo distância))
ANGLE
Retorna o ângulo em radianos entre dois pontos informados
Necessário inserir ângulo em radianos
(setq angret (angle ponto_inicial ponto_final))
,
DISTANCE
Retorna distância entre dois pontos informados
(setq dist (distance ponto_inicial ponto_final))
INTERS
Retorna a lista de coordenadas do ponto de interseção entre duas retas
As retas não precisam estar desenhadas
As retas devem se cruzar graficamente
Função não considera interseção do prolongamento das retas
Retorna nil se as retas definidas não se cruzarem
(inters inicio1 fim1 inicio2 fim2)
;Informar as listas de coordenadas dos pontos que definem o inicio e fim da reta 1 e da reta 2
;Exemplo para teste
(defun c:qwe ()
(progn
(setq p1 (getpoint)) (setq p2 (getpoint)) ;pontos reta 1
(setq p3 (getpoint)) (setq p4 (getpoint)) ;pontos reta 2
(setq coord (inters p1 p2 p3 p4))
)
(command "point" coord) ;marcar ponto
)
Entidades gráficas - criar e editar
Tudo que pode ser desenhado
A chave para edição de entidades gráficas reside na alteração dos pares pontuados que compõem a lista de propriedades da entidade.
ASSOC
Retorna o par pontuado relativo ao código fornecido
Lista com dois valores, ponto não conta
(setq entobj (entsel "\nSelecione a entidade: "))
(setq entdata (entget (car entobj)))
(setq layname (assoc 8 entdata))
(strcat "\nA layer do objeto selecionado é: " (cdr layname))
SUBST
Substituir um par pontuado da lista por outro pré-definido
Ex: Substituição do par pontuado que define a layer da entidade
(setq entobj (entsel "\nSelecione a entidade: "))
(setq entdata (entget (car entobj)))
(setq layname (assoc 8 entdata))
(setq entdata2 (subst (cons 8 "NewLayer") layname entdata))
ENTMOD
Atualizar a lista de propriedades de uma entidade através de uma segunda lista com valores alterados
Ex: Substituição do par pontuado que define a layer da entidade
(setq entobj (entsel "\nSelecione a entidade: "))
(setq entdata (entget (car entobj)))
(setq updata (subst (cons 8 "NewLayer") (assoc 8 entdata) entdata))
(setq updobj (entmod updata))
ENTMAKE
Criar uma nova entidade gráfica a partir da definição de seus parâmetros básicos
line -> pontos inicial e final
circunferência -> ponto central e raio/diâmetro
Ex: criar uma linha
Não é obrigatório informar a layer da nova entidade (código 8)
(setq p_inicial (getpoint "\nInforme o ponto inicial: "))
(setq p_final (getpoint "\nInforme o ponto final"))
(setq nova_entidade (entmake (list (cons 0 "line")(cons 10 p_inicial)(cons 11 p_final)(cons 8 "NovaLayer"))))
ENTDEL
Deletar uma entidade a partir do nome da entidade
A função Inspect do VLIDE apontará um erro, pois o objeto que ela tenta encontrar já foi apagado -> tudo ok
(setq entobj (entsel "\nSelecione a entidade: "))
(entdel (car entobj))
VLAX-ENAME->VLA-OBJECT
Converter uma lista de propriedades da entidades para um objeto compatível com os comandos de VISUAL LISP
Entidade deixa de ser uma lista e passa a ser um objeto com propriedades que podem ser acessadas
(setq entobj (entsel "\nSelecione a entidade: "))
(setq vl-obj (vlax-ename->vla-object (car entobj)))
para converter de volta para ename
- (vlax-vla-object->ename vla-object)
VLA-GET-<propriedade> / VLA-PUT-<propriedade>
GET
Pegar o valor de uma propriedade de um objeto visual lisp
PUT
Alterar o valor de uma propriedade de um objeto visual lisp
Sempre retornará nil no inspect quando conseguir realizar a alteração com sucesso
(setq entobj (entsel "\nSelecione a entidade: "))
(setq vl-obj (vlax-ename->vla-object (car entobj)))
(vla-get-length vl-obj) ;pegar valor da propriedade
(vla-put-layer vl-obj "NovaLayer") ;alterar valor da propriedade
(vla-put-elevation vl-obj (/ elev 1) ;resolver problema ao inserir um valor string que é real ou integer
VLAX-GET-ACAD-OBJECT
Pegar objeto visual lisp
(SETQ ACADOBJ (VLAX-GET-ACAD-OBJECT))
Entidades não gráficas - criar e editar
Enquanto as entidades gráficas são tudo que você pode ver no desenho, as entidades não gráficas são outros elementos que não podem ser desenhados, mas também compõem o desenho, como styles, linetypes e layers.
As entidades não gráficas também são definidas por uma lista de propriedades definidas por pares pontuados.
TBLSEARCH
Retorna a lista de propriedades da entidade não gráfica procurada
Informar o tipo da entidade através do Symbol Table Name
Se for usado de um IF, retorna TRUE se existir o elemento na table.
Informar o nome da entidade especifica, no caso abaixo o nome do estilo de texto
(tblsearch "style" "Standard")
retorna: ((0 . "STYLE") (2 . "Standard") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (71 . 0) (42 . 0.2) (3 . "simplex.shx") (4 . ""))
(tblsearch "layer" "0")
retorna: ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous"))
TBLOBJNAME
Retorna apenas o nome da da entidade não gráfica procurada
Informar o tipo da entidade através do Symbol Table Name
Informar o nome da entidade especifica, no caso abaixo o nome do estilo de texto
(tblobjname "style" "Standard")
VLISP
Converter em objeto visual lisp
Utilizar os comandos de alteração das propriedades
(setq entobj (tblsearch "style" "Standard"))
(setq vl-obj (vlax-ename->vla-object entobj)) ;
(vla-put-height vl-obj 0.10) ;alterar valor da propriedade
ENTMAKE
Criar uma nova entidade gráfica a partir da definição de seus parâmetros básicos
line -> pontos inicial e final
circunferência -> ponto central e raio/diâmetro
Ex: criar uma linha
Não é obrigatório informar a layer da nova entidade (código 8)
(setq p_inicial (getpoint "\nInforme o ponto inicial: "))
(setq p_final (getpoint "\nInforme o ponto final"))
(setq nova_entidade (entmake (list (cons 0 "line")(cons 10 p_inicial)(cons 11 p_final)(cons 8 "NovaLayer"))))
Armazenando dados
USERR1-5 / USERI1-5 / USERS1-5
Variáveis para armazenamento de dados dentro do arquivo dwg acessíveis ao usuário
Basta apenas digitar o nome da variável na linha de comando
USERR1-5 -> armazenar valores real
USERI1-5 -> armazenar valores integer
USERS1-5 -> armazenar valores string
Cinco variáveis disponíveis para cada grupo de dados
NAMEDOBJDICT (DICTIONARY)
Acessar a lista de dictonaries que estão contidas no desenho atual
As dictionaries são bibliotecas de informações
podemos consultar
ou mesmo criar uma própria
(namedobjdict)
VLAX-LDATA-...
Escrever e manipular valores dentro de uma dictionary
Inserir valores dentro da dictionary
(vlax-ldata-put "NovoDictionary" "NovoValor" 125) ;inserir novo valor na dicitonary
(setq retval (vlax-ldata-list "NovoDictionary")) ;listar os itens da dictionary
(setq retval (vlax-ldata-get "NovoDictionary" "NovoValor")) ;pegar o valor de uma propriedade especifica
(vlax-ldata-delete "NovoDictionary" "NovoValor") ;deletar uma propriedade especifica da dictionary
ESCREVENDO NO REGISTRO
Inserir informações no registro do computador
(vl-load-com)
(setq userprod (vlax-user-product-key)) ;pegar o caminho no registro do autocad para o usuário atual
(vl-registry-write (strcat "HKEY_CURRENT_USER\\" userprod) "MYSAVEDVALUE" 125) ;inserir um valor no registro
(vl-registry-read (strcat "HKEY_CURRENT_USER\\" userprod) "MYSAVEDVALUE") ;deletar um valor do registro
Carregando uma LISP
Manage>>Load application...
appload ou ap
arrastar para o arquivo
colar na linha de comando
Nem todas lisp funcionam desta forma
acad.lsp
Carregado quando o autocad é iniciado
Support file search path
Inserir pré configurações e layers
(setvar <variavel>)
(vl-load-com)
(load <support directories>)
acaddoc,lsp
Carregado toda vez que um novo documento é criado ou aberto
Support file search path
Inserir pré configurações e layers
(setvar <variavel>)
(vl-load-com)
(load <support directories>)
Tratamento de erros
Tratar erros de uma forma clara para o usuário.
(defun *error* (msg)
(princ "\nOcorreu um erro durante a execução da lisp!")
(princ)
)
(defun c:getdata ( / retpnt)
(setq retpnt (getpoint "\nInforme o ponto: "))
(princ)
)
///////fim do curso//////////////////////////////////////////////////////////////////////
Fichamento informações gerais
Object data fields
Acessar e utilizar as obejct data criadas a partir de arquivos shapefile
(setq entobj (entsel "\nSelecione a entidade: ")) ;selecionar entidade
(ade_odgettables (car entobj)) ;descobrir as tables de atributos
(ade_odgetfield (car entobj) "CurvasNivel" "ELEVATION" 0) ;pegar o field especifico de uma table
Updates lisp autocad (até 2021)
Em 2022, VLIDE será descontinuado e não vêm mais instalado no autocad
Usando as properties da entidade (update autocad 2011)
- dumpallproperties - Retrieves an entity’s supported properties.
Sintax -> (dumpallproperties ename [context])
Linha de comando
(princ (dumpallproperties (car (entsel "\nSelecione uma entidade qualquer"))))(princ)
- getpropertyvalue - Returns the current value of an entity’s property.
Sintax -> (getpropertyvalue ename propertyname [or collectionName index name])
Linha de comando
(princ (getpropertyvalue (car (entsel "\nSelecione uma pline")) "Length"))(princ)
- ispropertyreadonly - Returns the read-only state of an entity’s property. (1 yes/ 0 no)
Signature -> (ispropertyreadonly ename propertyname [or collectionName index name])
Linha de comando
(princ (ispropertyreadonly (car (entsel "\nSelecione uma pline")) "Length"))(princ)
- setpropertyvalue - Sets the property value for an entity.
Signature -> (setpropertyvalue ename propertyname value [or collectionName index name val])
Linha de comando
(setpropertyvalue (car (entsel "\nSelecione um texto simples")) "TextString" "Corrigido")