LISP AUTOCAD - Fonction "if" - Utilisation comme condition d'une valeur fournis par AutoCAD

LISP AUTOCAD - Fonction "if" - Utilisation comme condition d'une valeur fournis par AutoCAD

thomas_longuet
Contributor Contributor
981 Visites
11 Réponses
Message 1 sur 12

LISP AUTOCAD - Fonction "if" - Utilisation comme condition d'une valeur fournis par AutoCAD

thomas_longuet
Contributor
Contributor

Bonjour,

 

J'ai une question concernant la fonction "if" ou "cond" en LISP sur AutoCAD
Je crée des macros pour aider mes collègues dans leur utilisation d'AutoCAD, et j'ai pour objectif de les transformer en LISP et potentiellement les améliorer.

 

Mon problème survient lors de la première commande que je lance dans mon LISP :

(Command "_.QSAVE")


Si le dessinateur na pas enregistrer une première foi son dessin, AutoCAD propose :

thomas_longuet_1-1741280142506.png


Je souhaiterais savoir s'il est possible d'utiliser cette information fournie par AutoCAD comme condition pour la fonction "if" ou "cond".

Du genre :
SI : "enregistrer le dessin sous *" EST / A ÉTÉ indiqué en ligne de commande, alors annuler le lisp
SI : NON alors passer à la suite

Merci d'avance pour votre aide.
Bien cordialement, LONGUET Thomas.

0 J'aime
Solutions acceptées (3)
982 Visites
11 Réponses
Replies (11)
Message 2 sur 12

_gile
Consultant
Consultant
Solution acceptée

Salut,

La variable système DWGTITLED indique si le dessin a été enregistré.

Tu peux interroger la valeur de cette variable avant d'appeler la commande _QSAVE.

(if (= (getvar "DWGTITLED") 1)
  (progn
    (command-s "_QSAVE")
    ;; ici, le reste du code
  )
)


Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 3 sur 12

cadffm
Consultant
Consultant

