Aller au contenu

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

  1. Bonjour, TOTALAREA dans les Lisps de (gile) doit pouvoir faire cela à tester... https://gilecad.azurewebsites.net/Lisp.aspx Cdt
  2. Offrir du QI, c'est possible ça? Je trouve cela bien paradoxale😉 Et c'est mon dernier mot Patrick
  3. Perso, j'aurais préféré une conversion en valeur réelle, c'est un choix 😉
  4. @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 😉).
  5. 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🙂
  6. 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
  7. 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
  8. Ta solution avec grdaw est très bonne, cela offre du choix et du contenu pour qui voudrait s'inspirer et se perfectionner.
  9. @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
  10. 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
  11. @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
  12. 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
  13. @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.
  14. Bonjour, Oui c'était l'idée. A+ Bruno
  15. 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) )
  16. 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
  17. Hummm, bien tenté mais cela ne prouve rien, les chatbots aussi font de l'humour😉
  18. VDH-Bruno

    Récursivité

    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
  19. VDH-Bruno

    Récursivité

    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)
  20. VDH-Bruno

    Récursivité

    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
  21. 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"
  22. 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+
  23. 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
  24. Oui c'est préférable
  25. 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
×
×
  • 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é