
VDH-Bruno
Membres-
Compteur de contenus
1 145 -
Inscription
-
Dernière visite
-
Jours gagnés
19
Tout ce qui a été posté par VDH-Bruno
-
Aires automatiques d’un lot + Surfaces (ACAD 2024/25)
VDH-Bruno a répondu à un(e) sujet de Scout dans Visual LISP
Bonjour, TOTALAREA dans les Lisps de (gile) doit pouvoir faire cela à tester... https://gilecad.azurewebsites.net/Lisp.aspx Cdt -
Ok c'est dimanche mais on ne laisse pas reposer ses neurones pour autant !
VDH-Bruno a répondu à un(e) sujet de Patrick Emin dans Pause café
Offrir du QI, c'est possible ça? Je trouve cela bien paradoxale😉 Et c'est mon dernier mot Patrick -
[Challenge] Extraire les nombres d'une chaîne de caractères
VDH-Bruno a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
Perso, j'aurais préféré une conversion en valeur réelle, c'est un choix 😉 -
[Challenge] Extraire les nombres d'une chaîne de caractères
VDH-Bruno a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
@bonuscad Merci, les grands esprits se rencontrent, j'ai eu la même réflexion, le problème et que 1/2 peut être considéré comme une valeur fractionnaire et 1 / 2 / 3 / 4 / 5 comme une énumération, et c'est la que je vais faire plaisir à @Patrick Emin . @Patrick Emin Je viens de parcourir rapidement ton article, pour moi une utilisation intéressante des IA, c'est qu'elles réussissent assez bien à contextualiser une donnée dans un texte, suffit de voir les traducteurs automatique qui ne cessent de s'alimenter et donc de progresser. Sur ce type de problème une solution efficiente serait de laisser au programmeur le traitement ce qui n'est pas compliqué en soi, et de déléguer à une AI le soin de reformater les données en fonction d'un standard compréhensible pour le traitement. (Nb: sur le retour de l'IA, en lisp 1/3 est un symbole (non une valeur numérique) et 10 un nombre entier 😉). -
[Challenge] Extraire les nombres d'une chaîne de caractères
VDH-Bruno a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
Re, @didier Je ne pense pas qu'il faille aller plus loin dans le traitement du problème, c'est juste à titre d'illustration car sur ce type de problème on pourra toujours trouver des exceptions et rallonger indéfiniment la liste des conditions, si on ne connait pas à l'avance le domaine d'application pour faire un traitement sur mesure. Quant à la signature, c'est une contraction en forme d'hommage à un ami enseignant d'Aïkido, dont je ne me souviens plus exactement de la formulation au mot près mais qui disait : "Dans l'action d'apprendre, on entend le mot prendre et dans prendre ne jamais oublier qu'il y a rendre" Voilà je laisse libre à chacun d'interpréter ces quelques mots🙂 -
[Challenge] Extraire les nombres d'une chaîne de caractères
VDH-Bruno a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
Bonjour, @bonuscad Bonne fête!😄 @didier Je ne suis pas convaincu que se soit le challenge qui éveille l'intérêt des anciens du forum, mais plutôt le type de donnée à traiter qui intimide les moins expérimentés. Extraire des données d'une chaine de caractère avec un formatage qui n'est pas codifié de façon rigoureuse est de mon point de vue un problème bien complexe à traiter et donne du code bien fastidieux à écrire, si on ne maitrise pas comme @(gile) les expressions régulières qui sont de mon point de vu la panacée. Si la donnée est issue d'un tableur type Excel, nous avons un formatage parfait (libellés, nombres, unités ect...) très facilement interprétable pour un programme Si la donnée est issue d'un traitement de texte cela devient beaucoup plus compliqué à interprété, ex: 10.2 mètre cube, 10.2 m3, 10.2m3. Que doit on traiter? (12.2) ou (12.2 3). De même que considère t'on comme une valeur numérique une fraction doit elle être vu comme une valeur numérique exemple 1/3 doit donner 0.33333 ou 1 & 3 et les exemple et contre exemple peuvent être très nombreux. D'ailleurs pour illustrer le propos j'invite à tester la donnée suivante: " Volume 1/3 m3 tous les 10m²" avec la version de @(gile) et les expressions régulières... A+ Bruno -
[Challenge] Extraire les nombres d'une chaîne de caractères
VDH-Bruno a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
Bonjour à tous, jeunes et moins jeunes Bon visiblement c'est la réunion des moins jeunes, donc je répond à l'appel 😄 Oui vous vous doutez bien que l'intitulé du post CHALLENGE entre crochet à de suite éveillé ma curiosité et me fais sortir du bois... 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. Effectivement à la lecture de l'énoncé, j'en suis de suite arrivé à la même conclusion, ce qui signifie que le challenge ne va porter que sur un exercice de style. Les bases étant posé, je savais déjà que je laisserai (gile) dégainer ses expressions régulières (il en est l'auteur), c'est une question d'étique personnelle pour un challenge. Voilà ceci étant fait je ne vais pas bouter mon plaisir à me dérouiller les doigts en proposant tout de même quelques lignes, sachant que l'exercice était plié et qu'il n'y aurait pas d'enjeu algorithmique, sachant également que pour des raisons de souplesses et de performance les codes proposé le seront principalement sur du traitement de liste, par contre pied j'ai tenté de proposer un traitement directement sur la chaine de caractère, en me basant sur un exemple relevé au hasard du file de discutions. Mon premier jet basé sur les expressions retourné par la fonction read pour éviter de lire caractère par caractère la chaine ce qui est couteux en lisp. (defun f (str) (cond ((null (setq r (read str))) nil) ((numberp r) (cons r (f (substr str (+ (strlen (vl-princ-to-string r)) 2))))) (T (f (substr str (+ (strlen (vl-princ-to-string r)) 2)))) ) ) Un test rapide: _$ (f "slt / 18 +36.0 &gg !") (18 36.0) Ok Puis un regard plus attentif me montre qu'il y a de la ponctuation dans l'exemple fourni, et d'expérience pour avoir déjà expérimenté cette voie je comprend de suite que les caractères '.() peuvent posé problème à la fonction read Problème facilement contournable sans alourdir le code en mettant en place une trappe pour gérer les exceptions au moyen de vl-catch-all-apply Deuxième jet: (defun f (str) (cond ((vl-catch-all-error-p (vl-catch-all-apply 'read (list str))) (f (substr str 2))) ((null (setq r (read str))) nil) ((numberp r) (cons r (f (substr str (+ (strlen (vl-princ-to-string r)) 2))))) (T (f (substr str (+ (strlen (vl-princ-to-string r)) 2)))) ) ) Un second test rapide: _$ (f "Long= 450.0 m . ) 37 ( à -5.0 m !") (450.0 37 -5.0) Puis une analyse plus attentive des différents exemples, me montre que des caractères peuvent être accolé aux nombres Ce qui implique faut complexifier les lignes de codes ou proposer une fonction auxiliaire afin de formater le texte en argument pour qu'il corresponde aux limitations du code proposé. Mais quitte à analyser la chaine autant la traiter dans le même temps et je décide de changer mon fusil d'épaule en travaillant avec des listes, les données sont plus facile à analyser et moins couteuses. Ma première intention travailler avec des appels croisées mais hélas (gile) est déjà passé par là... Qu'à cela ne tienne je passe par un accumulateur pour stoker les nombres sous forme de liste et les reconstituer à la remonté des appels de la fonction récursive simple Ma troisième proposition (defun extraireNombres (txt / foo) (defun foo (l acc) (cond ((null l) nil) ((or (< 47 (car l) 58) (and (= (car l) 45) (< 47 (cadr l) 58)) (and (= (car l) 46) acc) ) (foo (cdr l) (cons (car l) acc)) ) (acc (cons (read (vl-list->string (reverse acc))) (foo (cdr l) nil) ) ) (T (foo (cdr l) nil)) ) ) (foo (vl-string->list (strcat txt " ")) nil) ) Teste _$ (extraireNombres "Longueur = 25.4mm Largeur = 12.7mm Quantité = -42.") (25.4 12.7 -42.0) A+ Bruno -
[Résolu] Copier Coller texte et effacer l'origine
VDH-Bruno a répondu à un(e) sujet de yusukens82 dans Routines LISP
Ta solution avec grdaw est très bonne, cela offre du choix et du contenu pour qui voudrait s'inspirer et se perfectionner. -
[Résolu] Copier Coller texte et effacer l'origine
VDH-Bruno a répondu à un(e) sujet de yusukens82 dans Routines LISP
@didier , après être passé dépanné hier soir un confrère et ami sur un AutoCAD récent, maintenant je sais dire j'en ai profité/amusé pour faire quelques tests sur des variables d'environnements apparu en 2015 et 2016, j'ai identifié SELECTIONEFFECT & SELECTIONEFFECTCOLOR qui influent sur l'aspect visuel des sélections et par effet de bord sur l'aspect visuel des entités géré par la fonction lisp redraw. La première SELECTIONEFFECT paramétré sur 0 permet de retrouver l'ancien style d'affichage des sélections, paramétré sur 1 la couleur de l'aspect visuel de la surbrillance devient dépendant de SELECTIONEFFECTCOLOR. SELECTIONEFFECTCOLOR est initialement réglé sur 0, elle accepte les 255 couleurs de la table ACI, personnellement j'ai gardé un environnement de travail sur fond noir et j'ai réglé SELECTIONEFFECTCOLOR sur 3 (vert), j'ai trouvé le visuel satisfaisant. Voilà pour le retour -
L'otium du peuple, une drogue à laquelle on prend vite gout !
VDH-Bruno a répondu à un(e) sujet de Patrick Emin dans Pause café
Bonjour Patrick, Un nouveau départ, un nouveau chalenge s'offre à toi notamment celui de La reconquête du temps libre. Plein de bonnes choses à toi pour la suite. Bruno -
@Luna oui je te comprend, tu n'es pas la seule à connaitre cette problématique, pour te rassurer j'ai moi même sous le coude quelques lignes de code écrite par (gile) ici datant de 2013, un algorithme que j'ai échoué à implémenter, pour lequel j'aimerais prendre le temps nécessaire en recherche afin de mis consacrer sérieusement (chose que je n'ai toujours pas pris la peine de faire), un jour peut être ou dans une autre vie... 😅 A+ Bruno
-
Bonjour @Luna Je passais dans le coin, donc pour répondre à ton interrogation et pour l'avoir fait pas le passé (cela reste à tester sur des autocad récent) il est tout à fait possible de créer une formule avec une valeur de champ sur une entité cotation mais seulement par programmation, bien que cela ne soit pas possible manuellement, car en mode édition les propriétés de l'entité ne sont pas accessible aux valeurs de champs. Ci-dessous un lien sur ce forum ou tu trouvera un exemple de code qui permet de faire cela, si des fois cela peut servir un jour. https://cadxp.com/topic/48507-arrondir-cotes-%C3%A0-la-valeur-sup%C3%A9rieur/?do=findComment&comment=290565 A+ Bruno
-
[Résolu] Copier Coller texte et effacer l'origine
VDH-Bruno a répondu à un(e) sujet de yusukens82 dans Routines LISP
@didier pour avoir écrit de nombreuses routines avec la fonction redraw, sur des anciennes version l'aspect visuel était très bien géré, il est vrai que pour ce que j'en ai vu sur les versions récentes c'est plus ça, après est ce que Autodesk aurait introduit de nouvelles variables pour y remédié je ne saurais dire.... En tout cas sur le clone d'Autocad (en version 15) qu'il m'arrive encore d'utiliser au travail cela passe encore très bien. -
[Résolu] Copier Coller texte et effacer l'origine
VDH-Bruno a répondu à un(e) sujet de yusukens82 dans Routines LISP
Bonjour, Oui c'était l'idée. A+ Bruno -
[Résolu] Copier Coller texte et effacer l'origine
VDH-Bruno a répondu à un(e) sujet de yusukens82 dans Routines LISP
Bonjour, Pour compléter et répondre à la question de la surbrillance d'un objet, il y a la fonction lisp redraw, qui gère l'aspect visuel d'une entitée, c'est moins graphique que la solution de @didier avec des vecteurs temporaire et c'est une variante à la proposition de @Luna et l'emploi d'un sssetfirst avec la création d'une sélection. Pour l'illustration du propos: (defun c:r2 (/ entseltxt etxt1 etxt2) ;; Sélection utilisateur retourne ename ou nil (defun entseltxt (msg / ent) (if (and (setq ent (car (entsel msg))) (or (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT") (prompt "\nL'entitée n'est pas un texte valide! ") ) ) ent ) ) ;; Code (and (setq etxt1 (entseltxt "\nSélectionnez le texte à copier puis effacer: ")) (or (redraw etxt1 3) (setq etxt2 (entseltxt "\nSélectionnez le texte à modifier: ")) (redraw etxt1 4)) (entmod (subst (assoc 1 (entget etxt1)) (assoc 1 (entget etxt2)) (entget etxt2))) (entdel etxt1) ) (princ) ) -
[Résolu] Copier Coller texte et effacer l'origine
VDH-Bruno a répondu à un(e) sujet de yusukens82 dans Routines LISP
Bonjour, @Luna, Oui pour les explications, et non pour l'application, car il me semble que c'est plutôt ces lignes qu'il faudrait translater: (setq bg (vlax-safearray->list minext) hd (vlax-safearray->list maxext) ) en les remplaçants par les suivantes: (setq bg (trans (vlax-safearray->list minext) 0 1) hd (trans (vlax-safearray->list maxext) 0 1) ) sinon tu risques d'avoir des résultats surprenant avec les points bg & hd définie dans un système de coordonnées et les points hg & bd définie dans un autre A+ Bruno -
L'intelligence artificielle c'est bientôt fini
VDH-Bruno a répondu à un(e) sujet de Patrick Emin dans Pause café
Hummm, bien tenté mais cela ne prouve rien, les chatbots aussi font de l'humour😉 -
Re, Après avoir discuté du fond, au sujet de la forme j’ai conscience que ce type de fonction est un peu « casse-tête » à appréhender. Personnellement je n’en n’écris pas tous les jours moi-même. Ayant une programmation que je qualifierai plus intuitif que théorique, pour expliquer « le comment » arriver à ce type de construction de façon intelligible c’est un peu plus compliqué, mais j’essaierais à l’occasion de monter un autre exemple plus parlant dans un sujet distinct et pour ne pas polluer d'avantage celui-ci. En attendant je peux essayer de renvoyer sur sujet proche ou je m’étais essayé à en expliquer le fonctionnement https://cadxp.com/topic/40897-fraction-continue/?do=findComment&comment=229745
-
Bonsoir Bruno, Oui mais ce n'est pas de mon fait mais plutôt de comment sont implémentés les nombres entiers, pour rappel en AutoLISP les entiers relatifs sont codés sur 32 bits, d'où les limites -2^31 et 2^31 - 1 Donc 13! = 1×2×3×4×5×6×7×8×9×10×11×12×13= 6227020800 (numériquement parlant dépasse la limite des entiers signé sur 32 bits) Le dépassement de la limite des entiers est géré différemment suivant les cas: Si la valeur est entrée directement, elle est automatiquement convertie en réel _$ 6227020800 6.22702e+09 Si la valeur est le résultat d'une opération arithmétique le résultat sera faux ce qui est le cas ici: _$ (* 1 2 3 4 5 6 7 8 9 10 11 12 13) 1932053504 Pour aller au calcul de la factorielle correcte jusqu'au limite des réels supporté par AutoLISP, sur le paradigme précédemment proposé il suffit d'interroger la fonction avec une valeur réelle: _$ (fact 13.) 6.22702e+09 Ou alors par précaution de modifier le code comme ceci: (defun fact (n) ((lambda (f) (f f n) ) (lambda (g k) (if (< k 1) 1. (* k (g g (- k 1))) ) ) ) ) et là on obtient: _$ (fact 13) 6.22702e+09 Bonne soirée (Ps: Je te suis reconnaissant d'avoir soulevé ce point de détail que je n'avais pas pris la peine de développer)
-
Bonjour, En redécouvrant par hasard ce post, je ne résiste pas à l'envie de présenter une version fonctionnelle de l'implémentation du calcul de la factorielle, à noter que c'est une construction qui montre comment se passer de la boucle ou de la récursion dans sa définition. (defun fact (n) ((lambda (f) (f f n) ) (lambda (g k) (if (< k 1) 1 (* k (g g (- k 1))) ) ) ) ) A+ Bruno
-
Entier en texte avec ajout de 0 avant
VDH-Bruno a répondu à un(e) sujet de Olivier Eckmann dans Routines LISP
Et dans ce cas pour réduire le nombre au format souhaité dizaines, milliers ect.. (defun Int2Str (iNumber iNbCarac) (substr (setq iNumber (itoa (+ iNumber (expt 10 iNbCarac)))) (- (1+ (strlen iNumber)) iNbCarac) ) ) _$ (int2str 1259410 4) "9410" _$ (int2str 410 4) "0410" -
Entier en texte avec ajout de 0 avant
VDH-Bruno a répondu à un(e) sujet de Olivier Eckmann dans Routines LISP
Sinon rapidement dans le même esprit pour ne pas avoir à se soucier de DIMZIN Ajouter en puissance de 10, plutôt que de diviser puis convertir le résultat en texte en suppriment le 1er caractère (defun Int2Str (iNumber iNbCarac) (substr (itoa (+ iNumber (expt 10 iNbCarac))) 2) ) _$ (int2str 10 4) "0010" _$ (int2str 12 4) "0012" _$ (int2str 9000 4) "9000" A la condition que le nombre soit inférieur au nombre de chiffre significatif que l'on veut obtenir sinon ajouter une condition de longueur dans la fonction substr A+ -
Entier en texte avec ajout de 0 avant
VDH-Bruno a répondu à un(e) sujet de Olivier Eckmann dans Routines LISP
Cette discussion me rappelle ce sujet ou il était question de rajouter des 0 de fin sur des nombres décimaux https://cadxp.com/topic/37583-rtos/?do=findComment&comment=230041 -
Entier en texte avec ajout de 0 avant
VDH-Bruno a répondu à un(e) sujet de Olivier Eckmann dans Routines LISP
Oui c'est préférable -
Entier en texte avec ajout de 0 avant
VDH-Bruno a répondu à un(e) sujet de Olivier Eckmann dans Routines LISP
Commande : (int2str 100 4) "01" Commande : (int2str 1000 4) "1" Commande : (int2str 10 4) "001" Commande : (int2str 12 4) "0012" Si DIMZIN différent de 0 Salutations Bruno