Aller au contenu

Matt666

Membres
  • Compteur de contenus

    736
  • Inscription

  • Dernière visite

  • Jours gagnés

    2

Tout ce qui a été posté par Matt666

  1. Matt666

    Ne plus rien voir...

    Quelques tentatives de réponses ici... A bientôt ! Matt.
  2. Bonjour !! Eh oui c'est encore moi.... Décidément ! :D Voilà. Existe-t-il en autoLISP une pirouette pour ne pas utiliser le (command "_undo" "d") et (command "_undo" "f") en début et fin de routine ? Bref un moyen d'annuler la routine exécutée... Merci d'avance ! A bientot. Matt. [Edité le 11/9/2007 par Matt666]
  3. Matt666

    Centre de gravité

    oulah mais c'est le monde à l'envers !!!! :laugh: Et il est humble en plus de ça !! Surtout, Gile, DE RIEN, vu le nombre de précieux conseils et coups de main que tu as donné à bon nombre de gens, et à moi en particulier.... Ça me fait plaisir de pouvoir te rendre une infime part de ce que tu donnes tous les jours ! Au passage dès que je trouve des routines autoLISP "traduites" du VLISP, j'essaierai de les mettre ici... A bientot ! Matt.
  4. Matt666

    Centre de gravité

    Une autre, nettement plus simple, mais encore moins précise !!! (defun gravite (ent / pts) (if ent (setq pts (mapcar 'cdr (remove-if-not '(lambda (x) (= 10 (car x))) (entget ent))))) (if pts (List (/ (apply '+ (mapcar 'car pts)) (length pts)) (/ (apply '+ (mapcar 'cadr pts)) (length pts)) 0.000 ) ) ) A bientot. Matt. [Edité le 10/9/2007 par Matt666]
  5. Pas de réponses de bseb67 ? Dommage ton lisp m'aurait bien intéressé...
  6. Ah bah oui tu m'étonnes !!! Yen a marre de ne pas pouvoir utiliser toutes ces possibilités... a bientot ! Matt
  7. Matt666

    Centre de gravité

    Donc pour lancer la commande, il faut entrer dans la ligne de commande : (pt_gravity (car (entsel))) (Pour ceux qui n'auraient pas bien compris ;) ) A bientot ! Matt. PS : Que ceux qui voient un moyen de raccourcir ce LISP n'hésitent surtout pas !!
  8. Bonjour !! Je sais que ce sujet a déjà été traité dans ce forum. Ce message s'adresse à ceux qui utilisent un moteur IntelliCAD (donc sous BricsCAD et consorts), bref ceux qui ne peuvent pas (encore ?) utiliser de VLISP. Voici une routine permettant de trouver approximativement le centre de gravité d'une polyligne. Elle a été créée ici , par bonuscad, à ce que je comprends. PT_GRAVITY ;;; twice the area of a simple 2d triangle ;;; z ignored (defun GEOM-AREA2 (a b c) (- (* (- (car b)(car a)) (- (cadr c)(cadr a)) ) (* (- (car c)(car a)) (- (cadr b)(cadr a))) ) ) ;;; three times the centroid of a simple 2d triangle, ;;; z ignored, 2d point returned (defun GEOM-CENTROID2Dx3 (pts) (list (apply '+ (mapcar 'car pts)) (apply '+ (mapcar 'cadr pts)) ) ) ;;; Computes the centroid (center of gravity) of an arbitrary ;;; simple polygon via a weighted sum of signed triangle areas, ;;; weighted by the centroid of each triangle. ;;; Thanks to Kamal Boutora ;;; Returns 3D-point, accepts only 2d or 3d points ;;; Twice area and three times centroid is used to avoid division ;;; until the last moment. see comp.graphics.algorithms FAQ or ;;; the O'Rourke code centroid.c (defun GEOM-CENTROID2D (pts / areasum2 a2 p0 c3 cg) (setq areasum2 0.0 cg '(0 0) p0 (car pts) pts (cdr pts) ) (if (equal p0 (last pts)) (setq pts (reverse (cdr (reverse pts))))) (while (cadr pts) (setq c3 (geom-centroid2dx3 (list p0 (car pts) (cadr pts))) a2 (geom-area2 p0 (car pts) (cadr pts)) cg (list (+ (car cg) (* a2 (car c3))) (+ (cadr cg) (* a2 (cadr c3)))) areasum2 (+ areasum2 a2) pts (cdr pts) ) ) (setq areasum2 (* areasum2 3.0)) (if (caddr p0) (list (/ (car cg) areasum2)(/ (cadr cg) areasum2)(caddr p0)) (list (/ (car cg) areasum2)(/ (cadr cg) areasum2)) ) ) (defun C:pt_gravity ( / ent pt_lst pt_ucs) (while (not ent) (setq ent (entsel "\nSélectionner une Polyligne:")) (if ent (progn (setq ent (entget(car ent))) (if (/= (cdr(assoc 0 ent)) "LWPOLYLINE") (progn (prompt "\nEntitée sélectionnée n'est pas une Polyligne optimisée. Réessayer") (setq ent nil) ) ) ) (prompt "\nAucune sélection. Réessayer") ) ) (setq pt_lst (mapcar '(lambda (x) (trans x 0 1)) (mapcar 'cdr (remove-if-not '(lambda (x) (= (car x) 10)) ent)))) (command "_.point" "_none" (GEOM-CENTROID2D pt_lst)) (princ) ) Cette routine ne donne pas directement le centre mais génère un point représentant celui-ci. Il faut cliquer sur la poyligne. Pour avoir seulement les coordonnées de la polyligne, et ce sans la sélectionner mais en donnant seulement son ENAME, il faut juste changer le code de la fonction principale, à la fin : (defun pt_gravity (ent / pt_lst) (if (and (eq (type ent) 'ename) (eq (cdr (assoc 0 (entget ent))) "LWPOLYLINE") ) (progn (setq ent (entget ent) pt_lst (mapcar '(lambda (x) (trans x 0 1)) (mapcar 'cdr (remove-if-not '(lambda (x) (= (car x) 10)) ent))) ) (GEOM-CENTROID2D pt_lst) ) ) ) L'argument ENT demande le nom d'une polyligne ('ENAME) que l'on peut trouver en exécutant un petit (car (entsel)) sur une polyligne. Au passage, un petit exemple de la puissance du LISP avec cette fonction plutot pas mal, que je n'ai jamais pu trouver malgré le temps passé à chercher : (mapcar 'cdr (remove-if-not '(lambda (x) (= (car x) 10)) ent)) qui retourne tous les elts de la liste commençant par 10... PS : Pour que cette routine fonctionne, il faut aussi la routine de Gile remove-if-not, qu'on peut trouver ici ... Ceux qui n'ont pas le VLISP feraient mieux de très vite lancer toutes ces routines à chaque démarrage, elles sont vraiment très pratiques... :D Voilà ! A bientot. Matt.
  9. Et bah nan ça ne fonctionne pas ! Je vais regarder le lisp Battman pour voir comment ils font... Merci à vous tous ! Matt.
  10. Matt666

    Ssget...

    il faut entrer ceci : (setq ss (ssget "_x" (list (cons 0 "LINE")(cons 8 "003-TRUSS-WIRE-DUN")))) il faut que donnes un argument de sélection à ta fonction, en l'occurrence "x", qui signifie tout. Si tu veux ne sélectionner que ce que tu trouves dans l'espace objet, il faut saisir : (setq ss (ssget "_c" (getvar "extmin")(getvar "extmax)(list (cons 0 "LINE")(cons 8 "003-TRUSS-WIRE-DUN")))) Ensuite, la fonction quote (') retourne littéralement ce qui est entre parenthèses... ici ce sera (0 "line") et (8 "003-TRUSS-WIRE-DUN"). Si tu regardes comment sont agencés les codes DXF, tu verras qu'il te manque un point entre ton 0 et ton type d'objet line... Genre (0 . "line"). Le cons le permet. Voilà. A bientot. Matt.
  11. Sinon tu peux faire comme ça : Routine de sélection : (defun c:face0 () (if (setq jeux (ssget "x" (list '(0 . "LINE")))) (progn (c:flatten "Y" jeux) (sssetfirst nil JEUX) ) ) (princ) ) J'ai remplacé *face* par LINE, pour voir les résultats. Comme tu peux voir, on a 2 paramètres après la fonction flatten (c:flatten "Y" jeux) J'ai un peu changé la routine FLATTEN pour ajouter deux paramètres... Comme suit : (defun c:FLATTEN (quest sset / *ERROR* CRZ ELIST ENAME ETYPE I NUMCHG NUMNO0 NUMNOT OLDCMD OLDERR SS1 SS1LEN SSNO0 TMPUCS VRT ) (setq tmpucs "$FLATTEN-TEMP$" olderr *error* ) (defun *error* (msg) (if (or (= msg "Function cancelled") (= msg "quit / exit abort")) (princ) (princ (strcat "\nError: " msg)) ) (setq *error* olderr) (if (tblsearch "UCS" tmpucs) (command "._UCS" "_Restore" tmpucs "._UCS" "_Delete" tmpucs) ) (command "._UNDO" "_End") (setvar "CMDECHO" oldcmd) (princ) ) (defun zeroze (key zelist / oplist nplist) (entmod (subst (reverse (append '(0.0) (cdr (reverse (assoc key zelist))))) (assoc key zelist) zelist ) ) ) (setq oldcmd (getvar "CMDECHO")) (setvar "CMDECHO" 0) (command "._UNDO" "_Group") (command "._UCS" "_Delete" tmpucs "._UCS" "_Save" tmpucs "._UCS" "_World") (prompt (strcat "\nFLATTEN sets the Z coordinates of most objects to zero.")) (if (not quest) (progn (initget "Y,Yes N,No") (setq quest (getstring "\nDo you want to continue : ")) (if (eq quest "")(setq quest "y")) )) (cond ((and (/= (strcase quest) "NO") (/= (strcase quest) "N") (or (eq (strcase quest) "Y") (eq (strcase quest) "YES")) ) (graphscr) (if (not sset)(progn (setq sset (ssget)) (if (null sset) (setq sset (ssget "_X")) ) )) (setq ss1 sset ss1len (sslength ss1) i 0 numchg 0 numnot 0 numno0 0 ssno0 (ssadd) ) (prompt "\nWorking.") (while (< i ss1len) (if (= 0 (rem i 10)) (prompt ".") ) (setq ename (ssname ss1 i) elist (entget ename) etype (cdr (assoc 0 elist)) ) (if (not (member etype '("3DFACE" "ARC" "ATTDEF" "CIRCLE" "DIMENSION" "ELLIPSE" "HATCH" "INSERT" "LINE" "LWPOLYLINE" "MTEXT" "POINT" "POLYLINE" "SOLID" "TEXT" ) ) ) (progn (setq numnot (1+ numnot)) (if (/= 0.0 (car (reverse (assoc 10 elist)))) (progn (setq numno0 (1+ numno0)) (ssadd ename ssno0)) ) ) ) (if (member etype '("3DFACE" "ARC" "ATTDEF" "CIRCLE" "DIMENSION" "ELLIPSE" "HATCH" "INSERT" "LINE" "MTEXT" "POINT" "POLYLINE" "SOLID" "TEXT" ) ) (setq elist (zeroze 10 elist) numchg (1+ numchg) ) ) (if (member etype '("3DFACE" "ATTDEF" "DIMENSION" "LINE" "TEXT" "SOLID")) (setq elist (zeroze 11 elist)) ) (if (member etype '("3DFACE" "SOLID")) (progn (setq elist (zeroze 12 elist) elist (zeroze 13 elist) ) ) ) (if (member etype '("DIMENSION")) (progn (setq elist (zeroze 13 elist) elist (zeroze 14 elist) elist (zeroze 15 elist) elist (zeroze 16 elist) ) ) ) (if (= etype "POLYLINE") (progn (setq vrt ename) (while (not (equal (cdr (assoc 0 (entget vrt))) "SEQEND")) (setq elist (entget (entnext vrt)) crz (cadddr (assoc 10 elist)) ) (if (/= crz 0) (progn (zeroze 10 elist) (entupd ename)) ) (setq vrt (cdr (assoc -1 elist))) ) ) ) (if (member etype '("LWPOLYLINE")) (progn (setq elist (subst (cons 38 0.0) (assoc 38 elist) elist) numchg (1+ numchg) ) (entmod elist) ) ) (setq i (1+ i)) ) (prompt " Done.") (prompt (strcat "\n" (itoa numchg) " object(s) flattened.")) (prompt (strcat "\n" (itoa numnot) " object(s) not flattened.")) (if (/= 0 numno0) (progn (prompt (strcat " [" (itoa numno0) " with non-zero base points]")) (getstring "\nPress enter to see non-zero unchanged objects... ") (command "._SELECT" ssno0) (getstring "\nPress enter to unhighlight them... ") (command "") ) ) ) ) (command "._UCS" "_Restore" tmpucs "._UCS" "_Delete" tmpucs) (command "._UNDO" "_End") (setvar "CMDECHO" oldcmd) (setq *error* olderr) (princ) ) Le problème est que si tu utilises la routine flatten ailleurs, il faudra changer FLATTEN en lui ajoutant des conditions... Par exemple si tu veux la commande flatten normale, il ne faut pas saisir FLATTEN dans la ligne de commande, mais saisir : (c:flatten nil nil) Mais sinon ça fonctionne bien... A bientot. Matt.
  12. Tu penses que ça fonctionnera sans AutoCAD ?? Dans tous les cas je tente, mais je ne suis vraiment pas sur de cela... Merci pour ce lien Patrick_35 !
  13. Si tu veux bien publier ton lisp ici bseb67, ce serait avec plaisir ; Puisque je n'ai pas AutoCAD, donc pas de Battman !! Mais bon il y a ptet moyen de faire qqh en lisp, je pense... Je vais tenter... A bientot ! Matt.
  14. C'est vrai ça, et les autres !!! Merci pour vos réponses, je vois ça dès que je le peux ! a bientot ! Matt.
  15. C'est bien la routine Flatten de Mark Middlebrook ?
  16. D'ailleurs si vous avez une réponse, ça m'arrangerait plutot pas mal !!
  17. Salut à tous ! je ne sais pas si ce problème a déjà été évoqué... J'ai un problème bizarre, qui a l'air récurrent dans les versions AutoCAD... Voilà j'ai un bloc avec des attributs, par exemple un cartouche. Je m'aperçois que ce bloc, dans toutes les présentations n'est pas bien placé. Donc pour faire un peu plus vite, je change la référence de bloc en ouvrant la référence dans un nouveau dessin, et en modifiant le point d'insertion. De là on enregistre et on ferme le dessin, puis on insère le bloc, en redéfinissant les blocs existants. Par cette action, tous les blocs se déplacent automatiquement, MAIS PAS LES ATTRIBUTS ! Pourquoi ??? merci pour votre réponse ! A bientot !
  18. Ou comme ceci, qui revient au même.. (setq ss1 nil ss1 (ssadd (car (entsel)))) C'est vrai que ce message n'est pas très clair !! [Edité le 6/9/2007 par Matt666]
  19. Une petite chose comme ça peut-être ? (command "(c:flatten)" "y ") à la place de ton (c:flatten) [Edité le 6/9/2007 par Matt666]
  20. Matt666

    Équivalences à vl-*

    Salut Gile ! Une petite erreur se trouve dans ta fonction sort... le remove_doubles... c'est un remove-doubles qu'il faut mettre ! Voilà.. A bientot.. Matt.
  21. Merci Bonuscad pour ta patience et tes réponses précises et rapides ! C'est vraiment ça je pense... Le fait de faire des tests sur AutoCAD 2000 !! Un essai sur la 2006, et c'était exactement ce que tu disais... Un bloc de base, sans attribut = code dxf 70 retourne 0 Un bloc-attributs = Code DXF 70 retourne 2 Ca se complique encore un peu dans le dxf70, parce que j'utilise BricsCAD, qui retourne 64, 65 ou 66 !! J'utilise seulement AutoCAD pour vérifier le fonctionnement des routines... Ils pourraient pas se mettre d'accord ceux là !!! Merci, vraiment !! A bientot !!! Matt.
  22. Ok... C'est ça !! Les codes DXF 70 des réfs de blocs ont changé depuis la version 2000... Maintenant, les drapeaux sont les mêmes que vous !! Ooouuuffff !!! Enfin je comprends mieux !!! Merci pour votre patience ! Saloperie de MAJ... Bon WE !! Matt.
  23. Oui d'accord... Mais lorsque je charge ce petit bout de code (cdr (assoc 70 (tblsearch "block" (cdr (assoc 2 (entget (car (entsel)))))))) sur tous les blocs du dessin, aucun ne retourne la valeur 2 sur le code dxf 70 !!! c'est soit 32, 33 ou 34 !! Et non, j' ne m'intéresse pas aux XREF !! Je n'ai aucun plan lié par XREF dans mon plan actuel !!! Décidément c'est très bizarre tout ça !!! Pour un bloc-attributs anodin le code DXF retourné ressemble à ça : (70 . 34) !! Tu vois ? C'est ça que je ne comprends vraiment pas... Ptet que c'est ça : J'utilise autoCAD 2000... Je n'ai pas essayé sur des versions plus récentes...
  24. Salut Bonuscad ! Oui oui, j'ai très bien compris ce système ! J'ai l'impression de ne pas être clair du tout !! Cela ne répond pas à ma question... Vous faites tous les logand, ou des boole pour retrouver les blocs avec attributs... Perso je demande juste les blocs dans le code DXF 70 retourne 34 !! Pourquoi cette différence ?? Et en plus on arrive au même résultat !!! Voilà.. J'espère avoir été un peu explicite !! Merci d'avance, pour votre pateince à tous et aussi pour la transmission de savoir quotidienne... C'est vraiment dément. Matt, from Rennes in Blood.
  25. Dément... Simplement dément !! Tout s'éclaire !! Merci Gile ! Elle est géniale cette explication... Le mini bout de code aussi d'ailleurs... Merci, vraiment ! Décidément, que ferait ce forum lisp sans toi et Patrick_35 !! Impressionnant... Je tente d'incorporer tout ça dans l'écriture des lisps ! A bientot ! Matt.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité