Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    208

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

  1. Salut, Tu peux voir la propriété ConfigName de l'objet Layout correspondant à la présentation. (vla-get-ConfigName (vla-item (vla-get-Layouts (vla-get-ActiveDocument (vlax-get-acad-object))) nomPresentation))
  2. Salut, Je trouve que le fichier joint illustre bien comment décrire un motif de hachure. Tu peux trouver des exemple de motif non orthogonaux dans le lien de cette réponse, de celle là. ou encore celle là. HatchPattern.dwg
  3. Si tu examines la liste DXF d'une entité en couleur forcée avec une "couleur vraie", tu noteras un groupe 420 dont la valeur est un entier qui représente la "couleur vraie" sous la forma de 3 octets. La valeur de rouge est décalée de 2 octets, la valeur du vert d'un octet et la valeur du bleu n'est pas décalée (voir ce sujet, plus particulièrement cette réponse). On peut donc faire un filtre de sélection avec le code 420. Pour faciliter les choses, on stockera, dans la listes des couleurs à convertir, le rbg sous forme de liste plutôt que de chaîne. (defun c:philChangeColor (/ changeColor rgb2TrueColor colors) (defun rgb2TrueColor (rgb) (logior (lsh (car rgb) 16) (lsh (cadr rgb) 8) (caddr rgb)) ) (defun changeColor (rgb aci / ss i) (if (setq ss (ssget "_X" (list (cons 420 (rgb2TrueColor rgb))))) (repeat (setq i (sslength ss)) (setpropertyvalue (ssname ss (setq i (1- i))) "Color" aci) ) ) ) ;; Liste à compléter en respectant le format : (indexACI . "rouge,vert,bleu") (setq colors '( ((60 195 123) . 103) ((60 195 124) . 103) ;; ... ) ) (foreach p colors (changeColor (car p) (cdr p))) (princ) )
  4. Salut, Tu peux essayer ça. Il faut modifier/compléter la liste des couleurs dans le code en respectant le format : (indexACI . "rouge,vert,bleu") (defun c:willyChangeColor (/ changeColor colors) (defun changeColor (aci rgb / ss i) (if (setq ss (ssget "_X" (list (cons 62 aci)))) (repeat (setq i (sslength ss)) (setpropertyvalue (ssname ss (setq i (1- i))) "Color" rgb) ) ) ) ;; Liste à compléter en respectant le format : (indexACI . "rouge,vert,bleu") (setq colors '( (91 . "255,255,219") (31 . "255,224,194") ;; ... ) ) (foreach p colors (changeColor (car p) (cdr p))) (princ) ) PS : on ne peut pas forcer la luminance si on spécifie les valeurs de rouge, vert, bleu. Si R,V,B est égal à 255,255,219 la luminance est égale à 93. Si je force la luminance à 90 le R,V,B devient : 255,255,204.
  5. @Syl2007 Des caractères avaient disparu probablement lors d'un formatage du site. J'ai corrigé le code dans le message original.
  6. Même s'il était possible de sélectionner certaines poignées en LISP (ce que je ne crois pas), je ne vois pas comment un programme saurait quelles poignées sélectionner...
  7. Salut, Pour activer les "grips" il faut utiliser la fonction sssetfirst. (sssetfirst nil (ssadd ename_de_la_hachure))
  8. Comme promis, je donne ma version récursive "plus concise". C'est la même que la troisième proposition de @VDH-Bruno en un peu moins concise mais insensiblement plus "rapide" puisqu'elle fait un appel récursif de moins dans les cas d'un nombre ou d'un point suivi d'un chiffre et un peu plus robuste puisqu'elle contrôle aussi la présence d'un point dans nombre en cours de reconstitution. (defun extraireNombres (str / loop) (defun loop (lst dot acc) (cond ((and (null lst) (null acc)) nil) ((isDigit (car lst)) (loop (cdr lst) dot (cons (car lst) acc)) ) ((and (isHyphen (car lst)) (isDigit (cadr lst)) (null acc)) (loop (cddr lst) dot (cons (cadr lst) (cons (car lst) acc))) ) ((and (not dot) (isDot (car lst)) (isDigit (cadr lst)) acc) (loop (cddr lst) T (cons (cadr lst) (cons (car lst) acc))) ) (acc (cons (read (vl-list->string (reverse acc))) (loop (cdr lst) nil nil)) ) (T (loop (cdr lst) dot acc)) ) ) (loop (vl-string->list str) nil nil) ) La même fonction peut être écrite avec une boucle (while ...) et beaucoup de (setq ...). (defun extraireNombres (str / lst num dot nums) (setq lst (vl-string->list str)) (while lst (cond ((isDigit (car lst)) (setq num (cons (car lst) num) lst (cdr lst) ) ) ((and (isHyphen (car lst)) (isDigit (cadr lst)) (null num)) (setq num (cons (cadr lst) (cons (car lst) num)) lst (cddr lst) ) ) ((and (isDot (car lst)) (isDigit (cadr lst)) (not dot) num) (setq num (cons (cadr lst) (cons (car lst) num)) lst (cddr lst) dot T ) ) (num (setq nums (cons (read (vl-list->string (reverse num))) nums) num nil dot nil lst (cdr lst) ) ) (T (setq lst (cdr lst)) ) ) ) (if num (setq nums (cons (read (vl-list->string (reverse num))) nums)) ) (reverse nums) ) Concernant la prise en compte de certains caractères (comme la barre de fraction), j'aurais dû être plus clair en précisant "la liste des nombres entiers et réels". Ça peut faire l'objet d'un autre challenge ou d'un ajout à celui-ci... Sinon, désolé @Patrick Emin, mais je pense que mêler l'IA à ce sujet est une vraie pollution (au sens propre comme au figuré).
  9. @Patrick Emin La fonction RegExpExecute est définie dans la petite bibliothèque Expressions Régulières en lien dans la réponse ci-dessus ou encore, en bas de cette page.
  10. Une autre solution utilisant les expressions régulières. (defun extraireNombres (str) (mapcar '(lambda (x) (read (car x))) (RegExpExecute str "(-?\\d+(.\\d+)?)" nil T) ) )
  11. C'est si bien demandé... Je ne pense pas en ce qui concerne l'algorithme : On lit la chaîne caractère par caractère, dans le sens de lecture. Dès que le caractère est un chiffre (ou un moins (-) suivi d'un chiffre), on reconstitue le nombre à partir de caractère (ou de ces caractères) et des suivants tant que se sont des chiffres ou un point (unique). On stocke le nombre reconstitué. On reprend la lecture des caractères suivants. Pour l'implémentation, le traitement des listes et la récursivité étant, à mon sens, fondamentaux en LISP, j'utilise la liste des caractères (codes ascii) comme @bonuscad, et la récursivité croisée avec deux fonctions auxiliaires : une qui lit la liste de caractères et stocke les nombres reconstitués (ping) et l'autre qui reconstitue les nombres (pong). J'ai aussi ajouté trois petites fonctions (isDigit, isDot, isHyphen) qui servent essentiellement à rendre le code plus explicite. ;; Evalue si le catactère est un chiffre [0-9] (defun isDigit (i) (<= 48 i 57)) ;; Evalue si le catactère est un point [.] (defun isDot (i) (= i 46)) ;; Evalue si le catactère est un signe moins [-] (defun isHyphen (i) (= i 45)) ;; Renvoie la liste des nombres contenus dans la chaîne (defun extraireNombres (str / ping pong) (defun ping (lst) (cond ((null lst) nil) ((isDigit (car lst)) (pong (cdr lst) nil (chr (car lst))) ) ((and (isHyphen (car lst)) (isDigit (cadr lst))) (pong (cddr lst) nil (strcat (chr (car lst)) (chr (cadr lst)))) ) (T (ping (cdr lst))) ) ) (defun pong (lst dot num) (cond ((isDigit (car lst)) (pong (cdr lst) dot (strcat num (chr (car lst)))) ) ((and (not dot) (isDot (car lst)) (isDigit (cadr lst))) (pong (cddr lst) T (strcat num (chr (car lst)) (chr (cadr lst)))) ) (T (cons (read num) (ping (cdr lst)))) ) ) (ping (vl-string->list str)) ) Ceci aurait très bien pu être écrit de manière impérative/procédurale avec des boucles (while ...). Je laisse chercher ceux qui seraient tentés... À suivre, une version plus concise (récursivité simple).
  12. @GEGEMATIC Il semble qu'il manque aussi la fonction : pw_isnum.
  13. @didier Intéressante approche aussi. Mais attention, certains caractères ne sont pas écartés et génèreront des 0.0 non attendus. (extrairenombres "Longueur = 456.789 mètres. Largeur = 123.456. Il faut retirer -56.89 à la quantité qui est de 1234 !")
  14. (gile)

    ListBox

    Il ne s'agit pas d'une nouvelle version. J'ai simplement modifié la version en ligne en ajoutant l'argument default et l'expression suivante pour le sélectionner dan la liste s'il existe. (if (and default (setq pos (vl-position default (mapcar 'car keylab)))) (set_tile "lst" (itoa pos)) )
  15. @bonuscad Intéressant. Pour plus de robustesse, il faudrait écarter le caractère 47 (/). (extraireNombres "Dimensions = 25.4mm / 12.7mm Quantité = -42")
  16. (gile)

    ListBox

    Salut, S'il s'agit bien de la routine ListBox de Dialog.lsp sur cette page, le code suivant accepte un argument supplémentaire la clé de la valeur sélectionnée par défaut. ;; ListBox (gile) ;; Boite de dialogue permettant un ou plusieurs choix dans une liste ;; ;; Arguments ;; title : le titre de la boite de dialogue (chaîne) ;; msg ; message (chaîne), "" ou nil pour aucun ;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...) ;; flag : 0 = liste déroulante ;; 1 = liste choix unique ;; 2 = liste choix multipes ;; default : la clé sélectionnée par défaut ou nil ;; ;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2) ;; ;; Exemple d'utilisation ;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1 "Présentation1") (defun ListBox (title msg keylab flag default / str2lst tmp file dcl_id pos choice) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{key=\"lst\";") (T "spacer;:list_box{key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ListBox" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list (mapcar 'cdr keylab)) (end_list) (if (and default (setq pos (vl-position default (mapcar 'car keylab)))) (set_tile "lst" (itoa pos)) ) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))) (setq choice (reverse choice))) (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab))))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) PS: Ce sujet n'a rien à voir avec OpenDcl ou ObjectDcl, je le déplace dans "Pour aller plus loin en LISP"
  17. Ça faisait longtemps. Le but de ce challenge est d'écrire une routine qui prend en argument une chaîne de caractères et renvoie la liste des nombres contenus dans cette chaîne. Exemple : (extraireNombres "Longueur = 25.4mm Largeur = 12.7mm Quantité = -42") renvoie : (25.4 12.7 -42)
  18. @PHILPHIL As-tu bien installé la toute dernière version (2.1) ? STP essaye de désinstaller via le panneau de configuration, de re-télécharger et ré-installer.
  19. @PHILPHIL Quand tu as modifié une valeur de paramètre dynamique dans le Fichier Excel, as-tu bien enté une valeur correspondant au type du paramètre ?
  20. Salut, Comme signalé dans le premier message, il faut désormais télécharger ExcelAttributeSetup.exe, pour installer ExcelAttribute sur toute version d'AutoCAD depuis 2013 (il faut probablement Débloquer le fichier téléchargé).
  21. Attention, si on supprime les références d'attributs de blocs insérés sans toucher à la définition de bloc, un ATTSYNC recréera ces attributs avec leurs valeurs par défaut. En pur AutoLISP (les routines proposées par @lecrabe utilisent "Visual LISP") on accède aux références d'attribut d'une référence de bloc avec la fonction entnext, dans une boucle while avec comme condition d'arrêt le type d'entité renvoyé par entnext. Un exemple de routine qui récupère toutes les références d'attribut d'une référence de bloc. Elle revoie une liste de noms d'entité (ENAME). ;;; GetAttribs ;;; Renvoie la liste de toutes les référence d'attribut de la référence de bloc. ;;; ;;; Argument ;;; ename : nom d'entité de la référence de bloc (defun getAttribs (ename / lst) (while (and (setq ename (entnext ename)) (= (cdr (assoc 0 (entget ename))) "ATTRIB") ) (setq lst (cons ename lst)) ) (reverse lst) ) La même sous forme récursive : (defun getAttribs (ename) (if (and (setq ename (entnext ename)) (= (cdr (assoc 0 (entget ename))) "ATTRIB") ) (cons ename (getAttribs ename)) ) )
  22. Salut, S'agit-il de supprimer les définitions d'attribut dans les définitions de bloc et / ou de supprimer les références d'attribut dans les (ou des) références de bloc insérées ?
  23. (gile)

    Bug du balayage

    @AurelieCanaille Pourquoi un Balayage ? Une Extrusion option Chemin devrait faire l'affaire.
  24. (gile)

    "_-plot"

    Salut, Regarde la fonction initdia.
  25. C'était un oubli, j'ai modifié le LISP ci-dessus.
×
×
  • 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é