Aller au contenu

Repositionner des entités (Texte, Attribut...) sur la Grille de Résolution


Messages recommandés

Posté(e)

Comme je le précise dans le sujet, je suis à la recherche d'un programme lisp, VBA ou autre qui permettrait de repositionner des entités Autocad tel que Texte, Attribut ... sur le pas de grille de résolution donné, soi le point d'accrochage d'un Objet sur le point le plus près du Pas de Résolution d'une Grille. Le but est donc de remettre sur le pas de Grille des entités Autocad qui se trouvent n'importe ou dans l'espace (Résolution corrompu suite à désactivation du Mode d'Accrochage - Touche F9)

Ca doit bien exister (?) ... mes recherches sont veines :(

Merci d'Avance

:)

Posté(e)

Bon finalement j'ai trouvé des choses interressantes dans les sujets :

- "lisp pour accrocher extremites à une grille"

- "lisp de rêve"

... qui permettent de raccrocher des entités Autocad sur le pas de Grille Résol.

Dommage que pour les blocs avec Attributs, ceux-ci ne suivent pas le déplacement ... soi toutes les entités faisant parti du bloc , du point d'insertion du bloc sur le pas de Grille le plus proche. Le lisp aurait été vraiment à la perfection. Mais c'est déjà super quand vous reçevez des dwg sans résol.

 

Merci à gile, bonuscad, blizard, ... et dis donc Didier, va voir t'avais fait des commentaires toi aussi, tu avais donc tremper dedans.

 

Dom :)

Posté(e)

Salut

 

Ben, c'est noël :D

 

(defun c:aro(/ bl doc ent pas_x pas_y round)

 ;;; ROUND (gile)
 ;;; Arrondit à la valeur la plus proche en fonction de prec
 ;;; (round pi 0.01) -> 3.14
 ;;; (round pi 1e-5) -> 3.14159
 ;;; (round 5456.50 1) -> 5457
 ;;; (round 5456.50 100.0) -> 5500.0

 (defun round (num prec)
   (if (zerop (setq prec (abs prec)))
     num
     (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5)))
   )
 )

 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (setq pas_x (car  (getvar "gridunit"))
pas_y (cadr (getvar "gridunit"))
 )
 (vlax-for bl (vla-get-blocks doc)
   (and (eq (vla-get-islayout bl) :vlax-true)
     (vlax-for ent bl
(cond
  ((member (vla-get-objectname ent) '("AcDbArc" "AcDbEllipse" "AcDbLine"))
    (setq pt1 (vlax-get ent 'startpoint))
    (vlax-put ent 'startpoint (list (round  (car pt1) pas_x)
				    (round (cadr pt1) pas_y)
				    (caddr pt1)
			      )
    )
    (setq pt1 (vlax-get ent 'endpoint))
    (vlax-put ent 'endpoint (list   (round  (car pt1) pas_x)
				    (round (cadr pt1) pas_y)
				    (caddr pt1)
			      )
    )
  )
  ((eq (vla-get-objectname ent) "AcDbSpline")
    (setq pt1 (vlax-get ent 'starttangent))
    (vlax-put ent 'starttangent (list (round  (car pt1) pas_x)
				      (round (cadr pt1) pas_y)
				      (caddr pt1)
				)
    )
    (setq pt1 (vlax-get ent 'endtangent))
    (vlax-put ent 'endtangent (list   (round  (car pt1) pas_x)
				      (round (cadr pt1) pas_y)
				      (caddr pt1)
			      )
    )
  )
  ((eq (vla-get-objectname ent) "AcDbCircle")
    (setq pt1 (vlax-get ent 'center))
    (vlax-put ent 'center (list (round  (car pt1) pas_x)
				(round (cadr pt1) pas_y)
				(caddr pt1)
			  )
    )
  )
  ((eq (vla-get-objectname ent) "AcDbPolyline")
    (vlax-put ent 'coordinates
		  (mapcar '(lambda(a / b)
			    (if b
			      (progn
				(setq b nil)
				(round a pas_y)
			      )
			      (progn
				(setq b T)
				(round a pas_x)
			      )
			    )
			  )
			  (vlax-get ent 'coordinates)
		  )
    )
  )
  ((member (vla-get-objectname ent) '("AcDbBlockReference" "AcDbText" "AcDbMText"))
    (setq pt1 (vlax-get ent 'insertionpoint))
    (vlax-put ent 'insertionpoint (list (round  (car pt1) pas_x)
					(round (cadr pt1) pas_y)
					(caddr pt1)
				  )
    )
  )
)
     )
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

@+

 

[Edité le 15/12/2009 par Patrick_35]

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci pour le rappel concernant la commande ATTSYNC (que j'utilise souvent en plus) ou BATTMAN (Très pratique aussi)

 

Heu .. suis pas un expert en Lisp :P

C'est quoi celui-ci ... de Patrick_35 ... et comment on le lance

A quoi il sert?

A recadrer les cercles ? :exclam:

 

Quand je le démarre la commande, ça me donne :

 

Commande: aro

; erreur: no function definition: VLAX-GET-ACAD-OBJECT

 

... j'ai oublié quelque chose ? :o

 

 

Posté(e)

??? J'ai bien intercalé la ligne comme ci après :

 

(defun c:aro(/ bl doc ent pas_x pas_y round)

(vl-load-com)

 

;;; ROUND (gile)

... etc

 

 

Mais cette fois rien ne se passe (?)

Voilà ce que j'obtiens :

 

Commande: aro

 

Commande:

 

:(

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité