Matt666
Membres-
Compteur de contenus
736 -
Inscription
-
Dernière visite
-
Jours gagnés
2
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Matt666
-
distance entre lignes d\'un mtext
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
G pas l'impression que ce soit ça, désolé... Pour un mtext de base le code dxf 44 retourne 1... Si je prend une distance à la louche pour un texte de base, ça ne donne pas vraiment 1... Merci quand même ! -
Désolé pour le temps de réponse, mais j'avais pas vu ces challenges !! Vachement bien ça didon !! (defun cen-grav (pt1 pt2 pt3) (mapcar '(lambda (div) (/ div 3))(mapcar '+ pt1 pt2 pt3)) ) Ma réponse diffère un peu de celle de Gile, mais c'est pas loin... A quand un autre chalenge de ce type ??? ;) A bientot ! Matt.
-
Salut !! Tite question, vite fait : ya -t-il un code DXF qui renferme le décalage entre les lignes de textes d'un objet texte multiple ? Ou sinon comment faire pour le trouver ? une piste m'aiderais beaucoup ! Merci ! A bientot... Matt.
-
oh bah t'inquiète je commence à sacrément le comprendre !!! Oui, ça peut être intéressant, mais avec AutoCAD... Pas avec un clone... Bon bah je vais rester sur mon fichier texte ! Merci pour ton temps perdu à me répondre... Matt.
-
Bing c'est Bred le premier !!! Ah bah oui, c'est po con... Il faut simplement répéter le read-line... par contre imaginons que cette variable est à modifier, comme l'unité, pour reprendre l'exemple plus haut, Là je ne peux plus ouvrir le fichier en lecture seule... Il faudrait pour bien faire recopier les données du fichier et modifier la valeur qui nous intéresse inscrite à une ligne donnée... Si, justement... merci pour ta réponse rapide... Adtal ! Matt.
-
Un peu à la bourre !!! (defun test (lst / pts listt) (setq lst (mapcar '(lambda (x) (cons x 1)) (acad_strlsort lst))) (foreach pt lst (if (eq (vl-position (setq pts (cons (car pt) (apply '+ (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) (car pt))) lst))) )) listt ) nil ) (setq listt (cons pts listt)) ) ) (if listt (reverse listt)) ) Tout ça pour dire : A quand un nouveau challenge pas trop dur ??? :D A bientôt. Matt.
-
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Franchement je vois pas du tout... Chu ptet un peu trop le nez dans mon code... Mais là je donne ma langue à CadXP... A part un rwhile et une récursivité, je vois pas comment faire !! Et vu que la récursivité, chu une belle bille (de 20), je vois que le while... LST2STR.... STR2LST ???? :) ;;;**************************************************************** ;;;**************************************************************** ;;; STR2LST ;;; Retourne une liste à partir d'une chaîne de caractères concaténée avec un caratère de séparation ;;; str = Chaîne de caractères ;;; sep = caractère de séparation ;;; ;;; (str2lst "0,1,,,,2,3,4,5,6,7,8,9" ",") -> (0 1 2 3 4 5 6 7 8 9) ;;; (str2lst "0,1,2,3,4,5,6,7,8,9" "" ) -> ("0" "," "1" "," "2" "," "3" "," "4" "," "5" "," "6" "," "7" "," "8" "," "9") (defun str2lst ( STR SEP / ) (setq lst nil cn 0) (if (/= SEP "") (progn (while (string-search SEP str nil) (if (/= (substr str 1 (string-search SEP str nil)) "") (setq lst (cons (setq eff (chtype (substr str 1 (string-search SEP str nil))))lst) str (string-subst "" (strcat (princ-to-string eff) SEP) str nil) ) (setq str (string-subst "" SEP str nil)) ) ) (if (and (/= (substr str 1 (strlen str)) "") (string-search SEP str nil) ) (setq lst (cons (chtype (substr str 1 (strlen str))) lst)) ) ) (repeat (strlen str) (setq lst (cons (substr str (setq cn (1+ cn)) 1) lst)) ) ) (if lst (reverse lst)) ) ;;; (defun chtype (CRT / ) (if (eq CRT "0") (atoi CRT) (if (/= (atoi CRT) 0) (atoi CRT) (if (or (/= (atof CRT) 0.00) (and (eq (atof CRT) 0.00) (eq (substr CRT 1 4) "0.00") ) ) (atof CRT) CRT ) ) ) ) J'ai viré une variable qui ne servait pas... Et voilà !! J'ai honte... Il va se marrer le (gile) !! Adtal ! Matt. Edition : Maintenant la routine gère les zones vides entre les caractères de séparation... Voir le 1er exemple de la routine... [Edité le 19/9/2007 par Matt666] -
Salut ! J'ai une autre question : Dans les routines lisp que j'ai créées, certaines variables reviennent tout le temps... On doit appeler ça des variables globales je crois... La question est , vous vous en doutez : Comment stocker et appeler les variables globales ??? Pour moi la meilleure solution consiste à créer un fichier texte... L'une de mes variables est stockée dans un fichier texte nommé "VAR.TXT". C'est la variable d'unité de dessin. je fais un read-line pour retourner l'unité. J'aimerais bien pouvoir en ajouter d'autres mais je ne sais pas comment "demander à lire la deuxième ligne du fichier texe" par exemple !!! Voilà... Bon je sais ya deux questions... on va Q1 pour la 1ère et Q2 pour l'autre :laugh: Merci d'avance pour vos réponses garanties !! Qui sera le premier... (Gile), Patrick_35, BonusCad ou Bred ??? :D J'rigole.. A bientôt ! Matt.
-
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Concours des brutes du lisp !! C'est beau tout ça !! :laugh: Bon bah je vais essayer.... Par contre je suis un peu nul avec la gestion des chaines de caractères, notamment le substr... mais bon je vais tenter ! Ne compte par sur moi pour utiliser la récursivité, c'est vraiment trop obscur encore... Il faut que j'étudie ça plus profondément, avec des exemples et tout et tout.. En fait surtout des exemples simples !! :) Même pas besoin de demander !!! Dément... J'ai une dernière question par rapport à ça : Si on déclare des variables locales genre (defun test (/ ss lst)) est-ce vrai que ces deux variables déclarées son mises à nil avant de commencer ? C'est ça le vrai intérêt de cette déclaration... Désolé, mais j'aime bien parfaitement comprendre les choses :P Bon je vais poster un nouveau sujet... :) A bientot ! Matt. -
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
C'est vrai que c'est la classe, la récursivité... Oui c'est vrai que c'est beaucoup mieux comme ça !! Merci ! Que penses-tu de cette dernière ? On peut faire largement bien mieux, mais je la trouve po mal... Je préfère les fonctions sans variables, comme c'est le cas pour mapcar ou l'exemple de récursivité. C'est d'autant plus beau ! Je n'ai jamais compris pourquoi il fallait déclarer les variables !! Maintenant c'est fait. Le fait de faire ça, si je comprend bien, met à nil celles-ci ? C'est génial ça didon ! bon bah dément ! J'en aurais encore appris un paquet aujourd'hui ! Merci Gile !! -
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Ah oui j'ai vu aussi !! (defun CONCAT_recursive (lst sep) (if (cdr lst) (strcat (vl-princ-to-string (car lst)) sep (CONCAT_recursive (cdr lst) sep) ) (vl-princ-to-string (car lst)) ) ) -
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Bon bah voilà un petit bout de code pas dément, mais c'est déjà ça !! ;;;**************************************************************** ;;; CONCATL ;;; Retourne une liste à partir d'une chaîne de caractères concaténée avec un caratère de séparation ;;; str = Chaîne de caractères ;;; car = caractère de séparation ;;; Exemples : ;;; (concatl "0,1,2,3,4,5,6,7,8,9" ",") -> (0 1 2 3 4 5 6 7 8 9) (defun CONCATL (str crt / ) (setq lst nil cn 0) (if (/= crt "") (progn (while (string-search crt str nil) (setq un (string-search crt str nil) lst (cons (setq eff (chtype (substr str 1 un))) lst ) str (string-subst "" (strcat (princ-to-string eff) ",") str nil) ) ) (if (/= (substr str 1 (strlen str)) "") (setq lst (cons (chtype (substr str 1 (strlen str))) lst )) ) ) (progn (repeat (strlen str) (setq lst (cons (substr str (setq cn (1+ cn)) 1) lst)) ) ) ) (if lst (reverse lst)) ) Ne te fous pas de moi stoplé !! Je sais, c'est très loin d'être concis, mais ça a le mérite de fonctionner ! Par contre j'arrive pas (encore) à faire une liste de nombres.... ya pas une fonction contraire à princ-to-string ? Genre ça (defun chtype (crt / ) (if (eq crt "0") (atoi crt) (if (/= (atoi crt) 0) (atoi crt) (if (/= (atof crt) 0.0000) (atof crt) crt ) ) ) ) [Edité le 18/9/2007 par Matt666] Modification du code : si crt égal "", retourne liste caractère par caractère. [Edité le 18/9/2007 par Matt666] -
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Houlàlà récursivité, je connais pas du tout ! Je vois bien le concept, une fonction qui fait appel à elle-même, mais pour l'instant c'est pas encore ça... Par contre j'essaie la fonction qui extrait une liste d'une chaîne.. Et ça c'est assez balaise, aussi !! Pour l'instant g un gros code tout pourri :) Mais je ne désespère pas (trop) ! -
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Aaar !! Mais c'est dur !!! Grmbl Merci pour toutes ces infos !! Pour l'instant j'ai ces corrections-ci : (defun CONCAT (lst crt / ) (strcat (apply 'strcat (mapcar '(lambda (x) (strcat (princ-to-string x) crt))) (reverse (cdr (reverse lst))) ) (princ-to-string (last lst)) ) ) Par contre sans le mapcar, ça devient dur, là !! A part un foreach+variable, je vois pas ! Génial cette fonction princ-to-string :D Merci encore pour ton temps passé à me conseiller ! J'attends avec impatience ta façon de faire !! J'essai l'inverse, aussi... [Edité le 18/9/2007 par Matt666] -
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Peut être la fonction REMOVE, qui si on la renomme devrait fonctionner sous Autocad.. (defun CONCAT (lst crt / ) (strcat (apply 'strcat (mapcar '(lambda (x) (strcat x crt)) (vl-remove (last lst) lst)) ) (last lst) ) ) En tout cas ça fonctionne sous 2000... Maintenant je vais tenter avec ton princ-to-string -
Concatener une liste avec un caractère de séparation...
Matt666 a répondu à un(e) sujet de Matt666 dans Routines LISP
Ok d'ac je m'y attèle direc ! ;) Forcément que tu dois avoir ça !!! Sur BricsCad ça fonctionne très bien.. Grmbl Bon je regarde ! Adtal ! [Edité le 18/9/2007 par Matt666] -
Rotation / Echelle en gardant l\'objet original
Matt666 a répondu à un(e) sujet de lecrabe dans Routines LISP
Oups pardon... Merci BonusCad et gile pour ces précisions ! J'ai tout bien compris ! A bientot. Matt. [Edité le 24/9/2007 par Matt666] -
Salut les gens de CadXP... Voici un petit lisp pluôt sympa pour passer d'une liste à une chaîne de caractères en la concatenant. Bon ce sont mes débuts avec les fonctions apply et mapcar donc on ne rigole pas, mais elle a l'air de bien fonctionner ! ;;;**************************************************************** ;;; CONCAT ;;; Retourne une chaîne de caractères concaténée avec un caratère de séparation ;;; lst = liste à concatener ;;; car = caractère de séparation ;;; Exemples : ;;; (concat '(0 1 2 3 4 5 6 7 8 9) ",") -> "0,1,2,3,4,5,6,7,8,9" ;;; (concat '(0 1 2 3 4 5 6 7 8 9) "") -> "0123456789" (defun CONCAT (lst car / ) (strcat (apply 'strcat (mapcar '(lambda (x) (strcat x car)) (remove (last lst) lst)) ) (last lst) ) ) Dites moi ce que vous en pensez ! A bientot. Matt. [Edité le 18/9/2007 par Matt666]
-
Rotation / Echelle en gardant l\'objet original
Matt666 a répondu à un(e) sujet de lecrabe dans Routines LISP
C'est quoi cette méthode ??? Je comprends pas bien... Pourrais-tu développer stp le Crabe ? Merci ! A bietot. matt. -
"ceinture rouge et blanche 6em dan" Si c'est pas la classe ça !!! Bravo ! Merci d'avoir créé une routine en autolisp et en Vlisp, pour ceux qui n'ont pas la chance de pouvoir utiliser le VLisp.... Je suis quand même sacrément bluffé par ta maîtrise du Lisp, c'est impressionant... Et je rejoins ce que dit lili2006 à propos de ce site Abientot ! Matt.
-
Merci à vous pour ces réponses ! Je vais quand même essayer de voir avec OVERKILL.... Ai-je le droit de modifier un lisp des express tools et de l'intégrer dans un autre logiciel CAO DAO ? En l'occurence OVERKILL ? Et puis si je n'y arrive pas je continuerai mon lisp... Gile, tu as donné une routine permettant de trouver les extrémités d'une liste de points. Crois-tu que ce petit bout de routine fonctionne comme ça aussi ? (setq addit (mapcar '(lambda (x) (+ (car x) (cadr x) (caddr x))) lst3) pt1 (nth (position (car (sort addit '<)) addit) lst3) pt2 (nth (position (car (sort addit '>)) addit) lst3) ) Il fait l'addition des coordonnées de chaque point, et retourne le plus petit et le plus grand... Je suis pas sur, quand même ! Ca parait trop simple ;) A bientot !! Matt. [Edité le 14/9/2007 par Matt666]
-
La commande Overkil... :o Mais qu'est-ce que c'est que ça !!!! Bah écoute je sais pas !! Je regarde ça demain ! Même si je n'ai pas autocad, je vais regarder... Merci Ludwig ! A bientôt. Matt.
-
Monopolisation du forum là... Ca va plus !!! Encore un truc... Suite à une discussion ici, j'ai eu une petite idée d'un lisp : Purger les lignes superposées en fonction d'une sélection. J'ai commencé, ça donne ça : ;;; LINEARP Retourne T si tous les points de la liste sont alignés ;;; Lisp de GILE (defun linearp (lst) (cond ((= 2 (length lst)) T) ((or (equal (vec1 (car lst) (cadr lst)) (vec1 (car lst) (caddr lst)) 1e-009 ) (equal (vec1 (car lst) (cadr lst)) (vec1 (caddr lst) (car lst)) 1e-009 ) ) (linearp (cdr lst)) ) ) ) ;;; VEC1 Retourne le vecteur normé (1 unité) de p1 à p2 (nil si p1 = p2) ;;;Lisp de GILE (defun vec1 (p1 p2) (if (not (equal p1 p2 1e-009)) (mapcar '(lambda (x1 x2) (/ (- x2 x1) (distance p1 p2)) ) p1 p2 ) ) ) ;;;Efface les lignes superflues (defun c:SURFLU () (cond ((setq sel (ssget '((0 . "LINE")))) (setq cn 0) (while (setq entity (ssname sel (setq cn (1+ cn)))) (setq lst1 nil lst1 (cons (cdr (assoc 10 (entget entity))) lst1) lst1 (cons (cdr (assoc 11 (entget entity))) lst1) lst3 nil ) (repeat (setq cn2 (sslength sel)) (setq entity2 (ssname sel (setq cn2 (1- cn2))) lst2 nil lst2 (cons (cdr (assoc 10 (entget entity2))) lst2) lst2 (cons (cdr (assoc 11 (entget entity2))) lst2) ) (if (linearp (append lst1 lst2)) (progn (if lst3 (setq lst3 (append lst2 lst3))(setq lst3 (append lst1 lst2))) (entdel entity2) (ssdel entity2 sel) ) ) ) (if lst3 (progn (setq addit (mapcar '(lambda (x) (+ (car x) (cadr x) (caddr x))) lst3) pt1 (nth (position (car (sort addit '<)) addit) lst3) pt2 (nth (position (car (sort addit '>)) addit) lst3) ) (entdel entity) (entmake (list (cons 0 "LINE") (cons 10 pt1) (cons 11 pt2) )) (entupd (entlast)) (princ "\nlignes jointes.") )) ) ) ) (redraw) (princ) ) En fin de compte le ssget retourne une liste de points qui, à la condition d'être co-linéaires sont jointes pour ne former qu'une seule ligne. Le code est loin d'être concis, notamment cette chose là (setq addit (mapcar '(lambda (x) (+ (car x) (cadr x) (caddr x))) lst3) pt1 (nth (position (car (sort addit '<)) addit) lst3) pt2 (nth (position (car (sort addit '>)) addit) lst3) ) qui retourne la coordonnée la plus grande et la plus petite... Bon ça fonctionne pour les lignes superposées. Par contre si deux lignes séparées d'un vide sont colinéaires, il va les joindre aussi !! Voilà je cherche un moyen de lui faire comprendre de ne pas joindre les lignes non superposées et colinéaires... Merci ! A bientot. Matt. [Edité le 14/9/2007 par Matt666]
-
Monopolisation du forum là... Ca va plus !!! Encore un truc... Suite à une discussion ici, j'ai eu une petite idée d'un lisp : Purger les lignes superposées en fonction d'une sélection. J'ai commencé, ça donne ça : ;;; LINEARP Retourne T si tous les points de la liste sont alignés ;;; Lisp de GILE (defun linearp (lst) (cond ((= 2 (length lst)) T) ((or (equal (vec1 (car lst) (cadr lst)) (vec1 (car lst) (caddr lst)) 1e-009 ) (equal (vec1 (car lst) (cadr lst)) (vec1 (caddr lst) (car lst)) 1e-009 ) ) (linearp (cdr lst)) ) ) ) ;;; VEC1 Retourne le vecteur normé (1 unité) de p1 à p2 (nil si p1 = p2) ;;;Lisp de GILE (defun vec1 (p1 p2) (if (not (equal p1 p2 1e-009)) (mapcar '(lambda (x1 x2) (/ (- x2 x1) (distance p1 p2)) ) p1 p2 ) ) ) ;;;Efface les lignes superflues (defun c:SURFLU () (cond ((setq sel (ssget '((0 . "LINE")))) (setq cn 0) (while (setq entity (ssname sel (setq cn (1+ cn)))) (setq lst1 nil lst1 (cons (cdr (assoc 10 (entget entity))) lst1) lst1 (cons (cdr (assoc 11 (entget entity))) lst1) lst3 nil ) (repeat (setq cn2 (sslength sel)) (setq entity2 (ssname sel (setq cn2 (1- cn2))) lst2 nil lst2 (cons (cdr (assoc 10 (entget entity2))) lst2) lst2 (cons (cdr (assoc 11 (entget entity2))) lst2) ) (if (linearp (append lst1 lst2)) (progn (if lst3 (setq lst3 (append lst2 lst3))(setq lst3 (append lst1 lst2))) (entdel entity2) (ssdel entity2 sel) ) ) ) (if lst3 (progn (setq addit (mapcar '(lambda (x) (+ (car x) (cadr x) (caddr x))) lst3) pt1 (nth (position (car (sort addit '<)) addit) lst3) pt2 (nth (position (car (sort addit '>)) addit) lst3) ) (entdel entity) (entmake (list (cons 0 "LINE") (cons 10 pt1) (cons 11 pt2) )) (entupd (entlast)) (princ "\nlignes jointes.") )) ) ) ) (redraw) (princ) ) En fin de compte le ssget retourne une liste de points qui, à la condition d'être co-linéaires sont jointes pour ne former qu'une seule ligne. Le code est loin d'être concis, notamment cette chose là (setq addit (mapcar '(lambda (x) (+ (car x) (cadr x) (caddr x))) lst3) pt1 (nth (position (car (sort addit '<)) addit) lst3) pt2 (nth (position (car (sort addit '>)) addit) lst3) ) qui retourne la coordonnée la plus grande et la plus petite... La routine met beaucoup de temps à finir son travail... Alors ça fonctionne pour les lignes superposées. Par contre si deux lignes séparées d'un vide sont colinéaires, il va les joindre aussi !! Voilà je cherche un moyen de lui faire comprendre de ne pas joindre les lignes non superposées et colinéaires... Et puis, en passant, d'accélérer un peu letravil à fournir !! Voilà ! Merci ! A bientot. PS : Bien sur je pourrais utiliser la commande joindre, mais ce serait trop facile ;) [Edité le 12/9/2007 par Matt666]
-
:thumbup:Oui, aussi !!! Disons que cette commande _undo est très pratique pour annuler la conséquence d'une routine. Mais c'est une commande ! Sur BricsCAD, on annule pas à pas le réultat d'une routine... Comment ferais-tu, pour annuler par exemple tous les déplacements d'objets appartenant à un calque dans un autre ??? Vite fait un truc du genre : (defun c:depcal () (if (and (setq sel (ssget "_x" (list (cons 8 (cdr (assoc 8 (entget (car (entsel "\nSélectionner un objet du calque à déplacer : ))))))))) (setq nouvcalq (cdr (assoc 8 (entget (car (entsel "\nSélectionner un objet du calque de destination : ")))))) ) (repeat (setq cn (sslength sel)) (setq entity (entget (ssname sel (setq cn (1- cn))))) (entmod (subst (cons 8 nouvcalq) (assoc 8 entity) entity)) ) ) (princ) ) Eh bien pour revenir à l'état initial, il faut faire autant de UNDO que d'objets déplacés !!! Voilà la raison de ma question... Et puis j'aime bien les routines sans (command) !! Voilà, bonne nuit ! A bientot ! Matt.
