Dúvidas

Dúvidas sobre o AutoCAD...

Moderador: Moderadores

Responder
Alexandre Moroni
Madeira
Madeira
Mensagens: 20
Registrado em: Dom 05 Mai 2013 8:32:11 pm

Dúvidas

Mensagem por Alexandre Moroni »

Boa noite....

Como sou novato vou pedir uma ajuda....estou testando uma rotina....essa rotina é uma mistura de várias rotinas....na verdade estou tentando aprender Autolisp....essa rotina tem a finalidade de fazer o arremate entre duas linhas que não se encontram....mas estou tendo alguns problemas:

1 - as vezes a rotina funciona certo....depois de rodar a mesma várias vezes já não funciona mais...e apresenta esse erro "error: too many arguments";

2 - quando estou rodando a rotina as vezes o arremate é feito certo e as vezes não, depende da posição das linhas originais, segue em anexo uma imagem dos problemas que estou tendo com essa rotina (não consegui enviar o anexo);

3 - tem como fazer para que esse arremate fosse arredondado com um determinado raio....como o Fillet...?

Segue abaixo a rotina

(defun c:LII (/)

(command "_undo" "_begin")
(setq cmdch (getvar "cmdecho"))
(setq pbx (getvar "pickbox"))
(setq osnp (getvar "osmode"))
(command "_setvar" "cmdecho" 0); desabilita os comandos executados na rotina
(command "_setvar" "PICKBOX" 0); desabilita o Pickbox, fica 0 o tamanho da caixa
(command "_setvar" "OSMODE" 0); desabilita o OSNAP (F3), neste caso vai desabilitar somente depois de inserir o ponto de inserção DU
(command "_GRID" "_OFF"); desabilita a Grade

(setq #cont1 0)

(setq p1l1 (getpoint "\nInsira um ponto inicial da primeira reta:"))
(setq p2l1 (getpoint p1l1 "\nInsira um ponto final da primeira reta:"))

(while (/= p2l1 nil)

(command "_line" p1l1 p2l1 "")

(if (= #cont1 0)
(setq #ll1 (entlast))
(progn
(setq #ll2 #ll1
#ll2 (entlast)
)
(arrmt #ll1 #ll2)
)
)

(setq p1l1 (getpoint "\nInsira um ponto inicial da segunda reta:"))
(setq p2l1 (getpoint p1l1 "\nInsira um ponto final da segunda reta:"))


(command "_line" p1l1 p2l1 "")

(setq #cont1 (1+ #cont1)); contador de looping do While

)
(princ)
)

(defun arrmt (laa)
(setq p3l1 (inters
(cdr (assoc 10 (entget laa)))
(cdr (assoc 11 (entget laa)))
nil
)
)
(command "_.change" laa "" p3l1)
(princ)
)

(PROMPT "\nDigite LII")
(PRINC)
Avatar do usuário
cracksther
Diamante
Diamante
Mensagens: 1063
Registrado em: Seg 13 Dez 2004 11:00:00 pm

Re: Dúvidas

Mensagem por cracksther »

Para setar uma variável não use COMMAND, use a própria função SETVAR
exemplo:
(setvar "cmdecho" 0)

Obs: A sitaxe dos comandos podem variar mais facilmente entre as versões do AutoCAD do que a sintaxe das funções AutoLISP, por isso aconselho evitar o uso de COMMAND, embora o uso do mesmo torne o código mais simples (as vezes)

Segue exemplo em AutoLISP puro, sem o uso de COMMAND.
[lsp]
(defun c:arrmt (/ l1 l2 e1 e2 prop1 prop2 p1l1 p2l1 p1l2 p2l2 ang1 ang2 par)
;| Loop para seleção da primeira linha |;
(while (not l1)
(setq l1 (entsel))
;| Verifica se foi selecionada uma linha |;
(if (not (and l1 (= "LINE" (cdr (assoc 0 (entget (car l1)))))))
;| Não foi selecionada uma linha, então permanece no loop |;
(setq l1 nil)
)
)

;| Loop para seleção da segunda linha |;
(while (not l2)
(setq l2 (entsel))
;| Verifica se foi selecionada uma linha |;
(if (not (and l2 (= "LINE" (cdr (assoc 0 (entget (car l2)))))))
;| Não foi selecionada uma linha, então permanece no loop |;
(setq l2 nil)
)
)

;| Ename e propriedades |;
(setq e1 (car l1))
(setq e2 (car l2))
(setq prop1 (entget e1))
(setq prop2 (entget e2))

;| Coordenadas das pontas |;
(setq p1l1 (cdr (assoc 10 prop1)))
(setq p2l1 (cdr (assoc 11 prop1)))
(setq p1l2 (cdr (assoc 10 prop2)))
(setq p2l2 (cdr (assoc 11 prop2)))

;| angulação |;
(setq ang1 (angle p1l1 p2l1))
(setq ang2 (angle p1l2 p2l2))

;| Verifica se estão paralelas |;
(if (or (= ang1 ang2)
(= (+ ang1 pi) ang2)
(= (- ang1 pi) ang2)
)
(setq par t)
)

;| intersercção |;
(if par
(princ "\nAs linhas são paralelas:")
(progn
(setq int (inters p1l1 p2l1 p1l2 p2l2 nil))
;| Alteração das linhas |;
;| Nesta parte fiz apenas uma verificação em relação a ponta mais distande da linha com a intersecção |;
;| Para um "fillet" mais correto é necessário calcular também qual o lado da linha deve-se cortar caso esteja comprida de mais |;
;| Fica como parte de seu estudo as demais conferências, este código tem apenas o objetivo de servir como exemplo |;
(if (< (distance int p1l1) (distance int p2l1))
(setq prop1 (subst (cons 10 int) (assoc 10 prop1) prop1))
(setq prop1 (subst (cons 11 int) (assoc 11 prop1) prop1))
)
(if (< (distance int p1l2) (distance int p2l2))
(setq prop2 (subst (cons 10 int) (assoc 10 prop2) prop2))
(setq prop2 (subst (cons 11 int) (assoc 11 prop2) prop2))
)
;| Aplica as novas coordenas nas linhas |;
(entmod prop1)
(entmod prop2)
)
)

(princ)
)
[/lsp]

Até mais!
Marcelo Silva - Cascavel - PR
cracksther@gmail.com
Responder