Aller au contenu

VDH-Bruno

Membres
  • Compteur de contenus

    1 146
  • Inscription

  • Dernière visite

  • Jours gagnés

    20

Tout ce qui a été posté par VDH-Bruno

  1. 😂😂😂 C'est malin, je viens d'en avaler mon café de travers.
  2. Bonjour, Oui c'est une façon de faire, après si je peux faire un parallèle avec des choses que j'ai déjà mis en oeuvre et éviter la lecture d'un fichier de config .cfg et ainsi répondre à cette interrogation: Surtout si le fichier cfg est écrit sous forme d'un lisp, c'est dans faire directement un fichier config_fr.lsp en autochargement en déclarant directement la variable globale *GLOBAL_MSG* à l'intérieur du fichier. Ce qui permet d'économiser les lignes suivantes dans le corps du programme et accessoirement le temps de chargement correspondant, temps qui reste négligeable car effectué qu'une seul fois dans ton programme. En faire un fichier lisp n’empêche en rien la personnalisation du fichier de config, si il n'est pas encapsulé dans ton vlx, car cela reste un fichier texte. Pour cela suffit de mettre quelques commentaire bien choisi en entête du fichier config_**.lsp pour permettre à l'utilisateur de le personnaliser. En tout cas jolie travail et bonne continuation dans ton projet, projet que j'observe de loin mais toujours avec intérêt étant "retraité" du lisp, ne travaillant plus que très occasionnellement sous AutoCAD. Amicalement Bruno
  3. Bonjour Zebulon_ Ca fait bien longtemps que je ne me suis pas intéressé au dcl, personnellement j'avais opté pour l'autre solution. Influencé sans doute par le fichier AutoCAD.dcl que j'avais édité pour voir comment Autodesk avait traité la question. Après je m'étais écris un fichier texte avec les occurrences à traduire puis je passais par un remplacer dans le bloc-notes. Pour une petite boite de dialogue écrire le dcl à la volée c'est rapide, mais dans un fichier avec beaucoup de boite de dialogue, je trouvais pratique d'avoir un dcl pour pouvoir inspecter /visualiser ses BD dans l'éditeur Visual Lisp. Salutations Bruno
  4. Oui tu as raison, je me suis fait prendre par la patrouille, en première intention je voulais écrire une fonction auxiliaire pour ne pas parcourir toute la chaîne, puis comme c'était à titre d'exemple j'ai sacrifié l'efficience à la concision pensant que personne ne le verrais... 😂 D’ailleurs comme j'avais mauvaise conscience, j'ai voulu me dédouaner en précisant "ça peut donner"😂😂😂 Oui il y avait une petite escroquerie, je te remercie de l'avoir relevée😉
  5. Et pour le jeu en traduisant récursivement l’algorithme donné par (gile), ça peut donner ceci: (defun f (s) (cond ((= s "") "") ((wcmatch (substr s 1 1) "#") (strcat (substr s 1 1) (f (substr s 2)))) (T (f (substr s 2))) ) )
  6. Bonjour, Si tu es sur que ta chaîne ne contient que des caractères AlphaNumérique, tu peux très simplement tenter ceci: _$ (vl-string-trim "ABCDEFGHIJKLMNOPQRSTUVWXYZ" (strcase "Ma80cm")) "80" _$ (vl-string-trim "ABCDEFGHIJKLMNOPQRSTUVWXYZ" (strcase "80Macm")) "80" _$ (vl-string-trim "ABCDEFGHIJKLMNOPQRSTUVWXYZ" (strcase "Macm80")) "80" Cdt Bruno (Ps: Sinon il y a évidement les expressions régulières mentionné par (gile) beaucoup plus puissante..)
  7. Bonjour à tous, Une petite précision pour les ldata (qui sont effectivement trés simple d'utilisation)qui ne devrait pas arranger @Curlygoth, car elles sont accessible seulement en Lisp et ObjectArx. Un lien de (gile) qui résume cela sur le forum A+ Bruno
  8. VDH-Bruno

    Joyeuses Fêtes

    Bonne année et bon réveillon, Santé et plein de bonnes choses à tous pour 2022! Et un grand remerciement à tous ces jeunes retraités (que je sais nombreux😉) et qui continuent à contribuer à la richesse de ce forum.
  9. Bonjour, J'avoue ne pas mettre libéré suffisamment de temps entre les fêtes de fin d'années pour regarder plus dans le détail cette question, mais je le ferais et je te remercie de ta réponse. J'ai tout de même trouvé quelques minutes pour le jeu et l'occasion de revisiter joyeusement ma trigo, pour réécrire une version qui n'utilise pas de fonction auxiliaire, ce n'est ni plus ni moins qu'une réécriture de vos versions. ;; Trigones 3 VDH-Bruno ;; ;; ---------------------------------------------------------------------------- ;; ;; Algorithme: Version basé sur les relations trigonométriques ;; ;; Les arguments sont exprimés en fontion de la tangeante pour le ;; ;; calcule de la valeur angulaire ;; ;; ---------------------------------------------------------------------------- ;; (defun trigones3 (a sinus cosinus secante cosecante tangente cotangente) (if (setq a (cond ((< 0. a (/ pi 2.)) a) ((< 0. sinus 1.) (atan sinus (sqrt (- 1. (* sinus sinus))))) ((< 0. cosinus 1.) (atan (sqrt (- 1. (* cosinus cosinus))) cosinus)) ((< 1. secante) (atan (sqrt (1- (* secante secante))))) ((< 1. cosecante) (atan (/ 1. (sqrt (1- (* cosecante cosecante)))))) ((< 0. tangente) (atan tangente)) ((< 0. cotangente) (atan (/ 1. cotangente))) ) ) (list a (setq sinus (sin a)) (setq cosinus (cos a)) (/ 1 cosinus) (/ 1 sinus) (/ sinus cosinus) (/ cosinus sinus) ) ) ) @(gile) Pour le retour, les and précédant les < dans le cond me semble superflue dans ta première version....
  10. Bravo!!! Après quelques testes et une analyse sommaire, je dois avouer que ta fonction compute (écrite efficacement) donne un avantage certain, rendant mon code plus "bruyant" en comparaison, je me dis que j'aurais pu insisté un peu plus sur l'optimisation.
  11. Jolie, Pour ta version 1, j'ai une version équivalente sauf que je me suis limité pour le jeu de ne pas écrire de fonction auxiliaire et à ne me servir que des fonctions natives en Autolisp. Pour ta version 2, je vais étudié cela plus dans le détail quant je serais en meilleur forme, notamment comment fonctionne la façon dont tu exprime l'infini dans ton code, je vais surement apprendre quelque chose. Pour ce qui est d'éviter de recalculer la valeur en entré je m'étais essayé par le passé à écrire une fonction de "mémoïsation" (pas sur que ce soit le bon terme) à titre expérimental, impossible de retrouver mes codes pour les adapter à ce challenge, de toute façon les opérations étant limité le coût aurait été supérieur au gain. La version codé sur le principe de la fonction TriangleRec donné précédemment avec les fonctions mathématiques native fournie en AutoLisp (atan sin / sqrt expt + -), contrairement aux tiennes je n'ai pas bordé les saisies, j'ai été au plus simple, l'idée était de montrer le procédé... ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Trigones 1 VDH-Bruno ;; ;; ---------------------------------------------------------------------------- ;; ;; Algorithme: Chaques fontions est définie en fonction d'une autre de façon ;; ;; qu'elles soient toutes chainées de façon à créer une dépendance ;; ;; circulaire, de fait si une valeur est insérer dans la boucle de ;; ;; dépendance toutes les fonctions sont alors définie et leurs ;; ;; valeurs respective retournées ;; ;; ---------------------------------------------------------------------------- ;; ;; Description: -> "lire dépend de" ;; ;; (tang) -> (sec) -> (cosinus) -> (cot) -> (csc) -> (sinus) -> (ang) -> (tang) ;; ;; ---------------------------------------------------------------------------- ;; ;; Liste des fonctions: ;; ;; - Angle (ang) ;; ;; - Sinus (sinus) ;; ;; - Cosinus (cosinus) ;; ;; - Sécante (sec) ;; ;; - Cosécante (csc) ;; ;; - Tangente (tang) ;; ;; - Cotangente (cot) ;; (defun trigones1 (ang sinus cosinus sec csc tang cot) (mapcar '(lambda (val fun) (if val (eval (list 'defun fun () val)) fun ) ) (list ang sinus cosinus sec csc tang cot) (list (defun ang () (atan (tang))) (defun sinus () (sin (ang))) (defun cosinus () (/ (cot) (sqrt (1+ (expt (cot) 2.))))) (defun sec () (/ 1. (cosinus))) (defun csc () (/ 1. (sinus))) (defun tang () (sqrt (1- (expt (sec) 2.)))) (defun cot () (sqrt (1- (expt (csc) 2.)))) ) ) (list (ang) (sinus) (cosinus) (sec) (csc) (tang) (cot)) )
  12. Bonjour, Comme il n'y a pas foule en Lisp, j'ouvre le bal en proposant ma deuxième version qualifié de plus "analytique" (pas ma préféré), pour la version fonctionnelle je laisserai (gile) dégainer en premier. Comme j'ai un peu de temps j'ai mis des commentaires dans le code (une fois n'est pas coutume), elle est basé sur les triangles semblable ce qui nous place dans une relation de Thalès, et comme les 3 triangles ont un coté commun il est très facile de définir un coefficient de proportionnalité pour chaque triangle, donc un peu de Pythagore pour trouver le premier triangle et le tour est joué. La fonction principale (basé sur le principe de Thalès) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Trigones 2 VDH-Bruno ;; ;; ---------------------------------------------------------------------------- ;; ;; Algorithme: Les 3 triangles sont des triangles semblables. ;; ;; (leurs côtés sont proportionnels, les angles sont égaux) ;; ;; résoudre un des triangles c'est résoudre les deux autres ;; ;; ---------------------------------------------------------------------------- ;; ;; Description | (Hypothénuse) | (Adjacent) | (Opposé) | (coef *) ;; ;; Triangle 1: | 1 | cosinus | sinus | x1 ;; ;; Triangle 2: | cosécante | cotangente | 1 | x2 ;; ;; Triangle 3: | sécante | 1 | tangente | x3 ;; ;; ;; (defun trigones2 (ang sinus cosinus sec csc tang cot / triangle x1 x2 x3) (cond (ang ;_ si angle (setq triangle (triangleRec 1. (cos ang) nil) ;_ Triangle 1 (cos angle) x1 1. x2 (/ 1. (caddr triangle)) x3 (/ 1. (cadr triangle)) ) ) ((or sinus cosinus) ;_ si sinus ou cosinus (setq triangle (triangleRec 1. cosinus sinus) ;_ Triangle 1 x1 1. x2 (/ 1. (caddr triangle)) x3 (/ 1. (cadr triangle)) ang (atan (/ (caddr triangle) (cadr triangle))) ) ) ((or csc cot) ;_ si cotangente ou cosecante (setq triangle (triangleRec csc cot 1.) ;_ Triangle 2 x1 (/ 1. (car triangle)) x2 1. x3 (/ 1. (cadr triangle)) ang (atan (/ (caddr triangle) (cadr triangle))) ) ) ((or sec tang) ; _si secante ou tangente (setq triangle (triangleRec sec 1. tang) ;_ Triangle 3 x1 (/ 1. (car triangle)) x2 (/ 1. (caddr triangle)) x3 1. ang (atan (/ (caddr triangle) (cadr triangle))) ) ) ) (list ang ; angle (* x1 (caddr triangle)) ; sinus (* x1 (cadr triangle)) ; cosinus (* x3 (car triangle)) ; secante (* x2 (car triangle)) ; cosecante (* x3 (caddr triangle)) ; tangente (* x2 (cadr triangle)) ; cotangente ) ) Et la fonction auxiliaire utilisant Pythagore pour déterminer les 3 cotés d'un triangle rectangle en fonction des 2 autres (fonction issus de ma biblio perso) ;; TriangleRec VDH-Bruno ;; Retourne les 3 cotés d'un triangle rectangle en fonction des 2 autres ;; Exemple: (TriangleRec nil 3. 4.) -> (5.0 3.0 4.0) ;; (TriangleRec 5. nil 4.) -> (5.0 3.0 4.0) (defun triangleRec (hyp adj opp) (mapcar '(lambda (val fun) (if val (eval (list 'defun fun () val)) fun ) ) (list hyp adj opp) (list (defun hyp () (sqrt (+ (expt (opp) 2.0) (expt (adj) 2.0)))) (defun adj () (sqrt (- (expt (hyp) 2.0) (expt (opp) 2.0)))) (defun opp () (sqrt (- (expt (hyp) 2.0) (expt (adj) 2.0)))) ) ) (list (hyp) (adj) (opp)) ) Bruno
  13. Merci de la précision très intéressant, pour la version lisp je t’avouerai que je suis parti du principe que les valeurs saisies étant dans le premier quadrant du cercle, elle était forcément valide donc je n'ai pas prévu de gestion d'erreur... Le but "déguisé" était de montrer l’intérêt d'écrire une solution fonctionnelle en "chainant" les appels. Après comme il y avait peu de candidat sur le challenge j'ai aussi écrit une version plus "classique", version qui prend plus de 15mn à écrire 😉 .
  14. Bonjour, @nazemrap oui c'est ça bien ça @(gile) Quant j'ai vu que tu posais un exemple en F# je n'avais plus de doute sur le codage, voir le code n'a fait que confirmer ce que je savais déjà 😉 (Ps: (gile) Je ne pense pas qu'il y aura beaucoup de proposition en Lisp sinon des personnes ce seraient déjà manifesté, je pense que dans la matinée tu peux déposer ta version Lisp, si tu le souhaites)
  15. Bonsoir nazemrap, En Lisp c'est mieux mais si tu souhaites en déposer une que tu ne peux pas retranscrire dans ce langage, personnellement je ne suis pas contre. Par contre je ne pourrai pas te la tester ou te faire un éventuel retour dessus. Après tout dépend du langage car je sais que certains font appel à des bibliothèques mathématiques spécialisées très bien fournies, dans ce cas il y a plus vraiment de challenge;) Salutations Bruno
  16. Tu as raison il y a une coquille dans mon illustration, c'est strictement compris entre 0 et PI/2, comme indiqué dans l'énoncé. Effectivement il y avait ambiguïté la précision est nécessaire.
  17. Zut... Je viens d'en trouver une autre plus analytique, du coup la première que j'avais écrite perd un peu de son intérêt dans ce que je voulais démontrer, si j'avais un peu mieux réfléchie au sujet, j'aurais certainement modifier l'énoncé du challenge... Bon c'est le jeu on peut pas penser à tout😉
  18. Bonjour (gile) Génial, même si j'en doutais pas, oui merci d'attendre un peu pour ne pas tuer le match. Perso j'ai écrit la mienne en moins de 15mn (j'ai été au plus simple), et je pense que l'on doit avoir sensiblement la même, si tu es impatient, tu peux me la poster en MP je jetterai un œil ça m'occupera, j'ai exceptionnellement un peu de temps devant moi, je suis à l'isolement forcé depuis hier... donc un peu de temps pour lancer et tester un challenge. Bruno
  19. VDH-Bruno

    pb de trigo

    Bonjour, Oui pas mieux que (gile) même si personnellement j'aurais plus formulé comme ceci: Pour la version trigo : 2000 * cos (Asin (750 / 2000)) Et avec Pythagore: 2000 * sqrt (1 - (750 / 2000)^2) Mais c'est du pareil au même Cdt VDH-Bruno
  20. Bonsoir, Une récente discussion m'a inspiré une petite proposition de challenge qui doit pouvoir parler à tous le monde https://cadxp.com/topic/54760-pb-de-trigo/?tab=comments#comment-312380 En général pour résoudre des problèmes de résolution dans un triangle, j'ai pour habitude de me servir des triangles semblables pour travailler sur un triangle dont l’hypoténuse (rayon du cercle unitaire) vaut 1, de façon à trouver la relation la plus simplifié à programmer pour résoudre le système. Pour mémoire dans cette configuration il suffit de connaitre une seule donné pour en déduire les autres. Dans cet esprit je vous propose d'élaborer une fonction trigones qui peut prendre en arguments: l'angle / sinus / cosinus / sécante / cosécante / tangente / cotangente, j'ai volontairement limité les arguments on pourrait en ajouter. (trigones ang sinus cosinus sécante cosécante tangente cotangente) Dans l'appel de la fonction, on ne renseignerait qu'un argument les autres valant nil, et la fonction retournerait tous les autres cotés, et ce quelque soit l'argument renseigné. Ex: Appel de fonction en renseignant l'angle: _$ (trigones (/ pi 4) nil nil nil nil nil nil) (0.785398 0.707107 0.707107 1.41421 1.41421 1.0 1.0) Ex: Appel de fonction en renseignant le sinus: _$ (trigones nil 0.6 nil nil nil nil nil) (0.643501 0.6 0.8 1.25 1.66667 0.75 1.33333) Ex: Appel de fonction en renseignant la tangente: _$ (trigones nil nil nil nil nil 2 nil) (1.10715 0.894427 0.447214 2.23607 1.11803 2 0.5) Une petite illustration pour ceux dont la résolution des trigones est un lointain souvenir, on se limite a résoudre le triangle de rayon 1 dans le premier quadrant du cercle c'est à dire avec un angle compris entre 0 et PI/2 Un petit prétexte pour réviser sa trigo en cette fin d'année, bon code à tous.
  21. En AutoLisp c'est un truc que j'ai toujours regretté avec sslength _$ (length nil) 0 _$ (sslength nil) ; erreur: type d'argument incorrect: lselsetp nil
  22. Bonjour, Rapidement et aussi pour le fun, expression fonctionnant dans le SCU et qui retourne 0 si le polygone ne contient pas de bloc. (sslength (cond ((ssget "_WP" ((lambda (e i / pt pts) (while (setq pt (vlax-curve-getPointAtParam e i)) (setq i (1+ i) pts (cons (trans pt 0 1) pts)))) (car (entsel "\nSélectionnez une polyligne: ")) 0) '((0 . "INSERT")) ) ) ((ssadd)) ) ) (Ps: Surtout un prétexte ici pour partager une astuce comme une autre pour éviter à la fonction sslength d'échouer sur une selection null et de retourner 0 au moyen d'une sélection vide)
  23. Merci, finalement en voulant me créer un compte la-bas je me suis aperçu que j'en avais un d'existant, j'ai réussie à reprendre la main dessus.
  24. Bonjour, Non jamais installé le module VBA depuis qu'il n'est plus supporté, de mémoire la seule macro VBA qui était utilisé au bureau sur version 2004, je l'ai réécrite pour la version d'AutoCAD 2007 en lisp à la demande d'un collègue. Bonne fin de soirée Edit: La mémoire me fait défaut après vérification ce matin au bureau le module VBA est encore intégré sur AutoCAD 2007.
  25. VDH-Bruno

    Propriétés d'un dossier

    Bonsoir, En lisp il y a le fichier julian.lsp de chez AutoDesk, qui peut t'aider pour formater une date au format Julien en reprenant l'exemple donné par Didier une fois le fichier charger _$ (setq date1 "44253.4264583334") "44253.4264583334" _$ (JTOC (+ 2415019 (atof date1))) (2021 2 26 10 14 6.00002) Retourne la date sous forme de liste au format (aaaa mm jj hh mm ss) à retravailler pour avoir l'affichage désiré Sinon en fin de fichier pour un affichage plus spécifique tu peux t'inspirer des dernières lignes du fichier dans la routine (C:date) (setq date1 "44253.4264583334") (setq cdate (jtod (+ 2415019 (atof date1))) c (fix cdate) y (/ c 10000) ; Get year m (rem (/ c 100) 100) ; Ger month d (rem c 100) ; Get day c (- cdate (fix cdate)) ; Strip date from date/time c (fix (* c 1000000000)) ; Scale time to get HHMMSSmmm integer hh (/ c 10000000) ; Get hours mm (rem (/ c 100000) 100) ; Get minutes ss (rem (/ c 1000) 100) ; Get seconds msec (rem c 1000) ; Get milliseconds ) ;; Comment transformer ces dates dans le format suivant : jj/mm/aaaa - hh:mm:ss (strcat (itoa d) "/" (itoa m) "/" (itoa d) " - " (if (> hh 9) "" "0") (itoa hh) ":" (if (> mm 9) "" "0") (itoa mm) ":" (if (> ss 9) "" "0") (itoa ss)) Pour l'exemple dans la console Vlisp: _$ (strcat (itoa d) "/" (itoa m) "/" (itoa y) " - " (if (> hh 9) "" "0") (itoa hh) ":" (if (> mm 9) "" "0") (itoa mm) ":" (if (> ss 9) "" "0") (itoa ss)) "26/2/2021 - 10:14:06" julian.lsp
×
×
  • 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é