Invité ingoenius Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 comme pour le langage python est possible en autolisp de creer de liste qui fonctionnent comme des dictionnaires?? j'ai essaié ceci, mais sens reussir a extrare les codes associees (setq KG (list' ( (mac2000, 50) (PAR64, 3.0)(MAC500, 38.0) ))) je cherche ensuite d' extraire le code associée (setq P_Blok (assoc mac2000 Kg)) masi il me retourne nil ??
Bred Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 Salut,Ta liste à un "niveau" en trop, et la virgule n'est pas accepeté comme séparateur : elle fait ici parti de ton nom de variable. Si tu veux mettre en séparateur, met un point : (setq KG '((mac2000 50)(PAR64 3.0)(MAC500 38.0)))ou(setq KG '((mac2000 . 50)(PAR64 . 3.0)(MAC500 . 38.0))) et quand t uutilises assoc, l'élément à ressortir ne peut être une variable, c'est forcément une valeur (donc ici il faut rajouter un "quote" (ou ') devant : (setq P_Blok (assoc [b]'[/b]mac2000 Kg)) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Invité ingoenius Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 merci bred, maintenat, ca le fait, mais la question qu'il ne peut pas etre une variable m'embete un peu, il y a alors une facon pour transformer une variable en une valeur?
Bred Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 Ta valeur est sous quel forme ?texte ? Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Invité ingoenius Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 oui est une chaine de texte qui est contenue dans la variable nome (setq nome "mac2000") et mon assoc devrai aller chercher la valeur associes dans la liste Kg (setq KG '((mac2000 . 50)(PAR64 . 3.0)(MAC500 . 38.0)))(setq PBlok (cdr(assoc 'mac2000)));poid du bloc pour me donner a la fin une string du type "mac2000 p 50 kg" ou la valeur 50 est ressortie de la liste initiale KG
Bred Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 (setq nome "mac2000") (setq KG '(("mac2000" . 50)("PAR64" . 3.0)("MAC500" . 38.0))) (setq PBlok (cdr (assoc nome KG))) (strcat nome " p " (rtos PBlok) " kg") Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 Salut, Si je comprends bien, il est possible de faire une liste associative à partir de variables si celles ci son évaluées lors de la constitution de la liste, il ne faut donc "quoter" ni la liste ni les paires pointées. Soient les variables nome1, nome2, nome3. (setq nome1 "mac2000" nome2 "PAR64" nome3 "MAC500" ) constitution de la liste associative : (setq KG (list (cons nome1 50) (cons nome2 3.0) (cons nome3 38.0))) Le résultat retourné est : (("mac2000" . 50) ("PAR64" . 3.0) ("MAC500" . 38.0)), les variables ont bien été évaluées. Pour retrouver un élément de la liste on peut faire indifféremment, soit : (setq PBlok (cdr (assoc nome1 KG))) soit : (setq PBlok (cdr (assoc "mac2000" KG))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité ingoenius Posté(e) le 26 juin 2007 Posté(e) le 26 juin 2007 j'ai testé a le fair avec une serie de cond, mais j'arrive pas a comprendre pourquoi ca fonctionne pas normalment je voudrais que a partir de la liste de la selection, pour chaque bloc la script associé la bonne variable PBlok (qui est son poids) et que a chaque passage l'ajoute a la variable Peso (qui est le poids totale de la selection mais je me dois tromper quelque part ;-( (defun c:P3 () (setq Peso 0.0) (graphscr) (setq SS (ssget (list (cons 0 "insert")))) (if (/= SS nil) (progn (setq lb (list nil)) ; lb lista dei nomi dei blocchi ;(setq INDEX 0) (setq P1 (getpoint "\nGet Point")) ));fine scelate selezione (repeat (sslength SS) (setq EL (entget (SSNAME SS INDEX))) ;element (setq nome (cdr (assoc 2 EL))) ;nome du bloK ;Liste poids des bloKs --LISTA DEI PESI------------------------------------------- ;------------------------------------------------------------------------------ (setq PBlok (cond ((= nome "ACL") 7.0) ((= nome "ACL_3d") 7.0) ((= nome "alpha_spot") 20.0) ((= nome "alpha_spot_3d") 20.0) ((= nome "ASSY_3d") 20.0) ((= nome "DECOUPE_1Kw") 7.0) ((= nome "DEC_1KW_3d") 6.0) ((= nome "DECOUPE_2KW") 12.0) ((= nome "DEC_2KW_3d") 12.0) ((= nome "DECOUPE_ETC") 5.0) ((= nome "DEC_ETC_3d") 5.0) ((= nome "DECOUPE_REVOLUTION") 40.0) ((= nome "FRESNEL_1Kw") 6.0) ((= nome "FRESNEL_1KW_3d") 6.0) ((= nome "FRESNEL_2Kw") 10.1) ((= nome "FRESNEL_2KW_3d") 10.1) ((= nome "MAC_2000") 38.0) ((= nome "MAC_500") 32.5) ((= nome "MAC_500_3D") 32.5) ((= nome "MAC_600") 32.6) ((= nome "MAC_600_3D") 32.6) ((= nome "QUARTZ") 3.0) ((= nome "RAMPE_T8") 8.0) ((= nome "VL_3000") 32.0) ((= nome "VL_3500") 32.0) ((= nome "BARRE_PAR") 6.0) ((= nome "BARRE_PAR_3d") 6.0) ((= nome "ColorSpot") 32.0) ((= nome "Colorwash") 32.0) ((= nome "KOLORADO") 32.0) ((= nome "PAR") 1.5) ((= nome "PAR_3D") 1.5) ((= nome "PAR_P") 0.8) ((= nome "PAR_P_3D") 0.8) ;poids des ponts h30v (carre) environs ((= nome "H30V-L100-3D") 5.1) ((= nome "H30V-C003-3D") 4.8);angle90 ((= nome "H30V-C017-3D") 6.1);T ((= nome "H30V-C016-3D") 7.2);croix ));fine cond e fine set pesi (setq Peso (+ Peso PBlok)) );fine repeat assegnazione pb ) [Edité le 26/6/2007 par ingoenius] [Edité le 26/6/2007 par ingoenius]
Bred Posté(e) le 26 juin 2007 Posté(e) le 26 juin 2007 j'ai testé a le fair avec une serie de cond, mais j'arrive pas a comprendre pourquoi ca fonctionne pas :casstet: ... je ne vois plus du tout quel est le rapport avec ta première demande...ça commence un peu à être habituel avec toi ingoenius....Essaye d'être plus rigoureux dans tes messages, et tiens nous au courant si nos propositions te conviennent ! (c'est assez frustrant pour la personne qui réponds de ne pas avoir de retour !....)Est-ce que ma ma dernière réponse convenait en temps que résolution de ton problème ? (Edit : ma réponse au cond est fausse, je n'avais pas vu ta déclaration de variable avant - effacé -) [Edité le 26/6/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Invité ingoenius Posté(e) le 26 juin 2007 Posté(e) le 26 juin 2007 Je m'excuse, je sais que je devient un peu bordelique ;-( le fait est que en cherchart de faire fonctionner les choses je rajoute parfois des nouveaux problemes, mais vos reponse sont toujours bonnes ;-) J'essayerai de faire de mon mieux pour pas vous embeter ;-) PS entretemps par contre je reuissi a finir le lisp ;-) ici le code (defun c:POI () (setq Peso 0.0);setto il peso a Zero (setq SS (ssget (list (cons 0 "insert"))));set di selezione (if (/= SS nil);se la lista non é vuota (progn (setq lb (list nil)) ; lb lista vuota dei nomi dei blocchi (setq INDEX 0) (repeat (sslength SS) (setq EL (entget (SSNAME SS INDEX))) ;elementi della lista (setq nome (cdr (assoc 2 EL))) ;nomi degli elementi ;parte per il peso dei blocchi--LISTA DEI PESI------------------------------------------- ;------------------------------------------------------------------------------ (setq Pb (cond ((= nome "ACL") 7.0) ((= nome "ACL_3d") 7.0) ((= nome "alpha_spot") 20.0) ((= nome "alpha_spot_3d") 20.0) ((= nome "ASSY_3d") 20.0) ((= nome "DECOUPE_1Kw") 7.0) ((= nome "DEC_1KW_3d") 6.0) ((= nome "DECOUPE_2KW") 12.0) ((= nome "DEC_2KW_3d") 12.0) ((= nome "DECOUPE_ETC") 5.0) ((= nome "DEC_ETC_3d") 5.0) ((= nome "DECOUPE_REVOLUTION") 40.0) ((= nome "FRESNEL_1Kw") 6.0) ((= nome "FRESNEL_1KW_3d") 6.0) ((= nome "FRESNEL_2Kw") 10.1) ((= nome "FRESNEL_2KW_3d") 10.1) ((= nome "MAC_2000") 38.0) ((= nome "MAC_500") 32.5) ((= nome "MAC_500_3D") 32.5) ((= nome "MAC_600") 32.6) ((= nome "MAC_600_3D") 32.6) ((= nome "QUARTZ") 3.0) ((= nome "RAMPE_T8") 8.0) ((= nome "VL_3000") 32.0) ((= nome "VL_3500") 32.0) ((= nome "BARRE_PAR") 6.0) ((= nome "BARRE_PAR_3d") 6.0) ((= nome "ColorSpot") 32.0) ((= nome "Colorwash") 32.0) ((= nome "KOLORADO") 32.0) ((= nome "PAR") 1.5) ((= nome "PAR_3D") 1.5) ((= nome "PAR_P") 0.8) ((= nome "PAR_P_3D") 0.8) ;poids des ponts h30v (carre) environs ((= nome "H30V-L100-3D") 5.1) ((= nome "H30V-C003-3D") 4.8);angle90 ((= nome "H30V-C017-3D") 6.1);T ((= nome "H30V-C016-3D") 7.2);croix ));fine cond e fine set pesi (setq Peso (+ Peso Pb)) (setq INDEX (1+ INDEX)) );fine progn );fine if );fine repeat (setq P1 (getpoint "\nGet Point")) ;creo stile di testo (command "_style" "T_MAX" "Simplex" 0 1 0 "N" "N" "");crea lo stile di testo (setvar "textstyle" "T_MAX") ;lo rende corrente (setq ROT_TEXT 0) (setq hTxt 0.12 ) (setq Speso (rtos Peso)) (setq stringa_peso (strcat "Weight " Speso " Kg" )) (command "_TEXT" P1 hTxt 0.0 stringa_peso "" ) );fine defun [Edité le 26/6/2007 par ingoenius]
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