Aller au contenu

Messages recommandés

Posté(e)

Bonsoir,

 

je veux saisir plusieur point et les appelé point1, point2 point3 ...

 

mais la ligne suivante précédé de while... ne fonctionne pas, quelq'un aurait -il la solution ?

 

(setq (read (strcat "point" (itoa (- i 1)))) (getpoint))

Posté(e)

Salut,

 

Remplace setq par set (setq est une abréviation pour set quote ce qui empêche l'évaluation de l'expression).

 

Personnellement je ne recommande pas cette façon de faire avec des nom de variables incrémentés.

On peut en général utiliser une liste ce qui est souvent plus efficace et permet de déclarer les variable.

 

LISP = LISt Processing.

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

Posté(e)

bonne Année a tous

 

voici un exemple

(defun c:azerty()
 (setq a 0)
 (repeat 4
 (set (read (strcat "liste" (itoa a))) a)
   (setq a (+ a 1))
   )

 (setq a 0)
(repeat 4
(princ (eval (read (strcat "liste" (itoa a)))))
(setq a (+ a 1))
)
)

Vous fîtes ce que vous pûtes

et vous m'épatâtes !!!!

Posté(e)

Bonjour et bonne année à tous,

 

je ne recommande pas cette façon de faire avec des nom de variables incrémentés.

Je suis d’accord avec (gile) surtout pour ce cas précis, néanmoins je trouve tout de même intéressant (ne serai ce que pour des raisons de compréhensions et de culture général) de connaître la possibilité de travailler directement sur les symboles.

 

Extrait de la définition d’un symbole Lisp sur wikipédia:

Les symboles littéraux en Lisp sont utilisés comme identificateurs de variables ; toutefois, ils sont plus généraux et peuvent être utilisés pour eux-mêmes également, comme des objets.

 

Le fait d’utilisé directement le nom de symbole, était beaucoup plus répandu (utilisé notamment comme texte) en Lisp lorsque celui-ci ne gérait pas les chaînes de caractères, ce qui n’est plus le cas aujourd’hui et ce qui ne l’a jamais été en AutoLISP. Ce qui explique que pour faire ce que tu souhaites tu sois obligé d’utiliser les fonctions de manipulations de chaînes de caractères, puis d’employer read pour faire une conversion du type STR vers le type SYM.

 

Alors que dans d’autres versions LISP, il existe d’autres façons d’accéder au nom d’un symbole et il y a également des fonctions spécialisées permettant de traiter directement le nom de symbole comme par exemple les fonctions EXPLODE et IMPLODE

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Re,

 

Je m’étais il y a plusieurs mois déjà, amusé sur les concaténations de car et cdr à écrire un code qui travaillait sur la création de symbole ne le retrouvant plus, je vais faire comme capde06, y aller de mon petit exemple et faire ce que tu proposes, à savoir saisir plusieurs points en les appelants point1, point2 point3 ect..

Même si comme l’a précisé (gile) il est préférable de stoker directement les coordonnées des points.

 

La fonction:

;; Renvoie une liste de symbol (chaques symbols contenant les coordonnées du point cliqué)
(defun point-xxx (i pt)
 (if pt
   (cons ((lambda (sym) (set sym pt) sym) (read (strcat "point" (itoa i))))(point-xxx (1+ i) (getpoint)))
 )
)

 

 

Exemple en débutant l'incrémentation à 3 et en cliquant 4 points, la fonction renvoi une liste des variables créer pour chaques points cliqué.

_$ (setq lstpoint (point-xxx 3 (getpoint)))
(POINT3 POINT4 POINT5 POINT6)

 

Pour extraire collectivement les coordonnées des points correspondants

