Resposta a:
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