Aller au contenu

Amélioration du lisp move-att.lsp


Messages recommandés

Posté(e)

Ho la !!

C'est quoi cette histoire de fous :casstet: :casstet:

Sur certaine 2007, ça fonctonne, sur d'autres (MAP), ça plante.

Sur certaines 2008, ça fonctionne, sur d'autre, ça plante.

Sur certaine 2009, ça plante, sur d'autre ça fonctionne mal...

 

Ça ne vient peut-être pas des versions, ils ont des trucs spéciaux vos attributs ???!!!...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci lili2006,

 

J'ai réussi à localiser des erreurs avec ton fichier (comme quoi ça fonctionnait pas si bien) il semblerait que ça vienne de la propriété TextAlignmentPoint suivant la justification des textes d'attribut.

J'ai modifié le code Réponse 22

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

 

Hello Gilles

 

Super, ca marche maintenant sur mon MAP 2008 :) :D

 

J'ai pas encore testé sur MAP 2007, mais j'ai confiance :P

 

Gilles, je te salue "bien bas" pour la qualité de tes développements et ta réactivité ;)

 

Très subtil le fait de transformer l'attribut en texte temporairement pour pouvoir visualiser

dynamiquement le déplacement du texte :cool:

 

Le Decapode (qui te remercie)

 

Autodesk Expert Elite Team

Posté(e)

J'ai apporté une nouvelle petite modification pour que l'affichage soit cohérent dans les SCU 3d (pivotés sur les axes X et/ou Y)

 

Merci à tous les testeurs ;)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

J'ai pu testé la dernière modification envoyée par Gilles et ça fonctionne bien maintenant chez moi avec AutoCAD Map 2008.

 

C'était plus que quelques lignes qu'il fallait rajouter au code d'origine.

 

Merci à Gilles.

 

Si le lisp fonctionne chez tous les testeurs, je pense que l'on peut clôturer le sujet ?

 

Bonne journée.

 

PHP

Posté(e)

C'était plus que quelques lignes qu'il fallait rajouter au code d'origine.

Encore faut-il les trouver.

 

La variable DRAGMODE est-elle bien à 2 ?

J'y ai pensé ce matin. Je vérifie ce soir et je redis.

Devais être fatigué hier soir.

 

@+

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)

Voilà une version finalisée, renommée MoveAtt.

 

J'ai supprimé les tests qui me semblaient désormais inutiles.

J'ai ajouté des contrôles pour couvrir toutes les justifications (y compris aligné et ajuster)

J'ai regroupé les 2 LISP en un seul : à la première invite "Sélectionnez un attribut ou [bloc] : " l'utilisateur peut choisir de sélectionner les attributs un par un (comme move_att) ou faire Entrée, Espace ou entrer "b" pour pour sélectionner les attributs par bloc (comme move-att).

 

EDIT : Contrôle des calques

 

;; MOVEATT (gile) 07/05/08
;; Déplace les attributs
;; Par défaut l'utilisateur sélectionne les attributs un par un
;; L'option "Bloc" permet de déplacer tous les attributs des blocs sélectionnés

