higorigorsantosGUBFF
67 Exibições, 1 Resposta

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)
)

 

 

 

 

 

Marcas (1)
Etiquetas (3)
hmsilva
em resposta a: higorigorsantosGUBFF

Olá @higorigorsantosGUBFF 

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

EESignature