Aller au contenu

Messages recommandés

Posté(e)

Un nouveau challenge, que je dirais niveau intermédiaire, mais je trouve difficile de parler de "niveaux" tant les expériences de chacun sont diverses.

Donc, merci à que ceux qui auraient une solution immédiate de laisser un peu chercher les autres ;)

 

Il s'agit de faire une bascule sur un (ou des) code(s) binaire(s) d'une variable système.

 

La réponse pourrait être la forme : (defun bascule (variable drapeau) ...) et fonctionner comme dans les exemples suivant.

 

Exemple 1 : activer/désactiver le mode ortho

(getvar "ORTHOMODE") -> 0

(bascule "ORTHOMODE" 1)

(getvar "ORTHOMODE") -> 1

(bascule "ORTHOMODE" 1)

(getvar "ORTHOMODE") -> 0

...

 

Exemple 2 : activer/désactiver différents modes d'accochage aux objet (ex : milieu,centre)

(getvar "OSMODE") -> 7 (extrémité, milieu, centre)

(bascule "OSMODE" 6)

(getvar "OSMODE") -> 1 (extrémité)

(bascule "OSMODE" 6)

(getvar "OSMODE") -> 7 (extrémité, milieu, centre)

...

 

ou

 

(getvar "OSMODE") -> 3 (extrémité, milieu)

(bascule "OSMODE" 6)

(getvar "OSMODE") -> 5 (extrémité, centre)

(bascule "OSMODE" 6)

(getvar "OSMODE") -> 3 (extrémité, milieu)

...

 

ou encore activer/désactiver tous les accrochages aux objets...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

En clair, c'est quoi la question ?

Changer l'état d'une variable via un lisp ?

 

Oui, faire une bascule sur un (ou des) code(s) binaire(s) : la même routine qui active (s'il est inactif) ou désactive (s'il est actif) le (ou les) code(s) spécifié(s) comme arguments.

 

J'ai bien dit "niveau intermédiaire" ;)

 

[Edité le 23/5/2007 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

tu veux dire un truc comme ca ???

 

(defun c:scf ()

(setq scf1 (getvar "ucsfollow"))

(if (= scf1 0)

(setq scf1 1)

(setq scf1 0)

)

(setvar "ucsfollow" scf1)

(if (= scf1 1)

(prompt (strcat "\nUCSFOLLOW EST ACTIF (" (rtos SCF1 2 0) ") "))

(prompt (strcat "\nUCSFOLLOW EST INACTIF (" (rtos SCF1 2 0) ") "))

)

(princ)

)

 

 

loll

 

 

phil

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Posté(e)

Oui, c'est bien une bascule, mais je pensais à une routine plus polyvalente qui accepterait comme argument un nom de variable pluôt qu'une commande qui ne marche que pour une variable.

Qu'on puisse faire aussi bien (basc "orthomode") que (basc "ucsfollow") ou (basc "cmdecho").

 

J'imaginais aussi aller un peu plus loin que seulement 1 ou 0, mais on peut commencer traquilement comme ça, on améliorera par la suite...

 

D'autre part, tu dois pouvoir faire plus concis : évite les setq quand c'est possible, et regarde du côté de progn pour ne pas refaire deux fois (if (= scf1 1) ...)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut

J'ajouterai juste une chose

 (if (= scf1 0)
(setq scf1 1)
[surligneur] (setq scf1 0) [/surligneur] 
)

si scf1 est à zero, inutile de redéfinir la variable scf1 à zéro ;)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)
Evgeny a tout dit, Bravo :)

 

c'est là que je voulais en arriver, mais j'esperais que d'autres moins expert cherchent un peu ...

 

Je m'excuse fortement!

Je connaissais à la fois la réponse au devoir.

On regrette, mais j'ai abîmé le jeu...

 

:(

Evgeniy

Posté(e)

Ça n'est pas grave, Evgeniy, le challenge n'était pas si bon : trop facile pour ceux, comme toi, qui connaissaient la solution, et peut-être vraiment difficile pour certains.

 

That don't matter, Evgeniy, the challenge wasn't so good; too easy for those, as you, who knew the solution, and may be really difficult for some others.

 

Quelques explications.

 

L'idée m'est venu en répondant à une demande sur un forum Autodesk, et je pensaiss que ça pouvait être un moyen pour aborder les manipulations de codes binaires avec les opérateurs logique.

 

La fonction Boole est une fonction générale pour faire des opérations booléennes sur les bits (code binaires). Elle admet comme arguments plusieurs entiers dont le premier définit l'opérateur et les suivants sont les codes binaires sur lesquels se font les opérations.

 

Les opérations Booléennes standard, AND, OR, XOR et NOR ont comme opérateur respectivement 1, 7, 6 et 8.

Pour plus d'explications sur la fonction Boole (et aussi logand, logior et ~) voir dans l'aide aux développeurs ou ici.

 

La solution de ce challenge résidait donc dans l'utilisation de l'opérateur XOR (ou exclusif, ou bien), qui permet d'éviter les tests logiques pour savoir si un bit est actif ou non.

 

(Boole 6 n m) retourne la somme des codes binaire qui sont exclusivement dans n ou dans m.

 

Exemple :

 

(Boole 6 1 0) -> 1

(Boole 6 1 1) -> 0

 

Donc pour une variable comme ORTHOMODE, faire :

 

(setvar "ORTHOMODE" (Boole 6 1 (getvar "ORTHOMODE"))) mtrra orthomode à 1 s'il était à 0 et inversement.

 

De la même façon on peut activer/désactiver plusieurs accochages aux objets :

 

(setvar "OSMODE" (Boole 6 6 (getvar "OSMODE"))) effectuera une basule sur les codes 2 et 4 (milieu et centre).

 

On peut faire une routine dont les arguments sont le nom de la variable et la somme des codes binaire sur lesquels effectuer la bascule.

 

(defun bascule (var bin)
 (setvar var (Boole 6 (getvar var) bin))
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é