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
-
Bonjour, D’un autre coté entre propulsé sur AutoCAD sans formation initial, au départ c’est un peu du chinois.. :D Désolé, ok je sort.. :unsure: Sinon chapeau bas, la preuve d’une grande persévérance. A+
-
Salut -Olivier- Car la réciproque n’est pas vrai (pas d’application 64bit sous un système en 32bit) .. A+
-
Bonjour, Pas de problème chez moi ça marche ou on ne s’est pas bien compris.. (pour les smilley met un espace entre la parenthèse et le B ) Tout simplement parce que le lisp est un language interprété (non compilé), l’interpréteur lisp est intégré dans AutoCAD, VLisp est lui un IDE (environnement de développement intégré) mais l’interpréteur c’est toujours AutoCAD, en clair tu peux écrire et exécuter directement un programme lisp sur la ligne de commande. Pour y aller de ma petite théorie, je pense que historiquement l’on doit l’implémentation de la division dans AutoCAD à la commande Zoom qui permet de spécifier une valeur de zoom de façon fractionnaire, ce qui est pratique pour la mises à l’échelle des fenêtres de présentations Zoom XP (1/3xp, 1/75xp etc..) Cordialement, Bruno
-
Bonjour, Actuellement c’est la configuration de mon poste et de celle de mes collègues et sa tourne, même si c’est pas génial génial.. Eventuellement en installant AutoCAD sous une virtualisation window en xp, il semblerai que cela donne de meilleur résultat, à voir pas testé personnellement. A+
-
Bonjour Tramber, Le fichier de configuration Vlisp est bien VLIDE.DSK C: \ Utilisateur \ nom_utilisateur \ AppData \ Roaming \ Autodesk \ AutoCAD xxx\ Rxx.x \ fra \ VLIDE.DSK Oui et des fois il est tellement bien planqué qu’il n’existe même pas (je m’en suis aperçu à la lecture de cette discussion http://cadxp.com/topic/37156-oups-la-boulette/) Dans ce cas (et pour compléter le post au cas où) l’astuce consiste à aller dans l’éditeur Vlisp puis dans la barre de menu -> Outils -> Attribut de la fenêtre -> Configurer la fenêtre active puis changer certaines couleurs, fermez AutoCAD et le fichier est généré. Source : http://adndevblog.typepad.com/autocad/2012/07/vlisp-window-attributeconfigure-current-may-fail-on-autocad-64-bit.html Mes besoins en lisp étant très modeste je n’ai jamais travaillé sur 5 projet simultané, je les ouvre aisément via l’historique de la barre de menu -> Projet Liste que tu retrouves en tête du fichier VLIDE.DSK (fichier lisp) dans la liste des projets _%PROJECT-LIST% ;# VLIDE desktop file [v.3]. DO NOT EDIT!!! (:AL (_%PROJECT-LIST% ("C:/Users/b.vandenheede/Documents/main2/main2.prj" :APEX nil :SORT nil :MULTIPLE-SELECTION nil) ("C:/Users/b.vandenheede/Documents/main1/main1.prj" :APEX nil :SORT nil :MULTIPLE-SELECTION nil) ("C:/Users/b.vandenheede/Documents/espace de nom/perimcarre.prj" :APEX nil :SORT nil :MULTIPLE-SELECTION nil)) … A+ Bruno (Ps : DSK on pouvait difficilement faire plus mémo-technique… ;) ) ______________________________________________________________________________ Edit: Pour le retour et suite à ma réponse pas de soucis pour moi, si je quitte et rouvre AutoCAD je conserve bien tous mes projets ouvert simultanément à l’écran..
-
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Teste les codes de la réponse n°18, je pense que tu as la une bonne base de départ il suffit de spécifier le nom de ton paramètre pour récupérer ton point, après il ne reste plus qu'a adapter suivant ton besoin. A+ -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Non pas à ma connaissance, car il ne peut y avoir qu’un seul point de base dans un bloc, pour tes essais il faut bien ajouter le paramètre point et pas point de base dans la conception de ton bloc via l’éditeur de bloc. A+ -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Re, Le bloc n’est pas obligé d’être dynamique, pour avoir un paramètre point tu n’es pas obligé de lui associé un paramètre d’action. Voir ce sujet : http://cadxp.com/topic/36132-multi-points-de-base-dans-bloc-dynamique/page__view__findpost__p__196351 L’information ainsi créé étant non graphique pas de soucis lors de la décomposition, et sur ta bibliothèque de bloc a part offrir des possibilités étendue de points d’insertions , je ne vois pas d’inconvénient particulier. Pour ce besoin je sais que certains utilise un masque, ou une hachure solide en jouant après sur l’ordre de tracé pour avoir l’effet souhaité. A+ -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Bonjour, Pour mon cas personnel c’était plus tenter de répondre à l’intitulé du sujet «Définir des points particuliers sur un bloc», et je trouvais intéressant de passer par les attribut pour montrer que l’on peut exploiter autre chose que leurs valeurs, comme par exemple leurs coordonnées d’insertions en fonction de leurs libellés et ainsi s’affranchir du calcul des transformations de rotations, d’échelles et de translations. De plus la recherche de solution me permet sur un plan personnel d’approfondir certaines notions et dans le cas présent je n’avais jamais songé à la propriétés constant des attributs. Sinon pour moi c’est une solution comme tant d’autres, il est sûr que je n’ai pas ton recul et ton expérience sur le sujet. Sinon pour me répondre et explorer des pistes qui me sont encore inconnue, l’idée d’exploiter les propriétés dynamique des blocs semble également fonctionner. D’autant plus que (gile) ayant été une fois de plus très généreux sur le sujet, c’est trés confortable pour le lispeur amateur que je suis de passer après, donc en repartant des codes publier ici : http://cadxp.com/topic/30066-modifier-un-bloc-dynamique-en-fonction-de-son-attribut/ ;; gc:GetDynProps ;; Retourne la liste des propriétés dynamiques de la référence de bloc ;; sous forme d'une liste de paires pointées : (nom_propriété . propriété) ;; ;; Argument ;; blk : le bloc (ename ou vla-object) (defun gc:GetDynProps (blk / lst) (vl-load-com) (and (= (type blk) 'ENAME) (setq blk (vlax-ename->vla-object blk))) (if (and (= (vla-get-ObjectName blk) "AcDbBlockReference") (= (vla-get-IsDynamicBlock blk) :vlax-true)) (foreach p (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties blk))) (setq lst (cons (cons (vla-get-PropertyName p) p) lst)) ) ) (reverse lst) ) ;; gc:GetDynPropValue ;; Retourne la valeur d'une propriété dynamique ;; ;; Arguments ;; blk : la référence de bloc (ename ou vla-object) ;; name : le nom de la propriété (sensible à la casse) (defun gc:GetDynPropValue (blk name / val) (vl-load-com) (if (setq prop (assoc name (gc:GetDynProps blk))) (vlax-variant-value (vla-get-Value (cdr prop))) ) ) Pour tester je me suis créer un bloc simple un carré de 10x10 auquel j’ai ajouté quatre paramètre point nommé Pos1, Pos2, Pos3, Pos4 à chaque sommet. Pour voir les paramètres de la référence de bloc : _$ (gc:GetDynProps (car (entsel))) (("Pos1 X" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e450704>) ("Pos1 Y" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e450f54>) ("Pos2 X" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e450f34>) ("Pos2 Y" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e450f14>) ("Pos3 X" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e452f84>) ("Pos3 Y" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e452f04>) ("Pos4 X" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e452e84>) ("Pos4 Y" . #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 2e452e04>) ) Pour récupérer par exemple les coordonnées (SCO) du paramètre point Pos1: ((lambda (eName pName) (list (gc:GetDynPropValue eName (strcat pName " X")) (gc:GetDynPropValue eName (strcat pName " Y"))) ) (car (entsel)) "Pos1" ) Retourne (-5.0 5.0) Le point retourné portant déjà des éventuelles transformations d’échelle, il ne reste plus qu’une rotation et un déplacement pour traduire les coordonnées dans le SCG (à condition que le SCO // SCG) ((lambda (eName pName / eDxf ang pins pt) (setq eDxf (entget eName) ang (cdr (assoc 50 eDxf)) pins (cdr (assoc 10 eDxf)) pt (list (gc:GetDynPropValue eName (strcat pName " X")) (gc:GetDynPropValue eName (strcat pName " Y")) 0.0 ) ) (mapcar '+ (polar '(0. 0. 0.) (+ (angle '(0. 0. 0.) pt) ang) (distance '(0. 0. 0.) pt)) pins) ) (car (entsel)) "Pos1" ) Retourne (285.702 395.764 0.0) Remarque: L’inconvénient de la méthode c‘est que sur 2007, les blocs dynamiques ne supportent que les échelles homogènes en X, Y et Z. A+ -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Je pense qu’il y a également d’autres pistes de réflexion comme par exemple utiliser un ou plusieurs paramètres points lors de la création du bloc, il me semble avoir aperçu des codes utilisant les propriétés dynamique des bloc mais n’ayant jamais rien codé de tel, je ne peux à mon niveau garantir un résultat concluant, à voir.. A+ -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Le même qu'une définition d'attribut sur un calque gelé ;) A+ -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Bonsoir, Effectivement je n'avais jamais fait attention qu'avec constant on avait pas accès à la définition de l'attribut. Personnellement je ne me suis jamais servi de cette option ou alors très rarement et il y a très longtemps. Pour éviter de saisir une valeur lors de l'insertion je me sers de la propriété Prédéfini. Après un test rapide avec l'option prédéfini aucun soucis: _$ (GetPosAttribs (car (entsel))) (("POS3" 2606.56 1609.58 0.0) ("POS2" 2606.96 1604.11 0.0)) _$ Je récupère bien le point d'insertion de mes deux étiquette d'attributs Pos3 et Pos2 définie dans ma référence de bloc. Cordialement, -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Bonjour, C’est l’illustration de ce que souhaitait azerty9 Le souci dans ce cas c’est qu’il te faudra tenir compte du point d’insertion de ta référence ainsi que de son l’échelle d’insertion, pour modifié les coordonnées de ton point que tu auras récupéré en parcourant la définition de ton bloc. Et dans l’hypothèse ou l’on voudrait définir plusieurs points comment les distinguer? Dans ma suggestion précédente, au développement succinct l’idée implicite n’était pas de récupérer la fonction GetAttribs tel quel, l’astuce dans mon esprit consistait à modifier légèrement le code de façon à récupérer la position des attributs en fonction de leurs étiquettes, à condition de positionner la définition de l’attribut au point désiré dans la définition de bloc. Pour ainsi obtenir directement les coordonnés pour la prochaine insertion en fonction de l’étiquette du bloc (Ce qui permettrait même de pouvoir en définir aisément plusieurs) La fonction s’écrivant par exemple comme ceci. ;; GetPosAttribs ;; Retourne une liste de paire pointées (TAG . Position) par attribut contenus dans le bloc ;; Position -> code DXF 10 ;; Argument ;; ent : le nom d'entité (ENAME) de la référence de bloc (defun GetPosAttribs (ent / elst lst) (setq ent (entnext ent)) (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent))))) (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 10 elst))) lst) ent (entnext ent) ) ) (reverse lst) ) Pour finir de s'en convaincre il suffit de tester cette ligne de code (entmake (list '(0 . "LINE") (assoc 10 (entget(car(nentsel)))) '(11 0.0 0.0 0.0))) Sur un bloc ayant subit des transformations, puis de cliquer une fois sur un attributs puis une seconde fois sur une entité quelconque du bloc (ayant un code dxf 10), dans le premier cas une ligne est dessiné du point 0,0,0 au point d’insertion de l’attribut dans la référence de bloc, dans l’autre cas une ligne du point 0,0,0 au point dxf 10 tel qu’il est spécifié dans les coordonnées du SCO de la définition du bloc. En espérant avoir était suffisamment clair, même si sur ce dernier point j’ai un gros doute… A+ Bruno (Ps : Après rien n’empêche de définir les attributs sur un calque non imprimable ou même gelé) -
Définir des points particuliers sur un bloc
VDH-Bruno a répondu à un(e) sujet de azerty9 dans Débuter en LISP
Bonsoir, Oui bien sur, d’ailleurs sur le forum (gile) a publié une routine GetAttribs très pratique pour récupérer les attributs sous forme d’une liste de paires pointés. Tu trouvera le code à cette adresse : http://cadxp.com/topic/32894-recuperer-la-valeur-dun-attribut/page__view__findpost__p__176345 Ainsi que des explications et des lignes de codes commentés dans la suite de la discussion. A+ -
comment avoir plusieurs programme dans un lisp?
VDH-Bruno a répondu à un(e) sujet de philsogood dans Débuter en LISP
Bonjour philsogood, Même si il n’y a rien à redire sur l’excellente explication de (gile), pour décortiquer ces lignes de codes une petite astuce consiste à substituer le defun par defun-q, cela te permet de définir les fonctions sous forme de liste. Et ainsi comprendre comment construire ta liste de définition en pas à pas. Pour obtenir la définition à construire dans la console Vlisp: _$ C:P8 (nil (COMMAND "_mline" "_j" "_z" "_st" "PVC" "_s" (DIAMSCALE 12))) A comparer avec la définition d’origine.. (defun-q c:p8 () (command "_mline" "_j" "_z" "_st" "PVC" "_s" (diamScale 12))) Ainsi tu visualise mieux que le nil symbolise l’absence d’arguments () dans la fonction définit en C: Pour des exemples commenté sur l’emploie de mapcar, il y eu un challenge sur son emploie ça peut aider. http://cadxp.com/topic/14868-challenge-special-debutants/ Sinon il y a toujours le post arguments et variables en entête du forum : http://cadxp.com/topic/28642-arguments-et-variables/page__view__findpost__p__156096 (Ps: Personnellement je pense que l’étude de ces lignes de codes apporte beaucoup dans la compréhension du Lisp.) Bon courage -
Bonjour, Pour cette explication j’avais donné la version longue, pour faire simple (éviter les Ctrl+C et Ctrl+V) et intuitif, dans la zone d’édition du champ formule, tu peux également faire un clic Bouton-Droit et choisir -> insérer un champ pour sélectionner l’objet et la propriété qui t’intéresse dans ton calcul. Non cela ne fonctionne car dans la valeur prédéfinie de ta définition d’attribut, tu référence les valeurs prédéfinie des définitions d’attribut utilisé dans ton champ formule. Et même en cochant Afficher la valeur de référence, pour AutoCAD 2007 (je ne pense pas que cela ait changé depuis) ce n’est pas la même chose que de définir ta formule dans une référence d’attribut. A+ Bruno (Ps : A l’occasion n'hésite pas à lire ou relire Blocs et imbrications sur le forum)
-
Lisp pour mettre tous les Z des entités d'un dessin à 0
VDH-Bruno a répondu à un(e) sujet de autospeed dans Routines LISP
Bonjour, C’est un peu le but de ce code et dans le post précédent, il s’applique à tout le dessin bloc et imbrications de bloc. Ce qu’il est possible d’adapter aisément sans faire une usine à gaz (comme rappeler par lecrabe) : Il est possible de limité son action aux seuls espaces objet et papier comme ceci… ;; 05-09-2013 VDH-Bruno ;; My Z=0, Affecte toutes les espaces de dessin (EO, EP) et exclut les définitions de bloc (defun c:Spacez=0 () (vl-load-com) (vlax-map-collection (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) '(lambda (block) (and (wcmatch (vla-get-name block) "`*Model_Space,`*Paper_Space*") (vlax-map-collection block '(lambda (obj) (cond ((vlax-method-applicable-p obj 'Move) (vla-Move obj (vlax-3d-point '(0 0 0)) (vlax-3d-point '(0 0 1e99))) (vla-Move obj (vlax-3d-point '(0 0 0)) (vlax-3d-point '(0 0 -1e99))) ) ) ) ) ) ) ) (princ) ) Ou bien dans un cadre plus spécifique il est facile d’exclure les définitions de blocs qui ne doivent pas être "aplati ", en les spécifiant au moyen d’une boite de dialogue (avec la fonction ListBox de (gile)) ;; 05-09-2013 VDH-Bruno ;; My Z=0, Affecte toutes les espaces de dessin (EO, EP) ;; Exclut les définitions de bloc spécifié dans la boite de dialogue (defun c:Blocz=0 (/ l bl) (vl-load-com) (setq l (acad_strlsort (vl-remove-if (function (lambda (n) (= (substr n 1 1) "*"))) (while (setq bl (tblnext "BLOCK" (not bl))) (setq l (cons (cdr (assoc 2 bl)) l))) ) ) l (listbox "Blocs à exclure" "Sélectionnez des définitions blocs" (mapcar 'cons l l) 2) ) (vlax-map-collection (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) '(lambda (block) (if (not (and (vlax-property-available-p block 'EffectiveName) (member (vla-get-EffectiveName block) l))) (vlax-map-collection block '(lambda (obj) (cond ((vlax-method-applicable-p obj 'Move) (vla-Move obj (vlax-3d-point '(0 0 0)) (vlax-3d-point '(0 0 1e99))) (vla-Move obj (vlax-3d-point '(0 0 0)) (vlax-3d-point '(0 0 -1e99))) ) ) ) ) ) ) ) (princ) ) ;;============================================================================;; ;; ListBox (gile) ;; Boite de dialogue permettant un ou plusieurs choix dans une liste ;; ;; Arguments ;; title : le titre de la boite de dialogue (chaîne) ;; msg ; message (chaîne), "" ou nil pour aucun ;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...) ;; flag : 0 = liste déroulante ;; 1 = liste choix unique ;; 2 = liste choix multipes ;; ;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2) ;; ;; Exemple d'utilisation ;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 2) (defun ListBox (title msg keylab flag / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{key=\"lst\";") (T "spacer;:list_box{key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ListBox" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list (mapcar 'cdr keylab)) (end_list) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))) (setq choice (reverse choice))) (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab))))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) En plus de la commande flatten des outils Express d’AutoCAD, avec un peu de recherche tu trouveras pléthore de routine pour Z=0, dans le lot je suis sûr que tu trouveras ton bonheur.. Cordialement, (Ps : Les codes proposé sont tapés à la volée et peu ou pas testé, je suis retourné pour quelques temps à l’éxé pas trop le temps de finasser les lisps). -
pagination automatique
VDH-Bruno a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
Pour celui qui le souhaiterai le code précédent de la réponde 20 a été modifié comme suit avec l’évènement de fin de commande du réacteur de commande: … (or *command-reactor-pagine* (setq *command-reactor-pagine* (vlr-command-reactor "Pagination Automatique" '((:vlr-commandEnded . pagine-callback)))) ) ;; Routine de pagination automatique (defun pagine-callback (rea evenement) (or *acaddoc* (setq *acaddoc* (vla-get-ActiveDocument (vlax-get-acad-object)))) (and (eq (car evenement) "LAYOUT_CONTROL") (ssget "_X" '((0 . "INSERT,*TEXT") (-3 ("PaginationData")))) … Pour l’instant le fonctionnement me convient bien, et éventuellement si à l’usage je viens à modifier le code, j’essayerai d’intégrer la possibilité évoqué par zebulon : En faisant précéder du signe – (négatif) le nom des onglets qui seront laissé de côté. A+ Bruno -
Bonjour, Regarde également les fonctions minusp (et éventuellement zerop si tu veux également concaténer le signe +/- devant le niveau 0.00) A+
-
pagination automatique
VDH-Bruno a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
+1 :D :D :D -
pagination automatique
VDH-Bruno a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
Merci beaucoup Patrick_35, je suis heureux de ton intervention, je viens de tester ton réacteur sur la commande "LAYOUT_CONTROL" sans jamais le prendre en défaut, je pense que tu as trouvé la meilleur solution au problème. Commande "LAYOUT_CONTROL" que je ne connaissais pas, ce qui m’a donné l’idée d’écrire ces quelques lignes pour connaître le nom des commandes envoyer par l’évènement vlr-commandWillStart (defun inspecteCommandWillStart (rea cde) (alert (strcat "La commande " (car cde) " va être executé..") ) ) (setq inspecte (vlr-command-reactor nil '((:vlr-commandWillStart . inspecteCommandWillStart)))) (Ps : Je pense que c’est avec un code similaire que tu l’as débusqué ;) ) A+ Bruno -
pagination automatique
VDH-Bruno a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
Pour avoir testé, il ne se passe rien lors de la sélection des onglets... A+ -
pagination automatique
VDH-Bruno a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
Re, J’ai un peu survolé les différentes solutions proposé, celle de faire un bloc spécifique ne me convenant que moyennement, et celle de renommé tous les onglets de présentation pas beaucoup plus. Donc je propose ma variante (un premier jet encore un peu brut), qui répond au fonctionnement suivants : - La commande PAGINE demande de pointer un texte ou un attribut d’une référence de bloc quelconque, qu’elle édite automatiquement comme un élément de pagination pour la présentation de définition de l'élement. - Les éléments ainsi sélectionné devenant des " références" de pagination au moyen de xdata, ils sont automatiquement mis à jour à chaque changement d’onglet au moyen d'un réacteur d'évènement. - L’espace Objet étant considéré comme espace de conception, il est volontairement décompté et est supposé valoir 0. Le code à tester : ;; VDH-Bruno le: 28-08-2013 ;; ------------------------------- PAGINE V 2.00 ----------------------------------- ;; Transforme l'entité (texte ou attribut) sélectionné en objet de pagination ;; automatique pour la présentation dans laquelle il est définie. (vl-load-com) ;; Déclaration du réacteur ;; (vlr-remove *command-reactor-pagine*) (or *command-reactor-pagine* (setq *command-reactor-pagine* (vlr-command-reactor "Pagination Automatique" '((:vlr-commandEnded . pagine-callback)))) ) ;; Routine de pagination automatique (defun pagine-callback (rea evenement) (or *acaddoc* (setq *acaddoc* (vla-get-ActiveDocument (vlax-get-acad-object)))) (and (eq (car evenement) "LAYOUT_CONTROL") (ssget "_X" '((0 . "INSERT,*TEXT") (-3 ("PaginationData")))) (vla-delete (vlax-map-collection (vla-get-ActiveSelectionSet *acaddoc*) '(lambda (obj / xtypeOut xdataOut etiquette obj att) ;; Obtention des Xdata attaché à l'objet (vla-GetXData obj "PaginationData" 'xtypeOut 'xdataOut) ;; Teste si etquette="" c'est un texte à traiter, sinon c'est un attribut (if (= "" (setq etiquette (cadr (mapcar 'vlax-variant-value (vlax-safearray->list xdataOut))))) (vla-put-textstring obj (bv:GetTaborder "" obj)) (foreach att (vlax-invoke obj 'GetAttributes) (if (= etiquette (vla-get-tagstring att)) (vla-put-textstring att (bv:GetTaborder "" obj)) ) ) ) ) ) ) ) (princ) ) ;; Numérotation de la présentation de l'objet (defun bv:GetTaborder (pref obj) (or *acaddoc* (setq *acaddoc* (vla-get-ActiveDocument (vlax-get-acad-object)))) (if (= (type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj)) ) (strcat pref (itoa (vla-get-taborder (vla-get-layout (vla-objectidtoobject *acaddoc* (vla-get-ownerid obj))))) "/" (itoa (1- (vla-get-count (vla-get-layouts *acaddoc*)))) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;; Programme principal ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Programme de pagination (defun c:pagine (/ ent) ;; vérifié si pas de plantage encas dabsence d'application non enregstrer (or (tblsearch "APPID" "PaginationData") (regapp "PaginationData")) (setq loop T) ;; sélection utilisateur (while loop (setq ent (car (nentsel "\nSélectionnez l'élément (texte ou attribut) à paginer: ")) loop (cond ((not ent) (princ "\nPas d'objet sélectionné !")) ((wcmatch (cdr (assoc 0 (setq ent (entget ent)))) "ATTRIB,*TEXT") nil) ((princ "\nSélectionnez un texte ou un attribut !")) ) ) ) ;; ajout des données étendues de l'application "PaginationData" (if (= (cdr (assoc 0 ent)) "ATTRIB") (entmod (append (entget (cdr (assoc 330 ent))) (list (list -3 (list "PaginationData" (cons 1000 (cdr (assoc 2 ent)))))) ) ) (entmod (append ent (list (list -3 (list "PaginationData" (cons 1000 "")))))) ) ;; pagination automatique (pagine-callback nil (list "LAYOUT_CONTROL")) ) ;; Code de dépagination d'un objet (defun c:unpagine (/ ent) ;; sélection utilisateur (while (not (setq ent (car (entsel "\nSélectionnez l'élément à supprimer des références d'objet à paginer: "))) ) (princ "\nPas d'objet sélectionné !") ) (entmod (append (entget ent) (list (list -3 (list "PaginationData"))))) (princ) ) (prompt "\nPAGINE / UNPAGINE commande à saisir pour convertir (ou pas) une entité textes/attribut en référence de pagination automatique." ) (princ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; A+ Bruno Edit: Version modifié pour faire suite au post de Patrick_35 en changeant le réacteur vlr-miscellaneous-reactor par le réacteur vlr-command-reactor. pagine.LSP -
Re, Je ne sais pas vraiment à qui tu réponds.. Dans le doute si c’est à moi, c’est que l’on ne s’est pas compris, ou que je n’ai certainement pas suffisamment développé ma réponse. Je ne pense pas avoir suggérer de ne pas créer le calque au départ de ta routine… Précédemment je faisais seulement remarquer que tu n’avais pas besoin de rendre ton calque courant comme avec command puisque tu utilisais entmake et que tu spécifiais le calque de destination au moyen du code dxf 8. Comme tu ne spécifie pas de code dxf 62 à la création de ton texte, tu utilises la couleur par défaut (celle qui est spécifié dans le contrôle des couleurs si ce n’est pas la couleur DuCalque). Par sécurité tu peux forcer sur DuCalque en ajoutant le code suivant (cons 62 256) dans la définition de ton entité texte avec la fonction entmake Sur ce dernier point, tu peux aisément introduire une vérif du type: (defun c:zde () (if (= "zfe" (getvar "clayer")) (setvar "clayer" "0") ) (command "_.Laydel" "_n" "zfe" "" "_Y") ) A+
-
Bonjour, Pas besoin de rendre le calque ZFE courant, les lignes suivantes ne servent à rien : (setq cc (getvar "clayer")) (setvar "clayer" "zfe") (setvar "clayer" cc) Car ta fonction Posetxt est définie avec un entmake dans lequel tu spécifie de façon explicite le calque de destination dans la création de ton entité (cons 8 "zfe"). D’ailleurs c’est l’intérêt (ou différence) d’écrire avec entmake (on gère une liste DXF) par rapport à un command (on gère les variables AutoCAD). A+
