harksin Posté(e) le 27 avril 2011 Posté(e) le 27 avril 2011 nouveau sujet nouvelle question: mon probleme:j'ai deux liste, exemple L1 : (1 3 5 7 9)L2 : (2 4 6 8 10) bon et ben vus que je suis un peut chiant je veut sa:(1 2 3 4 5 6 7 8 9 10) j'ai codé une tite fonction (defun c:INT_list ( l1 l2) ; intercaleur de liste (setq liste_in nil) (while l1 (setq Liste_in (cons (cons (car l1) (car l2)) Liste_in)) (setq l1 (cdr l1)) (setq l2 (cdr l2)) ) (reverse Liste_in) ) mais sa me donne ((1 2) (3 4) (5 6) (7 8) (9 10))...Et le problème c'est que derrière j'ai une autre fonction qui n'accepte que des chaine continue.. donc si quelqu'un connais le moyen de transformé ((1 2) (3 4) (5 6) (7 8) (9 10))en(1 2 3 4 5 6 7 8 9 10) je suis tout ouïe
(gile) Posté(e) le 27 avril 2011 Posté(e) le 27 avril 2011 Salut, Pour "aplatir" ta liste, tu peux faire :(apply 'append '((1 2) (3 4) (5 6) (7 8) (9 10))) Mai il y a moyen de faire plus simple (et plus élégant) :(defun int_list (l1 l2) (if l1 (cons (car l1) (int_list l2 (cdr l1))) l2 ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 27 avril 2011 Posté(e) le 27 avril 2011 Salut Ou encore(vl-sort (append '(1 3 5 7 9) '(2 4 6 8 10)) '<[b])[/b]mais j'ai l'impression de tricher un peu ;) Sinon, il y a aussi cette solution(apply 'append (mapcar 'list '(1 3 5 7 9) '(2 4 6 8 10))) @+ [Edité le 27/4/2011 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Carboleum Posté(e) le 27 avril 2011 Posté(e) le 27 avril 2011 (apply 'append (mapcar 'list '(1 3 5 7 9) '(2 4 6 8 10))) La classe! Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
harksin Posté(e) le 27 avril 2011 Auteur Posté(e) le 27 avril 2011 Bonsoir! merci beaucoup pour ces information!Cependant il semble que j'ai oublier de précisé un objet non négligeable:le contenue de mes liste, c'est du texte exemple réel : L1 : ("Enrobé " "TV 0-20" "TV 0-31,5" "Traitement en place")L2 : ("0,1" "0,2" "0,35" "0,65") forme de la liste obtenue avec mon code :(("Traitement en place" . "0,65") ("TV 0-31,5" . "0,35") ("TV 0-20" . "0,2") ("Enrobé " . "0,1")) or la fonction append ne fait rien, (je n'ai pas de message d'erreur mais aucun resultat). donc a priori je tourne toujours en rond^^. ceci dit sa sert a quoi tout vos apostrophe? c'est pour déclaré un paramètre ou c'est plus complexe? ps: j'ai aussi essayer sans succé les autre proposition [Edité le 27/4/2011 par harksin]
(gile) Posté(e) le 27 avril 2011 Posté(e) le 27 avril 2011 C'est parce que ton code ne génère pas une liste de sous listes, mais une liste de paires pointées. Les codes données par Patrick_35 et moi fonctionnent tous les deux. Une petite différence si les deux listes ne font pas la même longueur : le code donné par Patrick_35 s'arrête à la liste la plus courte, celui que j'ai donné ajoute le restant de la liste la plus longue. (setq L1 '("Enrobé " "TV 0-20" "TV 0-31,5" "Traitement en place") L2 '("0,1" "0,2" "0,35" "0,65") ) (defun int_list (l1 l2) (if l1 (cons (car l1) (int_list l2 (cdr l1))) l2 ) ) (defun int-list (l1 l2) (apply 'append (mapcar 'list l1 l2)) ) _$ (int_list l1 l2)("Enrobé " "0,1" "TV 0-20" "0,2" "TV 0-31,5" "0,35" "Traitement en place" "0,65")_$ (int-list l1 l2)("Enrobé " "0,1" "TV 0-20" "0,2" "TV 0-31,5" "0,35" "Traitement en place" "0,65") ceci dit sa sert a quoi tout vos apostrophe? L'apostrophe est un raccourci pour la fonction quote qui empêche l'évaluation de l'expression.Ceci dit, si tu poses ce genre de questions, c'est que tu t'es trompé de forum, "Débuter en LISP" aurait été mieux adapté et les réponses auraient peut-être pris ça en considération. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
harksin Posté(e) le 27 avril 2011 Auteur Posté(e) le 27 avril 2011 Effectivement sa marche Pourquoi je n'ai pas réussi tout a l'heure? mystère. Pour le post je ferai attention a poser au bon endroits la prochaine fois. Cependant si sa ne t'embette pas on peut continuer ici?pourrai tu m'expliquer ce qu'est une paire pointé?? comme on les obtiens et quel sont leur usage? parcque pour le coup je n'ai jamais entendu ce mot dans la bouche de mon prof^^. par ailleur je me casse les dent sur un algorithme de désision. ma structure est: tan que ma liste existe Si son premier element est égal a (une serie de possibilité) alors si je rencontre (une serie de possibilité) j'enregistre les valeur suivante dans une liste et je lance un cript sinon je reduit la liste d'un element (et j'ajoute la valeur suprimé a une liste temporaire)et je recomence. ma question est:quand je sort du cript je veut retourné au debut de l'algo, et non pas a un endroit X a l'interieur... auriez vous une piste pour mois? la premiere branche de l'arbre de dessision : (setq len_disp (length Disp_lst)) (while (< 0 len_disp) (cond ((= "Vo_def" (Car Disp_lst)) ( (repeat (cond ((= "Vo_def" (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo))) ) ;rend la liste active courante et lance le prog ((= "Tr_def" (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo))) ) ((= "Brd_def" (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo))) ) ((= nil (Car Disp_lst)) ((setq disp_lst_vo disp_lst_act) (c:MOD_vo))) ) ((setq disp_lst_act (cons (Car Disp_lst) disp_lst_vo)) (setq Disp_lst (cdr Disp_lst))) ) ) [Edité le 27/4/2011 par harksin]
(gile) Posté(e) le 27 avril 2011 Posté(e) le 27 avril 2011 pourrai tu m'expliquer ce qu'est une paire pointé?? comme on les obtiens et quel sont leur usage? parcque pour le coup je n'ai jamais entendu ce mot dans la bouche de mon prof^^. J'espère que tu as eu un moment d’inattention, parce que sinon,ton "prof" a vraiment oublié de te parler des fondamentaux... Un paire pointée est une liste spéciale, non seulement parce qu'elle ne contient que deux éléments mais surtout à cause de la manière dont on la construit et dont on accède à ses éléments. Une paire pointée se construit avec la fonction cons à laquelle on passe deux atomes comme arguments :(setq p (cons 1 "a")) retourne (1 . "a") qui est une paire pointée (il y a un point entre les deux éléments)(car p) retourne 1 comme avec une liste classique, mais(cdr p) retourne "a" qui n'est pas une liste mais un atome Avec une liste classique de deux éléments, on a des résultats un peu différents.Pour la construire, on utilise la fonction list :(setq l (list 1 "a")) retourne (1 "a") qui est une liste classique (pas de point)(car l) retourne 1, mais(cdr l) retourne ("a") qui est une liste. Ce comportement est directement lié aux "listes chainées" utilisées en LISP (et dans d'autres langages). Voir ce sujet. Les paires pointées sont largement utilisées dans ce qu'on appelle les listes d'association : liste de paires pointées et/ou de sous listes dont le premier élément sert de clé et le reste de la sous-liste (ou paire pointée) est la valeur. Les données DXF des objets AutoCAD (entre autres) sont exposés de cette manière ce qui facilite l'accès à ces données avec la fonction assoc et les clés.Exemple avec une liste d'association très simple :(setq alst '((1 . "string") (10 2.6 8.4 0.0) (70 . 2)))(assoc 1 alst) retourne la paire pointée (1 . "string")(assoc 10 alst) retourne la liste (10 2.6 8.4 0.0)(assoc 70 alst) retourne la paire pointée (70 . 2) et la fonction cdr permet d'accéder à la valeur que celle-ci soit un atome ou une liste(cdr (assoc 1 alst)) retourne l'atome "string"(cdr(assoc 10 alst)) retourne la liste (2.6 8.4 0.0) (un point)(cdr(assoc 70 alst)) retourne l'atome 2 Quand à ta seconde demande, je ne comprends pas tout mais peut te dire d'ores et déjà que ton code comporte beaucoup trop de parenthèses.(cond ([i]condition1 expression1 expression2[/i] ...) ([i]condition2 expression4 expression5[/i] ...) ... )Où chaque condition et expression peut être soit un atome soit une liste (appel de fonction).Je te recommandes la lecture des 4 sujets "Mis en tête" du forum "Débuter en LISP" :- Éléments de syntaxe AutoLISP- L'éditeur Visual LISP- Arguments et Variables Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
harksin Posté(e) le 28 avril 2011 Auteur Posté(e) le 28 avril 2011 Je publie a la suite car je suis dans l'impossibilité de crée un nouveau sujet (dans le forum debutant ou ici) (erreur duplicate key) merci pour toute tes info j'ai encore du mal a saisir la difference entre argument et variable locale mais je vais trouvez! En fait si tu veut je souhaite sortir d'une boucle avant qu'elle soit fini, car ma boucle est une fonction de recherche, et quand j'ai trouvé je ne doit pas continuer... message original:bonjour Voila, je voudrai ouvrir un nouveau .dwg a partir d'un gabarit. Le but étant que mon lisp ouvre ce gabarit, enregistre le fichier, dessin dedans, puis le ferme le tout uniquemet en ligne de commande pour que ce soit transparent pour l'utilisateur. la question est donc commen faire pour ouvrir et fermer un fichier?? merci d'avance de votre aide Harksin [Edité le 28/4/2011 par harksin]
(gile) Posté(e) le 28 avril 2011 Posté(e) le 28 avril 2011 j'ai encore du mal a saisir la difference entre argument et variable locale On appelle variable une valeur affectée à un symbole, dans le dessin ou à l'intérieur d'une fonction si la variable est déclarée dans la fonction. Un argument (ou paramètre) est une valeur passée à une fonction, quand on fait :(reverse Liste_in) Liste_in est l'argument de la fonction reverse. (defun c:INT_list ( l1 l2) ...) l1 et l2 sont les arguments de la fonction c:int_list. En fait si tu veut je souhaite sortir d'une boucle avant qu'elle soit fini, car ma boucle est une fonction de recherche, et quand j'ai trouvé je ne doit pas continuer... La fonction cond évalue tour à tour les conditions jusqu'à la première qui retourne un résultat non nil, elle évalue alors la ou les expressions pour cette condition puis s'arrête. (setq num (getint "\nEntrez un nombre entier: ")) (cond ((= 0 (rem num 2)) (alert "Nombre pair")) ((= 0 (rem num 3)) (alert "Multiple de 3")) (T (alert "Nombre impair non multiple de 3")) ) Voila, je voudrai ouvrir un nouveau .dwg a partir d'un gabarit.Le but étant que mon lisp ouvre ce gabarit, enregistre le fichier, dessin dedans, puis le ferme le tout uniquemet en ligne de commande pour que ce soit transparent pour l'utilisateur. la question est donc commen faire pour ouvrir et fermer un fichier?? Attention le LISP est lié au document : si un LISP lancé dans un document "A" ouvre un document "B", il n'est pas actif dans le document "B". En Visual LISP, on peut utiliser ObjectDBX pour accéder à la base de donnée d'un document fermé, modifier cette base de donnée et enregistrer le document, mais je pense que tu as des choses à apprendre avant de te lancer dans ce genre d'exercice. Sinon, ce que tu veux faire est peut-être possible en utilisant un script, fais une recherche avec SuperAutoScript. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bryce Posté(e) le 28 avril 2011 Posté(e) le 28 avril 2011 Bonjour, Voila, je voudrai ouvrir un nouveau .dwg a partir d'un gabarit. Le but étant que mon lisp ouvre ce gabarit, enregistre le fichier, dessin dedans, puis le ferme. C'est absolument incompréhensible (pour moi en tout cas)... :casstet: Il n'est pas nécessaire d'ouvrir un gabarit pour créer un nouveau fichier à partir d'un gabarit, pourrais-tu essayer de clarifier ce que tu souhaites faire ? Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
harksin Posté(e) le 29 avril 2011 Auteur Posté(e) le 29 avril 2011 bonjour en fait je veut pouvoir dire en lisp crée ce fichier, pour ce faire utilise le gabarit "X" place toi dedans dessine sauve ferme j'ai trouvé une manière de contourné mon problème en dessinant dans le dessin actif dans une zone défini, et en exportant le contenue de cette zone dans un nouveau dwg avec la commande wbloc mais je suis toujours en quette d'un moyen plus direct pour résumé je cherche des équivalent au jeux de commande lisp (open read-line write-line close)mais qui s'applique à un dessin et non à un fichier texte. ceci-dit je pense que gile avais cerné la question, et je après avoir fouillez un peut je pense qu'il a raison. pour superautoscrip je l'ai Dl mais pas encore etudié. petite question subsidiaire:quand on crée un wbloc depuis un script les objet sélectionné s'efface, hors dans la boite de dialogues il y a un option "conserver". peut on contrôler cet argument ? bonne journée harksin [Edité le 29/4/2011 par harksin]
Patrick_35 Posté(e) le 29 avril 2011 Posté(e) le 29 avril 2011 Salut Je pense comme (gile)Apprends à mieux utiliser le vlisp avant de t'attaquer à ce type de prog.Il y a plusieurs concepts à maîtriser, comme la gestion des documents dans autocad par exemple. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
harksin Posté(e) le 29 avril 2011 Auteur Posté(e) le 29 avril 2011 bonsoir quelqu'un sait il pourquoi je ne peut plus crée de sujet (erreur duplicate key 1)en désespoir de cause je poste ici mais c'était pour le forum "object dcl" message originalBonjour je souhaite afficher un dwg dans une boite de dialoge dwg preview d'objectdcl me parai approprié néanmoins je ne parviens pas a réglé le zoom et la position de la vue. connaissait vous une méthode ou un autre artefact qui me permette d'arriver plus facilement a mes fins?? merci d'avance pour vos réponse Harksin
bryce Posté(e) le 29 avril 2011 Posté(e) le 29 avril 2011 Bonjour, petite question subsidiaire:quand on crée un wbloc depuis un script les objet sélectionné s'efface, hors dans la boite de dialogues il y a un option "conserver". peut on contrôler cet argument ? Tu peux utiliser la commande _UNDO ou l commande _OOPS après avoir utilisé WBLOC. ;) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
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