Aller au contenu

Routine dessinant une "polyligne-flèche"


Messages recommandés

Posté(e)

Bonjour à tous,

 

Voilà, j'ai fais un tout petit bout de code ce matin et j'en profite pour le partager.

 

Ce petit LiSP dessine une polyligne avec des épaisseurs variées de façon à ce qu'elle prenne la forme d'une Flèche.

 

Ce code est entièrement paramétrable, j'explique, la commande dans AutoCAD se présente comme ceci :

^C^C(c:FlecheParam "Long" "Larg" "Epais") 

Exemple : ^C^C(c:FlecheParam "3" "1.5" "0.1")

 

Avec :

Long = la longueur de la tête de la flèche (3),

Larg = largeur de la tête de la flèche (1.5),

Epais = épaisseur de la queue de la flèche (0.1).

 

Voici le code HYPER compliqué :

(defun c:FlecheParam (Long Larg Epais /)
 (setq pt_Deb (getpoint "\nPointe de la flèche : "))
 (setq pt_Fin (getpoint pt_Deb "\nPied de la flèche : "))
 (setq pt_Fl (polar pt_Deb (angle pt_Deb pt_Fin) (atof Long)))
 (command "_.pline" "_non" pt_Deb "_w" 0 (atof Larg) "_non" pt_Fl "_w" (atof Epais) (atof Epais) "_non" pt_Fin ""
 ) ;_ Fin de command
 (princ)
) ;_ Fin de defun

J'espère que ça servira à quelqu'un...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonjour Denis,

 

2 petites questions:

- si la fonction doit être appelé avec des paramètres, pourquoi la déclarer en C: ?

- pourquoi passer les paramètres réels sous forme de chaine au lieu de les passer directement en tant que réel?

 

Il ne s'agit pas de critique, c'est juste pour comprendre les raisons de tes choix.

 

Olivier

Posté(e)

Re,

 

De rien pierrevigneux,

 

Olivier,

- si la fonction doit être appelé avec des paramètres, pourquoi la déclarer en C: ?

Parce que s'il y a des paramètres on peut se passer du "c:" ?

 

- pourquoi passer les paramètres réels sous forme de chaine au lieu de les passer directement en tant que réel?

Effectivement, j'aurai pu y penser avant, peut-être que c'est issu d'une autre routine qui, elle, comportait d'autres paramètres textes (ex : Nom de calque).

 

Merci du retour, voici donc la même routine avec des paramètres dits "réels" :

 

Commande dans AutoCAD :

^C^C(c:FlecheParam 3 2 0.1) 

 

LiSP :

(defun c:FlecheParam (Long Larg Epais / pt_Deb pt_Fin pt_Fl)
 (setq pt_Deb (getpoint "\nPointe de la flèche : "))
 (setq pt_Fin (getpoint pt_Deb "\nPied de la flèche : "))
 (setq pt_Fl (polar pt_Deb (angle pt_Deb pt_Fin) Long))
 (command "_.pline" "_non" pt_Deb "_w" 0 Larg "_non" pt_Fl "_w" Epais Epais "_non" pt_Fin ""
 ) ;_ Fin de command
 (command "_.pline" "_non" pt_Deb "_w" 0 0 "")
 (princ)
) ;_ Fin de defun

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonjour,

 

la syntaxe C:XXX est utile pour pouvoir lancer la commande, par ex:

 

