Invité ingoenius Posté(e) le 16 mai 2008 Posté(e) le 16 mai 2008 existe la possibilité en lisp de créer un espèce de tableau comme celui la NOM DE BLOC DIMx DIMy KG KW PAR64 40 20 3 500MAC250 85 72 35 1200MAC2000 90 80 42 2000................................................................. maintenat dans le dessin il y a des bloc avec les nom correspondantcomment je fait pour chercher le bloc MAC250 e dire combien de KG il pese?ou pour sortir sa dimension, en excel il y a une fonction "recherche V" est ce que en lisp on peut faire quelque chose de similaire ? une matrice? ou autre? il faut partir avec des listes? ou avec des listes de listes?et comment extraire depuis le nome de bloc MAC2000 la bonne reference ? merci pour votre aide je suis un peut perdu, ;-)
Bred Posté(e) le 16 mai 2008 Posté(e) le 16 mai 2008 Salut,existe la possibilité en lisp de créer un espèce de tableau comme celui lail faut partir avec des listes? ou avec des listes de listes?Il peut y avoir plusioeur logique, mais bien sûr la base est la liste.Moi je fais des listes de listes. : (setq lst-BLC (list '("PAR64" 40 20 3 500) '("MAC250" 85 72 35 1200) '("MAC2000" 90 80 42 2000))) Poids :(setq pd (nth 3 (assoc "MAC250" lst-BLC))) Dimension :(setq dim (list (cadr (assoc "MAC250" lst-BLC)) (caddr (assoc "MAC250" lst-BLC)))) Pour rechercher des éléments d'une un liste, tu as aussi la fonction foreach, ou repeat, ou while... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Invité ingoenius Posté(e) le 16 mai 2008 Posté(e) le 16 mai 2008 merci pour l'aide ;-) je avance sur cela et ça marche bien (defun C:Bd() ;--------------- ;TABELLA Dimensioni in mm puissWatt ; NOME PesoKg dimX dimY dimZ Watt (setq lst-BLC (list '("MAC2000 Perf" 42 408 490 743 1550) '("MAC2000 Wash" 32 408 490 750 1450) '("MAC250" 31 330 384 525 370) '("MAC250+" 22 330 384 525 370) '("MAC550" 26.1 356 481 673 700) '("MAC600" 31.5 356 481 652 780) '("MAC600_NT" 31.5 356 481 652 780) )) (setq poid 0.0);Kg (setq puiss 0.0);Watt (setq Volume 0.0);m cube ;(setq lb (list nil)) (setq INDEX 0) (setq SS (ssget (list (cons 0 "insert")))) (repeat (sslength SS) (setq EL (entget (SSNAME SS INDEX))) (setq NOM-BLOC (cdr (assoc 2 EL))) (setq pd (nth 1 (assoc NOM-BLOC lst-BLC))) (setq Kw (nth 5 (assoc NOM-BLOC lst-BLC))) (setq Dx (nth 2 (assoc NOM-BLOC lst-BLC))) (setq Dy (nth 3 (assoc NOM-BLOC lst-BLC))) (setq Dz (nth 4 (assoc NOM-BLOC lst-BLC))) (setq M3 (/ (* Dx Dy Dz)100000000.00)); (setq puiss (+ Kw puiss)) (setq poid (+ pd poid)) (setq Volume (+ M3 Volume)) (setq INDEX (+ 1 INDEX)) );fin Repeat );fin Defun
Bred Posté(e) le 16 mai 2008 Posté(e) le 16 mai 2008 Pour mon travail je fais les mêmes choses que toi, sauf que j'ai rentré mes info dans les blocs avec des attributs invisibles. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Invité ingoenius Posté(e) le 16 mai 2008 Posté(e) le 16 mai 2008 c'est aussi une solution, mais j'explique pourquoi je l'utilise pas pour moi c'est n'est pas assai pratique car des que tu veut ajouter un paramétre il faut décomposer les blocs et recréer le tout en faisant attention a l'ordre de sélection des attribut etc , par contre avec cette méthode, seul le nom du bloc compte , et les info sont stocké dans le lisp modifiable très facilement de plus je peut si besoin crée des blocs génériques auxquels ensuite je change seulement le nom avec cette routine, quoi en penses tu? ;; InputBox (gile) ;; Ouvre une boite de dialogue pour récupérer une valeur ;; sous forme de chaine de caractère ;; ;; Arguments ;; tous les arguments sont de chaines de caractère (ou "") ;; box : titre de la boite de dialogue ;; msg : message d'invite ;; val : valeur par défaut ;; ;; Retour ;; une chaine ("" si annulation) (defun InputBox (box msg val / subr temp file dcl_id ret) ;; Retour chariot automatique à 50 caractères (defun subr (str / pos) (if (and (< 50 (strlen str)) (setq pos (vl-string-position 32 (substr str 1 50) nil T)) ) (strcat ":text_part{label=\"" (substr str 1 pos) "\";}" (subr (substr str (+ 2 pos))) ) (strcat ":text_part{label=\"" str "\";}") ) ) ;; Créer un fichier DCL temporaire (setq temp (vl-filename-mktemp "Tmp.dcl") file (open temp "w") ret "" ) ;; Ecrire le fichier (write-line (strcat "InputBox:dialog{key=\"box\";initial_focus=\"val\";spacer;:paragraph{" (subr msg) "}spacer;:edit_box{key=\"val\";edit_width=54;allow_accept=true;} spacer;ok_cancel;}" ) file ) (close file) ;; Ouvrir la boite de dialogue (setq dcl_id (load_dialog temp)) (if (not (new_dialog "InputBox" dcl_id)) (exit) ) (set_tile "box" box) (set_tile "val" val) (action_tile "accept" "(setq ret (get_tile \"val\")) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) ;;Supprimer le fichier (vl-file-delete temp) ret ) (defun c:BB ();rinomina i blocchi (setq OBJ (ssgetfirst)) (setq old_BLOCCO (cadr OBJ));estrai la selezione (if (= old_BLOCCO nil) ;se nulla é selezionato (setq BLOCCO (car (entsel "\nSelect block "))) (setq BLOCCO (ssname old_BLOCCO 0)) ) (setq old_DatiB (entget BLOCCO))(= (cdr (assoc 0 old_DatiB)) "INSERT") (setq Test (cdr(assoc 2 old_DatiB))) ;metto qui il vecchio nome del blocco ;(setq New_N (getstring T "\nNew Name? ")) (setq New_N (inputbox "Rename Block" Test "new name")) ;cambiare qui la dcl dialog (null (tblsearch "BLOCK" New_N)) (vl-cmdf "_.rename" "_b" (cdr (assoc 2 old_DatiB)) New_N) (princ) ) ;----------------------------------------------------------------------------
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