-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
208
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
Comment identifier l'imprimante utilisée pour une présentation ?
(gile) a répondu à un(e) sujet de PATRICE69 dans Pour aller plus loin en LISP
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)) -
Lisp pour créer des hachures non "carrées"
(gile) a répondu à un(e) sujet de Otarie dans AutoCAD 2020-2024
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 -
Changer les couleurs des objets dans un dessin
(gile) a répondu à un(e) sujet de willy95 dans Débuter en LISP
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) ) -
Changer les couleurs des objets dans un dessin
(gile) a répondu à un(e) sujet de willy95 dans Débuter en LISP
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. -
Comment classer par ordre alphabétique une liste d\'Xrefs ???
(gile) a répondu à un(e) sujet de TramwayT3 dans AutoCAD 2010
@Syl2007 Des caractères avaient disparu probablement lors d'un formatage du site. J'ai corrigé le code dans le message original. -
ETIRER HACHURES en selectionnant plusieurs grips d'un coup
(gile) a répondu à un(e) sujet de PHILPHIL dans Routines LISP
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... -
ETIRER HACHURES en selectionnant plusieurs grips d'un coup
(gile) a répondu à un(e) sujet de PHILPHIL dans Routines LISP
Salut, Pour activer les "grips" il faut utiliser la fonction sssetfirst. (sssetfirst nil (ssadd ename_de_la_hachure)) -
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
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é). -
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
@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. -
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
Une autre solution utilisant les expressions régulières. (defun extraireNombres (str) (mapcar '(lambda (x) (read (car x))) (RegExpExecute str "(-?\\d+(.\\d+)?)" nil T) ) ) -
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
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). -
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
@GEGEMATIC Il semble qu'il manque aussi la fonction : pw_isnum. -
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
@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 !") -
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)) )
-
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
@bonuscad Intéressant. Pour plus de robustesse, il faudrait écarter le caractère 47 (/). (extraireNombres "Dimensions = 25.4mm / 12.7mm Quantité = -42") -
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"
-
[Challenge] Extraire les nombres d'une chaîne de caractères
(gile) a posté un sujet dans Pour aller plus loin en LISP
Ç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) -
Import/Export d\'attributs avec Excel
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
@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. -
Import/Export d\'attributs avec Excel
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
@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 ? -
Import/Export d\'attributs avec Excel
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
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é). -
Supprimer un attribut de bloc
(gile) a répondu à un(e) sujet de PATRICE69 dans Pour aller plus loin en LISP
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)) ) ) -
Supprimer un attribut de bloc
(gile) a répondu à un(e) sujet de PATRICE69 dans Pour aller plus loin en LISP
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 ? -
@AurelieCanaille Pourquoi un Balayage ? Une Extrusion option Chemin devrait faire l'affaire.
-
Salut, Regarde la fonction initdia.
-
Supression de hachures à l'intérieur de blocs
(gile) a répondu à un(e) sujet de Aeropix1908 dans AutoCAD 2020-2024
C'était un oubli, j'ai modifié le LISP ci-dessus.
