Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. (gile)

    Pb avec la fonction raccord.

    La voici : (defun c:mrac (/ rad ss) (initget 6) (if (setq rad (getdist (strcat "\nSpécifiez le rayon pour les raccords <" (rtos (getvar "FILLETRAD")) ">: " ) ) ) (setvar "FILLETRAD" rad) ) (prompt "\nSélectionnez les polylignes.") (if (setq ss (ssget '((0 . "LWPOLYLINE")))) (foreach pl (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (command "_.fillet" "_p" pl) ) ) (princ) ) [Edité le 18/10/2006 par (gile)]
  2. Salut lecrabe, Les routines (celle de Zebulon ou la mienne) partent de ce postulat, et ne retiennent le texte que s'il est dans la région, pas s'il est dans un ilot. On peut imaginer qu'il y ait, à l'intérieur de cet ilot, une autre région (ou polyligne, cercle ...) à extruder à une altitude différente.
  3. Je pense qu'il s'agit d'un problème d'arrondi. la fonction fix retourne la "troncature" du nombre (le nombre troqué de ces décimales) : (setq num 4.9999999999999) retourne 5.0 (fix num) retourne 4 tu peux utiliser la fonction arrondi : (defun arrondi (num) (if ( (abs (- num (1+ (fix num)))) ) (fix num) (1+ (fix num)) ) ) (arrondi num) retourne 5 (arrondi 4.49999999) retourne 4 (arrondi 4.5) retourne 5
  4. Certaines commandes de modification (decaler, deplacer, rotation ...) acceptent, comme argument, un jeu de sélection (PICKSET) ou un nom d'entité (ENAME), donc en LISP, avec la fonction (command ...) on peut passer un PICKSET ou un ENAME comme argument. Les fonctions LISP (prédéfinies ou définies avec defun ou lambda) sont plus rigoureuse et leurs arguments ne peuvent être que d'un seul type. L'argument pour getVertices doit être du type ENAME.
  5. Je t'ai déjà répondu ici ! Tu les lis, réponses qu'on te fait ? :casstet: (setq ent (entlast)) -> ? (type ent) -> ? (setq ss (ssadd)) -> ? (type ss) -> ? (ssadd ent ss) -> ? (ssname ss 0) -> ? [Edité le 18/10/2006 par (gile)]
  6. Pour avoir la liste de tout les calques (dans l'ordre alphabétique) (setq lay (tblnext "LAYER" T)) ; données du premier calque de la collection (while lay (setq lay_lst (cons (cdr (assoc 2 lay)) lay_lst) ; constitution de la liste lay (tblnext "LAYER") ; données du calque suivant ) ) (acad_strlsort lay_lst) ; mise en ordre alphabétique
  7. tu peux écrire plus simplement : (if (numberp (read (FinChaine chaine))) ...) (= (numberp (read (FinChaine chaine))) T) retourne T si (numberp (read (FinChaine chaine))) retourne T, ou retourne nil si (numberp (read (FinChaine chaine))) retourne nil. Il ne s'agit là que des fonctions vl-... pas des fonctions vla-... vlax... ou vlr-... La plupart de ces fonctions vl-... sont simples à comprendre, fort utiles et permettent d'alléger les codes en évitant des boucles ou des fonctions récursives. J'en avais redéfinies plusieurs en "pur" AutoLISP pour les logiciels Intellidesk, Intellicad ou LT Extender qui ne reconnaisent pas les fonctions vl-... Tu peux les trouver ici [Edité le 17/10/2006 par (gile)]
  8. Attention Denis, tu ne déclares pas tes variables, ce qui te permet de récupérer leurs valeurs d'une routine à l'autre, cette façon de faire n'est pas rigoureuse. Tu risque d'avoir de mauvaises surprises si la valeur d'une variable est modifiée par une autre routine. Dans l'exemple que je t'ai donné, FinChaine retourne la fin de la chaine sans l'attribuer à une variable (pas de (princ) à la fin) tu peux donc faire, dans la routine où tu as besoin de cette valeur : (setq result (FinChaine "Cadastre adresse 200")) (numberp (read result)) ou plus directement : (numberp (read (FinChaine "Cadastre adresse 200")))
  9. (gile)

    Calque : Filtre de groupe

    Salut, J'ai une piste mais je n'arrive pas à aboutir. Pour un filtre de propriétés, le code suivant retourne le pointeur vers le filtre "Nom_du_filtre" (vla-object) (vla-item (vla-item (vla-getextensionDictionary (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) "ACAD_LAYERFILTERS" ) "Nom_du_filtre" ) Mais pour un filtre de groupe, je n'arrive pas à retrouver son nom, j'arrive seulement à récupérer les noms des XRecord des filtres (de groupe ou de propriétés) dans une liste, mais ce sont des noms du type *A1, *A2, *A3 ... (vlax-for n (vla-item (vla-getExtensionDictionary (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) "ACLYDICTIONARY" ) (setq lst (cons (vla-get-Name n) lst)) )
  10. Salut, Il existe des fonctions LISP très pratiques pour le traitement des chaines de caractères : les fonctions vl-string-... par exemple vl-string-position : (vl-string-position char-codestr [start-pos [from-end-p]]) où : - char-codestr est le code ascii du caractère recherché - start-pos la position de départ de la recherche, le premier caractère est 0 (0 si omis) - from-end-p si T est spécifié, la recherche démarre à partir de la fin Ta fonction FinChaine pourrait être : (defun FinChaine (chaine / pos) (setq pos (vl-string-position (ascii " ") chaine 0 T)) (substr chaine (+ 2 pos)) ) Ensuite, pour savoir si la fin de la chaine est un nombre essaye : (numberp (read (FinChaine "Cadastre adresse 200"))) -> ? (numberp (read (FinChaine "Cadastre limite"))) -> ?
  11. (gile)

    Lister les blocs

    Merci aux testeurs, J'ai remis le (vl-load-com) au début du code, qui devrait maintenant marcher quelque soit le SCU courant.
  12. Super idée Zebulon :D Ça marche bien. Pour Phil, C'est bien le but : - soit "l'ilot" est une entité : une seule intersection, elle est extrudée. - soit "l'ilot" est un ""trou" dans la région : 6 intersections, le texte n'est pas dans la région, elle n'est pas extrudée. On ne joue pas au loto ;) On essaye de faire en sorte que ça marche dans toutes les situations. PS : un risque persiste quand même, même si la probabilité esr faible ;) : que la demi droite soit tangeante (ou ne rencontre qu'un sommet) à une "excroissance" de l'entité (1 intersection au lieu de 2). [Edité le 17/10/2006 par (gile)]
  13. (gile)

    Récursivité

    En effet !!! Dans la routine "Tracer" : - Def[surligneur]u[/surligneur]n au lieu de Defn - 2 paranthèses fermantes en trop après : (if (/= N NC)[surligneur]))[/surligneur] - un espace en trop dans : (Setq N (1[surligneur] [/surligneur]+ N)) Essaye avec ça : (Defun Tracer (P1 CE N) (if (/= N NC) (progn (if (= (rem N 2) 0) (Setq AN 0) (Setq AN pi) ) (command "ARC" P1 "c" CE "A" 180) (setq CE P1) (Setq N (1+ N)) (Setq P1 (polar P1 AN (* 2 r))) (setq R (* 2 R)) (Tracer P1 CE N) ) ) ) Sinon un sujet intéressant (en anglais) sur l'utilisation de fonction récursives pour dessiner des fractales ici [Edité le 16/10/2006 par (gile)]
  14. Je viens de faire de nouveaux essai et effectivement ... ... au temps pour moi , en fait les polylignes ayant servi à faire la region étaient toujours présentes (DELOBJ à 0). C'est la poly intérieure qui générait le solide de l'ilot. :calim:
  15. Une ou deux images valant mieux qu'un long discours, voilà une région (en gris) avec un "ilot" à l'intérieur, et un texte (rouge): http://img238.imageshack.us/img238/4456/txtrude1ok3.png avec ta méthode, deux polylignes sont créées et deux solides extrudés : http://img360.imageshack.us/img360/6393/txtrude2fx6.png D'autre part, si le texte est à l'intérieur de l'ilot (donc plus dans la région) ça fonctionne quand même, ce que je veux éviter. Sinon je partage complètement tes réticences à utliser des hachures, c'est vraiment à contre-coeur que je me suis rabattu sur cette solution. Je retiens ta proposition pour le motif de hachures et modifie le LISP (version 2.3).
  16. (gile)

    acadlt.pgp

    J'ai toujours eu ce type de messages au rechargement de AutoCAD.pgp, je n'ai jamais réussi à trouver les erreurs en question et n'ai pas non plus remarqué de dysfonctionnements avec les alias que j'utilise.
  17. (gile)

    acadlt.pgp

    Salut, As-tu fait REINIT, puis coché "FichierPGP" (ou RE-INIT puis 16) ?
  18. Pour Zebulon, Je me suis mal exprimé, quand je parlais d'ilots, je voulais dire des ilots faits dans la région avec la commande soustraction (opération booléenne). Ces ilots font partie de l'entité région et créerons autant de polylignes. De toutes façon, on n'est pas si loin les commandes contour et hachure ont un comportement assez proche. PS : J'ajoute un zoom étendu avant de faire les différentes opération et un zoom précédent à la fin. (version 2.2)
  19. :casstet: http://img167.imageshack.us/img167/112/returnsu7.png
  20. Salut Zebulon, Merci, j'avais pensé à utiliser Contour, mais si la région contient des ilots, la commande contour créera une polyligne par ilot en plus de celle du pourtour ce qui fait autant d'objets à gérer pour la sélection (ou l'exclusion de la sélection) du texte recherché.
  21. Salut et bienvenue, Je ne sais plus si cela existait dans AutoCAD 2002, mais regarde si tu trouves un "Utilitaire de licence mobile". Extrait de l'aide :
  22. (gile)

    Bloc Dynamique Porte

    Salut, Eric propose son support de cours sur les blocs dynamiques, c'est ici
  23. Pour essayer d'éviter au maximum le type d'erreur : "Les hachures sont trop denses ou la taille des discontinuités est trop petite.", tout en étant sûs d'avoir une intersection, l'échelle des hachures est calculé pour que l'espacement des lignes soit égal à la moitié de la hauteur de texte utilisé. Le code ci-dessus est modifié (version 2.1). PS : J'avais encore oublié de mettre des espaces entre Toutes mes excuses à ceux qui avaient les codes avant que je ne répare cet oubli. [Edité le 16/10/2006 par (gile)]
  24. (gile)

    Cotation de polylignes

    Pour info, la valeur du bulge correspond à la tangente du quart de l'angle de l'arc, un petit dessin ici
  25. Bon, voici une version qui, d'après les quelques essais que j'ai fait, semble fonctionner avec les régions. C'est du bricolage, je n'en garantis pas la fiabilité. La région est densément hachurée (hachure ANSI31, échelle 0.01*), et si une intersection est trouvée entre la hachure et un texte du calque spécifié constitué d'un nombre uniquement, elle est extrudée. * Suite à une suggestion de Zebulon (merci à lui), les hachures sont désormais un motif "utilisateur", l'espacement entre les lignes est égal à la moitié de la hauteur des textes recherchés. Version 2.4 (SelByObj et GetLayer doivent être chargés) Supprimer les espaces entre les ;;; TEXTRUDE Extrude les objets (cercle, ellipse, lwpolyligne) du calque spécifié ;;; de la hauteur donnée dans le texte contenu dans chaque objet. (defun textrude_err (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur: " msg)) ) (command) (command "_.zoom" "_previous") (setenv "MaxHatch" maxhatch) (command "_.undo" "_end") (setvar "CMDECHO" echo) (setq *error* m:err m:err nil ) (princ) ) (defun c:textrude (/ echo maxhatch laytxt layobj ssobj sstxt txtlst alt hach cnt) (setq m:err *error* *error* textrude_err echo (getvar "CMDECHO") maxhatch (getenv "MaxHatch") ) (if (and (setq laytxt (getlayer "Calque des textes de hauteur d'extrusion") ) (setq layobj (getlayer "Calque des objets à extruder")) ) (progn (setq ssobj (ssget "_X" (list '(-4 . " '(-4 . " '(0 . "CIRCLE") '(0 . "ELLIPSE") '(-4 . " '(0 . "LWPOLYLINE") '(-4 . "&") '(70 . 1) '(-4 . "AND>") '(-4 . "OR>") (cons 8 layobj) '(-4 . "AND>") ) ) ) (setq sstxt (ssget "_X" (list '(0 . "*TEXT") (cons 8 laytxt)))) (if sstxt (setq txtlst (vl-remove-if-not '(lambda (x) (numberp (read (cdr (assoc 1 (entget x)))))) (mapcar 'cadr (ssnamex sstxt)) ) ) ) (command "_.undo" "_begin") (setvar "CMDECHO" 0) (setenv "MaxHatch" "10000000") (command "_.zoom" "_extents") (if ssobj (foreach e (mapcar 'cadr (ssnamex ssobj)) (if (and (setq sstxt (SelByObj e "WP" (list '(0 . "*TEXT") (cons 8 laytxt)) ) ) (member (setq alt (ssname sstxt 0)) txtlst) ) (progn (if ( (command "_.extrude" e "" (cdr (assoc 1 (entget alt)))) (command "_.extrude" e "" (cdr (assoc 1 (entget alt))) 0.0 ) ) (setq txtlst (vl-remove alt txtlst)) ) ) ) ) ;; Traitement des régions (setq ssobj (ssget "_X" (list '(0 . "REGION") (cons 8 layobj)))) (if (and ssobj txtlst) (foreach reg (mapcar 'cadr (ssnamex ssobj)) (command "_.bhatch" "_p" "_u" 0.0 (/ (cdr (assoc 40 (entget (car txtlst)))) 2) "_n" "_s" reg "" "" ) (setq hach (entlast) cnt (length txtlst) ) (while ( (if (Intersect-p hach (setq alt (nth (setq cnt (1- cnt)) txtlst)) acExtendNone ) (progn (if ( (command "_.extrude" reg "" (cdr (assoc 1 (entget alt))) ) (command "_.extrude" reg "" (cdr (assoc 1 (entget alt))) 0.0 ) ) (setq txtlst (vl-remove alt txtlst)) (setq cnt -1) ) ) ) (entdel hach) ) ) (command "_.zoom" "_previous") (setenv "MaxHatch" maxhatch) (command "_.undo" "_end") (setvar "CMDECHO" echo) ) ) (setq *error* m:err m:err nil ) (princ) ) ;;; Intersect-p ;;; Évalue si deux objets (ename ou vla-object) ont une intersection (defun intersect-p (e1 e2 opt) (vl-load-com) (foreach e '(e1 e2) (if (= (type (eval e)) 'ENAME) (set e (vlax-ename->vla-object (eval e))) ) ) (if (atom (vlax-invoke e1 'IntersectWith e2 opt)) nil T ) ) PS : J'apporte des modifications mineures à la première version (sans régions)[Edité le 16/10/2006 par (gile)][Edité le 16/10/2006 par (gile)][Edité le 16/10/2006 par (gile)][Edité le 16/10/2006 par (gile)] [Edité le 18/10/2006 par (gile)]
×
×
  • 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é