Aller au contenu

Patrick_35

Membres
  • Compteur de contenus

    6 374
  • Inscription

  • Dernière visite

  • Jours gagnés

    30

Tout ce qui a été posté par Patrick_35

  1. Gagné B) @+
  2. Salut En regardant vite fait le code, je pense que tu pourrais simplifier les cond Par exemple en changeant ((= (vlax-get pr 'value) "Flèche haut") (setq lst (cons bl lst)) ) ((= (vlax-get pr 'value) "Flèche haut sans EF") (setq lst (cons bl lst)) ) ((= (vlax-get pr 'value) "Flèche haut sans EF EC") (setq lst (cons bl lst)) ) par ((member (vlax-get pr 'value) '("Flèche haut" "Flèche haut sans EF" "Flèche haut sans EF EC") (setq lst (cons bl lst)) ) Il y en a un autre à simplifier. Je te laisse chercher. @+
  3. Patrick_35

    Barre de commande

    Salut Un exemple avec ou sans les express pour indiquer un état d'avancement (defun c:test(/ ava express pou tot) (if (eval 'acet-ui-progress-done) (setq express T) ) (setq ava 0 tot 1000) (if express (acet-ui-progress-init "Avancement" tot) (princ "\nAvancement à : 00%") ) (repeat tot (setq ava (1+ ava) pou (/ (* ava 100) tot) ) (repeat 50000) (if express (acet-ui-progress-safe ava) (progn (if (< pou 10) (repeat 2 (princ (chr 8))) (repeat 3 (princ (chr 8))) ) (princ (strcat (itoa pou) "%")) (princ) ) ) ) (and express (acet-ui-progress-done) ) (princ) ) @+
  4. Salut Je t'avais répondu avec SSADD Un exemple ; Déclaration d'un jeu de sélection vide (à faire en dehors d'une boucle) (setq js (ssadd)) ; Ajouter un objet vla à la sélection) (ssadd (vlax-vla-object->ename Mon_Objet) js) @+
  5. Salut Un bloc dynamique est logiquement un bloc anonyme (sauf s'il est inséré tel que dans la base). Autocad à ses débuts ne connaissait pas ce type de bloc, donc ils étaient nommés et tout le monde était content. Pour qu’Autocad gère ces blocs, les développeurs ont fait une chose simple. A chaque changement d'état d'un bloc dynamique, Autocad efface l'ancien pour insérer un nouveau selon les besoins demandés. Et comme Autocad ne sait pas afficher pour un même nom des états différents, alors ils ont utilisés les blocs anonymes. Pour tester, tu regardes le nom anonyme d’un bloc dynamique, tu lui changes par exemple sa visibilité et tu regardes de nouveau son nom. Et bien il a changé. Pour ta sélection, tu peux faire (ssget "x" (list (cons 0 "insert") (cons 2 "CHUTE_EP,CHUTE_EU,CHUTE_EV,`*U*"))) Pour une sélection avec sssetfirst, il faut recréer un jeu de sélection dans une variable avec ssadd @+
  6. Il ne te reste plus qu'à payer ta bolée ;) Pour la rapidité, je pense que c'est surtout dû à la boucle en vlisp (vlax-for ...) et éviter de transformer un ename en vla-object. Il ne te reste plus qu'à te mettre au vlisp. Si tu as compris ce lisp, ce n'est pas aussi compliqué que l'on pense. @+
  7. Ok (defun c:test(/ bl doc lst pr sel) (vl-load-com) ; Document actif (setq doc (vla-get-activedocument (vlax-get-acad-object))) ; Sélection des blocs (or (ssget (list (cons 0 "insert"))) (ssget "x" (list (cons 0 "insert"))) ) ; Boucle en vlisp de la sélection active (vlax-for bl (setq sel (vla-get-activeselectionset doc)) ; Test si c'est un bloc dynamique (and (= (vla-get-isdynamicblock bl) :vlax-true) ; Boucle sur les propriétés dynamiques du bloc (foreach pr (vlax-invoke bl 'getdynamicblockproperties) ; Test nom de la propriété (and (= (vla-get-propertyname pr) "Flèche") ; Différents tests selon les besoins (cond ; Si Flèche bas, changer en Flèche haut ((= (vlax-get pr 'value ) "Flèche bas") (vlax-put pr 'value "Flèche haut") ) ; Si Flèche haut, mémoriser le bloc dans une liste pour ensuite l'effacer hors de cette boucle ((= (vlax-get pr 'value) "Flèche haut") (setq lst (cons bl lst)) ) ) ) ) ) ) ; Effacer si besoin les blocs de la liste (mapcar 'vla-delete lst) ; Effacer la selection active (vla-delete sel) ; Silence (princ) ) @+
  8. Non ; Sélection des blocs (or (ssget (list (cons 0 "insert"))) (ssget "x" (list (cons 0 "insert"))) ) Cela permet une sélection et si on fait entrée directement sans rien choisir, alors on sélectionne tous les blocs dans le dessin. Non, l'idée est de tester si la visibilité existe et alors de changer par cette visibilité. Tu peux éviter ce test si tu fais un test sur le nom du bloc dans la boucle et que tu es certain que ton bloc contient bien cette visibilité. Il est aussi possible d'inclure le test sur le nom du bloc pour éviter ceux qui n'ont rien à voir. Je ne comprends pas. Un paramètre de visibilité ne peut être désactivé ? @+
  9. Salut Un exemple avec commentaires qui change les paramètres de visibiltés des blocs choisis (defun c:test(/ bl doc pr sel) (vl-load-com) ; Document actif (setq doc (vla-get-activedocument (vlax-get-acad-object))) ; Sélection des blocs (or (ssget (list (cons 0 "insert"))) (ssget "x" (list (cons 0 "insert"))) ) ; Boucle en vlisp de la sélection active (vlax-for bl (setq sel (vla-get-activeselectionset doc)) ; Test si c'est un bloc dynamique (and (= (vla-get-isdynamicblock bl) :vlax-true) ; Boucle sur les propriétés dynamiques du bloc (foreach pr (vlax-invoke bl 'getdynamicblockproperties) ; Test sur le paramètre de visibilité (and (= (vla-get-propertyname pr) "Visibilité") ; Test si la propriété a changer existe (member "Bas" (vlax-get pr 'allowedvalues)) ; Changer la propriété (vla-put-value pr "Bas") ) ) ) ) ; Effacer la selection active (vla-delete sel) ; Silence (princ) ) @+
  10. Salut Tu peux créer une liste contenant les objets à ne pas déplacer. Cette liste peut être sauvegardée dans le dessin afin de retrouver ses éléments lors de la réouverture du dessin. Lors de la commande déplacement, tu peux placer les objets de la liste sur un calque temporaire verrouillé. Cela implique un ralentissement du PC dès que l'on bouge un objet, le chargement automatique du lisp quel que soit le dessin afin de gérer les objets au besoin. @+
  11. Bonjour Avant de commencer par Autocad, on pourrait déjà penser à Windows @+
  12. Salut Bonus Sans rentrer réellement dans le code, je pense que tu peux utiliser vla-get-activeselectionset pour accélérer la routine, d'autant que tu transformes tes objets en sélection vla Un exemple simple qui liste les blocs d'un dessin. (defun c:test(/ ele sel) (ssget "x" (list (cons 0 "insert"))) (vlax-for ele (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (princ (strcat "\n" (vla-get-name ele))) ) (vla-delete sel) (princ) ) @+
  13. Salut Ce que tu vois n'est qu'une traduction en lisp de ce qui peut se faire dans d'autres langages. Et ce n'est que la surface. C'est avec ce type liaisons que l'on trouve des failles de sécurité. Il faut dire que protéger des données en entreprise (même chez les éditeurs de logiciels) n'est pas une priorité et c'est bien dommage. Si quelqu'un se donne la peine de gratter un peu, il trouvera assez facilement. @+
  14. Salut C'est Edit Piaf qui va être contente :D @+
  15. Salut Un exemple pour télécharger un fichier sur internet, donc pour tester si le fichier existe. (defun download (url file / adob fso http ok taille tbl) (setq http (vlax-create-object "MSXML2.XMLHTTP") adob (vlax-create-object "ADODB.Stream") fso (vlax-create-object "Scripting.FileSystemObject") ) (vlax-invoke-method http 'open "get" url :vlax-false) (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke (list http 'send))) (princ (strcat "\nLe lien " url " n'est pas valide.")) (if (eq (vlax-get http 'status) 200) (if (vl-catch-all-error-p (setq taille (vl-catch-all-apply 'vlax-invoke (list http 'getResponseHeader "Content-Length")))) (princ "\nErreur de lecture sur la taille du fichier.") (if (< (atoi taille) (vlax-get (vlax-invoke fso 'getdrive (substr (vlax-invoke fso 'getabsolutepathname file) 1 1)) 'freespace)) (progn (princ "\nTéléchargement en cours.") (princ) (if (vl-catch-all-error-p (setq tbl (vl-catch-all-apply 'vlax-get-property (list http "ResponseBody")))) (princ "\nImpossible de télécharger le fichier.") (if (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda() (vlax-put adob "Type" 1) (vlax-invoke adob "Open") (vlax-invoke-method adob "Write" tbl) (vlax-invoke adob "SaveToFile" file 2) ) ) ) ) (setq ok T) ) ) ) (princ "\nPlus de place sur le périphérique de destination.") ) ) (princ (strcat "\nLe lien " url " n'est pas disponible.")) ) ) (mapcar 'vlax-release-object (list http adob fso)) (terpri) ok ) Ou tu peux aussi essayer avec vla-getremotefile @+
  16. Salut Je pense avoir compris ta demande. Tu souhaites un sommaire de tous tes folios (onglets) Tu peux t'inspirer de cette conversation @+
  17. Patrick_35

    pourquoi

    Salut La grammaire à une histoire et des règles simples à appliquer. Par exemple pour vérifier un verbe du 1er groupe (donc er) se termine en é ou er dans une phrase. Et bien on le remplace par un verbe du 3em groupe (re) Je viens de manger une gaufre peut aussi de dire je viens de prendre une gaufre. On a alors la conjugaison du verbe Idem pour le a et à. S'il est conjugable, alors pas d'accent. Idem pour les ^ sur les lettres. Dans l’histoire de la langue française, les ^ ont remplacés les s dans les mots. Par exemple le mot arrêt a un ^ car on peut dire arrestation. Juste une chose, c'est par son orthographe que l'on juge une personne. Je ne dis pas que je suis un exemple, loin de là, mais on se prend au jeu. @+
  18. Patrick_35

    Lisp pour autocad

    Salut http://docs.autodesk.com/ACD/2013/ENU/files/GUID-66377097-9BDB-4E3D-97E6-2263A5F273EC.htm @+
  19. Salut Si tu as des modifs à ne faire que sur un dessin, tu as MAT. (C'est la même chose, MAT fonctionne pour un dessin et PAT sur un répertoire) @+
  20. Patrick_35

    Lisps de Patrick_35

    Salut Il faut que je finisse de remettre les lisps à disposition, mais le temps me manque, surtout en ce moment. En attendant, le voici @+
  21. C'est pour remplacer une partie du code qui contient l'appel à une fonction vba si vba n'est pas installé. La partie du code à remplacer (defun InputBox (Titre Message Defaut / users1 valeur) (setq users1 (getvar "users1")) (acad-push-dbmod) (vla-eval (vlax-get-acad-object) (strcat "ThisDrawing.SetVariable \"USERS1\"," "InputBox (\"" Message "\", \"" Titre "\", \"" Defaut "\")")) (setq valeur (getvar "users1")) (setvar "users1" users1) (acad-pop-dbmod) valeur ) @+
  22. Salut Tu fais appel à une fonction vba dans le lisp, or vba n'est plus intégré par défaut dans Autocad. A installer suivant ce lien ou écrire une nouvelle fonction évitant l'appel à vba. Par exemple ;------------------------------------------------------------------------- ; Saisir une valeur via une boite de dialogue ;------------------------------------------------------------------------- ;; InputBox (gile) ;; Ouvre une boite de dialogue pour récupérer une valeur ;; sous forme de chaine de caractère ;; ;; Arguments ;; tous les arguments sont de chaines de caractère (ou "") ;; box : titre de la boite de dialogue ;; msg : message d'invite ;; val : valeur par défaut ;; ;; Retour ;; une chaine ("" si annulation) ;; ;; Modifié par Patrick_35 pour inclure le caractère \n ;; comme retour chariot (defun InputBox (box msg val / subr temp file dcl_id ret) ;; Retour chariot automatique à 50 caractères (defun subr (str / pos) (cond ((setq pos (vl-string-search "\n" str)) (strcat ":text_part{label=\"" (substr str 1 pos) "\";}" (subr (substr str (+ 2 pos))) ) ) ((and (< 80 (strlen str)) (setq pos (vl-string-position 32 (substr str 1 80) nil T)) ) (strcat ":text_part{label=\"" (substr str 1 pos) "\";}" (subr (substr str (+ 2 pos))) ) ) (T (strcat ":text_part{label=\"" str "\";}") ) ) ) ;; Créer un fichier DCL temporaire (setq temp (vl-filename-mktemp "Tmp.dcl") file (open temp "w") ret "" ) ;; Ecrire le fichier (write-line (strcat "InputBox:dialog{key=\"box\";initial_focus=\"val\";spacer;:paragraph{" (subr msg) "}spacer;:edit_box{key=\"val\";edit_width=54;allow_accept=true;} spacer;ok_cancel;}" ) file ) (close file) ;; Ouvrir la boite de dialogue (setq dcl_id (load_dialog temp)) (if (not (new_dialog "InputBox" dcl_id)) (exit) ) (set_tile "box" box) (set_tile "val" val) (action_tile "accept" "(setq ret (get_tile \"val\")) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) ;;Supprimer le fichier (vl-file-delete temp) ret ) (inputbox "Titre" "Message" "Valeur par défaut") @+
  23. Patrick_35

    pourquoi

    Salut C'est un oxymore :(rires forts): Plus sérieusement, fais une recherche car le sujet a déjà été abordé plusieurs fois. @+
  24. Salut Et en plus clair ? De base je dirai non car pour comparer il faut forcement faire une boucle, mais pas obligatoirement avec foreach, while ou repeat (vl-remove-if, vl-remove-if-not, mapcap, apply, etc...) @+
×
×
  • 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é