Aller au contenu

dictionnaires


Invité ingoenius

Messages recommandés

Invité ingoenius
Posté(e)

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 ??

Posté(e)

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)

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?

 

Posté(e)

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)

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

 

 

 

Posté(e)
(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...

Posté(e)

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)

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]

Posté(e)
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)

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]

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é