Resumão VLISP

Learning Autolisp & Visual Lisp - Josh Modglin - Lynda.com


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 entdataentdata))
(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.
Symbol table name
Description
APPID
Registered applications
BLOCK
Blocks (named and anonymous)
DIMSTYLE
Dimension styles
LAYER
Layers
LTYPE
Linetypes
STYLE
Text styles
UCS
Named User Coordinates Systems (UCSs)
VIEW
Named views
VPORT
Named viewports

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)

Sintax -> (dumpallproperties ename [context])
Linha de comando
(princ (dumpallproperties (car (entsel "\nSelecione uma entidade qualquer"))))(princ)
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)

Signature -> (setpropertyvalue ename propertyname value [or collectionName index name val])
Linha de comando
(setpropertyvalue (car (entsel "\nSelecione um texto simples")) "TextString" "Corrigido")