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 : 

Problème entre macro et lisp sur Autocad 2016

8 RÉPONSES 8
RÉSOLU
Répondre
Message 1 sur 9
newboy2007
953 Visites, 8 Réponses

Problème entre macro et lisp sur Autocad 2016

Bonjour à tous,

 

Il m'arrive régulièrement de faire des associations entre scripts-lisps-macro, chacun ayant ses avantages et inconvénients.

Chez moi, un lisp peu donc lancer un script, une macro peu lancer un lisp, etc...

 

 

Hors, je suis actuellement sur une macro qui doit lancer un lisp (un lisp qui permet l'insertion d'un bloc externe à l'endroit du clic).

 

J'ai donc enregistré avec la macro les divers endroit à cliquer mais quand je relance celle-ci, elle bloque dès la premier insertion redemandant le/les points à cliquer, comme si le "get point" n'arrivait pas à s'enregistrer dans la macro.

 

 

Voici le code ci dessous, que j'ai trouvé sur ce forum, je ne connais que la base de lisp.

 

Un grand merci à celui-qui pourra ma débloquer 😉

 

 

(vl-load-com)
(defun trunc (xr / )
  (itoa (fix (/ xr 1000.0)))
)
(defun c:UB ( / ent_text dxf_ent key file_name folder)
  (setq ent_text
    (entmakex
      (list
        (cons 0 "MTEXT")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbMText")
        (cons 1 "")
        (cons 10 (trans (getvar "VIEWCTR") 0 1))
        (cons 40 (/ (getvar "VIEWSIZE") 75.0));
        (cons 50 (- 0 (getvar "VIEWTWIST")))
        (cons 62 250)
        (cons 71 7)
        (cons 72 5)
        (cons 90 1)
        (cons 63 255)
        (cons 45 1.5)
      )
    )
    dxf_ent (entget ent_text)
  )
  (while (and (setq key (grread T 4 0)) (/= (car key) 3))
    (cond
      ((eq (car key) 5)
        (setq
          file_name (strcat (trunc (caadr key)) (trunc (cadadr key)) ".dwg")
          dxf_ent (subst (cons 10 (trans (cadr key) 1 0)) (assoc 10 dxf_ent) dxf_ent)
          dxf_ent (subst (cons 1 (strcat "{\\fArial;" file_name "}" )) (assoc 1 dxf_ent) dxf_ent)
          dxf_ent (subst (cons 40 (/ (getvar "VIEWSIZE") 75.0)) (assoc 40 dxf_ent) dxf_ent)
        )
        (entmod dxf_ent)
      )
    )
  )
  (cond
    ((eq (car key) 3)
      (entdel ent_text)
      (setq folder "G:/01Urbis/UrBIS_2016/dwg/") ;;;;;;;;;;;;;;;;;;<<<
      (if (findfile (strcat folder file_name))
        (progn
          (princ (strcat "\nOuvre le fichier: " (strcat folder file_name)))
	  (command "-inserer" (strcat folder file_name) "0,0,0" "1" "1" "0") ;;;;;;;;;;;;;;;;;;<<<
       )
        (princ (strcat "\nLe fichier " (strcat folder file_name) " est inexistant!"))
      )
    )
  )
  (prin1)
)

 

8 RÉPONSES 8
Message 2 sur 9
DenisHen
en réponse à: newboy2007

Bonjour.

 

Je ne trouve pas le getpoint...

Message 3 sur 9
newboy2007
en réponse à: DenisHen

Effectivement,

 

Il n'y pas de getpoint dans ce lisp (ce n'ai pas moi qui l'ai programmé), il doit être remplacé par autre chose d'équivalent à mon avis.

 

J'ai pris l'exemple du getpoint parce que j'ai l'impression que cela bloque au niveau de l'enregistrement de "l'endroit du clic".

 

 

Je rappelle que le lisp fonctionne très bien tout seul, mais dès qu'il est enregistré dans une macro, il se bloque et demande où il faut cliquer 😕

 

 

Comme si la macro n'aimait pas le lisp, une partie du code ou une fonction présent dans celui-ci...

 

Message 4 sur 9
DenisHen
en réponse à: newboy2007

Non non, il n'y a pas de getpoint et il n'y a rien qui le remplace... Essaye ça :

(vl-load-com)
(defun trunc (xr / )
  (itoa (fix (/ xr 1000.0)))
)
(defun c:UB ( / ent_text dxf_ent key file_name folder)
  (setq ent_text
    (entmakex
      (list
        (cons 0 "MTEXT")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbMText")
        (cons 1 "")
        (cons 10 (trans (getvar "VIEWCTR") 0 1))
        (cons 40 (/ (getvar "VIEWSIZE") 75.0));
        (cons 50 (- 0 (getvar "VIEWTWIST")))
        (cons 62 250)
        (cons 71 7)
        (cons 72 5)
        (cons 90 1)
        (cons 63 255)
        (cons 45 1.5)
      )
    )
    dxf_ent (entget ent_text)
  )
  (while (and (setq key (grread T 4 0)) (/= (car key) 3))
    (cond
      ((eq (car key) 5)
        (setq
          file_name (strcat (trunc (caadr key)) (trunc (cadadr key)) ".dwg")
          dxf_ent (subst (cons 10 (trans (cadr key) 1 0)) (assoc 10 dxf_ent) dxf_ent)
          dxf_ent (subst (cons 1 (strcat "{\\fArial;" file_name "}" )) (assoc 1 dxf_ent) dxf_ent)
          dxf_ent (subst (cons 40 (/ (getvar "VIEWSIZE") 75.0)) (assoc 40 dxf_ent) dxf_ent)
        )
        (entmod dxf_ent)
      )
    )
  )
  (cond
    ((eq (car key) 3)
      (entdel ent_text)
      (setq folder "G:/01Urbis/UrBIS_2016/dwg/") ;;;;;;;;;;;;;;;;;;<<<
      (if (findfile (strcat folder file_name))
        (progn
          (princ (strcat "\nOuvre le fichier: " (strcat folder file_name)))
          (setq Pt (getpoint "Cliquer le point d'insertion du bloc"))
	  (command "-inserer" (strcat folder file_name) Pt "1" "1" "0") ;;;;;;;;;;;;;;;;;;<<<
       )
        (princ (strcat "\nLe fichier " (strcat folder file_name) " est inexistant!"))
      )
    )
  )
  (prin1)
)

Je fais ça vite fait, dis-moi si ça fonctionne...

Message 5 sur 9
CADaSchtroumpf
en réponse à: newboy2007

Bonjour,

 

En effet je reconnais ce code.Smiley clignant de l'œil

Il sert à faire des insertions géo référencées quand les noms de fichiers comportent ces informations.

Donc le lisp sert à générer les coordonnées arrondies à la position du curseur; dès que le curseur change de zone référencée, les coordonnées changent.

 

Tu veux utiliser un script pour fournir les points (sont ils déjà préfixés correctement?)

Malheureusement une particularité (sous les versions pleines seulement) est que la fonction lisp (grread) arrive à prendre la main sur un script. C'est une fonction puissante d'analyse de saisie sur un périphérique extérieur.

 

Donc la solution la plus simple est d'écrire le lisp en vue de cette utilisation, c'est à dire une fonction avec argument (qui ici serait un point) et de ne plus faire appel à (grread) pour obtenir ce point.

 

Es tu capable de faire cette modification?

Message 6 sur 9
newboy2007
en réponse à: CADaSchtroumpf

Bonjour Cadastroumpf,

 

Je me demande si tu ne m'avais pas aidé à l'époque pour ce même code ? 🙂

 

Mon souci :

 

- Je m'enregistre (macro) en train de cliquer plusieurs points à l'écran avec le lisp ci dessus. Les blocs s'insère bien. j'arrête l'enregistrement de la macro.

- Jusqu'ici tout ca bien !

- Je relance le tout en faisant une lecture de la macro, cela bloque directement, me redemandant de recliquer 

 

Bref, la macro n'effectue pas la procédure enregistrée complètement et je ne sais pas pourquoi. 

 

Peut-être que la macro n'aime pas la fonction grread, et qu'en remplacant avec getpoint y aurait pas de souci (vu que j'ai déjà fait ce genre de chose avec des lisp contenant getpoint sans souci).

 

Malheureusement, je peux bidouillé un code lisp pour l'adapter mais là c'est un niveau élévé (faut rogner des coordonnées, etc.) 😕

 

Merci à toi,

 

 

Message 7 sur 9
newboy2007
en réponse à: DenisHen

Merci pour ton post DenisHen,

 

En fait la fonction getpoint rentre en conflit avec la fonction grread.

 

Faudrait que j'arrive à remplacer l'un par l'autre

Message 8 sur 9
CADaSchtroumpf
en réponse à: newboy2007

En effet comme je l'ai déjà dit, les scripts ou l'enregistreur d'action (dans ton cas) n'aime pas la fonction (grread)

 

Donc il va falloir te résoudre à utiliser une version épurée. Avec celle-ci il faudra que tu soit sûr de tes points, afin qu'une fois tronqués ils ne retourne pas le même résultat et crée ainsi des doublons.

 

Sans pouvoir tester, la version épurée à utiliser pour pouvoir en faire une macro avec l'enregistreur d'action.

(defun trunc (xr / )
  (itoa (fix (/ xr 1000.0)))
)
(defun C:UB ( / pt file_name folder)
  (setq
    pt (getpoint "\nDonner un point: ")
    file_name (strcat (trunc (car pt)) (trunc (cadr pt)) ".dwg")
    folder "G:/01Urbis/UrBIS_2016/dwg/"
  )
  (if (findfile (strcat folder file_name))
    (progn
      (princ (strcat "\nOuvre le fichier: " (strcat folder file_name)))
      (command "_.-insert" (strcat folder file_name) "0,0,0" "1" "1" "0")
    )
    (princ (strcat "\nLe fichier " (strcat folder file_name) " est inexistant!"))
  )
  (prin1)
)

 

Message 9 sur 9
newboy2007
en réponse à: CADaSchtroumpf

Alleluia...

 

C'était bien ça. Effectivement, en relisant la macro d'actions aucun point cliqué n'apparaissait.

 

Avec getpoint plus de souci. Tout fonctionne.

 

Je vais pouvoir arrêter de m'arracher les cheveux...

 

Encore merci Merci CadaSchtoumph et DenisHen pour votre temps et votre patience 😉

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

Publier dans les forums