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. Bonjour Ci-dessous quelques ligne de code à glisser dans un des fichiers de chargement automatique d'AutoCAD, normalement tu devrais sur le même model que la solution (setq useri1 (length (layoutlist)) ) avoir accès à une variable lisp *NombrePresentation* qui se met à jour automatiquement, à mettre dans un champ pour renseigner le nombre de présentation. Inconvénient: ceci ne fonctionnera que sur les postes ayant les lignes de codes chargées, pense à convertir le champ en texte avant de distribuer le dwg, ou de diffuser les lignes de code lisp. ;; VDH-Bruno le: 10-07-2017 ;; ----------------- NombrePresentation V 1.00 ------------------------------------- ;; Crée une variable lisp global *NombrePresentation* renseignant le nombre de ;; présentation présente dans le dessin actif. (vl-load-com) ;; Déclaration du réacteur ;; (vlr-remove *command-reactor-NombrePresentation*) (or *command-reactor-NombrePresentation* (setq *command-reactor-NombrePresentation* (vlr-command-reactor "Nombre Presentation" '((:vlr-commandEnded . NombrePresentation-callback)))) ) ;; Routine de mise à jour automatique de la variable lisp *NombrePresentation* (defun NombrePresentation-callback (rea evenement) (and (eq (car evenement) "LAYOUT_CONTROL") (setq *NombrePresentation* (length (layoutlist))) ) (princ) ) ;; Initialisation de la variable (NombrePresentation-callback nil (list "LAYOUT_CONTROL")) A+
  2. Bonjour, Ceci devrait également convenir: (command "CHPROP" (ssget "X" '((0 . "~HATCH"))) "" "CO" "DUCALQUE" "") A+
  3. Effectivement pour retourner une liste depuis une liste le couple mapcar/lambda est une évidence, mais les fonctions récursives aussi car elles empilent et dépilent les appels de la même manière qu'est construite une liste.. (defun indLst (i l) (if l (cons (cons i (car l)) (indLst (1+ i) (cdr l))) ) ) _$ (indLst 1 '("tata" "toto" "titi" "tutu")) ((1 . "tata") (2 . "toto") (3 . "titi") (4 . "tutu")) A+ Bruno
  4. D'où l'utilité de travailler avec assoc et les paires pointées, comme dans les codes dxf. Sinon la fonction reverse est ton amie _$ (reverse '((2 . "titi") (1 . "toto"))) ((1 . "toto") (2 . "titi")) A+
  5. Bonjour, Une liste se construit par la tête "car" si tu utilises la fonction de constructeur de liste cons, sinon utilise append si tu veux mettre des listes bout à bout... ;; Créer une paire pointée (setq dotpair (cons 1 "toto")) -> (1 . "toto") ;; Créer une liste contenant une paire pointée (setq lstdotpair (cons dotpair nil)) -> ((1 . "toto")) ;; ou (setq lstdotpair (list dotpair )) -> ((1 . "toto")) ;; Ajouter une paire pointé à la liste de paire pointée (setq lstdotpair (cons (cons 2 "titi") lstdotpair)) -> ((2 . "titi") (1 . "toto")) A l'occasion je t'invite à relire cette discussion http://cadxp.com/topic/29314-ces-listes-qui-nen-sont-pas/page__view__findpost__p__159425 A+
  6. Bonjour, En complément de ce qui précède la variable OSNAPCOORD, permet de préciser les priorités lors d'éventuels conflit entre les accrochages objets en cours et les saisies clavier de coordonnées (dans ou en dehors des scripts). Par défaut cette variable est réglée sur 2, dans ton cas il peut être intéressant d'envisager un réglage à 1. A+ Bruno
  7. Re, Oui des problèmes qui finissent par s'oublier car effectivement je me souviens maintenant d'une discussion ou tu avais soulevé un problème avec ce double quote + mapcar Ce qui m'avait fait préféré cette écriture plus robuste: _$ (mapcar '(lambda (x) (list 'quote x)) '(A B C D E)) ((QUOTE A) (QUOTE B) (QUOTE C) (QUOTE D) (QUOTE E)) Discution que tu peux retrouver ici -> quote quote A+ Bruno
  8. Oui j'ai vu ça, comme quoi patauger ç'arrive même aux meilleurs, pour s'amuser et tester si on est au point avec quote et eval, un exercice amusant consiste à réécrire une vraie fonction apply Si si il est possible de "surquoter" les éléments d'une liste (mapcar 'quote lst) ((quote (1 2)) (quote (1 2))) EDIT du 17/05/2017: pour la bonne syntaxe voir code réponse 14 Dans ton expression précédente tu as "quoté" l'argument de ta fonction anonyme et non les éléments de ta liste A+ Bruno
  9. Re, Au vu de la nature de tes listes, effectivement comme suggéré par Patrick_35 je préférerais la fonction equal à = Sinon pour le retour sur le point suivant: Pour appliquer vl-every à une liste d'argument variable, la bonne syntaxe est la suivante: _$ (setq lst '((1 2) ( 1 2))) ((1 2) (1 2)) _$ (apply 'vl-every (cons '= lst)) T A+ Bruno
  10. Bonjour Gérald, Au risque de répondre à coté, je ne suis pas sur de comprendre la difficulté que tu exposes.. Dans le cas de plus de 2 listes (non constitué de sous liste) ;) _$ (apply 'and (mapcar '= '(1 2 3) '(4 5 6) '(7 8 9)))) nil _$ (apply 'and (mapcar '= '(1 2 3) '(1 2 3) '(1 2 3))) T ------ EDIT 1 ---------------------- Et si au moins une de tes listes est doublement "quoté" l'expression retournera nil _$ (apply 'and (mapcar '= '(1 2 3) ''(1 2 3) '(1 2 3))) nil Le car de ta liste étant de type SYM: (type (car ''(1 2 3))) => SYM (type (car '(1 2 3))) => INT ------ EDIT 2 -------------------- Oupsss j'avais pas lu ceci et cela me fait penser que ma proposition n'est qu'une réécriture de la fonction vl-every... A+
  11. Le sujet portant sur une demande de solution en lisp, il est possible de mixer les 2 propositions en adaptant très légèrement le code de (gile), donc très rapidement: (defun c:debitfield (/ getAttribs getAtt getVal block attribs puissance delta debit elst) (defun getAttribs (ent / elst rslt) (while (and ent (= (cdr (assoc 0 (setq elst (entget ent)))) "ATTRIB")) (setq rslt (cons (cons (cdr (assoc 2 elst)) ent) rslt) ent (entnext ent) ) ) rslt ) (defun getAtt (tag /) (cond ((cdr (assoc tag attribs))) (T (prompt (strcat "\nL'attribut '" tag "' est introuvable"))) ) ) ;| (defun getVal (tag / att val) (if (and (setq att (getAtt tag)) (< 0. (setq val (atof (cdr (assoc 1 (entget att)))))) ) val (prompt (strcat "\nLa valeur de l'attribut '" tag "' n'est pas valide")) ) ) |;;; remplace la fonction getval (defun getid (tag) (vla-get-ObjectID (vlax-ename->vla-object (getAtt tag)))) (and (setq block (car (entsel "\nSélectionnez un bloc: "))) (setq attribs (getAttribs (entnext block))) (setq puissance (getid "PUISSANCE")) (setq delta (getid "DELTA")) (setq debit (getAtt "DEBIT")) (setq elst (entget debit)) (entmod (subst (cons 1 (strcat ;; (rtos (/ (* puissance 0.86) delta) 2 0) " l/h")) "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId " (itoa puissance) " 0>%).TextString>%*0.86/%<\\AcObjProp Object(%<\\_ObjId " (itoa delta) " 0>%).TextString>%) \\f \"%lu2%pr2%zs8\">%" ) ) (assoc 1 elst) elst ) ) ) (command "_regen") (princ) ) A+ Bruno
  12. Re, Plusieurs liens sur le sujet, ou je me suis essayé à une explication (avec plus ou moins de clarté…), discussion à lire dans leur intégralité. http://cadxp.com/topic/37644-calcul-entre-attributs-dans-bloc/page__view__findpost__p__207410 http://cadxp.com/topic/37644-calcul-entre-attributs-dans-bloc/page__view__findpost__p__210490 http://cadxp.com/topic/40695-pb-champ-dans-bloc/page__view__findpost__p__228056 En espérant que tu y trouve ton bonheur. A+ Bruno
  13. Re, https://we.tl/HpZLqFj6gF Essaye voir si cela peux te convenir fonctionne sous 2007 et + A+ Bruno
  14. Bonjour, Je veux bien essayer de te joindre un exemple si c'est possible (et si je suis bien dans le sujet), mais j'ai besoin de comprendre comment sont renseigné tes attributs puissance et delta (car je ne peux le voir sur ma version) A+ Brun0
  15. Bonjour, J'ai été faire un petit tour rapide sur le sujet en question, je répond ici n'ayant pas de compte sur ce forum, et je répond peut être à coté car je ne connais pas les évolutions du logiciel depuis d'AutoCAD 2007... Mais pour faire ce que tu souhaites sur version ancienne c'est possible, mais dans une référence de bloc pour avoir accès propriétés des attributs et pas dans une définition de bloc. A l'usage sur d'ancienne version, dans ton dessin tu ne dois pas insérer une définition de bloc mais une référence de bloc.. A+ Bruno
  16. Bonjour Consernant l'écriture d'une fonction spécifique pour la une sélection d'un texte ou une saisie numérique Je profite de l'occasion pour faire remarquer que les fonctions entsel, nentsel et nentselp permettant la saisie de coordonnées, elles ne réagissent pas de la même manière sur la ligne de commande en fonction d'une saisie numérique ou d'une saisie alphanumérique Je pense qu'au moyen de la variable lastprompt on peut se servir de cette particularités pour filtrer la saisie, ma proposition de code: ;; SelGetNum ;; Saisie numérique ou sélectionnez une entitée *TEXT ou ATTRIB ;; Retourne un texte (STR) ou nil ;; ;; Exemple: ;; (SelGetNum "\nEntrez un nombre ou sélectionnez un texte: ") (defun SelGetNum (msg / ent rep) (cond ((and (setq ent (car (nentsel msg))) (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT,ATTRIB")) (cdr (assoc 1 (entget ent))) ) ((numberp (read (setq rep (vl-string-left-trim msg (getvar 'lastprompt))))) rep) ) ) A+
  17. Un grand merci à vous 2, j'ai regardé et testé vos 2 codes (très complémentaire pour mon besoin), j'ai là toute la matière pour arriver à ce que je souhaiterai, il y a plus cas.. ;) A+ Bruno
  18. Bonjour, Qui aurait un lien, routine, co-routine ou extrait de code lisp, de décalage des lwpolyligne croisées. Pour être un peu plus clair sur ma version (peut-être cela à évolué depuis), une polyligne optimisé lorsqu'elle est décalé se coupe à chaque croisement… Je cherche une routine ou extrait de code qui traite ce décalage de polyligne en la gardant en un seul morceau continu, dans l'optique d'avoir une base de départ à adapter rapidement pour à un besoin ponctuel. D'avance merci VDH-Bruno
  19. Bonjour Non effectivement il ni en pas l'utilité si vraiment tu voulais utiliser mapcar, ce serai après cette première factorisation. Comme montré dans ce sujet. En effectuant une seconde factorisation, sur la séquence de déclaration de commande (defun c:C0() (truc "0")) (defun c:C1() (truc "AXES")) (defun c:C2() (truc "CACHE")) (defun c:C3() (truc "CARTOUCHE")) (defun c:C4() (truc "COTATION")) (defun c:C5() (truc "FIN")) (defun c:C6() (truc "HACHURES")) (defun c:C7() (truc "TEXTE")) (defun c:0p() (truc "PIPE")) (defun c:0e() (truc "Existant")) (defun c:0f() (truc "Fittings")) .... Comme ceci, pour créer tes fonctions à la volé: (mapcar '(lambda (f v) (eval (list 'defun f nil (list 'truc v)))) '(c:C0 c:C1 c:C2 c:C3 c:C4 c:C5 c:C6 c:C7 c:0p c:0e c:0f) '("0" "AXES" "CACHE" "CARTOUCHE" "COTATION" "FIN" "HACHURES" "TEXTE" "PIPE" "Existant" "Fittings") ) A+
  20. Bonjour Pour une réponse AutoCAD je me servirai de l'accrochage objet milieu entre 2 points m2p à l'invite de commande d'Autocad Pour une variante lisp et pour mémoire, en lisp il assez facile de faire appel à la calculatrice géométrique en ligne d'AutoCAD (définie comme une application extérieur: geomcal.arx) Calcul du milieu entre 2 points (setq p1 (getpoint) p2 (getpoint) pm (c:cal "plt(p1,p2,0.5)") ) Ceci étant une variante très spécifique à AutoCAD, les versions données précédemment par (gile) étant évidemment beaucoup plus pertinente pour l'apprentissage et la compréhension de la programmation Lisp. A+
  21. VDH-Bruno

    Mode administrateur

    Bonjour Olivier J'ai connu ça, et pire encore.. Mais bon même en trainant des pieds, s'il y a une volonté de suppression des droits administrateurs tu n'y couperas hélas pas. Mais insiste pour qu'AutoCAD puisse s'exécuter en tant qu'administrateur, cela limitera certains désagrément notamment avec tes palettes. A+ Bruno
  22. Le prend pas pour toi, c'est pas de ta faute tu n'es pas développeur chez Dropbox que je sache ;) A+ Bruno (Ps: profite de tes vacances et repose toi bien)
  23. J'ai vécu le truc hier, je n'ai trouvé la solution que ce matin sur un forum window, j'ai perdu 1/2 journée de prod au plus mauvais moment sur les dossiers en cours :angry: :angry: :angry:
  24. VDH-Bruno

    Copier un champ

    Ou plus classiquement copie-colle ton expression de champs dans des textes sur tes différents onglets, plutôt que l'entités texte. A+
  25. VDH-Bruno

    Copier un champ

    Bonjour, Allez ma petite astuce du jour que j'utilise en version 2007, consiste à dupliquer tes champs sur l'espace Objet, pour les insérer dans l'onglet de ton choix passe par la commande changespace, cette commande de permettra de garder les liens entre ton champs et l'ID de l'objet source. Ce que ne permet pas le copier-coller de window Salutations au forum VDH-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é