VDH-Bruno
Membres-
Compteur de contenus
1 146 -
Inscription
-
Dernière visite
-
Jours gagnés
20
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par VDH-Bruno
-
Le problème n’est pas comment sont enseignés les choses mais plus comment on se les approprient pour pouvoir les appliquer à son domaine d’activité. Ca ne me choque pas qu’ils soient plus difficile pour certaines personnes que d’autres de passer de l’abstraction mathématique à l’application au réel (et vice-versa) surtout pour un jeune qui peut manquer parfois d’assurance. C’est des raisonnements qui vont se mettre en place au fil du temps, il faut plus s’attacher à un état d’esprit car un savoir cela s’acquière pour l’autre s’est plus compliqué... @x_all Dans tes alias tu peux simplifier l’expression : (if (or (setq ss (ssget "_I" )) (setq ss (ssget ))) ss) Par (et ainsi économiser une variable inutile) (cond((ssget "_I")) ((ssget)))) Et avec un peu d’abstraction mathématique les 2 alias sont facilement factorisable (mapcar '(lambda (f cmd) (eval (list 'defun f nil (list 'command cmd '(cond ((ssget "_I")) ((ssget))) "" pause "_r" "@" pause pause) '(princ))) ) '(c:er c:tr ) '("_scale" "_rotate") ) ([Humour/on] Hé oui, pas évident de brut en blanc de passer de la pratique à l’abstraction mathématique lorsque l’école est loin derrière nous. [Humour/off] :D ) Amicalement Bruno
-
Arrondir cotes à la valeur supérieur
VDH-Bruno a répondu à un(e) sujet de litelsousa dans AutoCAD 2019
Oui évidemment sinon il y a mieux en suivant la suggestion de Patrice Mais pour cela je laisse un peu chercher c'est pas bien compliqué à faire Sinon le procédé du champ sur une dimension est intéressant dans certain cas (autre que faire un arrondi supérieur), quant on veut indiquer des nombres d'espacements, par exemple dans le cas du béton armé ou sur une certaine longueur on doit spécifier un nombre d'intervalle pour un écartement de cadres donné... -
Arrondir cotes à la valeur supérieur
VDH-Bruno a répondu à un(e) sujet de litelsousa dans AutoCAD 2019
Re, Une dernière petite précision au cas ou, pour un arrondi spécifique, une fois que le champ est en place sur la cotation tu peux aussi éditer et modifier directement le champ sans avoir à retoucher le lisp. @+ -
Arrondir cotes à la valeur supérieur
VDH-Bruno a répondu à un(e) sujet de litelsousa dans AutoCAD 2019
Oui c'est ca, c'est bien les 2 valeurs a modifié ou a mettre dans une variable pour généraliser le fonctionnement du lisp Vérifie avec une cotation comme 95 par exemple: arrondi a 40 ça doit te donner 120 arrondi a 20 ça doit te donner 100 Tu as certainement du tester sur une valeur multiple de 20 et de 40, par exemple 75 arrondi a 40 ça doit te donner 80 arrondi a 20 ça doit te donner 80 D'où une impression de continuer à arrondir à la vingtaine alors que a bien un arrondie à la quarantaine supérieur. Cdt Bruno -
Arrondir cotes à la valeur supérieur
VDH-Bruno a répondu à un(e) sujet de litelsousa dans AutoCAD 2019
Bonjour Visiblement ce post ne remporte pas un franc succès, je vais tenter une réponse rapide. Je te propose 2 codes, le premier répond à ta demande en forçant le texte de cotation… (defun c:dimVingtaine (/ ss i e) (setq ss (cond ((ssget "_I" '((0 . "DIMENSION")))) (T (princ "\nSélectionnez les cotations arrondir à la vingtaine supérieur...") (ssget '((0 . "DIMENSION")))) ) ) (repeat (setq i (if ss (sslength ss) 0)) (setq e (entget (ssname ss (setq i (1- i))))) (entmod (subst (cons 1 (rtos (* 20.0 (1+ (fix (/ (- (cdr (assoc 42 e)) 0.00000001) 20.0))) ) 2 3 ) ) (assoc 1 e) e ) ) ) (princ) ) Le second fait la même chose avec une valeur de champ, dans Autocad (du moins sur ma veille version) il n’est pas possible de créer ce type de champ en manuel, car normalement en mode édition les propriétés de l’entité ne sont pas accessible aux valeurs de champ. Mais c’est réalisable par programmation, c’est un assemblage rapide de plusieurs lignes de code que j’ai sous la main donc certainement optimisable, sans tester en profondeur ça doit tout de même faire le travail… ;; VDH-Bruno (defun c:dimVingtaine (/ ss i obj id) ;; gc:GetObjectIdString (gile) ;; Retourne l'ObjectId de 'obj' sous forme de chaîne représentant un entier 32 ou 64 bits ;; ;; Argument ;; obj : l'objet dont on cherche l'ObjectId (vla-object) (defun gc:GetObjectIdString (obj) (or *util* (setq *util* (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object)) ) ) ) (if (vlax-method-applicable-p *util* 'GetObjectIdString) (vla-GetObjectIdString *util* obj :vlax-false) (itoa (vla-get-ObjectId obj)) ) ) (setq ss (cond ((ssget "_I" '((0 . "DIMENSION")))) (T (princ "\nSélectionnez les cotations arrondir à la vingtaine supérieur...") (ssget '((0 . "DIMENSION")))) ) ) (repeat (setq i (if ss (sslength ss) 0)) (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i)))) id (gc:GetObjectIdString obj) ) (vla-put-TextOverride obj (strcat "%<\\AcExpr ((20.0 * (1 + (trunc ( ( %<\\AcObjProp Object(%<\\_ObjId " id ">%).Measurement>% - 0.00000001) / 20.0 ))))) \\f \"%lu2%pr0\">%" ) ) ) (command "_REGEN") (princ) ) A tester ce qui te convient le mieux Bruno -
Redresser une polyligne en préservant sa longueur initiale
VDH-Bruno a répondu à un(e) sujet de Azerty dans LISP et Visual LISP
Bonjour, De façon très sommaire, juste pour le fun (et l'exercice à Didier pour son site) quelque chose comme cela conviendrait-il? (defun c:Azerty (/ent pts x y n) (setq ent (car (entsel)) pts (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent)) x (cadar pts) y (caddar pts) n -1 ) (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length pts)) ) (mapcar '(lambda (i) (list 10 (+ x (vlax-curve-getDistAtParam ent (setq n (1+ n)))) y ) ) pts ) ) ) ) Cdt VDH-Bruno -
Bonjour, Si j’ai bien compris ce que tu cherches à faire, comme Didier je pense que tu vas devoir commencer à t’intéresser aux données étendue Xdata, ou aux dictionnaires Xrecord suivant tes besoins. Pour t’aider à comprendre de quoi on parle je te revoie à 2 liens : Pour les Xdata, il y a dans le lien qui suit un exemple de code ou je m’étais amusé à créer une application pour créer une pagination automatique. Le code pour toi est un peu pollué par la mise en œuvre d’un réacteur d’évènement, mais bon ça peut faire une base de départ pour voir si les notions abordé permettrons de réaliser ton projet. http://cadxp.com/topic/38099-pagination-automatique/page__view__findpost__p__210208 Et si tu souhaites comprendre ce que sont les dictionnaires et également pour voir si ils peuvent répondre à ton besoin, il y a ce sujet de (gile), que je trouve accessible, c’est celui que l’on retrouve à la fin de son introduction à Autolisp sur son site en page 40 http://cadxp.com/topic/33429-les-dictionnaires/ Quelques soit la solution envisagée, tu ne seras plus vraiment dans la rubrique débuter en lisp, et je ne les conseils que si on commence a avoir une bonne aisance avec le langage, pour n’avoir qu’à ce concentrer sur ses notions si elles te sont inconnu plutôt que sur la syntaxe du langage. A+ Bruno
-
SVP Micro-Amelioration sur Routine SSETVAL
VDH-Bruno a répondu à un(e) sujet de lecrabe dans Routines LISP
Bonjour Patrice Merci pour ces remerciements (pour cette routine que j’avais complètement oublié), bien que je ne réponde plus beaucoup à des questions de code propre au fonctionnement des entités Autocad, la seule version en ma possession est obsolète (AutoCAD 2007), et nombreux sujets me sont maintenant étranger. J’ai tout de même tenté de jeté un œil sur le code pour répondre à la question suivante : A priori chez moi en 2007 cela fonctionne aussi sur des blocs dynamiques, car pour établir la liste des étiquettes le code scanne la table des blocs donc toutes les étiquettes d’attributs du dessin sont théoriquement listé. Puis la sélection filtre toutes les références de bloc ayant des attributs, donc les références de blocs et les référence de blocs anonyme (comme les références de bloc dynamique). A la lecture du code le seul bémol que je peux déceler et qui n’est pas explicitement précisé dans l’entête. C’est dans le cas d’une sélection de plusieurs étiquettes dans la boite de dialogue, pour rester dans l’esprit de la discussion d’origine, ne seront sélectionnés que les références de bloc qui répondent à tous les critères (c.a.d. contenant toutes les étiquettes et valeurs d’attribut spécifié et ce qq soit le nom de la référence du bloc). Ne seront pas sélectionné les références de bloc contenant ne répondant pas à tous les critères de sélection (étiquette et valeur d’attribut). Je rassure si c’est cela le souci de l’échec de ta sélection cela peut être modifié aisément dans le code et donner lieu à une nouvelle routine. Après si le souci est ailleurs, éventuellement pense à joindre un extrait de fichier exemple au format 2007 de la sélection que tu souhaiterais, à l’occasion j’essayerai d’y jeter un œil. Amicalement Bruno -
Ca fait un moment que je ne le croisais plus sur le forum et je m'en inquiétais, maintenant je comprend mieux pourquoi.. J'ai vraiment beaucoup de peine, je devinais en lui une personne de qualité, j'ai ce soir une grosse pensée pour ses proches. Je ne pourrais jamais le remercier assez pour ces enrichissants échanges partagés sur ce forum... Merci
-
Bonjour, Et en reliant les points 3D avec une polyligne 2D, cela conviendrait-il?
-
Magnifique :) Merci du partage, très intéressant.
-
Bonjour, Petit passage rapide pour proposer un principe de résolution simple sur ce type de traitement qui doit fonctionner, sans tenir compte de la sructure des listes (c.a.d sans un traitement un spécifique limité aux seuls listes constituées de paires). (defun mgrouper (l / grp) (defun grp (l1 l2 acc flag) (cond ((null l1)(if flag (append l2 acc) l2)) ((member (car l1) l2) (grp (cdr l1) l2 acc T)) (T (grp (cdr l1) l2 (cons (car l1) acc) flag)) ) ) ((lambda (l m) (cond ((null (cdr l)) l) ((equal (cdr l) m) (cons (car l) (mgrouper m))) (T (mgrouper m)) ) ) l (mapcar '(lambda (x) (grp (car l) x nil nil)) (cdr l)) ) ) _$ (mgrouper '(("A" "B") ("B" "C") ("D" "E") ("F" "G") ("B" "D"))) (("F" "G") ("B" "D" "A" "C" "E")) Je pense que le tracage de la fonction mgrouper suffit pour comprendre l'algorithme, sinon je développerai le raisonnement en cas de demande. (trace mgrouper) (mgrouper '(("X" "Y") ("A" "B") ("M" "Y" "K") ("B" "Z" "C") ("D" "E") ("B" "D")("F" "G"))) Saisie (MGROUPER (("X" "Y") ("A" "B") ("M" "Y" "K") ("B" "Z" "C") ("D" "E") ("B" "D") ("F" "G"))) Saisie (MGROUPER (("A" "B") ("M" "Y" "K" "X") ("B" "Z" "C") ("D" "E") ("B" "D") ("F" "G"))) Saisie (MGROUPER (("M" "Y" "K" "X") ("B" "Z" "C" "A") ("D" "E") ("B" "D" "A") ("F" "G"))) Saisie (MGROUPER (("B" "Z" "C" "A") ("D" "E") ("B" "D" "A") ("F" "G"))) Saisie (MGROUPER (("D" "E") ("B" "D" "A" "C" "Z") ("F" "G"))) Saisie (MGROUPER (("B" "D" "A" "C" "Z" "E") ("F" "G"))) Saisie (MGROUPER (("F" "G"))) Résultat: (("F" "G")) Résultat: (("B" "D" "A" "C" "Z" "E") ("F" "G")) Résultat: (("B" "D" "A" "C" "Z" "E") ("F" "G")) Résultat: (("B" "D" "A" "C" "Z" "E") ("F" "G")) Résultat: (("M" "Y" "K" "X") ("B" "D" "A" "C" "Z" "E") ("F" "G")) Résultat: (("M" "Y" "K" "X") ("B" "D" "A" "C" "Z" "E") ("F" "G")) Résultat: (("M" "Y" "K" "X") ("B" "D" "A" "C" "Z" "E") ("F" "G")) A+ Bruno
-
Bonjour, Gros gros gros travail, un grand bravo!!! Je suis très impressionné et admiratif du résultat :) . Je le dis en connaissances de causes pour avoir tenté il a quelques temps déjà de m’écrire un ensemble de routines hétéroclites (avec plus ou moins de succès) d’aide au dessin d’armatures. Je ne suis jamais arrivée à un résultat aussi cohérent et aboutie, et de la à en faire un ensemble d’outils diffusable et utilisable pour d’autres, j'en suis bien loin. Bravo également pour les BD en DCL là aussi il y a des heures et des heures, c’est très impressionnant on reconnait le passionné qui à de la constance et le soucis du travail bien fait. Chapeaux bas _zebulon, belle générosité qui va bien au-delà du simple partage. Amicalement Bruno Ps : Sinon pour le retour sous version 2007 ça à l’air de bien tourner, je n’ai pas testé à fond car je n’ai plus trop l’usage d'AutoCAD,(je travaille actuellement à la migration de mon activité sous Tekla structure).
-
Faire une routine qui retourne des valeurs dans des...
VDH-Bruno a répondu à un(e) sujet de Aleck_Ultimate dans Débuter en LISP
Bonjour x_all, Dans le même sujet regarde le message #22 Salutations -
Bonjour, 2 petits liens à regarder sur une discussion similaire, à la nuance prés que nous cherchions à verrouiller le dynamisme des blocs plutôt qu'a le supprimer, ce qui devrait éviter d'avoir à modifier les champs de tes attributs A voir si cela peut te convenir: L'explication du procédé: http://cadxp.com/topic/41229-verrouiller-un-bloc-dynamique/page__view__findpost__p__232073 L'automatisation http://cadxp.com/topic/41229-verrouiller-un-bloc-dynamique/page__view__findpost__p__232105 A+ Bruno
-
Challenge récursive.
VDH-Bruno a répondu à un(e) sujet de Patrick_35 dans Pour aller plus loin en LISP
Non du tout, même si je serais lundi et mardi du coté de Bruxelles pour le travail. Pour l'anecdote les Flandres ça existe aussi en France Pour info je suis originaire de l'Oise et j'habite dans la région Creilloise A+ -
Challenge récursive.
VDH-Bruno a répondu à un(e) sujet de Patrick_35 dans Pour aller plus loin en LISP
Perdu ce sont les initiales de mon nom de famille qui en langue flamande peut ce traduire par "de la lande" ;) -
Bonjour Juste pour compléter, ce qui vient d'être dit est vraie pour le lisp embarqué dans AutoCAD et ses clones, mais dans la plus part des langages de la famille lisp: Clisp, Le_lisp etc... On peut surcharger en lisp ses propres fonctions lisp avec des arguments optionnels ou en nombre indéterminé. ;) A+ Bruno
-
Challenge récursive.
VDH-Bruno a répondu à un(e) sujet de Patrick_35 dans Pour aller plus loin en LISP
Bonjour, Sur ce challenge la porte du récursif ayant été verrouillé par les précédents intervenants. On peut s'autoriser une petite optimisation (si on est pas trop attaché au style) sur "la solution hors sujet" en économisant des parcours sur la liste du au 2ème member dans (member x (cdr (member x l))). vl-some comme mapcar étant des fonctions d'ordre supérieur, a l'appel de ces fonctions l'argument liste est chargé en mémoire, on peut donc à chaque itération "muter" son état dans la fonction argument en écrivant ceci: (defun doublon (l) (or (vl-some '(lambda (x) (member x (setq l (cdr l)))) l)) ) A+ Bruno -
Bonjour, Très rapidement, juste pour le plaisir de proposer une autre écriture récursive sur la façon de parcourir une arborescence, si on ne veut pas passer par des solutions écrites avec mapcar (très en retard sur le challenge, des versions sont déjà proposé par Patrick_35 & (gile)). (defun GetFolders (dir / directory files) (defun directory (dir) (cons dir (files (vl-remove "." (vl-remove ".." (vl-directory-files dir nil -1))))) ) (defun files (rep) (if rep (append (directory (strcat dir "\\" (car rep))) (files (cdr rep))) ) ) (directory dir) ) A+ Bruno
-
Comment savoir si une variable est un nombre
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Idem pour atof, bien joué :) -
Comment savoir si une variable est un nombre
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Salut Dans ce cas regarde le post de (gile) sur les expressions régulières http://cadxp.com/topic/45447-les-expressions-regulieres/page__view__findpost__p__263444 ;; Test pour une chaire représentant un nombre réel positif (RegExpTest varreelpositif "^\\d+(\\.\\d+)?$" T) ;; Test pour une chaire représentant un nombre entier positif (RegExpTest varintpositif "^\\d+?$" T) (ps: pas une le temps de regarder pour compléter l'expression et filtrer si la chaine est strictement positive, à compléter... :D ) A+ Bruno -
Comment savoir si une variable est un nombre
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Bonjour, Préfère numberp à type dans tes conditions, si tu ne veux pas te limiter aux nombres entiers.. -
Bonjour CADy, Je n’ai pas accès aux MLEADERS (accès uniquement à une version trop ancienne d’autoCAD) mais si tu n’as pas de réponse satisfaisante à ta question… Et dans l’hypothèse ou tu « script » la commande AutoCAD, et que tu ne masques pas les invites de la ligne de commande, tu peux essayer d’intégrer un (getvar "LASTPROMPT") dans ton code Lisp pour tenter une reconnaissance de caractère, et en déduire l’option active… (dans ton cas attention aux différents environnement linguistique qui vont d’alourdir le code). Pour avoir déjà testé des choses similaires c’est pas super génial comme façon de faire, mais quand on a pas le choix <_< A+
-
Programmation fonctionnelle ou impérative
VDH-Bruno a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
Bonjour, Pour le clin d'œil (defun sumOfSquares (lst) (apply '+ (mapcar '* lst lst)) ) Avec une très forte préférence pour la programmation fonctionnelle en ce qui me concerne, et un grand merci à (gile) pour le temps que tu prend à la rédaction ce type de sujet Amicalement Bruno