_$ (mapcar 'eval lstpoint)  
((10.0 10.0 0.0) (10.0 50.0 0.0) (35.0 50.0 0.0) (35.0 10.0 0.0))

 

Pour mettre toutes les variables à nil et libérer la mémoire

_$ (mapcar '(lambda (sym) (set sym nil)) lstpoint)
(nil nil nil nil)

Ou

_$ (foreach sym lstpoint (set sym nil))
nil

 

A+

Apprendre => Prendre => Rendre

Posté(e)

merci beaucoup

 

j'ai une autre question du même genre :

je veux récupéré la valeur de Point0 dans les lignes suivante on peut voir que ça ne marche pas.

auriez-vous la solution ? merci

 

 

_$ (setq point0 '(0 0)) (listp (read (strcat "point" (itoa 0))))

(0 0)

nil

Posté(e)

Salut,

 

Essaye :

 

(type (strcat "point" (itoa 0)))
(type (read (strcat "point" (itoa 0))))
(type (eval (read (strcat "point" (itoa 0)))))

 

Encore une fois, même si je pense qu'il est bon de comprendre les fondamentales set, quote, read et eval, cette technique complique les choses pour rien.

L'utilisation d'une liste et, si besoin, de l'accesseur nth est tellement plus simple.

 

PS : dans les exemples donnés ci dessus par capde06 et VDH-Bruno, les points ont beau être affectés à des symboles, ces symboles ne sont pas directement utilisés. L'utilisation de repeat ou mapcar aurait pu se faire, plus facilement, sur une liste points plutôt que sur une liste de variables contenant des points...

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

Posté(e)

Bonjour,

 

je veux récupéré la valeur de Point0 dans les lignes suivante on peut voir que ça ne marche pas.auriez-vous la solution ? merci.

Si je ne me trompe c’est un peu le même souci exprimé différemment que dans ta première intervention, à savoir créer un nom de variable lui affecter une valeur et récupérer le nom de variable plutôt que la valeur qui lui est transmis.

 

Pour faire cela tu ne peux éviter l’emploi d’une variable ou fonction auxiliaire, ce que j’ai fait en utilisant la fonction lambda dans l’exemple précédent avec cette ligne de code.

 ((lambda (sym) (set sym pt) sym) (read (strcat "point" (itoa i))))

 

En l’adaptant à ton exemple on obtiendrait:

_$ ((lambda (sym) (set sym '(0 0)) sym) (read (strcat "point" (itoa 0))))
POINT0
_$ POINT0
(0 0)
_$

 

 

Sur le fond je te conseille de suivre les recommandations de (gile) à savoir stocker tes valeurs de points dans une liste et d’y accéder avec la fonction nth car effectivement les points ont beau être affectés à des symboles, ces symboles ne sont pas directement utilisés.

 

 

Sinon si tu tiens vraiment (pour des raisons qui te son propre) à lier tes valeurs à une étiquette (ou clef) , je ne saurai trop te conseiller à t’intéresser aux listes d’associations au cas ou tu cela ne te serai pas famillié, on y accède facilement avec la fonction assoc (c’est le procédé utilisé lorsque tu travailles avec les codes DXF).

 

Un exemple avec une liste d’association :

;; Fonction de création d'une liste de point associative ((clef x y z) ...)
(defun lstdepoint (/ i pt lst)
 (setq i 0)
 (while (setq pt (getpoint))
   (setq lst (cons (cons (strcat "point" (itoa (setq i (1+ i)))) pt) lst))
 )
 (reverse lst)
)

 

Création de la liste de point (ex liste de 4 points cliqués)

_$ (setq ass-lst (lstdepoint))
(("point1" 25.0 25.0 0.0) ("point2" 25.0 100.0 0.0) ("point3" 100.0 100.0 0.0) ("point4" 100.0 25.0 0.0))

 

Accés au "point3"

_$ (assoc "point3" ass-lst)
("point3" 100.0 100.0 0.0)

ou

_$ (cdr (assoc "point3" ass-lst))
(100.0 100.0 0.0)

 

 

Une dernière petite précision au cas ou la notion de liste d’association te serai étrangère en plus d’avoir un accès facile au moyen de la fonction assoc, tu peux tout aussi facilement modifier et mettre à jour ta liste avec la fonction subst (fonction de substitution).

 

Modification des coordonnées du point3 dans ass-lst

_$ (setq ass-lst (subst '("point3" 50.0 50.0 0.0) (assoc "point3" ass-lst) ass-lst))
(("point1" 25.0 25.0 0.0) ("point2" 25.0 100.0 0.0) ("point3" 50.0 50.0 0.0) ("point4" 100.0 25.0 0.0))

 

A+

Apprendre => Prendre => Rendre

Posté(e)

merci beaucoup

 

finalement j'ai enregistrer les coordonnées de mes points dans une listes, j'obtient alors une liste sous la forme suivante :

((0.1 0) (12 4) (5 55))

 

le problème qui vient alors c'est que si je l'utilise pour créer une polyligne de la facon suivante sa ne fonctionne pas:

(setq i 1)

(while (setq pt (getpoint)) (setq lst (cons pt lst)) (setq i (+ 1 i)))

 

(setq ii 1)

(command "polylign"

(while (>= i ii)

(nth ii lst)

(setq ii (+ 1 i)))

"")

si j'ai bien compris, dès que je réenregistre ii en faisant (setq (+ 1 i))

le résultat est "renvoyer" pas seulement enregistré

 

 

y aurait il une meilleur solution ?

Posté(e)

Salut,

 

Si tu travailles avec des listes, tu n'as pas forcément besoin de compteurs :

 

(while (setq pt (getpoint)) (setq lst (cons pt lst)))
(command "_pline")
(foreach p (reverse lst) (command p))
(command "") ; ou (command "_close")

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

Posté(e)

Salut,

 

Si tu travailles avec des listes, tu n'as pas forcément besoin de compteurs :

Pour aller dans le sens de (gile), en plus de foreach qui va bien, il est également possible de varianter avec mapcar et apply

 

(command "_pline")
(mapcar 'command (reverse lst))
(command "")

ou

(command "_pline")
(apply 'command (reverse lst))
(command "")

A+

Apprendre => Prendre => Rendre

Posté(e)

Re,

 

y aurait il une meilleur solution ?

En relisant l’exemple que tu donne pour obtenir ta liste de points, je me demande si tout simplement tu ne souhaitais pas dessiner directement une polyligne de façon dynamique, dans ce cas il y a un sur le forum un « célèbre » code avec command

 

Le code

(command "_.pline")  
(while (< 0 (getvar 'cmdactive)) (command pause))

Que tu peux retrouver ici et ailleurs.

 

A+

Apprendre => Prendre => Rendre

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é