(If (= 1 (getvar 'DWGTITLED))(command "_.QSAVE")

)

 

but do you really want to cancel, not saving?

Saving in both cases:

(If (zerop(getvar 'DWGTITLED))(command "_.QSAVE" "~")

(command "_.QSAVE")

)

 

 

 

Edit: et encore une fois victime de la nouvelle mise en page, désolé pour la réponse supplémentaire tardive

Sebastian

Message 4 sur 12

thomas_longuet
Contributor
Contributor

@_gile @cadffm, Merci beaucoup pour vos réponses, elles m'ont permis d'ouvrir de nouvelles pistes de recherche et de résoudre se problème.

Pour être tout a fait transparent j'avais espoir que sa puisse résoudre un autre soucis que je rencontre, cette fois-ci avec (command "_.-HATCH" "COULEUR" "DUCALQUE")

Lorsque j'effectue ma macro et que j'arrive a se moment il y a deux possibilité soit AutoCAD me demande :

thomas_longuet_0-1741338688393.png

Soit il ne me propose pas cette "Nouvelle couleur d'arrière-plan", cela dépend du dessin sur lequel je me trouve et je n'ai aucune idée du pourquoi.

Je ne sais pas s'il y aura de nouveau ce problème maintenant que je souhaite le faire en LISP ; mais je préfère prévenir, que guérir.

 

Du coup je permets de réitérer ma question, est-ce que je peux "récupérer" cette information directement en ligne de commande:


Du genre : Si "Nouvelle couleur d'arrière plan*" "est/ou était" présent en ligne de commande, faire "."
                   Si non, passer à la suite.


Où est-ce que comme pour (_.QSAVE) je suis obligé de trouver la "variable" qui explique la présence de cette ligne et définir mon "if" en fonction de la valeur de cette variable ?


Je vous remercie encore pour votre aide,
Bien cordialement, LONGUET Thomas.

0 J'aime
Message 5 sur 12

O_Eckmann
Mentor
Mentor

Bonjour,

 

Je crois que la couleur d'arrière plan n'est proposée que pour les motifs autres que SOLID.

Il faudrait donc vérifier la variable HPNAME

(if (= (getvar "HPNAME") "_SOLID")
  ... pas de couleur d'arrière plan
  ... couleur d'arrière plan

Olivier Eckmann

EESignature

Message 6 sur 12

cadffm
Consultant
Consultant

A background color doesn't make sense with the SOLID pattern,
but it does with other hatch patterns 😉

Une couleur d'arrière-plan n'a aucun sens avec le motif SOLID,
mais avec d'autres motifs de hachures.

Sebastian

Message 7 sur 12

cadffm
Consultant
Consultant

 >"(if (wcmatch (strcase(getvar "HPNAME") "_SOLID")"

et le modèle original Autodesk AutoCAD Solid ? : "SOLID"

 

(if (wcmatch (strcase(getvar "HPNAME")) "SOLID,_SOLID") ; or "*SOLID)"

 then

 else

)

 

Sebastian

Message 8 sur 12

thomas_longuet
Contributor
Contributor

@O_Eckmann @cadffm Encore merci pour vos réponses, cela m'aide énormément.

 

Je vais encore avoir besoin de votre aide, cette fois ma condition "if" est définie par rapport à la présence ou non d'une "SPLINE" dans mon dessin

(defun c:VSPLINE ()
(if (wcmatch (cdr (assoc 0 (entget (car (entsel))))) "*SPLINE")
	(prompt "\nYES\n")
	(prompt "\nNO\n")
))

J'ai trouvé le :
(cdr (assoc 0 (entget (car (entsel)))))
dans une autre demande du forum, j'aimerais être sûr d'avoir bien compris comment il fonctionne.

"entGET" permet de fournir une liste d'information sur un objet
                elle a besoin de "car" pour sélectionner la première partie de cette liste (même si j'ai l'impression que cette liste n'est composée que d'une partie [peut-être car il n'y a qu'un seul objet que je sélectionne])
                et "entSEL" permet de sélectionner cet objet

Dans toute cette liste "assoc 0" permet de ne sélectionner que "l'entité" (0."[DXF de l'objet])
Cette "entité" étant composée de 2 éléments, le 0 et le "DXF" ; "cdr" isole le deuxième élément (le "DXF")

Donc, si j'ai bien compris, si je souhaite sélectionner plusieurs éléments au lieu d'un seul, il faut soit:


Que je change "entSEL" par une autre fonction qui demande la sélection de plusieurs objets,
Ou que je change "entSEL" ET "entGET" car "enGET" ne permet pas de donner les informations de plusieurs objets.

C'est bien cela ?

 

Désolé d'abuser ainsi de votre temps et encore merci pour tout

 

Bien cordialement, LONGUET Thomas



0 J'aime
Message 9 sur 12

cadffm
Consultant
Consultant
Solution acceptée

Sorry I can't support in french,

I am in hurry because my holidays (France!) tomorrow!

 

 

If your first question was correct:

 

(if (setq myselection (ssget "_X" (list '(0 . "SPLINE")(cons 410 (getvar  'ctab)))))

(Alert (itoa(sslength myselection)))

(Princ "\nNothing")

)

 

 

 

 

 

Sebastian

Message 10 sur 12

thomas_longuet
Contributor
Contributor

@cadffm 

I test this as soon as I can.
Enjoy your holiday and thank you again 😄

I am not good at all in English so this message is translated with reverso.net 😅.

0 J'aime
Message 11 sur 12

O_Eckmann
Mentor
Mentor
Solution acceptée

Bonjour @thomas_longuet ,

 

La fonction entsel  (abbréviation de ENTity SELection) ne permet de sélectionner qu'une seule entité.

Si on veut sélectionner plusieurs entités, il faut passer par un jeu de sélection via la fonction ssget

Celle-ci accepte plusieurs paramètres, notamment une liste permettant de filtrer les objets autorisés

(setq ssSpline (ssget (list (cons 0 "SPLINE"))))

La ligne au dessus affiche le message "Choix des objets" et autorise la sélection multiple, mais uniquement des objets de type SPLINE.

 

Ensuite on parcours le jeu de sélection dans une boucle et on accède à chacun des éléments

; initialisation du compteur
(setq I 0)
; boucle sur le nombre d'élément du jeu de sélecto=ion
(repeat (sslength ssSpline)
  ; récupère le i ème élément du jeu
  (setq oSpline (ssname ssSpline I))
  ; incrémente le compteut
  (setq I (1+ I))
  ; traite l'entité oSpine via enget par exemple pour extraire son calque
  (cdr (assoc 8 (entget oSpline)))
)

 

Olivier Eckmann

EESignature

Message 12 sur 12

thomas_longuet
Contributor
Contributor

@O_Eckmann @_gile 

Encore merci pour vos réponses, grâce à votre aide j'ai pu mener l'un de mes projets à bien.

 

Je conclus donc ce sujet et je vous souhaite à tous une excellente continuation.

 

Bien cordialement, LONGUET Thomas

 

@cadffm

Thanks again for your answers, thanks to your help I was able to carry out one of my projects.

 

So I conclude this topic and I wish you all an excellent continuation.

 

Best regards, LONGUET Thomas

0 J'aime