(defun C:TOTO ( / ) ...

 

permet de taper TOTO à la ligne de commande

 

si tu définis ta commande

(defun TOTO ( / ) ...

 

alors pour la lancer il faudra taper

(TOTO)

 

En règle général on utilise C: pour les commandes qui seront tapées au clavier afin de lancer la commande et on omet C: pour les commandes avec des paramètres donc qui devront être lancés entre parenthèse.

 

Après si tu veux sécuriser un peu ta routine, il faut tester que tous les paramètres passées et saisis soient corrects avant de pouvoir les utiliser. Par ex, si 1 des 3 paramètres est négatif ou vaut nil ta routine génère une erreur, si l'utilisateur fait Echap au moment où tu lui demandes un point, ça va aussi générer une erreur.

Pareil, si tu es en SCU au lieu de SCG, pas sûr que l'angle calculé soit le bon pour construire ton point intermédiaire...

 

En développant pour les autres et pas seulement pour soi, on s'aperçoit assez vite que la moitié de ton code sert à vérifier que toutes les conditions sont ben réunies pour pouvoir faire travailler la machine.

 

Olivier

Posté(e)

Re,

 

Effectivement, je devrais gérer tous les cas de fugures... Mais je n'y avais pas pensé.

 

C'est juste un petit bout de routine qui fonctionne tel-quel.

 

Je me pencherais dessus pour les valeurs "nil" ou controler les "Echappes". De même, si le deuxième paramètre est égale à zéro, ce n'est plus une flèche...

 

Merci pour ces conseils...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

bonjour

Merci pour ce partage , de plus cela me manquait.

perso je les appelé FLE

 

 

Nous vivons tous dans le ventre d'un chien géant

Tout le monde le sait mais personne ne dit rien du tout

 

ultra Vomit

Posté(e)

Bonjour,

 

(defun c:Fle (/ LONG LARG EPAIS pt_Deb pt_Fin pt_Fl)

 (setq LONG (vlax-ldata-get "DenisH" "LONG" 3.0))
 (setq LARG (vlax-ldata-get "DenisH" "LARG" 2.0))
 (setq EPAIS (vlax-ldata-get "DenisH" "EPAIS" 0.1))

 (prompt (strcat "\nLongueur : " (rtos LONG 2 3) ", lArgeur : " (rtos LARG 2 3) ", Epaisseur : " (rtos Epais)))
 (while (/= (type pt_Deb) 'LIST)
   (initget 1 "Longueur lArgeur Epaisseur")
   (setq pt_Deb (getpoint "\nPointe de la flèche ou [Longueur/lArgeur/Epaisseur] <Longueur> : "))
   (cond
     ((= pt_Deb "Longueur")
       (initget 7)
       (setq LONG (getdist "\nLongueur : "))
     )
     ((= pt_Deb "lArgeur")
       (initget 7)
       (setq LARG (getdist "\nlArgeur : "))
     )
     ((= pt_Deb "Epaisseur")
       (initget 7)
       (setq EPAIS (getdist "\nEpaisseur : "))
     )
   )
 )
 (initget 1)
 (setq pt_Fin (getpoint pt_Deb "\nPied de la flèche : "))
 (setq pt_Fl (polar pt_Deb (angle pt_Deb pt_Fin) Long))
 (command "_.pline" "_non" pt_Deb "_w" 0 Larg "_non" pt_Fl "_w" Epais Epais "_non" pt_Fin ""
 ) ;_ Fin de command
 (command "_.pline" "_non" pt_Deb "_w" 0 0 "")

 (vlax-ldata-put "DenisH" "LONG" LONG)
 (vlax-ldata-put "DenisH" "LARG" LARG)
 (vlax-ldata-put "DenisH" "EPAIS" EPAIS)

 (princ)
) ;_ Fin de defun

 

Pour revenir sur notre discussion récente concernant la possibilité de demander plusieurs choses à l'utilisateur : ci-dessus un lisp qui permet de paramétrer en cours d'utilisation. Un peu comme la commande raccord qui permet de rentrer la valeur du rayon en cours de commande.

 

Je trouve cette manière de faire plus souple d'utilisation : on paramètre par défaut les valeurs qui nous semblent les plus standards et on les modifie en cours de route si besoin.

 

 

Par ailleurs,

(command "_.pline" "_non" pt_Deb "_w" 0 0 "")

je suppose que c'est juste pour remettre l'épaisseur de polyligne à 0. On peut aussi, plus simplement, modifier la variable PLINEWID.

 

(setvar "PLINEWID" 0)

 

Encore mieux, ce serait de sauvegarder la valeur de PLINEWID dans une variable au début du lisp et remettre cette valeur à la fin.

 

(setq PLW (getvar "PLINEWID"))

...

...

(setvar "PLINEWID" PLW)

 

du coup, on laisse les choses comme on les a trouvé au départ.

 

Je me pencherais dessus pour les valeurs "nil" ou controler les "Echappes". De même, si le deuxième paramètre est égale à zéro, ce n'est plus une flèche...

Compte tenu que je rentre les valeurs de longueur, largeur et épaisseur par un getdist, je peux brider cette fonction avec un initget (pas de vide, de nul, de négatif...), ce qui supprime un certain nombre de vérifications a posteriori.

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Denis H

 

attention ton petit bout devient un grand bout.

tien! et pour les courbes ?

 

pardon, je n'aurais pas du.

 

cordialement.

 

Rappelle hydrater vous.......................

 

 

Nous vivons tous dans le ventre d'un chien géant

Tout le monde le sait mais personne ne dit rien du tout

 

ultra Vomit

Posté(e)

Bonjour à tous,

 

Et un grand merci pour vos retours...

 

@Zebulon :

1. Ok, j'avoue que ton complément et beaucoup plus "universel" que le mien. En fait, j'ai une palette avec 2 icones correspondant à 2 tailles de flèches que j'utilise dans le même dessin, j'ai donc mes 2 "commandes" :

^C^C(c:FlecheParam 3 2 0.1) 
^C^C(c:FlecheParam 1.5 1 0.0)

2. Merci pour la variable "PlineWid", oui, "(command "_.pline" "_non" pt_Deb "_w" 0 0 "")" servait à remettre les épaisseures de Plines à zéro. Je n'avais pas pensé que d'autres personnes pouvaient utiliser d'autres épaisseures...

 

@Big666 : A multiplier les utilisateurs, ça devient forcément de plus en plus compliquer. Comme pour les courbes ;)

 

Petite routine deviendra grande...

 

Et si un autre "pro" passe par là, il proposera peut-être une option avec une flèche à plus de 2 points...

 

En tous cas, merci à tous...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é