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. Salut, C'est DIMFXL il y a inversion entre le X et le L, sinon pour DIMFXLON c'est la bonne orthographe. A+
  2. Elle a été recodé en ARX ceci explique cela, merci pour le copier collé, cela devrait faire l'affaire…
  3. Salut, Une astuce à 2 balles (que tu connais déjà) et certainement pas celle que tu recherches, mais faute de mieux.. Ouvrir deux sessions de ton fichier (hélas l’une est forcément en lecture seule) puis: Menu > Fenêtre > Mosaïque vertical (puis choisie les onglets que tu veux afficher) A+
  4. Bonjour, Saurais tu me localiser le fichier lisp correspondant à la fonction que tu cites je n’y suis pas arrivé, j’aurais bien regardé comment Autodesk code certaines options. A+ et merci (Ps : Je n’avais jamais pensé à placer un marqueur pour récupérer les entités après l’usage de la commande _explode, j’aime bien l’astuce merci).
  5. Bonjour, En attendant une solution en lisp, à voir si cela peut correspondre à ta demande, je me suis simplifié la tâche en laissant à AutoCAD le soin de convertir les couleurs RAL, les objets sont rangées dans les calques correspondant à la couleur des objets (les entités dont la couleur est forcées reste dans la couleur forcées). (defun c:coulcalque (/ ent dxf lay) (while (if ent (setq ent (entnext ent)) (setq ent (entnext))) (setq dxf (entget ent)) (entmod (subst (cons 8 (itoa (cdr (cond ((assoc 62 dxf)) ((assoc 62 (tblsearch "layer" (cdr (assoc 8 dxf))))) ) ) ) ) (assoc 8 dxf) dxf ) ) ) (tblnext "layer" T) (while (setq lay (cdr (assoc 2 (tblnext "layer")))) (if (= 'INT (type (read lay))) (entmod (subst (cons 62 (read lay)) (assoc 62 (setq dxf (entget (tblobjname "layer" lay)))) dxf ) ) ) ) (princ) ) A+
  6. Bonsoir, (cond(= typeres "Y"); Y au lieu de (cond(typeres; Y Pour la dernière version ;) Amicalement,
  7. Bonjour, Comme je n’ai pas trouvé sur le forum et si des fois ça peut rendre service, une petite fonction pour générer des coordonnées permettant de tracer simplement la courbe représentative d’une fonction. ;; =======================COORDONNEES========================== ;; VDH-Bruno ;; Génère la liste de points d'une courbe représentative f(x) ;; définie sur un intervalle [a ; b] ;; Arguments: ;; a -> Limite inférieur de l'intervalle (un nombre) ;; b -> Limite supérieur de l'intervalle (un nombre) ;; e -> Ecart ou pas entre abscisses définie par une fonction ;; f -> Fonction du type y=f(x) ;; Valeur de retour: ;; Une liste de coordonnées 2D -> ((x1 y1)(x2 y2)(x3 y3)...) ;; Exemples: ;; (coord 2 5 '1+ 'sqrt) ;; retourne ((2 1.41421) (3 1.73205) (4 2.0) (5 2.23607)) (defun bv:coord (a b e f) (if (>= a B) (cons (list b ((eval f) B)) nil) (cons (list a ((eval f) a)) (bv:coord ((eval e) a) b e f)))) ;| Variante: Attention coordonnées de la limite supérieure pas systématiquement retourné !!! (defun coord (a b e f) (if (<= a B) (cons (list a ((eval f) a)) (coord ((eval e) a) b e f)))) |; Exemples d’application : Pour tracer au moyen d’une spline la courbe représentative de la fonction f(x) = sin x, définie sur l’intervalle [-5 ; 5] avec un pas de 0.1 entre chaque abscisses. ((lambda (l) (command "_spline") (foreach pt l (command "_none" pt)) (command "" "" "") ) (bv:coord -5 +5 '(lambda (x) (+ x 0.1)) 'sin) ) Pour tracer au moyen d’une polyligne la courbe représentative de la fonction f(x) = 2x²-6, définie sur l’intervalle [-8 ; 15] avec un pas de 1 entre chaque abscisses. ((lambda (l) (command "_pline") (foreach pt l (command "_none" pt)) (command "") ) (bv:coord -8 15 '1+ '(lambda (x) (- (* 2 x x) 6))) ) A+
  8. Bien vu, l'opération boléenne est un bon conseil :) :) :) J’avais effectivement oublié les effets de "typeligne gen" et PLINEGEN sur le code 70. Code corrigé : (while (not (and (setq ent (car (entsel "\nSélectionnez une polyligne fermée: "))) (= "LWPOLYLINE" (cdr (assoc 0 (setq ent (entget ent))))) (if (= 1 (logand (cdr (assoc 70 ent)) 1)) (princ "\nL'object sélectionné est une polyligne fermée") (princ "\nL'object sélectionné est une polyligne ouverte") ) ) ) ) A+ et merci
  9. Re, Une petite dernière plus conforme à ton énoncé de départ et sans employer les filtres de sélection basé sur la consultation des codes DXF via la fonction assoc. (while (not (and (setq ent (car (entsel "\nSélectionnez une polyligne fermée: "))) (= "LWPOLYLINE" (cdr (assoc 0 (setq ent (entget ent))))) (if (= 1 (cdr (assoc 70 ent))) (princ "\nL'object sélectionné est une polyligne fermée") (princ "\nL'object sélectionné est une polyligne ouverte") ) ) ) ) A+
  10. Bonjour, Un peu dans le même esprit que bonuscad qui a été plus rapide, voici une version moins aboutie (qui ne traite que les polylignes optimisée), mais peut-être un peu plus simple à comprendre si on ne maîtrise pas bien les filtres de sélection. ;; Sélectionne une polyligne fermée et renvoie son nom d'entité (defun c:selectCont (/ sel loop) (while (not loop) (if (and (setq sel (entsel "\nSélectionnez une polyligne fermée: ")) (ssget (cadr sel) '((0 . "LWPOLYLINE") (70 . 1))) ) (setq loop (car sel)) (princ "\nSélection non valide !!!") ) ) ) Et une variante reprenant ton énoncé de départ : ;; Sélectionne une polyligne fermée et renvoie son nom d'entité (defun c:selectCont (/ sel loop) (while (not loop) (cond ((not (setq sel (entsel "\nSélectionnez une polyligne fermée: "))) (princ "\n Aucun objet sélectionné !") ) ((ssget (cadr sel) '((0 . "LWPOLYLINE") (70 . 0))) (princ "\n L'object sélectionné est une polyligne ouverte") ) ((ssget (cadr sel) '((0 . "LWPOLYLINE") (70 . 1))) (setq loop (car sel)) ; renvoi le nom de la polyligne fermée ) (T (princ "\n L'object sélectionné n'est pas une polyligne")) ) ) ) A+
  11. Bonjour, Oui et non Tramber, je dirais que c’est plutôt un équivalent à cotlin (à l’option près), d’ailleurs la commande que tu cites n’est pas directement documenté avec F1 : Si tu veux obtenir un semblant d’info concernant la commande citée, il te faut entrer dans le mode cotation : Puis faire F1 et tu auras une aide sommaire de toutes les commandes accessible via ce mode COT : (et leurs correspondances depuis la version 14 de mémoire). Mon lien sur l'aide AutoCAD Les commandes COTROTATION, COTHOR, COTVERTICAL … ne sont donc pas à proprement parlé des commandes non documentées mais plutôt des «racourcis» au mode COT: suivie des instructions ROTATION, HORIZONTALE, VERTICAL conservé par soucis de compatibilité… Merci à toi d’avoir évoqué cette ancienne commande qui m’a permis de tester l’état de ma mémoire.. A+ Bruno
  12. Bonjour, Propriété 'closed D’une façon plus général lorsqu’il y a plusieurs propriétées, je me sers de la fonction suivante, inspiré de ce sujet ;; Copier une liste de propriétées de l'objet 1 sur l'objet 2 (defun bv:copieProp (obj1 obj2 lst) (foreach prop lst (and (vlax-property-available-p obj1 prop) (vlax-property-available-p obj2 prop) (vlax-put obj2 prop (vlax-get obj1 prop)) ) ) ) Adapté à ton code cela donnerait : (defun c:adapter_polyligne () (bv:copieProp (vlax-ename->vla-object (car (entsel "\n Sélectionnez la polyligne Modèle :"))) (vlax-ename->vla-object (car (entsel "\n Sélectionnez la polyligne Cible :"))) '(coordinates closed) ) (princ) ) Cordialement,
  13. VDH-Bruno

    Accrochage

    Bonjour autospeed J’interviens juste pour signaler qu’en privilégiant la syntaxe proposé par (gile) dans l’écriture de ton fichier accrobj.lsp, tu pourras lancer tes accroches objets en transparence (‘) pendant l’exécution d’une commande (ce que ne permet pas l’usage de la fonction command dans ton code). Et si tu apprécies les effets de style, c’est tout à fait le type de fonctions qui peuvent se déclarer sur le modèle utilisé par (gile) dans son fichier Vues_pavé. (mapcar '(lambda (f a) (eval (list 'defun f nil (list 'setvar ''OSMODE a) '(princ)))) '(c:aq c:ac c:ai c:ad c:ae c:am c:an) (list 16 4 32 0 (+ 1 32 4 64 2 8) 2 8) ) A+
  14. Re, Pour le gag, je m’aperçois que je suis finalement pas si malheureux avec ma version 2007, car la fonction étirer fonctionne très bien chez moi en sélection avant.. :D :D :D Bruno (Ps: Bryce désolé de t’avoir entrainé malgré moi dans cette polémique…)
  15. Merci pour l’info, peut-être qu’un jour je gouterai de nouveau aux joies de la nouveauté bien que cela n’en prenne pas le chemin… <_< Bruno (Toujours sous AutoCAD 2007 :unsure: )
  16. Bonjour, Alors loin de moi l’idée de déclencher une polémique mais comme je suis de l’avis de Didier et qu’il n’est plus trop présent sur le forum, je vais tenter de développé à sa place, après j’espère être à la hauteur niveau argumentaire.. Historiquement sous AutoCAD jusqu’à la Release 12 ou 11 je ne sais plus bien, il n’y avait qu’un mode de fonctionnement lancement de la commande puis sélection des objets. Ce mode fonctionne très bien, depuis toujours et avec toutes les commandes AutoCAD quelques soit le type de lancement : Menu déroulant, Icones, Ligne de commande, macro diésel etc.. Alors que pour la méthode sélection puis lancement de la commande, ce n’est pas compatible avec toutes les commandes AutoCAD, dans certain cas cela vient de la commande et sa logique, dans d’autres cas c’est de veilles commandes dont le code n’a jamais dû être mis à niveau, ce qui pose parfois des problèmes de cohérences entre les commandes et qui me fait préférer l’autre méthode.. A titre d’illustration quelques exemples parmi d’autres pour lesquels la sélection avant n’est pas possible: La plupart des commandes AutoCAD nécessitant une sélection unique du type _break (coupure) _dimcenter (Marque centrale) alors que l’effort de mise à niveau a été réalisé pour la commande _offset (décaler). Les commandes demandant de spécifier une source particulière avant de s’appliquer à plusieurs objets (là on comprend la limitation) du type _join (joindre). Les commandes demandant le choix d’une option avant de s’appliquer (comme la plupart des commandes dont on peut désactiver la boite de dialogue) comme par exemple _-dimstyle (modifie les styles de cotes). A ces exemples on peut ajouter les erreurs de macro dans les barres d’outils de certaines commandes, des macro de menu déroulant non compatible avec ce type de sélection, et la plupart des Lisps qui font l’impasse sur ce mode de sélection même si j’ai remarqué que tu y prêtais attention dans les tiens. C’est cela qui fait dire à certains utilisateurs que la sélection avant manque un peu homogénéité dans son comportement et la différence n’est pas seulement philosophique, bien qu’il n’y ai rien de catastrophique non plus.. Cordialement,
  17. Merci pour la correction, je pensais jeter un œil dessus (en ce moment je suis amateur de cette façon de coder)et finalement j’en suis resté à méditer sur l’intérêt de transmettre en argument des fonctions «quoté», ce que je prenais à tord pour une convention (ou un simple respect de la syntaxe utilisée par les fonctions LISP natives) va un peu plus loin, faut jusque je réussisse à formuler cela de façon claire avant d’en faire un petit topo.. A+
  18. Bonjour, Oupss, désolé une coquille dans le code, c’est corrigé plus haut... Normal, je n’avais pas traité le cas de la sélection après car comme indiqué dans ma prose précédente, l’opération peut aisément être réalisé en redéfinissant la commande effacer sur le principe suivant : (defun c:EFFACER () (command "_.erase" (ssget '((-4 . "<NOT") (-4 . "<AND") (0 . "INSERT") (2 . "TOTO,TATA,MomBloc") (-4 . "AND>") (-4 . "NOT>"))) "" ) (princ) ) Pour rendre la redéfinition de la commande effacer possible il faut supprimer la définition de l’actuel définition par la séquence suivante : (command "_.undefine" "EFFACER") En général pour plus de sureté on intègre ce type d’instructions dans la fonction S::STARTUP que l’on définit dans le acaddoc.lsp, comme ceci par exemple : ;; S::STARTUP (Définie ou modifie la fonction) ;; Permet à de redéfinir la commande interne effacer par celle définie précédemment par c: (if S::STARTUP (setq S::STARTUP (append S::STARTUP '((command "_.undefine" "EFFACER") (princ)) ) ) (defun-q S::STARTUP () (command "_.undefine" "EFFACER") (princ) ) ) Voilà sinon sur le même modèle que précédemment une variation peut être plus simple de la fonction commandWillStartcallback (defun commandWillStartcallback (rea lst) (if (and (= (car lst) "ERASE") (cadr (ssgetfirst))) (sssetfirst nil (ssget "_I" '((-4 . "<NOT") (-4 . "<AND") (0 . "INSERT") (2 . "TOTO,TATA,MomBloc") (-4 . "AND>") (-4 . "NOT>")))) ) ) Dans la fonction de sélection c’est l’expression codé en dure (2 . "TOTO,TATA,MomBloc") qu’il faut personnaliser. Tout ceci est un principe général à terme l’idéal étant de substituer l’ expression "TOTO,TATA,MomBloc" par une variable globale que tu paramétrera suivant les blocs à verrouiller (et/ou à déverouillé). A+
  19. Merci (gile), c’est très intéressant comme façon de faire :) :) :) Juste une petite suggestion sur la forme, il me semble qu'en ne quotant pas la fonction lambda passé en argument à la fonction sortBy, on doit pouvoir économiser l'expression (setq fun (eval fun)) qui fait un peu symétrique, mais a sans doute le mérite d'être plus conventionnel: (defun sortBy (fun lst) (vl-sort lst '(lambda (x1 x2) (< (fun x1) (fun x2)))) ) (defun sortDate (lst) (sortBy (lambda (s) (strcat (substr s 7) (substr s 4 2) (substr s 1 2)) ) lst ) ) ----------- Edit ---------------- En voulant tester, pour minBy & maxBy j'ai le message d'erreur suivant: Si j'ai un peu de temps en soirée j'essayerai de regarder plus dans le détail.. A+
  20. Salut, Pas trop difficile avec la foison de routines laissé par (gile) sur le forum: (defun tridates (lst) (mapcar '(lambda (x) (lst2str (reverse x) "/")) (vl-sort (mapcar '(lambda (x) (reverse (str2lst x "/"))) lst) 'compareList ) ) ) Avec les routines associées suivantes : ;; STR2LST ;; Transforme un chaine avec séparateur en liste de chaines ;; ;; Arguments ;; str : la chaine à transformer en liste ;; sep : le séparateur ;; ;; Exemples ;; (str2lst "a b c" " ") -> ("a" "b" "c") ;; (str2lst "1,2,3" ",") -> ("1" "2" "3") ;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ;; LST2STR ;; Concatène une liste et un séparateur en une chaine ;; ;; Arguments ;; lst : la liste à transformer en chaine ;; sep : le séparateur ;; ;; Exemples ;; (lst2str '(1 2 3) ",") -> "1,2,3" ;; (lst2str '("a" "b" "c") " ") -> "a b c" (defun lst2str (lst sep) (if (cadr lst) (strcat (vl-princ-to-string (car lst)) sep (lst2str (cdr lst) sep) ) (vl-princ-to-string (car lst)) ) ) ;; Compare des listes par la tête ;; http://cadxp.com/index.php?/topic/29470-trier-une-liste/page__p__160087#entry160087 (defun compareList (l1 l2) (if (and (and l1 l2) (= (car l1) (car l2))) (compareList (cdr l1) (cdr l2)) (< (car l1) (car l2)) ) ) Donc pour avoir : _$ (setq list_dates_debut (tridates '("31/12/2012" "28/10/2011" "01/03/2010" "25/04/2009"))) ("25/04/2009" "01/03/2010" "28/10/2011" "31/12/2012") $ (setq list_dates_fin (tridates '("30/11/2015" "21/08/2013" "01/04/2012" "26/05/2009"))) ("26/05/2009" "01/04/2012" "21/08/2013" "30/11/2015") _$ (car list_dates_debut);retourne le min "25/04/2009" _$ (car list_dates_fin);retourne le min "26/05/2009" _$ (last list_dates_debut);retourne le max "31/12/2012" _$ (last list_dates_fin);retourne le max "30/11/2015" A+
  21. Bonjour Didier, Etant un utilisateur d’AutoCAD de longue dates, tu prêche un convaincu, mais dans ce cas le but du jeu consiste empêcher l’effacement de certains type de blocs (sans passer par le verrouillage des calques). De façon simple l’opération consiste à redéfinir la commande _erase sauf que lorsqu’elle est appelé par la touche suppr, elle est précédé du point _.erase (ce qui rend caduc la redéfinition de commande). Ne connaissant pas la solution sous AutoCAD pour redéfinir la touche suppr, et ne pouvant raisonnablement pas empêché sont utilisation (à moins de l’ôter du clavier), j’ai suggéré une solution avec un réacteur pour filtrer les sélections avant(gripper) dans le cas où la commande erase est appelé (c’était également pour moi l’occasion de m’exercer un peu dans ce domaine). A+
  22. Re, Lecrabe, Je passe assez de temps à comprendre pourquoi les choses ne fonctionnent pas, que comme toi pour une fois je serai curieux de savoir pourquoi ça marche :) J’ai pas la possibilité de tester ta configuration, sinon je me serai intéressé à ce qui ce passe dans ton PS2 et le dézippage, puis le transfert vers les autres postes de travail.. A+
  23. Bonjour, Pour confirmer les propos d’Olivier sur les problèmes de chargement de dll et de téléchargement de fichiers internet en général, pour info et en complément, je rappellerai les éléments de réponses des sujets suivants : Import/Export d\'attributs avec Excel Mise sur le réseau d\'une dll en c# C’est rigolo ça ! Soit un mystérieux effet clef USB ou alors les postes en question n’ont pas le Framework 4 d’installé.. A+
  24. Bonjour, Eventuellement oui, tu peux également en chargement automatique via Outils->AutoLISP->Charger une application… puis le bouton contenue pour les applications chargés au démarrage. Ce qui compte c’est que le code soit chargé (donc le réacteur d’évènement) dans la session de dessin courante. Ps : J’ai une peu simplifier le code donné précédemment, je me suis aperçu que j’avais réécrit la fonction member. A+
  25. Bonjour, Je viens de voir ta réponse, finalement ce n’étais pas si obscure que cela, je pense plutôt que c’est moi qui était complétement passé à côté du sujet.. Donc en reprenant le problème depuis le départ. Ne sachant pas comment paramétrer la touche Suppr, ceci devrait fonctionner pour les problèmes de sélections avant pour la touche 'Suppr' et le bouton 'effacer' . Dans le code personnalise la ligne suivante '("TOTO" "TATA" "MomBloc") Par la liste des blocs que tu souhaites protéger. (or *commandreactor* (setq *commandreactor* (vlr-command-reactor nil '((:vlr-commandWillStart . commandWillStartcallback))) ) ) (defun commandWillStartcallback (rea lst / ss) (if (and (= (car lst) "ERASE") (setq ss (cadr (ssgetfirst)))) (progn (mapcar '(lambda (x / dxf) (if (and (= (type (setq x (cadr x))) 'ENAME) (= (cdr (assoc 0 (setq dxf (entget x)))) "INSERT") (member (cdr (assoc 2 dxf)) '("TOTO" "TATA" "MomBloc")) ) (ssdel x ss) ) ) (ssnamex ss) ) (sssetfirst nil ss) ) ) ) Voilà si cela peut t’inspirer.. A+ Edit1: Simplifié le code Edit2: Corrigé coquille
×
×
  • 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é