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
-
D'accord je comprends mieux pour les drapeaux... Merci pour ces infos ! Par contre (je suis désolé d'être neuneu comme ça...) je vois pas l'utilité... Dans mon dessin je veux savoir quels sont les noms de blocs avec des attributs. D'abord si on passe une petite routine dans un dessin (149 blocs) (sort (remove-doubles (mapcar '(lambda (x)(cdr (assoc 70 (tblsearch "block" x))))(lstab "block"))) '<) (remove-doubles) est une petite routine de Gile très appréciable disponible ici... Quant à (sort), elle correspond à (vl-sort) sur AutoCAD... Le résultat : (32 33 34) Bon... Ensuite si on regarde un peu mieux : 32 correspond aux blocs sans attributs 33 correspond aux blocs anonymes 34 correspond aux blocs avec attributs Donc il n'y a plus qu'à faire un filtre sur le drapeau 34 du code 70 des références de la table des blocs... Voilà... Qu'en dites-vous ?? Sinon, j'ai essayé la routine montrée ci-dessus (defun essai (lst /) (setq lib lst) (mapcar '(lambda (x) (if (not (eq (cdr (assoc 70 (tblsearch "block" x))) 34)) (setq lib (remove x lib)) ) ) lib ) (acad_strlsort lib) ) et je l'ai comparée à un foreach (defun essai2 (lst /) (setq listbl34 nil) (foreach pt lst (if (eq 34 (cdr (assoc 70 (tblsearch "block" pt)))) (setq listbl34 (cons pt listbl34)) ) ) (acad_strlsort listbl34) ) Il s'avère que le foreach, par rapport à un mapcar, est beaucoup plus rapide... Est-ce que c'est normal ??? Merci à vous pour votre patience... A bientot ! Matt.
-
Salut Patrick_35 ! Je viens de tester ta routine et nous arrivons au même résultat ! :D Par contre je ne comprends toujours pas les drapeaux du code 70 de la table des blocs.... Si je fais un (tblsearch "block" (cdr (assoc 2 (entget (car (entsel)))))) sur un bloc ou un bloc-attributs, je ne tombe jamais sur un 1 ou 4 ou 16 ! Et puis c'est quoi LOGAND !! Raaah lala je suis pommé encore une fois.... Je vais mieux regarder ta routine, j'ai du oublier une chose importante... Merci ! A bientot. Matt.
-
Petit début qui fonctionne plutot pas mal... (defun essai (lst /) (setq lisb lst) (mapcar '(lambda (x) (if (not (eq (cdr (assoc 70 (tblsearch "block" x))) 66)) (setq lisb (remove x lisb)) ) ) lisb ) lisb ) Voilà... Nota : Il faut charger la routine "remove" de gile qu'on peut trouver ici... D'ailleurs merci encore Gile pour ces routines !! Pour le code 70, Je ne comprends pas trop la problématique, peut-être du fait que je n'utilise pas AutoCAD.... Si je passe un petit (tblsearch "block" (cdr (assoc 2 (entget (car (entsel)))))) sur un bloc n'ayant pas d'attribs, il met un drapeau 64, par contre si c'est un bloc attrib, c'est le drapeau 66 qui vient... Voila ! A bientot. Matt Ah oui ! Pour que cette routine fonctionne sur autoCad, il faut ajouter vl- à remove... Et puis ce ,'est pas le drapeau 66, mais 34 pour le code DXF 70... Genre ça : ;;;Version AutCAD (defun essai (lst /) (setq lisb lst) (mapcar '(lambda (x) (if (not (eq (cdr (assoc 70 (tblsearch "block" x))) 34)) (setq lisb (vl-remove x lisb)) ) ) lisb ) lisb ) Voilà voilà ! Dites moi ce que vous en pensez ! [Edité le 30/8/2007 par Matt666][Edité le 30/8/2007 par Matt666] [Edité le 30/8/2007 par Matt666]
-
Salut BonusCad ! Merci pour ta réponse rapide ! Je vais aller voir et tester ton bout de code ! Merci ! A bientot. Matt.
-
Bonjour à tous ! Ce message s'adresse aux rois de la gestion des listes (Gile, par exemple :D ) J'aimerais avoir une liste de toutes les refs de blocs pourvues d'attributs dans un dessin.. Il faut donc rapatrier tous les noms des références de blocs, et passer par un tblsearch + code dxf 70 pour savoir quels blocs ont un code dxf de 66. Je suis sur que l'on peut utiiser un mapcar + lambda pour trouver ça rapidement. Je sais très bien qu'un foreach serait des plus simples ! Mais j'essaie de comprendre et d'utiliser ces fonctions de liste mapcar, apply, append, lambda etc... Voilà. J'ai commencé une routine qui ressemble à ça : (mapcar '(lambda (x)(cdr (assoc 70 (tblsearch "block" x))))(lstab "block")) Là j'arrive à voir les résultats du code DXF 70 pour chaque élément de la liste... Après je n'arrive pas à lui donner une condition, puis à reprendre le nom de la référence de bloc... La fonction LSTAB sert à lister toutes es refs de blocs présentes dans le dessin ;;; LSTAB ;;; Génère une liste des entités d'une des tables de la bd graphique. ;;; (LSTAB "layer") -> ("0" "structure") (defun LSTAB (tabl) (if (eq (type tabl) 'STR) (progn (setq lb '() lb (cons (cdr (assoc 2 (tblnext tabl T))) lb)) (while (setq x (cdr (assoc 2 (tblnext tabl))))(setq lb (cons x lb))) (if (/= (strcase tabl) "BLOCK")(setq lb (acad_strlsort lb)) lb ) ) ) ) Voilà voilà ! Merci d'avance. A bientot. Matt.
-
zoom sur bloc sans la commande zoom objet !!
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
Salut Gile ! Désolé pour le retard, j'étais en vacances ! D'accord pour les calculs vectoriels... J'essaierai de m'y mettre... Je vais tenter de faire les équivalents que tu dis en fonction de ton code... J'ai encore une question... Je ne comprend pas très bien comment fonctionne le code que tu as donné un peu plus haut : (setq minpt (apply 'mapcar (cons 'min ptlst))) (setq maxpt (apply 'mapcar (cons 'max plst))) C'est parce que je ne connais pas encore bien les fonctions mapcar et apply... Bref je te remercie, et à biretot ! Matt. -
zoom sur bloc sans la commande zoom objet !!
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
Ok... Tu as réussi à créer une méthode de sélection à partir d'une spline.... Bon bah cool !!! Merci pour tout ce travail :D !! Quel est le problème pour la matrice ? Lenteur ? Je vois pas le problème... Je teste ça dès que je retourne au boulot ! Merci pour tout. Matt. -
zoom sur bloc sans la commande zoom objet !!
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
Et bing !! Il est très fort ce Gile !! Eh bien... Le code DXF 42 ! Connaissais pas celui là.. Vachement pratique ce SelByPline ! Merci ! J'avais fait un truc similaire, mais là il prend en compte les arcs... Vraiment fort... Bon je vais me coucher, demain je me penche sur ce code ! Merci encore ! Matt. -
zoom sur bloc sans la commande zoom objet !!
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
J'avais essayé de trouver une routine qui permettait de dire si un point était à l'intérieur d'une polyligne ou pas, d'après un problème que tu avais posé dans un des nombreux forum de ce site... J'étais arrivé à la conclusion que l'on ne pouvait rien faire en autolisp lorsqu'on a une polyligne avec des arcs. La routine récupérait les sommets de la polyligne , et créait une sélection polygonale (ssget "cp"...) sans recréer les arcs, evidemment. Alors oui je vois bien ce que tu veux dire quand tu parles du problème d'encombrement des arcs et cercles... Je suis en train de me familiariser avec les mapcar et autres lambda ! c'est génial !!! :D plus besoin de foreach, et c'est beaucoup plus rapide.. Merci de me donner des pistes d'amélioration de code comme ça ! A bientot. Matt. -
zoom sur bloc sans la commande zoom objet !!
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
Ah... C'est vrai qu'un vieux "insterbox" serait des plus pratiques !! Bon bah c'est po grave, je vais demander au développeur de se demerder pour me trouver les coordonnées de l'encombrement du bloc en VB.. Il va être content, vu qu'il aime bien comparer le VB et le lisp !! Merci pour les petites (minuscules !!) expressions pour trouver les coordonnées min et max d'une pline, c'est cool !!! Vache j'ai vachement de boulot pour arriver à ce niveau de concision !!! merci encore, et bon Week-end ! A bientot. Matt. -
zoom sur bloc sans la commande zoom objet !!
Matt666 a posté un sujet dans Pour aller plus loin en LISP
Aille... Bonjour à tous !! J'ai (encore) un problème.. Si, si. Je cherche désespérément à faire un lisp qui, en entrant le handle graphique d'une entité, zoome sur celle-ci. Seulement voilà : Ces entités sont soit des blocs, soit des polylignes... Pour les polylignes, pas (trop) de problème, il faut trouver le coin inférieur gauche et le coin supérieur droit, pour faire un zoom fenêtre. Bon mon code est (très très) loin d'être concis mais ça a le mérite de fonctionner.. (setq lis10 '() a (entget (car (entsel)))) (foreach pt a (if (eq (car pt) 10) (setq lis10 (cons pt lis10)))) (setq lis10 (reverse lis10) minlisx (car (cdr (assoc 10 lis10))) minlisy (cadr (cdr (assoc 10 lis10))) minlisz (caddr (cdr (assoc 10 lis10))) maxlisx minlisx maxlisy minlisy maxlisz minlisz ) (foreach pt lis10 (if (< (cadr pt) minlisx)(setq minlisx (cadr pt))) (if (> (cadr pt) maxlisx)(setq maxlisx (cadr pt))) (if (< (caddr pt) minlisy)(setq minlisy (caddr pt))) (if (> (caddr pt) maxlisy)(setq maxlisy (caddr pt))) (if (< (cadddr pt) minlisz)(setq minlisz (cadddr pt))) (if (> (cadddr pt) maxlisz)(setq maxlisz (cadddr pt))) ) (setq minlis (list minlisx minlisy minlisz)) (setq maxlis (list maxlisx maxlisy maxlisz)) On ne rit pas dans le fond; merci ... Ca, c'est un beau merdier. Par contre pour les blocs, ça se complique ! Comment fait-on pour trouver l'encombrement du bloc !?! Même le point d'insertion ne sert pas... Comme on dit par ici, c'est la merde Thierry. (Désolé pour les Thierry...) Et pour couronner le tout, je n'utilise pas AutoCAD, mais bricsCAD, qui évidemment ne fournit pas l'outil de zoom objet. Bing. Fichtre ! Pour ceux qui seraient tentés d'utiliser des VL trucs, non plus ! Chez BricsCAD ils n'aiment que la pureté et la beauté de l'autolisp (sigh). :cool: Voilà pour les bases... Récapitulons : Faire un zoom sur un bloc après l'avoir sélectionné ! Messieurs, à vos claviers ! Et surtout merci d'avance... Je le connais ce site, les gens dedans, ils trouvent tout ! Désolé, c'est vendredi. A bientot ! Matt. -
Perpendiculaire à partir d\'un point
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
Ah oui D'accord je comprends mieux.. Pour l'instant ça risque de m'embrouiller plus qu'autre chose, mais merci pour cette précision ! Bonne journée ! Matt. -
Perpendiculaire à partir d\'un point
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
Raaah la vache ! C'est exactement ce que je voulais faire !! :D Bon bah j'ai encore du boulot moi !! :) (grdraw) connais pas, ça a l'air dément ! (textbox) Raaah là là mais c'est génial ce truc !! (getvar "UCSXDIR") Mais d'où elle sort cette variable !!! Encore une fois merci pour tout ! C'est vrai que la ligne élastique c'est un peu du bricolage... Merci aussi pour tes explications à propos du grread maintenant je vois beaucoup mieux. Pour mieux comprendre ce que tu as fais je vais tenter de faire la même routine avec la hauteur de texte, pour voir... Ou à la limite refaire ce code en cachant ce que tu as fait !! Reste encore à comprendre ces drôle de (or ou (and en début de code... genre (or (and str (setq str (strcat str (chr (cadr gr))))) (setq str (chr (cadr gr))) ) ) Là je bloque... On verra bien !! :o Et surtout merci de me donner des clefs de programmation du lisp, j'apprécie énormément... A bientot ! Matt, from Rennes in blood. -
BricsCAD fonctionne pratiquement de la même façon que AutoCAD. A part quelques commandes (parallel pour décaler, etc.) les fontions de base sont les mêmes. Seules les icônes et la présentation changent un peu... Un bon manuel d'autoCAD devrait normalement te suffire... Sinon je vais chercher de mon coté... Tu utilises BricsCAD depuis longtemps ? A bientot. Matt.
-
Perpendiculaire à partir d\'un point
Matt666 a répondu à un(e) sujet de Matt666 dans Pour aller plus loin en LISP
Bon j'ai essayé de décrypter un peu ton lisp Gile. Et, sans vouloir me vanter, je pense en avoir compris 80%.. Content moi... Mon problème de compréhension vient de la deuxième condition... Extrait : ((member (cadr gr) '(13 32)) (if (and str (numberp (read str))) (progn (entmod (subst (cons 41 (read str)) (assoc 41 (entget ent)) (entget ent) )) (setq loop nil) ) (progn (princ "\nNécessite un nombre valide ou une saisie au pointeur. \nSpécifiez la longueur: " ) (setq str "") ) ) ) Le petit "(member (cadr gr) '(13 32))", je comprends po... Ca doit être le GRREAD qui prend un code 13 ou 32, mais je vois pas ce que sont ces deux codes... En fait pour tout te dire, j'ai fait un petit lisp pour m'entrainer à la fonction GRREAD, qui est quand même vachement bien !! Elle permet de resserrer ou étendre un texte simple. (defun c:stretch () (defun erreur (msg) (if (= msg "Fonction annulée") (princ "\n*Annuler*") (princ (strcat "\nErreur: " msg)) ) (and per (entdel per)) (setq *error* m:err m:err nil ) ) (setq m:err *error* *error* erreur ) (if (setq ent (car (entsel "\nSélectionner le texte :"))) (progn (setq dep (cdr (assoc 10 (entget ent)))) (entmake (list '(0 . "LINE") (cons 10 (trans dep 1 0)) (cons 11 (trans dep 1 0)) ) ) (setq per (entlast) ang (angle (cdr (assoc 10 (entget ent)))(cdr (assoc 11 (entget ent)))) loop T ) (princ "\nSpécifiez la distance : ") (while (and (setq gr (grread T 12 0)) (/= (car gr) 3) loop) (cond ((= (car gr) 5) (setq essai (distance dep (cadr gr))) (entmod (subst (cons 11 (cadr gr)) (assoc 11 (entget per)) (entget per) )) (entmod (subst (cons 41 essai) (assoc 41 (entget ent)) (entget ent) )) ) ((member (cadr gr) '(13 32)) (if (and str (numberp (read str))) (progn (entmod (subst (cons 41 (read str)) (assoc 41 (entget ent)) (entget ent) )) (setq loop nil) ) (progn (princ "\nNécessite un nombre valide ou une saisie au pointeur. \nSpécifiez la longueur: " ) (setq str "") ) ) ) (T (if (= (cadr gr) 8) (or (and str (/= str "") (setq str (substr str 1 (1- (strlen str)))) (princ (chr 8)) (princ (chr 32)) ) (setq str nil) ) (or (and str (setq str (strcat str (chr (cadr gr))))) (setq str (chr (cadr gr))) ) ) (and str (princ (chr (cadr gr)))) ) ) ) (entdel per) )) (setq *error* m:err m:err nil ) (princ) ) Tu remarqueras que la routine est très très largement inspirée de la tienne (voire même pompée !!)... Maintenant ce que j'aimerais faire c'est de bloquer le déplacement du curseur en fonction de la rotation du texte... Voilà ! Merci, et à vientot ! Matt. -
Bing ! 40 minutes plus tard, Gile trouve la réponse... Et bah merci !! Et bravo, encore une fois... Tu es quand même vachement balaise !!! Ton taf c'est de développer en Lisp ? Ou c'est un plus forgé dans les années d'utilisation d'AutoCAD ? Impressionnant, quand même... Au fait je vais te poser quelques questions de compréhension d'un lisp que tu avais créé ici, notamment la fonction GRREAD... Voilà, merci encore, et bonne journée !! Matt.
-
Salut ! Je ne sais pas si ce sujet a déjà été discuté, mais voilà : La commande joindre sur autocad 2008. Pour ceux qui ne connaissent pas, elle permet de "joindre des objets pour former un objet unique, sans coupure" (dixit l'aide). Bon évidemment pas tous les objets ! Ceux qui sont fermés, c'est pas vraiment la peine de les joindre.. Pour les polylignes, pas de problèmes, tout le monde connait la commande pedit + joindre. Pour les arcs non plus, le centre + une des extrémités des deux arcs en commun, et c'est parti. Par contre pour les lignes, là, je cale. Pour savoir si toutes les lignes sélectionnées sont parallèles, ça va. Par contre pour savoir si elles sont colinéaires, là, je donne ma langue à cadXP (ou en tout cas aux furieux de l'autolisp présents sur ce site :))... Et attention challenge !! Pas de Vlisp ! Autolisp pur ! Sinon ce sera trop facile à mon avis... Voilà ! Merci à vous de consacrer autant de temps à aider les autres ; en particulier Gile et Patrick_35... A bientôt ! Matt.
-
Salut ! Merci pour ta réponse ! Oui j'ai déjà essayé CONTEXT mais il ne fait d'indentation automatique (formater les lignes en fonction des parenthèses)... Je vais essayer ceux qui sont énumérés dans le lien que tu as donné... A bientôt ! Matt.
-
Salut (Gile), et merci pour ta réponse -comme toujours- rapide.. En fait Notepad++ ne gère l'identation automatique pour le langage Autolispo comme VLISP... J'ai déjà cherché quelques logiciels gratuits et le meilleur (et le plus simple d'ailleurs) est certainement celui de Maxence delannoy, l'éditeur Autolisp, qui cependant et comme son nom l'indique ne comporte pas de VL... Par contre il s'occupe de gérer l'indentation auto, lui, le bougre... Voilà.. Disons que Visual lisp reste tout de même indétrônable pour sa clarté (gérer les couleurs) et sa simplicité..
-
Salut ! Tite question pour ceux qui sauraient (forécment !) : Peux-t-on ouvrir VLISP sans avoir à ouvrir Autocad ?? Voilà... Merci ! Matt.
-
En voilà une autre, je suis sur que tu peux faire la même sans la variable... Perso je n'y arrive pas, et j'aimerai voir comment tu pourrais faire... Si ça ne te dérange pas, gile, évidemment.... ;;; REMOVE-ALL ;;; Supprime tous les éléments d'une liste à partir d'une autre ;;; (REMOVE-ALL '(1 3 5) '(1 2 3 4 5 6 7)) -> (2 4 6 7) (defun REMOVE-ALL (lise lisc) (foreach pt lise (setq lisc (remove pt lisc))) ) A la différence de ton remove, celle-ci supprime des élts différents d'une liste.. Voilà, ça peut toujours servir ces petits bouts de code de rien du tout... Au passage j'essaie de comprendre tes codes, mais avec le cond je bloque.. Je vais chercher des explications sur le net, elle a l'air bien pratique cette fonction... On en utilise pour les dcl, mais c'est un peu nébuleux encore... Merci !!! A bientôt. Matt.
-
je me sens si petit des fois !!!! Et bien pour être concis, c'est vraiment concis !!! Merci une fois de plus pour ces petites routines vraiment pratiques... Je les insère dès maintenant dans mon petit "GLB.lsp" !! Bravo à toi pour cette initiative et merci encore.. A bientot. Matt.
-
Tiens une nouvelle routine qui pourrait être utile.. Bon c'est très loin d'être une "merveille de concision" mais ça peut servir pour par exemple remplacer tous les points par des virgules lors d'un export pour excel... ;;; STRING-SUBST-ALL ;;; Recherche et remplace toutes les occurences d'une chaine ;;; par une autre dans une chaine ;;; (string-subst-all "x" "a" "abracadabra") -> "xbrxcxdxbrx" ;;; (string-subst-all "," "." "50.25 m²") -> "50,25 m²" (defun string-subst-all (new pat stri / ) (setq cnt 0 str stri) (repeat (strlen str) (if (eq (substr str (setq cnt (1+ cnt)) 1) pat) (setq str (strcat (substr str 1 (1- cnt)) new (substr str (1+ cnt) (strlen str)) )) str ) ) ) Avec les mêmes exemples que les tiens Gile et une façon à peu près similaire de procéder.. En même temps j'ai repris ton string-subst, donc forcément la manière de procéder ressemble fortement ! Dis moi ce que tu en penses, et merci encore pour toutes ces équivalences ! On s'en sert tous les jours ici... A bientot. Matt.
-
Alors là chu totalement d'accord avec toi... En fait j'ai essayé sur Autocad, et ça fonctionne parfaitement... C'est le logiciel que j'utilise qui est une grosse ME**E... Merci, je vais (encore) signaler un bug chez bricsys... A bientot ! Matt.
-
En fait c pas vraiment une commande transparente... C'est exactement comme le "_all" au sein d'une sélection ! Sauf que là on a deux entrées utilisateur.
