Aller au contenu

Menu contextuel intelligent


bonuscad

Messages recommandés

Pour les anciennes versions d'autocad, des lisp avaient été développer pour recréer par exemple la commande "RACCORD" qui stockaient les rayons précédemment saisis dans un MNU pour pouvoir les rappeler à tout moment.

L'idée etait bonne mais necessitait l'emploi d'un MNU. (un peu lourd)

Je vous propose la même démarche en utilisant les menus contextuels.

Le code suivant crée une commande MYOFFSET identique à DECALER mais stoke les valeur dans le menu contextuel (paramétré à 10 valeurs, peut être changé)

Vous pouvez envisager la même chose pour la commande RACCORD ou CHAMFREIN.

 

(defun c:myoffset ( / mess_offset key_offset tmp_str )

(if (or (not (wcmatch (getvar "USERS5") "Par/*")) (zerop (strlen (getvar "USERS5"))))

(progn (setvar "USERI5" 0) (setvar "USERS5" "Par" ))

)

(setq mess_offset (getvar "USERS5"))

(initget 6 "Par _Through")

(setq key_offset

(getdist

(strcat

"\nSpécifiez la distance de décalage ou ["

mess_offset

"]<"

(if (> (getvar "OFFSETDIST") 0)

(rtos (getvar "OFFSETDIST"))

"Par"

)

">:"

)

)

)

(if (null key_offset) (setq key_offset (getvar "OFFSETDIST")))

(cond

((and (/= key_offset -1.0) (/= key_offset "Through"))

(if

(or

(not (wcmatch (getvar "USERS5") (strcat "*/" (rtos key_offset 2 4) "/*")))

(not (wcmatch (getvar "USERS5") (strcat "*/" (rtos key_offset 2 4) "*")))

)

(progn

(setvar "USERS5" (strcat (getvar "USERS5") "/" (rtos key_offset 2 4)))

(setvar "USERI5" (1+ (getvar "USERI5")))

(cond

((> (getvar "USERI5") 10)

(setvar "USERI5" 10)

(setq tmp_str (substr (getvar "USERS5") 5))

(while (/= (substr tmp_str 1 1) "/")

(setq tmp_str (substr tmp_str 2))

)

(setvar "USERS5" (strcat "Par" tmp_str))

)

)

)

)

(command "_.offset" key_offset)

)

(T

(command "_.offset" "_Through")

)

)

(prin1)

)

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Super :thumbup:

 

Juste une chose, mais comme je vois que tu traites des chaines, ca risque d'être compliqué,...

 

..., n'as-tu pas pensé à ceux qui préfère le clavier au menu contextuel avec un raccourci clavier, du type index de 0 à 9 ?

 

Sinon, super, of course.

 

Tu peux expliquer un peu le concept de "USERI5" et "USERS5" et de WCMATCH, dans ce cas, steup. ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Je ne vois pas trop bien comment ce la peut-être utile à l'utilisateur :

 

Command:

MYOFFSET

Spécifiez la distance de décalage ou [Par/5/10/67/7/8/9/11/11/1/33.6179]<33.6179>:10

 

Il y pas grand chose de différent que le commande original OFFSET, sauf qu'on peut voir les anciennes distances....mais comment ?

 

A+

l'ACADien ! http://img124.exs.cx/img124/7999/start.gif

Lien vers le commentaire
Partager sur d’autres sites

Cette routine n'apporte pas grand chose. Je voulais juste monter un emploi un peu particulier des menus contextuesl ("clik droit" pour ceux qui n'ont rien pu observer).

 

Elle peut être utile pour ceux qui font des contructions avec "DECALER" de façon répétitive en employant souvant les mêmes paramètres, par ex: un coup on décale avec 4.5 puis 7.125 puis 10.3337 et de nouveau avec 4.5 (que l'on rappelle avec click droit et qu'on sélectionne dans la liste).

 

Cette liste est parametrée avec 10 éléments (peut être changée), pour cela j'utilise la variable USERI5 (valeur entière) pour stocker le nombre d'élément concaténé dans la variable chaine.

Je stocke les paramètre rentrés à l'aide de la variable USERS5 (valeur chaîne caractère) que je concatène au fur et à mesure.

 

Pour m'assurer que le paramètre saisie ne figure 2 fois ou plus dans la chaine de caractères, car il est inutile de stocker plusieur fois le même paramètre, j'utilise la fonction (wcmatch) pour vérifier que cette chaine n'existe pas déjà.

L'emploi et similaire au joker de sélection de fichier dans l'explorateur:

* = n'importe quel caractère dans la chaine

? = n'importe quel caractère à la position n dans la chaine

et d'autre comme # @ . ~ (voir l'aide de wcmatch)

 

NB: l'emploi des variables USER?? aurait put être remplacé par des variables non déclarées en global ou local:

(defun C:XX ( / var1 var2 ....)) var1 et var2 déclarées, donc mise à nil à la fin de l'execution (non conservée)

(defun C:XX ( / )) aucune variable déclarée, la valeur des variables utilisée sera conservée à la fin de l'execution.

 

Voila pour ceux qui n'aurait pas compris la démarche.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

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é