(defun c:MoveAtt
      (/ space att lst1 lst2 ss1 ss2 tmp cl lay lck txt al p1 p2)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (initget "Bloc")
 (setq att (nentsel "\nSélectionnez un attribut ou [bloc] [b]: "))
 (if (or (null att) (= att "Bloc"))
   (if	(ssget '((0 . "INSERT") (66 . 1)))
     (vlax-for	blk (setq ss1 (vla-get-ActiveSelectionSet *acdoc*))
(setq lst1 (append (vlax-invoke blk 'getAttributes) lst1))
     )
   )
   (progn
     (and
(setq att (car att))
(= (cdr (assoc 0 (entget att))) "ATTRIB")
(setq lst1 (cons (vlax-ename->vla-object att) lst1))
(redraw att 3)
     )
     (while (setq att (car (nentsel "\nSélectionnez un attribut: ")))
(and
  (= (cdr (assoc 0 (entget att))) "ATTRIB")
  (setq lst1 (cons (vlax-ename->vla-object att) lst1))
  (redraw att 3)
)
     )
   )
 )
 (if lst1
   (progn
     (vla-StartUndoMark *acdoc*)
     (setq space (if (= 1 (getvar "cvport"))
	    (vla-get-PaperSpace *acdoc*)
	    (vla-get-ModelSpace *acdoc*)
	  )
    ss2	  (ssadd)
    tmp	  (vla-add (vla-get-Layers *acdoc*) "MoveAtt_tmp")
    cl	  (vla-get-ActiveLayer *acdoc*)
     )
     (vla-put-ActiveLayer *acdoc* tmp)
     (foreach a lst1
(setq lay (vla-item (vla-get-Layers *acdoc*) (vla-get-Layer a)))
(and (= (vla-get-Lock lay) :vlax-true)
     (setq lck (cons lay lck))
     (vla-put-Lock lay :vlax-false)
)
(setq txt
       (vla-addText
	 space
	 (vla-get-TextString a)
	 (vla-get-InsertionPoint a)
	 (vla-get-Height a)
       )
)
(foreach prop '(Backward       Linetype	      LinetypeScale
		Normal	       ObliqueAngle   Rotation
		ScaleFactor    StyleName      Thickness
		TrueColor      UpsideDown
	       )
  (vlax-put-property txt prop (vlax-get-property a prop))
)
(setq al (vla-get-Alignment a))
(vla-put-Alignment txt al)
(and (member al '(0 3 5))
     (vla-put-InsertionPoint
       txt
       (vla-get-InsertionPoint a)
     )
)
(or (= 0 al)
    (vla-put-TextAlignmentPoint
      txt
      (vla-get-TextAlignmentPoint a)
    )
)
(setq ss2  (ssadd (vlax-vla-object->ename txt) ss2)
      lst2 (cons txt lst2)
)
     )
     (if
(not
  (vl-catch-all-error-p
    (vl-catch-all-apply
      (function
	(lambda	()
	  (setq p1 (getpoint "\nSpécifiez le point de base: "))
	  (vl-cmdf "_.move" ss2 "" p1 pause)
	  (setq p2 (getvar "lastpoint"))
	)
      )
    )
  )
)
 (mapcar
   (function
     (lambda (a)
       (vla-move a
		 (vlax-3d-point (trans p1 1 0))
		 (vlax-3d-point (trans p2 1 0))
       )
     )
   )
   lst1
 )
     )
     (vla-put-ActiveLayer *acdoc* cl)
     (mapcar 'vla-delete lst2)
     (vla-delete tmp)
     (mapcar (function (lambda (x) (vla-put-Lock x :vlax-true)))
      lck
     )
     (vla-EndUndoMark *acdoc*)
   )
 )
 (princ)
) 

[Edité le 6/5/2008 par (gile)]

 

[Edité le 8/5/2008 par (gile)]

  • Like 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Mince, je pensais avoir réglé la question.

 

si tu fais :

(setq ss2 (ssget))
(setq p1 (getpoint "\nSpécifiez le point de base: "))
(vl-cmdf "_.move" ss2 "" p1 pause)
(setq p2 (getvar "lastpoint")) 

tu vois les objets se délacer ?

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bien, ça explique le pourquoi du comment, et ça me fait dire que s'il avait été verrouillé ça aurait provoqué une erreur.

Je vais modifier le LISP pour contrôler tout ça...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Voilà, si des attributs étaient sur des calques verrouillés, ceux-ci seront déverrouillés le temps du déplacement, et les textes temporaires sont créés sur un nouveau calque lui aussi temporaire.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

 

Hello

 

J'ai testé aussi sur un MAP 2004, ça fonctionne Nickel-Chrome ! :) :D

 

et comme d'hab, c'est du Grand Gilles :cool: :P

 

Le Decapode

 

Autodesk Expert Elite Team

  • 4 semaines après...
Posté(e)

Salut (gile),

je pense que tu dois connaitre, mais on ne sait jamais...

 

(vl-cmdf "_.move" ss2 "" p1 pause)

 

Vu que c'est une commande express, tu veux certainement pas l'utiliser, mais connais tu la commande acet-ss-drag-move ?

(c'est une commande "dll" des express : dans l'editeur, elle passe en bleu.)

 

Trouvé dans Afralisp :

(acet-ss-drag-move ss pt [prompt] [highlight [cursor]])

 

Drag a selection set to change location.

 

Arguments

ss: The selection set to drag.

pt: The base point.

prompt: A message to display before dragging is started.

highlight: If given, causes a rubber-band line to be drawn from pt to the current cursor position while dragging; this parameter can be nil to draw a rubber-band line in the inverse of the screen color, or non-nil to draw a highlighted line.

cursor: The cursor form to display while dragging (0=crosshairs, 1=no cursor, 2=target).

 

Return Values

Normally returns the selected point, but will honor initget settings and can return arbitrary text or keywords. Returns nil if the dragging operation is aborted.

 

Note:

The acet-ss-drag-move function does not move the selection set, but allows selection of a new position while showing how the result will appear.

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

C'est super pratique ce lisp....car je doid souvent deplacer mes attributs.

 

Mais est-ce possible de faire une rotation des attributs avec le lisp? ;)

 

Merci les pros!!

  • 13 ans après...
Posté(e)

Bonjour,

Super Lisp, quelqu'un serait-il capable de le modifier pour que lorsque on sélectionne l'attribut le point 1 soit directement sélectionner sur un des coin de l'attribut cela éviterait beaucoup de clic souris 🙂

Merci

 

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é