bseb67
Membres-
Compteur de contenus
833 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par bseb67
-
Salut Cadlt! Un fichier lisp (*.lsp) est lisible avec un simple editeur de texte notepad ou wordpad. Avant de me servir de Visual Lisp d'autocad, j'utilisais TextPad, un outil gratuit et assez pratique. Tu peux le configurer pour afficher le code en couleur (fonctions lisp). a+
-
Salut Griff! Il faut remplacer tous les code (40 . x) par (40 . largeur_voulue) a+ Oups, dsl c'est le forum VBA. [Edité le 12/10/2007 par bseb67]
-
Pouce :cool: ! Comme je suis un peu tordu d'esprit (l'air d'alsace est différent ;) ), et qu'en cours on nous martelle régulièrement: l'utilisateur peut faire n'importe quoi , écraser une mouche sur son clavier! :o :o Il faut gérer un max. Mais avec cela, on s'en sort plus. On fera comme microsoft: on gère plus ou moins et si ca marche pas, et bien c'est l'utilisateur qui a mal agi :cool: . Pour la mise à jour de mon lisp, le week-end chargé qui m'attend risque de la mettre en attente. Donc bon week-end à vous 3 en particulier et aux autres aussi. :D
-
Salut Matt666, Pas vraiment, je sais que l'on peut faire un (done_dialog x). Mais c'est, j'ai réussi à faire ce que je voulais. J'ai des variables globales qui contiennent le choix de l'utilisateur lors d'un clic, comme cela en bouclant sur la fonction qui lance la dcl, il peut faire toutes les étapes et dans n'importe quel ordre. Si j'ai le temps, je ferai une version simplifiée. Pour le futur challenge, disons qu'il n'est pas trop en rapport avec autocad, c'est plus tot l'intérêt des listes (encore :o ), et pour une fois pas vraiment un exercice :casstet: ! Je le lancerai dimanche ou lundi. a+
-
Salut (Gile)! La modification corrige le test, car moi, comme un con, j'ai pas trop réfléchit au retour de (angle). Car j'avais essayé la première version avec mon exemple lst, et bien ca marchait pas. Maintenant, pour la 3D, je vais partir sur trois choses: distance par rapport '(0.0 0.0 0.0), angle plan (angle normale), angle Z. Pour matt, je ne parle jamais de beau code, mais plus tot de code clair, propre et/ou efficace ;).
-
Salut Matt666! Les chemins de supports sont stockés dans la BDR (base de registres). Il y a peut être une variable ou une fonction. Mais si tu sais écrire en lisp dans la BDR, amuse toi ;). De plus, si tu utilise des comptes utilisateurs différents (chez nous se sont des profils itinérants), le changement dans la BDR n'est appliquée que pour l'utilisateur qui a ouvert la session windows. a+.
-
Resalut! Oups :P , je suis tête en l'air, angle renvoi entre 0 et 2*Pi. C'est ce qui arrive quand on fait ca le soir après une journée de travail, de la musique en fond sonore et que l'on joue en même temps. ;) Je ne suis pas une femme :cool:. , donc petite correction: ((or (= (setq ang1 (abs (angle (nth (1- cpt) res) (nth cpt res)))) (setq ang2 (abs (angle (nth cpt res) (nth (1+ cpt) res))))) (= ang1 (+ Pi ang2)) (= ang2 (+ Pi ang1)) ) Donc avec lst: (remove-align-bseb lst) => ((2031.72 887.831 0.0) (1103.09 444.369 0.0) (2479.32 281.238 0.0) (1242.68 -141.286 0.0) (1242.68 748.925 0.0))
-
Voilou! (setq lst '((2031.72 887.831 0.0) (1103.09 444.369 0.0) (1800.07 281.238 0.0) (2479.32 281.238 0.0) (1242.68 281.238 0.0) (1242.68 -141.286 0.0) (1242.68 748.925 0.0))) Bon, il n'y a pas de points confondus :cool: Je le remarque en faisant mes lisps, je dois souvent pallier au fait que les données ne sont pas toujours comment elles devraient être, et là, c'est surtout le traitement de ces cas spéciaux qui t'alourdissent le code et le temps d'exécution. Sinon, j'aurai fait le même premier code que toi Bred. :) Et bien pour ce cas là, c'est pas vraiment bon: (setq lst '((1407.97 589.961 0.0) (1103.09 444.369 0.0) (1800.07 281.238 0.0) (2479.32 281.238 0.0) (1242.68 281.238 0.0) (1242.68 -141.286 0.0) (1242.68 281.238 0.0))) Car l'aller-retour sur point l'avant avant dernier point, supprime le dernier morceau de ligne. [Edité le 10/10/2007 par bseb67] [Edité le 10/10/2007 par bseb67]
-
Bon, alors je dépose aussi. Mon truc est plus long, car je ne suppose pas que pi est entre pi-1 et pi+1 et s'il n'y a pas des points confondus. On peut tomber sur des mickeys qui font des aller-retour ou clique deux fois au même endroit ;)! ;------------------------------; ; nom: points_egaux ; ; role: test si les deux points; ; sont égaux ou non ; ; param: p1 => point n°1 ; ; p2 => point n°2 ; ; retour: t si oui ; ; nil sinon ; ; date: 25/04/2007 ; ; BLAES Sébastien ; ;------------------------------; (defun points_egaux( p1 p2 / res) (setq res t marge 1e-9) ; on compare x (if (> (abs (- (car p1) (car p2))) marge) (setq res nil) ; on compare y (if (> (abs (- (cadr p1) (cadr p2))) marge) (setq res nil) ; on compare z (if (> (abs (- (caddr p1) (caddr p2))) marge) (setq res nil) ) ; if z ) ; if y ) ; if x res ) ; points_egaux ;-------------------------------; ; nom: aumilieu ; ; role: test si le point p1 est ; ; entre les deux points p2; ; et p3 ; ; param: p1 => point 3D n°1 ; ; p2 => point 3D n°2 ; ; p3 => point 3D n°3 ; ; retour: t si oui ; ; nil sinon ; ; date: 25/04/2007 ; ; BLAES Sébastien ; ;-------------------------------; (defun aumilieu( p1 p2 p3 / d1 d2 d3) (setq d1 (distance '(0.0 0.0 0.0) p1) d2 (distance '(0.0 0.0 0.0) p2) d3 (distance '(0.0 0.0 0.0) p3) ) ; setq (cond ( (or (and (<= d2 d1) (<= d1 d3)) (and (<= d3 d1) (<= d1 d2))) t ) ; vrai (t nil ) ; sinon c'est faux ) ; cond ) ; aumilieu ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;; CHALLENGE12 ;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;--------------------------------; ; nom: remove-align-bseb ; ; role: simplifie une suite de ; ; points: si trois qui se ; ; suivent dans la liste l ; ; sont alignés, on supprime; ; celui du milieu ; ; param: l => liste de points ; ; retour: liste simplifiée : ; date: 08/10/2007 ; ; BLAES Sébastien ; ;--------------------------------; (defun remove-align-bseb( l / res cpt lg) (setq res l cpt 1 lg (1- (length l))) (while (< cpt lg) ; on test d'abord si les points ne sont pas égaux (cond ((points_egaux (nth (1- cpt) res) (nth cpt res)) ; on retire cpt (setq res (vl-remove (nth cpt res) res) lg (1- (length res))) ) ; cpt-1 = cpt ((points_egaux (nth cpt res) (nth (1+ cpt) res)) ; on retire cpt+1 (setq res (vl-remove (nth (1+ cpt) res) res) lg (1- (length res))) ) ; cpt = cpt+1 ; on compare l'angle par rapport à l'axe des x de cpt-1 et cpt ; avec la droite cpt cpt+1 ((= (abs (angle (nth (1- cpt) res) (nth cpt res))) (abs (angle (nth cpt res) (nth (1+ cpt) res)))) ; on supprime le point au milieu des 2 autres (setq d1 (distance '(0.0 0.0 0.0) (nth (1- cpt) res)) d2 (distance '(0.0 0.0 0.0) (nth cpt res)) d3 (distance '(0.0 0.0 0.0) (nth (1+ cpt) res)) ) ; setq (cond ( (or (and (<= d1 d2) (<= d2 d3)) (and (<= d3 d2) (<= d2 d1))) (setq res (vl-remove (nth cpt res) res) lg (1- (length res))) ) ; cpt au milieu ( (or (and (<= d2 d1) (<= d1 d3)) (and (<= d3 d1) (<= d1 d2))) (setq res (vl-remove (nth (1- cpt) res) res) lg (1- (length res))) ) ; cpt-1 au milieu (t (setq res (vl-remove (nth (1+ cpt) res) res) lg (1- (length res))) ) ; sinon c'est cpt+1 au milieu ) ; cond ) (t ; sinon on incrémente cpt (setq cpt (1+ cpt)) ) ; sinon ) ; cond ) ; while res ) ; remove-align-bseb
-
Salut (gile)! Je suis un peu décu qu'il n'y a pas beaucoup de différence entre 3/2.0 et 3*0.5, car la division par 2 est censé être la division (après 1) la plus rapide. A croire que *0.5 est traduit en /2.0. Bonne soirée :)
-
Salut et merci. Mais j'ai trouvé (une autre facon peut-être). Je fait: (action_tile "btn_fichier_ARC" "(setq f_ARC t)(DONE_DIALOG)") Puis après le (unload_dialog dcl_id) (cond (f_arc (setq var_f_ARC (recuperer_texte (car (entsel)))) (lance_dcl) ) ; f_arc ) ; cond A+! PS: J'ai hâte de voir ta façon pour le challenge12. J'en lancerai un prochainement ;)
-
Salut! Désolé Matt666 :o, j'espère que tu m'en voudra pas ;). Sinon petit message pour (gile), j'ai un premier jet pour ce challenge, je cherche à l'améliorer en me servant de benchmark, et bien il n'est pas très fiable :P . J'ai voulu tester mes deux méthodes pour une sous fonction, j'obtiens 1.00 pour la plus lente (lap lus lente aura toujours 1.00), mais l'autre le coef va de 1.00 à 1.30 :o. Des fois c'est plus rapide, des fois non :casstet: . Donc pour la mesure de temps, il faudrai rien faire d'autre sur le pc. Comme on ne peut mesurer le temps CPU (comme je le faisais en C++). Il me reste aussi à corriger le challenge10, j'ai un petit souci pour des suites de "." dans une suite de chiffres.
-
Salut! Je planche sur un problème de dcl depuis ce matin :( . Ca doit être faisable, puisque certaines boite de dialogues d'autocad le font. Déroulement de ce que je cherche: Je clique sur mon bouton, qui ouvre une dcl. Il y a bien sûr le bouton ok et cancel, mais d'autres boutons, si je clique sur un de ces boutons, je voudrai que l'utilisateur puisse cliquer sur un objet dans le dessin donc fermer la dcl, traiter l'objet choisi, puis de ré-afficher la dcl. Exemple pour un bouton: (action_tile "btn_fichier_ARC" "(DONE_DIALOG)(set_tile \"fichier_ARC\" (setq var_f_ARC (recuperer_texte (entsel))))") Je fais bien un DONE_DIALOG, j'initialise un edit avec l'objet cliqué. Mais dans la commande autocad, je vois bein apparaître "cliquez sur un objet:", mais la boite de dialogue reste affichée et là je ne peux plus rien faire (ca boucle :( ). Si quelqu'un peut m'éclairer, je suis preneur :)
-
Autre petite question Mat666, Ton exemple comporte des "faux" points 3D, faut-il faire une méthode 2D et une 3D? Et oui, je suis sur mon pc perso :cool: !! Ma femme est fatigué et va donc se coucher! :D
-
récupérer selection oui mais ...
bseb67 a répondu à un(e) sujet de lenoil dans Pour aller plus loin en LISP
Salut Lenoil! Tu fais : (setq selection (ssget "_X" (list (cons 8 monLayer) (cons 410 "Model")))) Le code 410 te donne le nom de la présentation ou Model qui correspond à l'espace objet. a+ -
Re-salut! Petite correction, ou plus tot précision: Signifiai si j'ai le droit d'aller sur le pc :), pas de ne pas sortir du lit ;). Comme je ne suis pas là 12h/24 et que je suis toute la journée sur un pc, le soir elle veut que l'on reste ensemble. Mais c'est vrai que des fois j'aime bien jouer le soir et seul :cool:
-
Salut MAt666! Pour le challenge11, je n'ai pas encore corriger le pb des points qui se suivent. Pour ce nouveau challenge, il faut tester toutes les combinaisons possibles entre les points? Ou seulement se dire que le point p1 et p2 forme une première ligne l1, p2 et p3 une deuxième l2, ... et donc devoir si l2 est une continuité de l1 ? Si c'est cela, je crois que j'ai du faire un truc dans ce genre, car pour tester un réseau, je vérifiai la superposition et le prolongement pour remplacer des morceaux de ligne par une seule ligne. Là je dois retourner bosser, si ma femme me laisse tranquille ce soir, je reprendrai mon lisp pour répondre à ce challenge.
-
Salut MAt666! Pour le challenge11, je n'ai pas encore corriger le pb des points qui se suivent. Pour ce nouveau challenge, il faut tester toutes les combinaisons possibles entre les points? Ou seulement se dire que le point p1 et p2 forme une première ligne l1, p2 et p3 une deuxième l2, ... et donc devoir si l2 est une continuité de l1 ? Si c'est cela, je crois que j'ai du faire un truc dans ce genre, car pour tester un réseau, je vérifiai la superposition et le prolongement pour remplacer des morceaux de ligne par une seule ligne. Là je dois retourner bosser, si ma femme me laisse tranquille ce soir, je reprendrai mon lisp pour répondre à ce challenge.
-
challenge 11 \"certainement pour confirmé\"
bseb67 a répondu à un(e) sujet de lovecraft dans Débuter en LISP
Salut Lovecraft! Ayant peu de dessins 3D, serai-t-il possible d'avoir un de ces plans? Je t'envoie mon mail perso en mp. a+! -
Patrick à déposer pendant j'écrivais, donc avec son code j'obtiens le même temps pour lui que pour moi. Je vais devoir rallonger la boucle de test ;)!
-
Re-salut! Eh bien, j'ai fait le lisp à midi, j'ai rajouté celui de gile (qui marche) et celui de patrick_35. J'ai fait une boucle avec un appel sur une chaine de 320 caractères. Il y a une différence entre le résultat du lisp de gile et le mien: pour gile, il faut qu'un point soit entouré de nombre, chez moi, si on 1.d => 1. "d", d.1 => "d." 1 Voici mon code ;---------------------------------; ; nom: challenge10bseb67 ; ; role: à partir d'une chaine de ; ; caractères avec chiffres ; ; et lettres, et la fonction; ; retourne une liste avec ; ; chiffres et les lettres ; ; séparées ; ; param: chaine ; ; retour: liste ; ; ou -1 si erreur ; ; date: 02/10/2007 ; ; Sébastien BLAES ; ;---------------------------------; (defun challenge10bseb67( depart / res etat tmp cpt lg charlu) ; on test si départ est bien une chaine (if (= (type depart) 'STR) (progn (setq res '() tmp "" cpt 0 lg (strlen depart)) ; on initialise l'état (if (or (= (substr depart 1 1) ".") (= (type (read (substr depart 1 1))) 'SYM)) (setq etat 'SYM) (setq etat 'INT) ) ; if ; on boucle sur la chaine pour la traiter (while (< cpt lg) (setq charlu (substr depart (1+ cpt) 1)) ; on test les cas possibles (cond ; on continue la chaine ((and (= etat 'SYM) (or (= charlu ".") (= charlu " ") (= (type (read charlu)) 'SYM))) (setq tmp (strcat tmp charlu)) ) ; on continue le nombre ((and (= etat 'INT) (or (= charlu ".") (= (type (read charlu)) 'INT))) (setq tmp (strcat tmp charlu)) ) ; sinon on change de type (t (if (= etat 'SYM) (setq etat 'INT res (append res (list tmp)) tmp charlu) (setq etat 'SYM res (append res (list (read tmp))) tmp charlu) ) ; if ) ) ; cond ; on incrémente cpt (setq cpt (1+ cpt)) ) ; while ; on ajoute le dernier morceau (setq res (append res (list tmp))) ) ; progn (progn (alert "Le paramètre d'appel de challenge10bseb67 n'est pas une chaine!") (setq res -1) ) ; progn ) ; if ; on affiche res ;(print res) ; on renvoie le résultat res ) ; challenge10bseb67 Les fonctions basique de mesure de temps ;-----------------------------------; ; nom: start_time ; ; role: sauvegarde la date de départ; ; d'un lisp ; ; param: aucun ; ; retour: aucun ; ; date: 22/05/2007 ; ; BLAES Sébastien ; ;-----------------------------------; (defun start_time() (setq starttimevar (getvar "DATE") timetot 0 intertimevar 0) ) ; start_time ;----------------------------------; ; nom: stop_time ; ; role: sauvegarde la date de fin ; ; d'un lisp ; ; param: affichage => si t oui ; ; retour: temps entre start et stop; ; en secondes ; ; date: 22/05/2007 ; ; BLAES Sébastien ; ;----------------------------------; (defun stop_time( affichage) (setq stoptimevar (getvar "DATE")) (setq stoptimevar (* 86400.0 (- stoptimevar starttimevar intertimevar))) (if affichage (alert (strcat "temps: " (rtos stoptimevar 2 2) "s" )) (strcat "temps: " (rtos stoptimevar 2 2) "s" ) ) ; if ) ; stop_time Et enfin le lisp de test: (defun test( / cpt nb) (setq cpt 0 nb 50 var_test "4v qsgfg.4qf4gdfsgq g4f4sv4 qg 4qsrg4g1hqrhg 3h4q4h4h4 hqt4dh4q 4ht4qh/44hgh t../ ghh4 84f3h.h 1h84t1.t18e6ah4a 1h61t 86h61.h 8a4eh86a4 .haet864h6 .h186h 1x831gbe4ht6hj4,k4kl4ik4 b6g 6g44h6 hb1dh4t .h4 hte4h69t4h4etajh.ha4 .h4 +at4.agjha74jh9 4+8t4j1v 4aha4h 1,n4.hah1 ah9+4ar+4jhqb1azth4ab1fg4ht84jh+4h1qdf84ha4th+1t+j48y") (start_time) (while (< cpt nb) (challenge10bseb67 var_test) (setq cpt (1+ cpt)) ) ; while (setq cpt 0) (setq tbseb (stop_time nil)) (print "bseb fini") (start_time) (while (< cpt nb) (challenge10gile var_test) (setq cpt (1+ cpt)) ) ; while (setq cpt 0) (setq tgile (stop_time nil)) (print "gile fini") (start_time) (while (< cpt nb) ;(challenge10pat var_test) (setq cpt (1+ cpt)) ) ; while (setq cpt 0) (setq tpat (stop_time nil)) (print "pat fini") (alert (strcat "tps bseb: " tbseb "\ntps (gile): " tgile "\ntps tarick_35: " tpat)) ) ; test (test) (gile), j'ai juste renommé ta fonction ;) Et bien au début, avant le renvoie de res dans mon lisp, je faisait un print. En lancant le test sur mon poste j'obtenais : 0.52s pour mon lisp 0.25s pour (gile) :( !! Ca m'a rendu triste de prendre 2 fois plus de temps. Puis un souvenir decours m'est revenu: les print sont un bouffe temps!!! J'ai commenté le print et le nouveau résultat: 0.19s pour mon lisp 0.25s pour (gile) :o !!! J'ai divisé par 2.5 mon temps. Mais en fait c'est tout à fait normal!!! ;) des appels récursifs sont plus gourmands que de l'itérative (autre connaissance de cours).
-
Salut Matt666! Pour info , je ne suis pas un maître. J'ai peut être une formation d'ingénieur de développement, mais à la fac c'était du C, C++ et Java. Le lisp je l'ai appris par une petite formation d'une semaine en février 2007, sachant que je ne connaissait on va dire quasiment rien à autocad. Comme toi, je sera parti sur des tests ascii, je passe toujours par un algo pseudo-code pour ensuite chercher à le transcrire. Mais en tout cas je ferai pas mieux que (gile) ou patrick_35. Je vais la faire ce matin et lancer une comparaison de performances entre les trois ;) .
-
Salut Matt666! Petite question: ton troisième exemple pose problème, car un "." peut être une "lettre"? et pas forcément une virgule. Ma journée est finie, donc j'attaque demain, mais je sais que gile ou patrick vont faire un truc plus rapide que moi.
-
Salut! Essaye SAS (SuperAutoScript) d'éric: http:// http://www.cadxp.com/sujetXForum-15445.htm?POSTNUKESID=2e72061eefc329f8b7717e3f0a1d0d81
-
Salut! Regarde déjà la différence de taille entre un fichier version 2004 vs version 2007 :cool: . Comme le dit rebcao, il faut utiliser les blocs, lors de ma formation lisp (au début de cette année) avec un exemple tout simple d'un batiment , on passe d'un fichier de 12Mo à <1Mo :o ! Le plus marrant c'est lorsqu'un client de mon formateur appel pour dire: mon pc ram, j'arrive pas à ouvrir un fichier!!!! => celui-ci faisait 130Mo :o :o !! Avec que des traits, pardon lignes!!! Sinon, j'utilise aussi la commande wbloc. a+.
