azop Posté(e) le 2 janvier 2012 Posté(e) le 2 janvier 2012 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))
(gile) Posté(e) le 3 janvier 2012 Posté(e) le 3 janvier 2012 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
capde06 Posté(e) le 3 janvier 2012 Posté(e) le 3 janvier 2012 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 !!!!
VDH-Bruno Posté(e) le 3 janvier 2012 Posté(e) le 3 janvier 2012 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
VDH-Bruno Posté(e) le 3 janvier 2012 Posté(e) le 3 janvier 2012 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
azop Posté(e) le 3 janvier 2012 Auteur Posté(e) le 3 janvier 2012 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
(gile) Posté(e) le 4 janvier 2012 Posté(e) le 4 janvier 2012 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
VDH-Bruno Posté(e) le 4 janvier 2012 Posté(e) le 4 janvier 2012 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
azop Posté(e) le 7 janvier 2012 Auteur Posté(e) le 7 janvier 2012 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 ?
(gile) Posté(e) le 7 janvier 2012 Posté(e) le 7 janvier 2012 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
VDH-Bruno Posté(e) le 8 janvier 2012 Posté(e) le 8 janvier 2012 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
VDH-Bruno Posté(e) le 8 janvier 2012 Posté(e) le 8 janvier 2012 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant