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
-
Salut, En fait ce qui pose problème sont les fonctions qualifiés de"formes spéciales", elles doivent être "quoté" et ne peuvent donc être évalués puis associés à leurs arguments comme les autres "opérateur Lisp", il faut impérativement construire l'expression puis évaluer cette dernière (avec un eval enveloppant). Pour un mapcar générique sans apply, l'implémentation Lisp ressemble à quelque chose comme cela: (defun map (f l) (if l (cons (eval (list f (car l))) (map f (cdr l))) ) ) Amicalement Bruno
-
Bonjour, Je viens seulement de découvrir ce sujet qui à également éveillé ma curiosité. Après quelques teste je vous en donne ma lecture. Logique et bizarre (peut être pas…) La fonction quote n'est pas une fonction neutre, elle bloque l'évaluation de l'expression qui suit. Par exemple si on tentait une écriture équivalente à ce qui a été codé précédemment via une fonction lambda on aurait: _$ (mapcar '(lambda (x) (quote x)) '(A B C D E)) (X X X X X) Et sans fonction lambba on a: _$ (mapcar 'quote '(A B C D E)) ((quote E) (quote E) (quote E) (quote E) (quote E)) La fonction enveloppante lambda n'évaluant plus l'expression quote, c'est l'ensemble de l'expression qui est retourné. Plus précisément la dernière expression, je pense également qu'en interne la fonction est définie de façon récursive et que le quote doit bloquer successivement l'évaluation et donc la substitution des arguments dans la remontée des appels enveloppant. Donc dans ce cas particulier propre au fonctionnement de la fonction quote, il faut "quoté" le quote (clin d'œil à l'entête du post ;) ) pour que cela fonctionne: _$ (mapcar '(lambda (x) (list 'quote x)) '(A B C D E)) ((QUOTE A) (QUOTE B) (QUOTE C) (QUOTE D) (QUOTE E)) Expression qui fonctionne très bien (également avec command) sous ma veille version 2007 à tester sur une version récente: _$ (setq lpt '((-4007.29 77.6245) (-3836.77 115.533) (-3831.78 114.556) (-3832.16 112.594) (-3836.75 113.49) (-4006.85 75.6722))) ((-4007.29 77.6245) (-3836.77 115.533) (-3831.78 114.556) (-3832.16 112.594) (-3836.75 113.49) (-4006.85 75.6722)) _$ (eval (append '(VL-CMDF "_pline") (mapcar '(lambda (x) (list 'quote x)) lpt) '("_close"))) T Amicalement Bruno
-
[Résolu] Lisp sur la base de la commande Liste
VDH-Bruno a répondu à un(e) sujet de Circus dans LISP et Visual LISP
Re, Sauf si tu as une définition d'entité supérieure (cas d'une polyligne avec beaucoup de sommets) à la capacité de ta fenêtre de texte, dans ce cas pour ces quelques cas particulier, il te faudra encore utiliser la touche ENTRER. A+ Ps: Personnellement si j'avais eu ce développement à faire, je serais également passé par les codes DXF. -
[Résolu] Lisp sur la base de la commande Liste
VDH-Bruno a répondu à un(e) sujet de Circus dans LISP et Visual LISP
Bonjour, En passant les entités une à une à la commande LIST au lieu d'une sélection global devrait considérablement réduire l'usage de la touche ENTRÉE. (command "_.list" #SS "") À remplacer par (repeat (setq i (sslength #ss)) (command "_.list" (ssname #ss (setq i (1- i))) "") ) La ligne de code suivante devrait suffire (vl-file-delete (getvar "LOGFILENAME")) Le code: (defun c:Listing (/ #ss i) (cond ((setq #ss (ssget)) (vl-file-delete (getvar "LOGFILENAME")) (setvar 'logfilemode 1) (repeat (setq i (sslength #ss)) (command "_.list" (ssname #ss (setq i (1- i))) "")) (setvar "LOGFILEMODE" 0) (startapp "Notepad" (getvar 'logfilename)) ) ) (princ) ) A+ -
Bonsoir, http://cadxp.com/topic/37832-lister-les-proprietes-et-les-methodes-applicables-a-un-objet/ Dans ce lien j'avais publié des routines qui devraient répondre à ta demande, dans cette même discussion (gile) rappelait l'existence de la fonction dumpallproperties apparu avec la version 2012, pour cette dernière je n'ai hélas toujours pas eu l'occasion de tester la fonction. A+
-
Re, En reprenant le code proposé en lien par BonuCAD, on peut faire quelque chose comme ça.. (defun c:field_Scale_Crabe (/ Space obj pt nw_obj) (vl-load-com) (setq Space (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))) (cond ((and (setq obj (car (entsel " \nSélectionnez une Fmult: "))) (eq "VIEWPORT" (cdr (assoc 0 (entget obj)))) ) (initget 1) (setq pt (trans (getpoint "\nPoint d'insertion de l'échelle: ") 1 0) nw_obj (vla-addMtext Space (vlax-3d-point pt) 0.0 (strcat "{\\fArial|b0|i0|c0|p34;" "Echelle 1/" "%<\\AcExpr (1000/" "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID (vlax-ename->vla-object obj))) ">%).CustomScale \\f \"%lu2%qf2816\">%" ") \\f \"%lu2%pr0\">%" ) ) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val)) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation 'BackgroundFill) (list 1 3.5 5 pt "Standard" "0" 0.0 -1) ) ) ((princ "\L'entité sélectionnez n'est pas une Fmult...") (c:field_Scale_Crabe)) ) (prin1) ) A+
-
@bonuscad, je l'avais oublié ce code là, je m'en suis souvent inspiré à l'époque ou tu l'as publié, et dans le cas présent il répond complétement à la demande avec un facteur 1000, merci. @lecrabe, lance le code de bonuscad, édite le champ, c'est l'illustration de la méthode manuel décrite précédement. A+
-
Bonjour, Le plus simple commence par insérer un champ formule -> saisie 1000/ -> puis clic BD insère ton champ objet à la suite dans ta formule. A+ Bruno
-
Comment faire pour "vider" un (ssget ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Slt, En lien sur CADxp tu as aussi celui-ci http://cadxp.com/topic/29314-ces-listes-qui-nen-sont-pas/ A+ -
Comment faire pour "vider" un (ssget ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Slt Une petite subtilité avec ce qui vient d'être dit ici et qui dépasse le cadre du forum débutant, le fait de le remettre à nil ou de localiser la variable qui contient le pointeur, qui pointe sur un jeu de sélection permet sa libération et permet ainsi de ne jamais atteindre la limite des 128 jeux de sélection ouvert simultanément. On peut faire le parallèle avec vla-get-activeselectionset qui créer un pointeur objet sur le pointeur du jeu de sélection, objet qu'il faut détruire explicitement avec vla-delete pour libérer ce dernier, au risque d'atteindre la limite de jeu de sélection et de retourner une erreur COM. Mais si on joue sur les mots pour vider un jeu de sélection, on ferait plutôt comme ceci: _$ (setq ss (ssget)) <Selection set: 1a5> _$ (sslength ss) 3 _$ (while (setq e (ssname ss 0)) (ssdel e ss)) <Selection set: 1a5> _$ (sslength ss) 0 Maintenant on a une variable qui pointe sur un pointeur de jeu de sélection vide de tout entitée A+ -
Comment faire pour "vider" un (ssget ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Bonjour, Peut-être que tu cherche à faire qqc comme cela? (if (setq ss (ssget "_X" '((0 . "TEXT,MTEXT") (1 . "#,##,###,####") (8 . "Portes")))) (progn (command "-calque" "n" "TOPO_NUM_POLICE" "") (command "chprop" ss "" "ca" "TOPO_NUM_POLICE" "") ) ) ;; (if (setq ss (ssget "_X" '((0 . "TEXT,MTEXT") (1 . "#.##,##.##,###.##") (8 . "0,_0")))) (progn (command "-calque" "n" "TOPO_ALTI" "") (command "chprop" ss "" "ca" "TOPO_ALTI" "") ) ) ;; (if (setq ss (ssget "_X" '((8 . "0,_0")))) (command "_erase" ss "") ) A+ (Ps: non testé, pour le principe) -
Bonjour, En saisissant des blancs(des espaces) dans les propriétés personnalisées de tes versions LT? A+
-
Comment demander deux choses à l'utilisateur ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
C'est tout à fait ça, je n'aurais pas mieux dit. A+ -
Comment demander deux choses à l'utilisateur ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Bonjour Denis, Dans le cas du getstring et la clé "EtiqPTRL_Calq", à la réflexion le mieux est d'utiliser une variable provisoire comme suggéré par _zebulon, Une proposition de code à décortiquer et tester: (defun c:DHConfEtiqPTRL (/ question tmp) ;; Fonction auxiliaire (defun question (msg rep) (initget "Oui Non") (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: "))) (rep) ) ) ;; Initialisation/modification des datas (vlax-ldata-put "DenisH" "EtiqPTRL_XY" (question "\nVoulez-vous indiquer l'X et l'Y dans l'étiquette" (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui") ) ) (vlax-ldata-put "DenisH" "EtiqPTRL_Z" (question "\nVoulez-vous indiquer le Z dans l'étiquette" (vlax-ldata-get "DenisH" "EtiqPTRL_Z" "Oui") ) ) (setq tmp (getstring (strcat "\nDans quel calque voulez-vous placer l'étiquette <" (vlax-ldata-get "DenisH" "EtiqPTRL_Calq" (vlax-ldata-put "DenisH" "EtiqPTRL_Calq" "_ETIQ")) ">: " ) ) ) (if (/= "" tmp) (vlax-ldata-put "DenisH" "EtiqPTRL_Calq" tmp) ) ;; Affichage (alert (strcat "Configuration actuelle : \n\tÉtiquette XY \t= " (vlax-ldata-get "DenisH" "EtiqPTRL_XY") "\n\tÉtiquette Z \t= " (vlax-ldata-get "DenisH" "EtiqPTRL_Z") "\n\tEtiqPTRL_Calq \t= " (vlax-ldata-get "DenisH" "EtiqPTRL_Calq") ) ) ;; Quitte tranquillement (princ) ) A+ -
Comment demander deux choses à l'utilisateur ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Re, Pour EtiqCalq peux-tu décrire exactement les saisies attendu/possible, je ne suis pas sur de tout comprendre, merci A+ -
Comment demander deux choses à l'utilisateur ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Bonjour DenisH, Je me tiens un peu en retrait de la discussion car en lisp j'ai une approche très différente, qui ne ferais que ajouter de la confusion à la discussion. Néanmoins, si tu as un peu de curiosité dans ta fonction de "Configuration" je t'inviterai à jeter un œil sur cette discussion,ou nous avions à titre d'exemple définie une fonction pour la saisie de mot clé avec une valeur par défaut: (defun question (msg rep) (initget "Oui Non") (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: "))) (rep) ) ) Avec l'expression suivante: (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui") rappelé hier, on peut aisément créer/modifier la clé dans une même ligne de code: (vlax-ldata-put "DenisH" "EtiqPTRL_XY" (question "\nÉcrire l'X et l'Y " (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui")) ) A+ Edit: Je viens de voir la réponse de _Zebulon, le même raisonnement peut être transposé pour EtiqCalq à toi de voir ce qui te va le mieux. -
Comment demander deux choses à l'utilisateur ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
En fait j'étais complétement passé à côté… :D -
Comment demander deux choses à l'utilisateur ?
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Oui et pour mémoire il me semble que cela peut également s'établir en natif, avec l'argument optionnel [default-data] de la fonction vlax-ldata-get: (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui") A+ -
[Résolu] Doublage du dernier (princ
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Bonjour, La deuxième invite est la valeur de retour de ta fonction lisp, le préfixe c: permet d'appeler ta fonction lisp sur la ligne de commande comme une commande AutoCAD, mais cela reste une expression Lisp qui retourne toujours la dernière expression évalué. Pour évité cette "impression" d'écho sur ta ligne de commande en sortie de programme insère un (princ) qui te renverra un blanc. A+ -
Oui tu as raison de parler de culture (ou de mode), personnellement j'ai commencé à codé très tardivement (bien après toi), à un moment ou la programmation fonctionnelle est plus dans l'air du temps ceci expliquant peut être cela… Ou alors peut-être ma façon de faire le café, le filtre en dernier avec une cafetière à piston cela me semble plus naturel… ;) Au passage pour ceux qui souhaiteraient se faire une idée plus précise de la programmation fonctionnelle, la lecture des 4 premiers billets du blog Func' programming - un blog homéopathique me semble intéressant, c'est écrit en CLisp mais cela reste compréhensible (d'ailleurs l'adaptation des exemples en AutoLisp est certainement un bon exercice). Amicalement Bruno
-
Re, Pour le plaisir de coder, une réécriture équivalente du code proposé par zebulon_, avec pour objectif de faire un éducatif orienté programmation fonctionnel (en minimisant l'emploi de variables) pour ceux que ça intéressent.. (defun c:chcol (/ ssmap ChangeCou) (defun ssmap (fun ss / n) (if (= 'PICKSET (type ss)) (repeat (setq n (sslength ss)) (apply fun (list (ssname ss (setq n (1- n)))))) ) ) (defun ChangeCou (e) (eval (list 'defun 'ChangeCou '(e) (list 'entmod (list 'append '(entget e) (list 'quote (acad_truecolordlg (cond ((assoc 430 (setq e (entget e)))) ((assoc 420 e)) ((assoc 62 e)) ((cons 62 256)) ) ) ) ) ) ) ) (ChangeCou (cdr (assoc -1 e))) ) ;; Corps du programme (ssmap 'ChangeCou (cond ((cadr (ssgetfirst))) ((ssget)) ) ) (princ) ) Voir ici pour des explications sur le fonctionnement de la fonction ssmap (fonction de second ordre) et là pour la fonction ChangeCou (fonction utilisant la précomputation). A+
-
Bonjour yusukens82, Ne connaissant pas ton niveau de lisp, je vais essayer de compléter astucieusement la bonne réponse de zebulon_, Car le travail sur le code de couleur dxf 62 ainsi que les éventuels codes associer 420 (couleur vrai) et 430 (carnet de couleur). N'étant pas des codes dxf à entrer multiple n'y des codes dépendant de marqueur de sous classe (code 100). Tu te trouves dans un cas particulier que j'avais tenté d'exposer ici En conséquence en ajoutant (et non en modifiant ;) ) les valeurs de retour de la fonction acad_truecolordlg au moyen de la fonction append au code dxf de l'entité sélectionné, tu vas déléguer la totalité du travail de suppression/d'ajout ou de substitution des codes dxf 62, 420, 430 dans ta liste de définition dxf à la fonction entmod. Pour passer indifféremment la couleur de ton entité en couleur ACI/vrai/carnet avec un code polyvalent et concis… La ligne de code à intégrer dans un bouton ou dans une fonction définie en defun c:, ou bien à tester directement sur la ligne de commande (entmod (append (entget (car (entsel)) ) (acad_truecolordlg '(420 . 15814158)))) Cordialement,
-
Merci :)
-
[Résolu] Transformation de chaines en réels et inversement
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Pour compléter AtoF = = Alphanumeric TO Float Hé oui, cela aurait pu être StoR pour AtoF, ou FtoA pour RtoS mais non faut faire avec... -
[Résolu] Transformation de chaines en réels et inversement
VDH-Bruno a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Si cela peut te rassurer en privé je m'en donne régulièrement, pas plus tard que ce matin avec la fonction ssget, alors que je pensais tous comprendre des sélections sous d'AutoCAD, je m'aperçois avec émerveillement que j'en découvre toujours plus…
