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

    débutant en LISP

    Bonjour, Oui c'est le fonctionnement classique lorsque l'on fait un wbloc directement sur une sélection d'entitées, si tu tape La commande BASE dans le dwg correspondant à l'export wbloc tu retrouveras les coordonnées correspondantes à ton point d'insertion. Oui il y a un autre moyen simple, si dans les nouvelles version d'autocad cela n'a pas changé, l'astuce consiste à faire un bloc interne de ta sélection, puis d'exporter la définition de ce bloc via la commande wbloc. Tu auras alors un dwg définie en 0,0,0 sur le point d'insertion spécifié. Cordialement Bruno
  2. Bonjour, Je vois que le problème a été solutionné avec brio, en parcourant ce post je vois que tu parles de pattern pour des expressions AlphaNumérique avec wcmatch Au cas ou, je souhaitais faire remarquer qu’en natif en AutoLisp il n'y a pas que wmatch qui permet cela, il y a aussi vl-string-right-trim et vl-string-left-trim qui supportent un jeu de charactères en argument. En fouillant dans mes archives j’ai retrouvé la fonction sur laquelle je m’appuyais pour trié des nomenclatures d’éléments béton, éléments précédé d’une lettre produit suivie d’un numéro d’élément au format string. ;; AlphaNum2lst VDH-Bruno ;; Modifie une chaine Alphanumérique en une liste au format (string number) ;; Exemple: (AlphaNum2lst "abC_151") --> ("abC_" 151) ;; (AlphaNum2lst "abC_") --> ("abC_" nil) ;; (AlphaNum2lst "151") --> ("" 151) (defun AlphaNum2lst (alphanum / alpha) (list (setq alpha (vl-string-right-trim "0123456789" alphanum)) (read (substr alphanum (1+ (strlen alpha)))) ) ) Cela n'enlève rien aux excellentes et puissantes fonctions de (gile) sur les expressions régulières dont la polyvalence n’a pas d’égale, mais comme bien souvent la polyvalence à un coût. Donc pour le fun sur la proposition du message n°9, une écriture possible de la fonction de tri : (defun sortAlphaNum (lst fun Case) (mapcar '(lambda (i) (nth i lst)) (vl-sort-i (mapcar 'AlphaNum2lst (if Case (mapcar 'strcase lst) lst ) ) '(lambda (a B) (if (= (car a) (car B)) ((eval fun) (cadr a) (cadr B)) ((eval fun) (car a) (car B)) ) ) ) ) ) _$ (setq lst '("0_M8" "12" "A" "0_M12" "bar" "85" "2" "0_M6" "foo" "P")) ("0_M8" "12" "A" "0_M12" "bar" "85" "2" "0_M6" "foo" "P") _$ (sortAlphaNum lst '> T) ("P" "foo" "bar" "A" "0_M12" "0_M8" "0_M6" "85" "12" "2") _$ (sortAlphaNum lst > nil) ("foo" "bar" "P" "A" "0_M12" "0_M8" "0_M6" "85" "12" "2") _$ (sortAlphaNum lst '< T) ("2" "12" "85" "0_M6" "0_M8" "0_M12" "A" "bar" "foo" "P") _$ (sortAlphaNum lst < nil) ("2" "12" "85" "0_M6" "0_M8" "0_M12" "A" "P" "bar" "foo") (Ps: Pour l’anecdote, comme la comparaison se fait 2 à 2, j’ai préféré eval à apply pour la fonction de comparaison, de fait si on oubli de quoté l’argument ça n’a pas d’incidence) Salutations
  3. Bonsoir (gile), Je sais bien que pour les habitués des forum CADxp ta réputation n'est plus à faire, et ce n'est pas ces quelques points en plus ou en moins qui vont l'altérer. ;) C'est ce qui me désole en plus des -12pt (d'une injustice criante) qui était au compteur, c'est que nous en sommes à "imaginer". Est-ce du à la procédure, les liens inactif... Alors qu'un tout petit commentaire aurait été tellement plus constructif. Voir même proposé une réécriture du poste si celui n'est plus d'actualité. Bref il est pas interdit d'ajouté du contenu sur un forum d'échange et de partage, c'est même vivement conseillé. :)
  4. Bonsoir Désolé pour le hors-sujet c'est pas dans mes habitudes de m'indigner publiquement sur le comportement/action des uns ou des autres, généralement lorsque quelque chose me désole je passe mon chemin... Mais dans le cas présent, j'ai pas réussi :blink: Avant de s'empresser à dégrader la réputation d'un membre regardez la date du message posté en entête pour savoir si la solution proposé est d'actualité ou pas!
  5. VDH-Bruno

    CadXP ??

    +1 C'est bon réponse envoyé depuis mon lieu de travail, merci pour la réactivité. Salutations VDH-Bruno
  6. VDH-Bruno

    CadXP ??

    Bonsoir, Pour le retour, depuis ce WE je peux de nouveau consulter les forums de mon domicile, par contre c'est toujours impossible depuis mon lieu de travail. Cdt VDH-Bruno
  7. C'était la fin de semaine, ça ira mieux Lundi ;)
  8. Pas de soucis Patrice ;; ;; Tri des entites par calque et transfert dans des sous-calques ;; ;; Si Calque nomme A alors --> A__TEXT, A__2LINE, A__HATCH, A__POLYLINE, etc ;; ;; Par Patrick_35 le 23/03/2009 pour Patrice B. ;; ;; Nouvelle version 1.1 qui separe XREF & BLOC et fonctionne sur AutoCAD >= 2000 ;; (defun c:TRI (/ doc ent lay lck nom ori pro sel tot txt) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (if (ssget) ;; sélection partiel ;; (ssget "X") sélection total (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (cond ((and (eq (vla-get-objectname ent) "AcDbBlockReference") (vlax-property-available-p ent 'path) ) (setq nom "Xref") ) (T (setq txt (substr (vla-get-objectname ent) 5) tot 2 ) (while (and (> (vl-string-elt txt tot) 90) (< tot (1- (strlen txt))) ) (setq tot (1+ tot)) ) (and (eq (1- (strlen txt)) tot) (setq tot (1+ tot)) ) (setq nom (substr txt 1 tot)) ) ) (setq ori (vla-item (vla-get-layers doc) (vla-get-layer ent)) lck (vla-get-lock ori) ) ;; (or (wcmatch (vla-get-layer ent) (strcat "* - " nom)) ;; (and (vl-catch-all-error-p (setq lay (vl-catch-all-apply 'vla-item (list ;; (vla-get-layers doc) (setq txt (strcat (vla-get-layer ent) " - " nom)))))) (or (wcmatch (vla-get-layer ent) (strcat "*__" nom)) (and (vl-catch-all-error-p (setq lay (vl-catch-all-apply 'vla-item (list (vla-get-layers doc) (setq txt (strcat (vla-get-layer ent) "__" nom)))))) (setq lay (vla-add (vla-get-layers doc) txt)) (foreach pro '('color 'freeze 'layeron 'linetype 'lineweight 'material 'plottable 'viewportdefault) (and (vlax-property-available-p lay (eval pro)) (vlax-put lay (eval pro) (vlax-get ori (eval pro))) ) ) ) (vla-put-lock lay :vlax-false) (vla-put-lock ori :vlax-false) (vla-put-layer ent txt) (vla-put-lock lay lck) (vla-put-lock ori lck) ) ) (princ (strcat "\nTravail sur " (itoa (vla-get-count sel)) " objet(s). ")) (vla-delete sel) ) (princ "\nDessin vide! ") ) (vla-endundomark doc) (princ) ) A+
  9. :blink: Chez moi ça fonctionne très bien sur 2007 Le bouclage sur la sélection courante (sélection active) est fait ici dans le code de Patrick_35 (vlax-for ent (setq sel (vla-get-activeselectionset doc)) A+
  10. Au plus simple je dirais.. (if (ssget) ... A+
  11. VDH-Bruno

    ???

    Re, Même si l’intérêt de tout ceci n’est pas fondamental, j’espérais réussir à enrichir un peu ce fil.. Mais par manque de disponibilité, je ne pense pas développer plus ma réponse, malgré tout je propose en vrac quelques réflexions que je m’étais déjà fait sur cette question: Parfois la possibilité de définir des fonctions sous forme de liste autre qu’avec defun, defun-q et lambda permet de façon ludique, d’écrire un code plus concis (et pas que plus crypté). A titre d’exemple la revisite d’un ancien challenge, sur TheSwamp où des solutions pour porter la fonction let dans AutoLISP sont proposées. Code que l’on pourrait facilement réécrire comme ceci (defun let (bindings body) (apply '(list (mapcar 'car bindings) body) (mapcar 'cadr bindings))) _$ (let '((x 3) (y 10)) '(+ x 10 (* x y))) 43 On peut noter la possibilité d’étendre la fonction vl-propagate aux fonctions, en les définissant en setq. _$ (vl-propagate 'let) ;Fonction définie avec defun ou defun-q ; erreur: Visual LISP: Objet d'importation/exportation entre documents non conforme #<USUBR @14c23d48 LET> _$ (setq let '((bindings body) (apply '(list (mapcar 'car bindings) body) (mapcar 'cadr bindings)))) ((BINDINGS BODY) (APPLY (QUOTE (LIST (MAPCAR (QUOTE CAR) BINDINGS) BODY)) (MAPCAR (QUOTE CADR) BINDINGS))) _$ (vl-propagate 'let) ((BINDINGS BODY) (APPLY (QUOTE (LIST (MAPCAR (QUOTE CAR) BINDINGS) BODY)) (MAPCAR (QUOTE CADR) BINDINGS))) A+
  12. Oui, et l'occasion de préciser que c'est la commande AutoCAD (et non la fonction command d'AutoLISP) qui à besoin d'être précédé d'un appel à (initdia) pour forcer l'affichage de la BD.
  13. Ou en incluant initdia dans l'appel de la fonction command (histoire d'économiser un progn ) (if (= (getvar "layermanagerstate") 0) (command (initdia) "_.layer"))
  14. VDH-Bruno

    Routine GEF V3.21

    Tu peux tenter dans le lisp de mettre cette séquence d'instruction en commentaire.. (if (fra) (setq dcl "gef_fr.dcl") (setq dcl "gef_en.dcl") ) Pour la remplacer par la suivante (setq dcl "gef_fr.dcl") En théorie qq soit ta config il chargera la dcl en Français A+
  15. VDH-Bruno

    Routine GEF V3.21

    Bonjour Personnellement je n'utilise pas cette routine mais pour développer la réponse faite par Steven, j'ai regardé rapidement le code (code qui a toujours été très formateur et agréable à lire chez Patrick_35) Effectivement, tu n'as pas besoin de charger les dll, le chargement est automatique pris en charge par ces quelques lignes de codes implantés dans le fichier lisp (fichier Gef.lsp). Extrait du code du fichier Gef.lsp: (and (not (eval 'gc-vpthaw)) (setq dcl (findfile "VpLayerLisp.dll")) (if (< 18 (atoi (getvar 'acadver))) (vl-cmdf "_netload" "vplayerlisp_19.dll") (vl-cmdf "_netload" "vplayerlisp.dll") ) ) (if (fra) (setq dcl "gef_fr.dcl") (setq dcl "gef_en.dcl") ) Au lancement la routine détecte: ta version d'AutoCAD et charge la dll correspondant (soit vplayerlisp_19.dll ou vplayerlisp.dll), ainsi que l'option de langue pour charger la version francaise ou anglaise de la boite de dialogue (gef_fr.dcl ou gef_en.dcl), après je suppose que tous ces fichiers doivent être installé dans un des chemins de recherche de fichiers de support pour le bon fonctionnement du programme. En conclusion le programme s'installe et se lance comme un lisp classique, l'usage de dll est transparent pour l'utilisateur. Salutations Bruno
  16. Bonsoir Steven, Bien que bonuscad est complété et justifié l'emploi d'une fonction lambda, je vais profité de ce sujet pour espérer rappeler à certains et préciser à d'autres 2 ou 3 petites choses concernant la syntaxe des fonctions defun et lambda. Donc pour ce qui est du code proposé par bonuscad, c'est une fonction anonyme (une fonction qui n'a pas de nom), la fonction n'étant pas nommé elle ne peut s’appeler qu'à l'endroit ou elle est définie. Exemple de définition d'une fonction anonyme. _$ (lambda (/) (princ "\nHello World") (princ)) #<USUBR @000000003e859bd8 -lambda-> Pour la lancer en ligne de commande ou dans un lisp, il suffit de mettre la définition de la fonction entre parenthèses (suivie de ses éventuelles arguments comme pour une fonction nommée définie avec defun). Exemple de lancement sur la ligne de commande d'une fonction anonyme comme celle proposé par Bonuscad Pour faire un parallèle avec une fonction nommée défini au moyen de la fonction defun, on aurait: _$ (defun salutation (/) (princ "\nHello World") (princ)) SALUTATION Pour lancer une fonction nommée, il suffit mettre son nom dans une liste (c.a.d. de la mettre entre parenthèse suivie de ses éventuelles arguments) On peut toute fois noter une légère différence entre les 2 définitions de fonction: la première définie avec lambda retourne la définition de fonction (USUBR) alors que la seconde définie avec defun retourne le symbole (SYM) auquel est associé la définition de fonction. _$ (type (lambda (/) (princ "\nHello World") (princ))) USUBR _$ (type (defun salutation (/) (princ "\nHello World") (princ))) SYM C'est pourquoi si on veut comme dans le cas de la fonction lambda, appeler une fonction nommée à l'endroit ou elle est définie, il faut pouvoir accéder à sa définition par l'évaluation du symbole retourné au moyen de la fonction eval, puis mettre sa définition dans une liste d'appel suivi de ses éventuelles arguments. Avec AutoCAD on a la possibilité d'appeler une fonction lisp directement à la ligne de commande sans avoir besoin de mettre la fonction dans une liste d'appel, pour cela il suffit de faire précéder le nom de la fonction définie en lisp par c:, comme il n'y a théoriquement plus de liste d'appel dans AutoCAD, il n'y a plus d'intérêt à passer des d'arguments aux fonctions définie en c:ma_fonction. Exemple de définition d'une fonction en c: _$ (defun c:salutation (/) (princ "\nHello World") (princ)) C:SALUTATION Son lancement depuis la ligne de commande d'AutoCAD Bien que la fonction se lance directement depuis la ligne de commande, comme toute commande AutoCAD, elle reste une fonction lisp et doit être appelé comme tel depuis un lisp. Mais par abus de langage on qualifie généralement de ce type de fonction de "commande lisp" Exemple d'appel d'une fonction définie en c: depuis une fonction lambda _$ ((lambda () (C:SALUTATION))) Hello World A+
  17. Bonjour, Alors pour moi ce qui me chiffonne le plus au premier regard c'est de voir 2 systèmes de coordonnées cohabiter(SCU & SCG), sans conversion pour passer de l'un à l'autre. D'expériences si les 2 systèmes ne sont pas superposés, tu risques des décalages non désiré.. C'est ce que tu sembles d'écrire ici: Exemple points exprimés et calculés dans le SCG, (le point est récupéré depuis le code DXF de l'entité) pins (cdr(assoc 10 (entget blocent)))) (setq p16 (polar pins (angle p11 p12) 0.05)) (setq p17 (polar p16 (+ (angle p11 p12) (/ pi 2.0)) 0.2)))) Points exprimés dans le SCU car transmit à la fonction command (command "_point" pins) (command "_.text" "_s" "Altimetrie" p17 Ang3 (rtos (atof Txt_Alti) 2 2)) Je te conseil de regarder ou de faire une recherche sur la fonction trans, ou d'utiliser la fonction entmake pour la création d'entité, afin de rester dans le même système de coordonnée. A+ Bruno
  18. VDH-Bruno

    ???

    La réciproque génial :) :) :) (Ps: Ta messagerie est pleine, pour l'anecdote j'ai voulu te MP vers un lien ou nous avions discuté de choses similaires)
  19. VDH-Bruno

    ???

    Bonne année et meilleurs vœux, prennez soin de vous. Sinon pour l'exemple et faire écho au sujet ouvert par (gile) ('((rec l) (rec l)) '((l) (if l (strcat (chr (car l)) (rec (cdr l))) "")) '(82 233 233 99 114 105 116 117 114 101 32 100 101 32 118 108 45 108 105 115 116 45 62 115 116 114 105 110 103 32 97 117 32 109 111 121 101 110 32 100 39 117 110 101 32 112 115 101 117 100 111 32 102 111 110 99 116 105 111 110 32 97 110 111 110 121 109 101 32 114 233 99 117 114 115 105 118 101 32 58 41 ) ) A+ Bruno
  20. Introduit "\n" dans ton code pour avoir un retour à la ligne, comme tu le ferais dans une invite de commmande lisp. Exemple _$ (princ (strcat "Bonjour" "\n" "Ceci est un retour à la ligne" "\n")) Bonjour Ceci est un retour à la ligne "Bonjour\nceci est un retour à la ligne\n" _$
  21. Certainement ton argument et du type str (string), applique la fonction rem avant la convertion de type via la fontion rtos (real to string), l'argument de la fonction rem doit être du type real/int. _$ (rem "1636551.22" 1000) ; erreur: type d'argument incorrect: numberp: "1636551.22" _$ (rem 1636551.22 1000) 551.22 _$ (type "1636551.22") STR _$ (type 1636551.22) REAL
  22. Bonjour, Regarde du coté de la fonction rem _$ (rem 1636551.22 1000) 551.22 Cdt Bruno
  23. A j'oubliais, autre solutions tu peux aussi convertir la macro diesel en commande/macro lisp, qui se relancera en appuyant sur la touche entrée comme toute commande native AutoCAD. ;; Coupure en 1point (defun c:C1p () (command "_break" pause "_f" pause "@") (princ)) AutoCAD avec son architecture ouvert (qui à fait son succès par le passé), t'offre tout un choix de solutions pour arriver au résultat souhaité, à toi de choisir celui qui te conviendra le mieux Cdt Bruno
  24. Re, ou lancer la commande multiple avant de cliquer ton bouton icone (macroté) pour boucler sur toute la séquence d'instruction de la commande. Au cas ou tu ne souhaite pas modifié la macro de ton bouton. A+ Bruno
  25. Bonjour, Je suppose que c'est pour la commande coupure par un point qui est en réalité une macro de la commande coupure ^C^C_break \_f \@ Tu peux essayer de faire précéder la macro du caractère *, pour répéter en boucle toute la séquence d'instruction.. *^C^C_break \_f \@ @+ 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é