12-23-2024
09:53 PM
- Marcar como novo
- Favorito
- Inscrever-se
- Emudecer
- Inscrever-se no RSS Feed
- Realçar
- Imprimir
- Relatório
12-23-2024
09:53 PM
LISP AUTOCAD - erro ao editar coordenadas de vertices de hachura
Sou bem iniciante em lisp Autocad e estou tentando criar uma rotina que permita arredondar as coordendas dos vertices de hachuras e outros elementos, até o momento consegui para quase quase todos os elementos, contudo quando implementei as hachuras apresentou o erro: no function definition: VLA-GET-LOOPS
(vl-load-com)
(defun LM:round (n)
(fix (+ n (if (minusp n) -0.5 0.5)))
)
(defun c:ArredondarCoord ()
(setq ss (ssget)) ; Seleciona entidades
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq data (entget ent))
(cond
;; Para polilinhas
((= (cdr (assoc 0 data)) "LWPOLYLINE")
(setq vertices (vl-remove-if-not '(lambda (x) (= (car x) 10)) data)) ; Filtra os vértices
(foreach ponto vertices
(setq coords (cdr ponto)) ; Obtém as coordenadas
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda as coordenadas
(setq data (subst (cons 10 nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
;; Para linhas
((= (cdr (assoc 0 data)) "LINE")
(foreach cod '(10 11) ; Pontos inicial (10) e final (11) da linha
(setq ponto (assoc cod data))
(setq coords (cdr ponto))
(setq nova-coord (mapcar 'LM:round coords))
(setq data (subst (cons cod nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
;; Para cotas
((= (cdr (assoc 0 data)) "DIMENSION")
(foreach cod '(10 11 13 14) ; Pontos relacionados às cotas
(setq ponto (assoc cod data))
(if ponto
(progn
(setq coords (cdr ponto)) ; Obtém as coordenadas
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda as coordenadas
(setq data (subst (cons cod nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
)
)
;; Para hachuras
((= (cdr (assoc 0 data)) "HATCH")
(setq hatch-obj (vlax-ename->vla-object ent)) ; Obtém o objeto de hachura
(vlax-for loop (vla-get-loops hatch-obj)
(if (vlax-property-available-p loop 'Coordinates)
(progn
(setq coords (vlax-get loop 'Coordinates)) ; Obtém os pontos do loop
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda os pontos
(vlax-put loop 'Coordinates nova-coord) ; Substitui os pontos no loop
)
)
)
)
)
;; Atualiza as entidades, exceto para hachuras (feito via API)
(if (not (= (cdr (assoc 0 data)) "HATCH"))
(progn
(entmod data) ; Modifica a entidade
(entupd ent) ; Atualiza a entidade no desenho
)
)
(setq i (1+ i))
)
(princ "\nCoordenadas arredondadas para todas as entidades selecionadas!")
)
(princ "\nNenhuma entidade válida selecionada!")
)
(princ)
)
Tentei de outra forma e funciona (codigo de baixo), contudo caso eu queira editar as bordas (limites laterais) da hachura manualmente após executar a cotina não é possivel e ela fica travada, como posso contornar esse problema:
(defun LM:round (n)
(fix (+ n (if (minusp n) -0.5 0.5)))
)
(defun c:ArredondarCoord ()
(setq ss (ssget)) ; Seleciona entidades
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq data (entget ent))
(cond
;; Para polilinhas
((= (cdr (assoc 0 data)) "LWPOLYLINE")
(setq vertices (vl-remove-if-not '(lambda (x) (= (car x) 10)) data)) ; Filtra os vértices
(foreach ponto vertices
(setq coords (cdr ponto)) ; Obtém as coordenadas
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda as coordenadas
(setq data (subst (cons 10 nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
;; Para linhas
((= (cdr (assoc 0 data)) "LINE")
(foreach cod '(10 11) ; Pontos inicial (10) e final (11) da linha
(setq ponto (assoc cod data))
(setq coords (cdr ponto))
(setq nova-coord (mapcar 'LM:round coords))
(setq data (subst (cons cod nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
;; Para cotas
((= (cdr (assoc 0 data)) "DIMENSION")
(foreach cod '(10 11 13 14) ; Pontos relacionados às cotas
(setq ponto (assoc cod data))
(if ponto
(progn
(setq coords (cdr ponto)) ; Obtém as coordenadas
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda as coordenadas
(setq data (subst (cons cod nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
)
)
;; Para hachuras
((= (cdr (assoc 0 data)) "HATCH")
;; Não alteramos diretamente os vértices, mas arredondamos os pontos de definição (se disponíveis)
(setq boundary (vl-remove-if-not '(lambda (x) (= (car x) 10)) data)) ; Pega os pontos de limite
(foreach ponto boundary
(setq coords (cdr ponto)) ; Obtém as coordenadas
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda as coordenadas
(setq data (subst (cons 10 nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
)
;; Atualiza a entidade
(entmod data)
(entupd ent)
(setq i (1+ i))
)
(princ "\nCoordenadas arredondadas para todas as entidades selecionadas!")
)
(princ "\nNenhuma entidade válida selecionada!")
)
(princ)
)
12-26-2024
06:41 AM
- Marcar como novo
- Favorito
- Inscrever-se
- Emudecer
- Inscrever-se no RSS Feed
- Realçar
- Imprimir
- Relatório
12-26-2024
06:41 AM
penso que esta tua primeira versão, ligeiramente modificada, deverá funcionar como esperado.
(vl-load-com)
(defun LM:round (n)
(fix (+ n
(if (minusp n)
-0.5
0.5
)
)
)
)
(defun c:ArredondarCoord ( / coords data ent i nova-coord ponto ss vertices)
(setq ss (ssget '((0 . "LWPOLYLINE,HATCH,LINE,DIMENSION")))) ; Seleciona entidades
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq data (entget ent))
(cond
;; Para polilinhas e hatch
((wcmatch (cdr (assoc 0 data)) "LWPOLYLINE,HATCH")
(setq vertices (vl-remove-if-not '(lambda (x) (= (car x) 10)) data)) ; Filtra os vértices
(foreach ponto vertices
(setq coords (cdr ponto)) ; Obtém as coordenadas
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda as coordenadas
(setq data (subst (cons 10 nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
;; Para linhas
((= (cdr (assoc 0 data)) "LINE")
(foreach cod '(10 11) ; Pontos inicial (10) e final (11) da linha
(setq ponto (assoc cod data))
(setq coords (cdr ponto))
(setq nova-coord (mapcar 'LM:round coords))
(setq data (subst (cons cod nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
;; Para cotas
((= (cdr (assoc 0 data)) "DIMENSION")
(foreach cod '(10 11 13 14) ; Pontos relacionados às cotas
(setq ponto (assoc cod data))
(if ponto
(progn
(setq coords (cdr ponto)) ; Obtém as coordenadas
(setq nova-coord (mapcar 'LM:round coords)) ; Arredonda as coordenadas
(setq data (subst (cons cod nova-coord) ponto data)) ; Substitui coordenadas no grupo de códigos
)
)
)
)
)
;; Atualiza as entidades
(entmod data) ; Modifica a entidade
(setq i (1+ i))
)
(princ "\nCoordenadas arredondadas para todas as entidades selecionadas!")
)
(princ "\nNenhuma entidade válida selecionada!")
)
(princ)
)
Espero que ajude
Henrique