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
-
Merci (gile) pour ta réactivité et toutes ces précisions je vais tester et décortiquer tes exemples. Histoire de m’imprégner un peu plus de tous cela.. A+ Bruno
-
Bonsoir à tous, Je me lance en ActiveX et je me suis enfin décidé à lâcher mon bon vieux fichier d’aide version R14 (français), pour les fichiers d’aides plus actuels mais en anglais, la bonne nouvelle c’est qu’à force d’insister je commence timidement à déchiffrer l’anglais.. La mauvaise c’est que je ne saisie pas encore bien toutes les subtilités de language.. J’aurais une question de syntaxe toute bête à soumettre au sujet d’ActiveX, prenons un code simple (qui peut ce généraliser à la plupart des propriétés) par exemple rendre le calque 0 inactif dans le dessin courant. Pour faire cela j’ai testé qu’avec ActiveX deux syntaxes sont possibles. La syntaxe avec vlax du type: (vlax-put-property object property argument) ou (vlax-get-property object property) Le code ;; Calque 0 courant avec syntaxe vlax- (defun calque0 (/ document calques) (vl-load-com) (setq document (vlax-get-property (vlax-get-acad-object) 'activedocument)) (setq calques (vlax-get-property document 'layers)) (vlax-put-property document 'activelayer (vla-item calques "0")) ) Ou privilégier la syntaxe vla du type: (vla-put-propr object argument) ou (vla-get-propr object) Le code ;; Calque 0 courant avec syntaxe vla- (defun calque0 (/ document calques) (vl-load-com) (setq document (vla-get-activedocument (vlax-get-acad-object))) (setq calques (vla-get-layers document)) (vla-put-activelayer acaddocument (vla-item calques "0")) ) Mes questions sont les suivantes pourquoi faire 2 syntaxes, laquelle privilégier, et sont elles toujours possible.. (à priori je suis tenté de dire oui). Merci à ceux qui pourront m’éclairer. Bruno
-
geler des calques avec avec un programe lisp
VDH-Bruno a répondu à un(e) sujet de 1308 dans AutoCAD 2012
Re, Le temps de trouver la bonne syntaxe pour rendre le calque 0 courant et je te propose une variante cette fois ci en gelant toutes les couches non dépendantes des Xref (et sauf le calque 0). ;; Gel tous les calques sauf 0 et ceux dépendant des Xref (defun c:layerfreez (/ acaddocument layers) (vl-load-com) (setq acaddocument (vla-get-activedocument (vlax-get-acad-object)) layers (vla-get-layers acaddocument) ) (vla-put-activelayer acaddocument (vla-item layers "0")) (vlax-map-collection layers '(lambda (layer) (if (not (wcmatch (vlax-get-property layer 'Name) "*|*,0")) (vla-put-freeze layer :vlax-true) ;; ou (vlax-put-property layer "Freeze" ':vlax-true) ) ) ) (princ) ) (Ps : Si d’autres Lispeurs plus aguerri voient une énormité, leurs grains de sel sont les bienvenues) A+ -
geler des calques avec avec un programe lisp
VDH-Bruno a répondu à un(e) sujet de 1308 dans AutoCAD 2012
Salut 1308 Je passais dans le coin, je réponds à ce que je comprends de ta demande pour m’exercer avec ActiveX (ce qui est tout neuf pour moi), à tester.. ;; Désactive tous les calques sauf ceux dépendant des Xref (defun c:layeron () (vl-load-com) (vlax-map-collection (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)) ) '(lambda (layer) (if (not (wcmatch (vlax-get-property layer 'Name) "*|*")) (vla-put-layeron layer :vlax-false) ) ) ) (princ) ) J’ai légèrement (et volontairement) varianté ton souhait de geler en en désactiver, car il n’est pas possible de rendre courant un calque dépendant d’une Xref pour pouvoir geler tous (ce que j'ai supposé) les autres calques.. A+ -
+1 (à voté) :D (gile)merci pour les explications, grâce à toi ce soir j’ai comblé des lacunes :)
-
Bonsoir, Après Dennis Ritchie (le créateur du language C),c’est le tour de John McCarthy (le père du Lisp), c’est bien triste tout cela.. Cela fait prendre conscience que nous sommes leurs contemporains, à titre personnel c’est bien la première fois que j’étudie une science dont les créateurs ne sortent pas d’un livre d’histoire.. Même si une page se tourne..
-
Clap clap clap je l’avais oublié celle-là merci Tramber de me rafraichir la mémoire, sinon pour me faire la main et comme je l’ai fait. Ci-joint les versions du code de didier avec command décliné: A la sauce entmake (defun c:cm (/ centre rayon) (if (setq centre (getpoint "\nPointez le centre du cercle multiple\n")) (while (setq rayon (getdist centre "\nValeur du rayon ?")) (entmake (list '(0 . "CIRCLE") (cons 10 centre) (cons 40 rayon)) ) ) ) (princ) ) Et à la sauce ActiveX (defun c:cm (/ centre rayon mspace) (if (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) centre (getpoint "\nPointez le centre du cercle multiple\n") ) (while (setq rayon (getdist centre "\nValeur du rayon ?")) (vla-addCircle mspace (vlax-3d-point centre) rayon) ) ) (princ) ) A+ Bruno (Ps : Bien souvent la paresse oblige à être astucieux, donc ce n’est pas toujours un vilain défault..)
-
Salut jalna, Pour faire plus "beau" remplace: (setq rayon(getreal"\nValeur du rayon ?")) par (setq rayon (getdist centre "\nValeur du rayon ?")) A+
-
Salut, A titre personnel je trouve cela plutôt bien par rapport à l’ancienne version de CADXP, cela permet de juger de l’intérêt d’un forum sur une période plus ou moins longue avant de s’inscrire et de participer (ou de passer son chemin). Cela permet également de suivre de façon anecdotique certains forums sans multiplier les inscriptions, par exemple il m’arrive de regarder épisodiquement des discussions sur TheSamp sachant bien que je ne m’inscrirai jamais pour poster étant dans l’incapacité d’aligner 2 mots d’anglais correctement.. Sinon pour l’anecdote sur l’ancienne version de CADXP il existait une solution pour suivre les discussions sans être inscrit et de passer outre le message : vous devez être enregistré pour voir les réponses. Il suffisait tout simplement de cliquer sur l’icône d’impression du site et la discussion s’affichait à l’écran sur fond blanc. A+ Bruno
-
Lisp pour extraire les coordonnées de l'intersection des axes
VDH-Bruno a répondu à un(e) sujet de Maxime85 dans Pour aller plus loin en LISP
J’en suis heureux juste une dernière chose, pour info et faire suite à une discussion avec Patrick_35 ici, il serait visiblement préférable (plus stable) d’utiliser cette version de la sous routine bv:ListInters (defun bv:ListInters (ss / lst sel) (cond (ss (vlax-for obj (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)) ) ) (setq lst (cons obj lst)) ) (vla-delete sel) (remove_doubles (apply 'append (mapcar '(lambda (x) (bv:xyz->Pt (vlax-invoke (car x) 'IntersectWith (cadr x) 0) ) ) (bv:matches lst) ) ) ) ) ) ) -
Lister les intersections d’objets d'un jeu de sélection
VDH-Bruno a répondu à un(e) sujet de VDH-Bruno dans Routines LISP
Pour info j'ai toujours pas réussi à faire planter le Lisp..;) (testé sur une version 2007 du Boulot) Ouais mais pour l'instant je vais y entréer timidement dans la cour des grands, car un heureux événement récent me raccourci les nuits et j'avoue ne plus récupérer aussi bien qu'avant :D A+ -
Lister les intersections d’objets d'un jeu de sélection
VDH-Bruno a répondu à un(e) sujet de VDH-Bruno dans Routines LISP
Re Patrick_35, J'ai essayé ce que tu m'as dit, je n'ai pas réussi à reproduire ce que tu m'a décris. La fonction semble stable. Pour tester: (repeat 1000 (princ "\n")(princ (bv:ListInters T))) ou (repeat 1000 (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)) ) ) A suivre... -
Lister les intersections d’objets d'un jeu de sélection
VDH-Bruno a répondu à un(e) sujet de VDH-Bruno dans Routines LISP
Salut, Etrange je m’explique mieux l’introduction de ta variable sel, ce que tu dis défi mon entendement , j’essaierai de reproduire ce que tu décris pour me faire une idée.. En espérant que l’aventure Automation ActiveX ne soit pas qu’une suite de phénomène inexpliqué.. A+ et merci -
Lisp pour extraire les coordonnées de l'intersection des axes
VDH-Bruno a répondu à un(e) sujet de Maxime85 dans Pour aller plus loin en LISP
Re maxwell85, Je te propose le code suivant cela devrait répondre à ton besoin on doit pouvoir faire mieux, j’ai été au plus simple et au plus rapide pour moi (c'est la pose déjeuné). A+ Bruno (Ps : j’ai préféré l’espace au point comme séparateur) Le code principal (defun c:FichInter (/ Lpt fich) (cond ((setq Lpt (bv:ListInters (ssget))) ; à affiner suivant besoin (setq fich (open (getfiled "Créez ou sélectionnez un fichier" "" "txt" 33) "a" ) ) (foreach pt Lpt (write-line (strcat (rtos (car pt) 2 3) " " (rtos (cadr pt) 2 3) " " (rtos (caddr pt) 2 3) ) fich ) ) (close fich) ) ) (princ) ) Les routines associées ;; Transforme une liste de coordonnées en liste de point ;; Argument: Une liste du type (x1 y1 z1 x2 y2 z2 x3 y3 z3 ...) ;; Retourne: Une liste du type ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) ...) ;; soit (p1 p2 p3 ...) ;; Exemples : ;; (bv:xyz->Pt '(x1 y1 z1 x2 y2 z2)) -> ((X1 Y1 Z1) (X2 Y2 Z2)) ;; (bv:xyz->Pt '(x1 y1 z1)) -> ((X1 Y1 Z1)) (defun bv:xyz->Pt (L) (if L (cons (list (car L) (cadr L) (caddr L)) (bv:xyz->Pt (cdddr L)) ) ) ) ;; matches (renvoie les combinaisons 2 à 2 sans répétition). ;; Argument: Une liste du type (A B C D) ;; Retourne: Une liste du type ((A B) (A C) (A D) (B C) (B D) (C D)) (defun bv:matches (L) (if (cdr L) (append (mapcar '(lambda (x) (list (car L) x)) (cdr L)) (bv:matches (cdr L)) ) ) ) ;; Extrait du fichier Listes.lsp ;; REMOVE_DOUBLES - Auteur (gile) ;; Suprime tous les doublons d'une liste (defun remove_doubles (lst) (if lst (cons (car lst) (remove_doubles (vl-remove (car lst) lst))) ) ) ;; ----------------------------------------------------------------------------- ;; Liste toutes les intersections présentent dans le jeu de sélection ;; (Avec suppression des points en doublons) ;; ----------------------------------------------------------------------------- ;; Argument: Un jeu de sélection du type <Selection set: 2a> ;; Retourne: Une liste de point du type ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) ...) (defun bv:ListInters (ss / lst) (cond (ss (vlax-for obj (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)) ) (setq lst (cons obj lst)) ) (remove_doubles (apply 'append (mapcar '(lambda (x) (bv:xyz->Pt (vlax-invoke (car x) 'IntersectWith (cadr x) 0) ) ) (bv:matches lst) ) ) ) ) ) ) -
Lister les intersections d’objets d'un jeu de sélection
VDH-Bruno a répondu à un(e) sujet de VDH-Bruno dans Routines LISP
Nouvelle version encore merci à Patrick_35 pour son activeselectionset, plus ajout d'un contrôle en cas de sélection vide. ;; ----------------------------------------------------------------------------- ;; Liste toutes les intersections présentent dans le jeu de sélection ;; (Avec suppression des points en doublons) ;; ----------------------------------------------------------------------------- ;; Argument: Un jeu de sélection du type <Selection set: 2a> ;; Retourne: Une liste de point du type ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) ...) (defun bv:ListInters (ss / lst) (cond (ss (vlax-for obj (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)) ) (setq lst (cons obj lst)) ) (remove_doubles (apply 'append (mapcar '(lambda (x) (bv:xyz->Pt (vlax-invoke (car x) 'IntersectWith (cadr x) 0) ) ) (bv:matches lst) ) ) ) ) ) ) -
Lisp pour extraire les coordonnées de l'intersection des axes
VDH-Bruno a répondu à un(e) sujet de Maxime85 dans Pour aller plus loin en LISP
Salut maxwell85 C’est ce qu’il fait sauf qu’il te renvoie les coordonnés sous forme de liste... Utilise le code fourni en lien réponse n°11 charge le dans Visual LISP, ainsi que les routines associées. Une fois chargé tape (bv:ListInters (ssget)) dans la consol Visual LISP ou sur la ligne de commande pour tester. En retour tu devrais avoir la liste des intersections des objets sélectionnés sous cette forme: ((X1 Y1 Z1) (X2 Y2 Z2) (X3 Y3 Z3) … (Xn Yn Zn)) A toi de traité cette valeur en retour, avec une boucle et les lignes de code donné par Didier cela ne devrai pas poser trop de problème pour écrire cela dans un fichier txt.. A+ -
Lister les intersections d’objets d'un jeu de sélection
VDH-Bruno a répondu à un(e) sujet de VDH-Bruno dans Routines LISP
Salut Tramber Pour bv :matches (et pour la petite histoire) c’est la première fonction récursive que j’ai écrite, il y a presqu’ 1 an… (je me souviens, j’étais tout fier :D ). Tu trouveras ici sur le site du zéro, l’algorithme dont je m’étais inspiré à l’époque. Pour Qbrick il existe certainement beaucoup de fonctions dont je n’ai pas encore connaissance car je ne vois pas le moyen de réaliser cela facilement.. A+ Bruno (Ps : Félicitations et bon courage pour ton investissement dans la modération du forum) -
Lister les intersections d’objets d'un jeu de sélection
VDH-Bruno a répondu à un(e) sujet de VDH-Bruno dans Routines LISP
Bonsoir Patrick_35, Comme toujours j’en suis très heureux, pour activeselectionset tu m’en apprends, merci et je vais analyser tous cela avec intérêt. Si cette année je me suis construit de bonnes bases en Lisp pur, en Visual Lisp je débute tout juste.. Et avec la nouvelle version de ce forum difficile de retrouver les anciens messages que j’avais repéré, notamment 2 ou 3 posts bien explicite pour se lancer avec ActiveX (sujet datant de 2006 ou 2007 dont tu étais l’auteur il me semble…). A+ -
Lisp pour extraire les coordonnées de l'intersection des axes
VDH-Bruno a répondu à un(e) sujet de Maxime85 dans Pour aller plus loin en LISP
Bonjour maxwell85, Regarde ici, j’ai posté un code qui devrait te donner certains éléments de réponse. A+ -
Lister les intersections d’objets d'un jeu de sélection
VDH-Bruno a posté un sujet dans Routines LISP
Bonjour, Ce sujet m’a inspiré pour écrire une routine qui permet de lister tous les points d’intersections d’objets contenu dans un jeu de sélection. Je n’ai pas testé en profondeur mais ça à l’air de tenir la route, personnellement je vais m’en servir pour positionner rapidement des blocs sur une trame préalablement dessiner. Voilà au cas où d’autres participants aux forums en auraient l’usage.. A+ Le code: ;; VDH-Bruno le 12/10/2011 ;; ----------------------------------------------------------------------------- ;; Liste toutes les intersections présentent dans le jeu de sélection ;; (Avec suppression des points en doublons) ;; ----------------------------------------------------------------------------- ;; Argument: Un jeu de sélection du type <Selection set: 2a> ;; Retourne: Une liste de point du type ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) ...) (defun bv:ListInters (ss) (remove_doubles (apply 'append (mapcar '(lambda (x) (bv:xyz->Pt (vlax-invoke (vlax-ename->vla-object (car x)) 'IntersectWith (vlax-ename->vla-object (cadr x)) 0 ) ) ) (bv:matches (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) ) ) ) ) ) Codes des routines associées: ;; Transforme une liste de coordonnées en liste de point ;; Argument: Une liste du type (x1 y1 z1 x2 y2 z2 x3 y3 z3 ...) ;; Retourne: Une liste du type ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) ...) ;; soit (p1 p2 p3 ...) ;; Exemples : ;; (bv:xyz->Pt '(x1 y1 z1 x2 y2 z2)) -> ((X1 Y1 Z1) (X2 Y2 Z2)) ;; (bv:xyz->Pt '(x1 y1 z1)) -> ((X1 Y1 Z1)) (defun bv:xyz->Pt (L) (if L (cons (list (car L) (cadr L) (caddr L)) (bv:xyz->Pt (cdddr L)) ) ) ) ;; matches (renvoie les combinaisons 2 à 2 sans répétition). ;; Argument: Une liste du type (A B C D) ;; Retourne: Une liste du type ((A B) (A C) (A D) (B C) (B D) (C D)) (defun bv:matches (L) (if (cdr L) (append (mapcar '(lambda (x) (list (car L) x)) (cdr L)) (bv:matches (cdr L)) ) ) ) ;; Extrait du fichier Listes.lsp ;; REMOVE_DOUBLES - Auteur (gile) ;; Suprime tous les doublons d'une liste (defun remove_doubles (lst) (if lst (cons (car lst) (remove_doubles (vl-remove (car lst) lst))) ) ) Eventuellement pour tester (bv:ListInters (ssget)) -
Lisp pour extraire les coordonnées de l'intersection des axes
VDH-Bruno a répondu à un(e) sujet de Maxime85 dans Pour aller plus loin en LISP
Bonjour, Pour rebondir sur la remarque de Patrick_35 Avec IntersectWith en plus de fonctionner avec les arcs splines etc.. Cela retourne également les intersections multiples, s’il y a lieu sous forme d’une liste de coordonnées. A titre d'indication l’astuce que j’utilise avec IntersectWith c’est de travailler avec des listes de points, à cette fin j’utilise cette petite routine qui transforme les listes de coordonnées (x1 y1 z1 x2 y2 z2 ...) en liste de points ((x1 y1 z1) (x2 y2 z2) ...). ;; Transforme une liste de coordonnées en liste de point ;; Argument: Une liste du type (x1 y1 z1 x2 y2 z2 x3 y3 z3 ...) ;; Retourne: Une liste du type ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) ...) ;; soit (p1 p2 p3 ...) ;; Exemples : ;; (bv:xyz->Pt '(x1 y1 z1 x2 y2 z2)) -> ((X1 Y1 Z1) (X2 Y2 Z2)) ;; (bv:xyz->Pt '(x1 y1 z1)) -> ((X1 Y1 Z1)) (defun bv:xyz->Pt (L) (if L (cons (list (car L) (cadr L) (caddr L)) (bv:xyz->Pt (cdddr L)) ) ) ) Tu peux donc modifier ton programme comme ceci: (setq valint (bv:xyz->Pt (vlax-invoke (vlax-ename->vla-object l1) 'IntersectWith (vlax-ename->vla-object l2) 0))) Puis utilise une boucle au cas où tu aurais plusieurs coordonnées de points à écrire dans ton fichier. Mais attention pour la suite du traitement sur valint dans ton code, car les coordonnées (x y) sont à une profondeur supplémentaire. Voilà comment je procède, il a certainement d’autres façon de faire.. A+ Bruno -
Lisp pour extraire les coordonnées de l'intersection des axes
VDH-Bruno a répondu à un(e) sujet de Maxime85 dans Pour aller plus loin en LISP
C’est bien naturel, à charge de revanche ;) -
Jolie organisation Patrick, j’en comprend l’esprit même si la plus part des termes utilisés ne me parle pas vraiment (flux RSS, widget Google Reader, hubs Viadeo, groupes LinkedIn..). Le jour ou le besoin se fera vraiment sentir je saurai ou chercher, merci.
-
Bon c’est pas méchant comme bug, ça ne m’empêchera pas de m’inscrire le jour ou j’aurai trouvé une organisation de vie me permettant de suivre et de contribuer à plus d’un forum à la fois.. A+ Bruno
-
Merci (gile) c’est gentil, mon seul mérite est d’avoir un coup d’avance sur Bortch59 pour avoir déjà décortiqué ses lignes de codes par le passé..
