Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Demande update Lisp XY Patrick_35

9 RÉPONSES 9
RÉSOLU
Répondre
Message 1 sur 10
duplanf
982 Visites, 9 Réponses

Demande update Lisp XY Patrick_35

Bonjour la communauté Autodesk France,

Je travaille en bureau d’étude structure béton, mon parcours professionnel m’a appris à utiliser les base d’Autocad 2D et qu’il y a autant de manière d’utiliser le programme qu’il y a d’utilisateur, hélas je n’ai pas appris le Lisp que j’ai découvert il y a quelques semaines.

 

Je suis persuadé que dans mon domaine nous n’utilisons pas les capacités du logiciel, la preuve en est en parcourant ce forum. Nos clients, essentiellement des maçons nous demandent des éléments que nous n’avions pas l’habitude de donner auparavant, dans mon cas des coordonnées XY suivant un point 0.

 

J’ai trouvé la Lisp de Patrick_35 qui répond à mes attentes suivant ce post de 2005 (https://forums.autodesk.com/t5/autocad-francais/bloc-avec-en-attribut-ses-coordonnees-xy/td-p/145432...), oui je déterre un vieux sujet. Mon bloc reprend les mêmes étiquettes du poste c-a-d :

« Nom du bloc: XY
1ere etiquette: Numero (c est le numero du point que je defini a l insertion du bloc)
2eme etiquette: X (coordonnee X du point d insertion du bloc)
3 eme etiquette :Y (coordonnee Y du point d insertion du bloc) »

 

Je compte reprendre cette Lisp, sauf si je ne me trompe, car cette méthode me semble plus simple qu’un bloc composé d’un point plus du texte avec un champ (lors de mes essaies, le bloc ne se mettait pas à jour malgré des Regens ou la commande Explose, et le texte n’était pas déplaçable comme peuvent l’être les étiquettes).

 

Le code est le suivant (toujours d’après le post indiqué):

(defun Attributs_xyz(Rea Cde / bl js js1 n xyz)
  (cond
    ((or (eq (car Cde) "MOVE") (eq (car Cde) "STRETCH"))
      (setq js (ssget "_p"))
    )
    ((eq (car Cde) "INSERT")
      (setq js (ssadd))
      (ssadd (entlast) js)
    )
    ((or (eq (car Cde) "UCS") (eq (car Cde) "COPY") (eq (car Cde) "GRIP_MOVE") (eq (car Cde) "GRIP_STRETCH"))
      (setq js (ssget "x" (list (cons 0 "INSERT") (cons 2 "XY"))))
    )
  )
  (if js
    (progn
      (setq n 0)
      (while (ssname js n)
        (setq bl (entget (ssname js n)))
        (if (and (eq (cdr (assoc 0 bl)) "INSERT") (eq (strcase (cdr (assoc 2 bl))) "XY"))
          (if (cdr (assoc 66 bl))
            (progn
              (setq xyz (trans (cdr (assoc 10 bl)) (cdr (assoc -1 bl)) 1))
              (while (not (eq (cdr (assoc 0 bl)) "SEQEND"))
                (if (eq (cdr (assoc 0 bl)) "ATTRIB")
                  (cond
                    ((eq (strcase (cdr (assoc 2 bl))) "X")
                      (setq bl (subst (cons 1 (rtos (car xyz))) (assoc 1 bl) bl))
                      (entmod bl)
                      (entupd (cdr (assoc -1 bl)))
                    )
                    ((eq (strcase (cdr (assoc 2 bl))) "Y")
                      (setq bl (subst (cons 1 (rtos (cadr xyz))) (assoc 1 bl) bl))
                      (entmod bl)
                      (entupd (cdr (assoc -1 bl)))
                    )
                  )
                )
                (setq bl (entget (entnext (cdr (assoc -1 bl)))))
              )
            )
          )
        )
        (setq n (1+ n))
      )
    )
  )
  (princ)
)

(defun c:spt(/ i j n)
  (if (vlr-reactors :vlr-Command-Reactor)
    (progn
      (setq n 1)
      (while (setq i (nth n (car (vlr-reactors :vlr-Command-Reactor))))
        (if (eq (cdr (car (vlr-reactions i))) 'ATTRIBUTS_XYZ)
          (setq j i)
        )
        (setq n (1+ n))
      )
      (if j
        (vlr-remove j)
      )
      (if mrea_mpt
        (princ "\n\tDésactivation de la mise à jour XY du bloc XY.")
      )
      (setq mrea_mpt nil)
    )
  )
  (princ)
)

(defun c:mpt()
  (if (not mrea_mpt)
    (progn
      (c:spt)
      (setq mrea_mpt (vlr-command-reactor nil '((:vlr-commandEnded . Attributs_xyz))))
      (princ "\n\tActivation de de la mise à jour XY du bloc XY.")
    )
    (princ "\n\tLa mise à jour XY du bloc XY est déjà activée.")
  )
  (princ)
)

(vl-load-com)
(princ "\n\tPour activer la mise à jour XY du bloc XY, lancez la commande MPT.\n\tPour revenir à la normale, faites la commande SPT.")
(princ)

 

Ma demande est la suivante et paraît simple au premier abord que l’on connaisse ou pas le Lisp. Je souhaite avoir respectivement avant les abscisses et les ordonnées le préfix « x : » et « y : ».

 

Je vous remercie d’avance.

9 RÉPONSES 9
Message 2 sur 10
patrick_35
en réponse à: duplanf

Salut

 

Il n'est plus tout jeune le lisp Smiley heureux

 

Tu remplaces

(cons 1 (rtos (car xyz)))

par

(strcat "x : " (cons 1 (rtos (car xyz))))


et

(cons 1 (rtos (cadr xyz))

par

(strcat "y : " (cons 1 (rtos (cadr xyz)))

@+

Message 3 sur 10
duplanf
en réponse à: patrick_35

En remplacant le code soumis, puis en le chargeant dans Autocad (v2015 Full) j'ai le message d'erreur suivant:

"Commande: (LOAD "C:/Users/f.duplan/Documents/ABAK/Autocad/mpt.lsp") ; erreur: structure incorrecte de la liste en entrée"

 

J'ai la portion de code suivante après avoir remplacé l'ancien:

 

                  (cond
                    ((eq (strcase (cdr (assoc 2 bl))) "X")
                      (setq bl (subst (strcat "x : " (cons 1 (rtos (car xyz))) (assoc 1 bl) bl))
                      (entmod bl)
                      (entupd (cdr (assoc -1 bl)))
                    )
                    ((eq (strcase (cdr (assoc 2 bl))) "Y")
                      (setq bl (subst (strcat "y : " (cons 1 (rtos (cadr xyz))) (assoc 1 bl) bl))
                      (entmod bl)
                      (entupd (cdr (assoc -1 bl)))
                    )
                  )

 

Merci de vos réponses.

 

Message 4 sur 10
patrick_35
en réponse à: duplanf

Regarde bien ma réponse et ton copier/coller. Il te manque à chaque fois une parenthèse fermante. il faut 4 parenthèses après

xyz))))

 

 

LISP : Lost In Stupid Parenthesis

 

 

@+

Message 5 sur 10
duplanf
en réponse à: patrick_35

Effectivement, c'est bien "Lost In Stupid Parenthesis" mais ce message "Spécifiez le point d'insertion ou [Pointdebase/Echelle/X/Y/Z/rOtation]: ; erreur: type d'argument incorrect: stringp (1 . "186.2")" que signifie t'il ?

Le bloc est bien inséré mais les coordonnées n'aparaissent pas, et ne se mettent pas à jour lorsque que je déplace le bloc donc est-ce mon bloc ou bien la LISP ?

J'ai bien peur de ne pas avoir fair une nouvelle fois la bonne manip quelque part.

Message 6 sur 10
Kevin_Megel
en réponse à: patrick_35


patrick_35 a écrit :

LISP : Lost In Stupid Parenthesis


Smiley très heureux Smiley très heureux Smiley très heureux Smiley très heureux

 

un peux tout les code c'est comme ça non ?

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

Message 7 sur 10
patrick_35
en réponse à: Kevin_Megel

Salut

Oui, du moins pour les lisps car on est très vite perdu avec toutes ces parenthèses.Smiley tirant la langue


Le lisp est un langage intelligent car on peut jouer avec les fonctions et les variables comme dans cet exemple

(mapcar '(lambda(x)(set_tile x (eval (read x)))) '("titr" "nbin" "ipas" "ind0")) ; Les variables sont les mêmes que dans la boite de dialogue


Ou encore, une fonction qui apprend

 

@duplanf  Je ne t'oublie pas, j'ai juste une urgence


@+

Message 8 sur 10
Kevin_Megel
en réponse à: patrick_35

ARf je comprend mieux le python !

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

Message 9 sur 10
patrick_35
en réponse à: duplanf

Salut

 

Je viens de tester avec le code modifié et tout fonctionne

 

Le code au cas où

(defun Attributs_xyz(Rea Cde / bl js js1 n xyz)
  (cond
    ((or (eq (car Cde) "MOVE") (eq (car Cde) "STRETCH"))
      (setq js (ssget "_p"))
    )
    ((eq (car Cde) "INSERT")
      (setq js (ssadd))
      (ssadd (entlast) js)
    )
    ((or (eq (car Cde) "UCS") (eq (car Cde) "COPY") (eq (car Cde) "GRIP_MOVE") (eq (car Cde) "GRIP_STRETCH"))
      (setq js (ssget "x" (list (cons 0 "INSERT") (cons 2 "XY"))))
    )
  )
  (if js
    (progn
      (setq n 0)
      (while (ssname js n)
        (setq bl (entget (ssname js n)))
        (if (and (eq (cdr (assoc 0 bl)) "INSERT") (eq (strcase (cdr (assoc 2 bl))) "XY"))
          (if (cdr (assoc 66 bl))
            (progn
              (setq xyz (trans (cdr (assoc 10 bl)) (cdr (assoc -1 bl)) 1))
              (while (not (eq (cdr (assoc 0 bl)) "SEQEND"))
                (if (eq (cdr (assoc 0 bl)) "ATTRIB")
                  (cond
                    ((eq (strcase (cdr (assoc 2 bl))) "X")
                      (setq bl (subst (cons 1 (strcat "X:" (rtos (car xyz)))) (assoc 1 bl) bl))
                      (entmod bl)
                      (entupd (cdr (assoc -1 bl)))
                    )
                    ((eq (strcase (cdr (assoc 2 bl))) "Y")
                      (setq bl (subst (cons 1 (strcat "Y:" (rtos (cadr xyz)))) (assoc 1 bl) bl))
                      (entmod bl)
                      (entupd (cdr (assoc -1 bl)))
                    )
                  )
                )
                (setq bl (entget (entnext (cdr (assoc -1 bl)))))
              )
            )
          )
        )
        (setq n (1+ n))
      )
    )
  )
  (princ)
)

(defun c:spt(/ i j n)
  (if (vlr-reactors :vlr-Command-Reactor)
    (progn
      (setq n 1)
      (while (setq i (nth n (car (vlr-reactors :vlr-Command-Reactor))))
        (if (eq (cdr (car (vlr-reactions i))) 'ATTRIBUTS_XYZ)
          (setq j i)
        )
        (setq n (1+ n))
      )
      (if j
        (vlr-remove j)
      )
      (if mrea_mpt
        (princ "\n\tDésactivation de la mise à jour XY du bloc XY.")
      )
      (setq mrea_mpt nil)
    )
  )
  (princ)
)

(defun c:mpt()
  (if (not mrea_mpt)
    (progn
      (c:spt)
      (setq mrea_mpt (vlr-command-reactor nil '((:vlr-commandEnded . Attributs_xyz))))
      (princ "\n\tActivation de de la mise à jour XY du bloc XY.")
    )
    (princ "\n\tLa mise à jour XY du bloc XY est déjà activée.")
  )
  (princ)
)

(vl-load-com)
(princ "\n\tPour activer la mise à jour XY du bloc XY, lancez la commande MPT.\n\tPour revenir à la normale, faites la commande SPT.")
(princ)

@+

Message 10 sur 10
duplanf
en réponse à: patrick_35

Merci beaucoup.

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report