phil_vsd Posté(e) le 14 février 2008 Posté(e) le 14 février 2008 Bonjour à tous, Je me suis mis au lisp mais mes prétentions n'ont même pas l'ambition de me permettre de résoudre vos challenges les plus simples. Je me contente de changements de calques courant... J'ai constitué pas mal de blocs avec des attributs, eux même paramétrés par des styles de textes. Au fil du temps mes attributs ne sont pas "centrés" comme ils devraient l'être au milieu du bloc. Pouvez-vous me créer un petit programme qui analyserait tous les blocs avec attributs et leurs appliquerait un ATTSYNC. J'ai des blocs-attributs sur toutes mes présentations et y'en a environs une quinzaine par dwg. Merci d'avance. PS : Votre petit bout de code me permettra de surfer vers une autre petite idée que j'ai en tête. "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 14 février 2008 Posté(e) le 14 février 2008 Salut, Je suis content que tu t'essayes au LISP. Voilà un petit LISP abondamment commenté. (defun c:allsync (/ ss name lst) ;; si il existe une sélection de tous les blocs avec attribut du dessin... (if (setq ss (ssget "_X" '((0 . "INSERT") (66 . 1)))) ;; ...pour chaque entité du jeu de sélection... (foreach bl (mapcar 'cadr (ssnamex ss)) ;; ...on récupère le nom du bloc, ... (setq name (cdr (assoc 2 (entget bl)))) ;; ... ou ce nom est présent dans la liste des blocs traités... (or (member name lst) ;; ... ou, on l'ajoute à la liste et on le traite (and (setq lst (cons name lst)) (command "_.attsync" "_n" name) ) ) ) ) (princ "\nListe des blocs traités : ") (princ lst) (princ) ) [Edité le 14/2/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 15 février 2008 Auteur Posté(e) le 15 février 2008 Merci beaucoup (Gile), Ca marche super bien. Je n'avai pas osé demander les ocmmentaires qui vont avec mais tu as anticipé le coup. Mon autre truc est de tester toutes les fenêtres des toutes les représentation et de les mettre en : Couleur "du calque" et épaisseur "0.18" Je m'inspire de tes lisp sur Cadxp puis sur les dicussion d'Autodesk. Je t'y ai piqué déjà quelques idées... A bientôt. "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 15 février 2008 Posté(e) le 15 février 2008 Je te donne juste quelques pistes pour que tu cherches de ton côté On ne peut pas modifier les propriétés des Fenêtres de présentation (VIEWPORT) avec la fonction entmod, il faut donc utiliser la commande CHPROP (ou Visual LISP).La fonction command ne fonctionne que dans l'onglet actif, il va donc falloir activer successivement chaque présentation. La fonction layoutlist retourne un liste des présentation du dessin.La fonction foreach permet d'exécuter une ou plusieurs expression pour chaque élément d'une liste (voir code ci-dessus).La fonction setvar permet de modifier la valeur d'une variable système (la variable CTAB indique l'onglet actif)La fonction ssget crée un jeu de sélection et accepte un filtre de sélection (liste de paires pointées type entget)La fonction command requiert comme arguments le nom de la commande et les mêmes entrées que celles requises par la commande (un blank ("") équivaut à une validation) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 15 février 2008 Posté(e) le 15 février 2008 Salut Un coup de pouce, car c'est avec des exemples de ce que l'on veut faire qu'on avance Une utilisation limité du vlisp, car tu peux aussi utiliser la commande _.chprop Extrait de l'aideRestrictions on Using entmod There are restrictions on the changes the entmod function can make: An entity’s type and handle cannot be changed. If you want to do this, use entdel to delete the entity, and then make a new entity with the command or entmake function. The entmod function cannot change internal fields, such as the entity name in the –2 group of a seqend entity. Attempts to change such fields are ignored. You cannot use the entmod function to modify a viewport entity. ; Sélection des toutes les fenêtres dans les présentations (setq js (ssget "x" (list (cons 0 "VIEWPORT")))) ;Définition de la variable n à 0 (setq n 0) ; Boucle while pour parcourir le jeu de sélection tant qu'il n'est pas vide (while (ssname js n) ; je récupere l'objet fenêtre dans le jeu de sélection (setq vp (ssname js n)) ; Convertion de l'objet fenêtre en objet vlisp (setq vpvl (vlax-ename->vla-object vp)) ; Je met la couleur ducalque (vla-put-color vpvl acbylayer) ; je met l'epaisseur 0.18 (vla-put-lineweight vpvl 18) ; je passe à la fenêtre suivante dans le jeu de sélection (setq n (1+ n)) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 15 février 2008 Posté(e) le 15 février 2008 Salut Patrick, Il me semble que Phil n'a accès qu'à une LT avec LT Etender, donc pas de vlisp... Avec (command "_.chprop" ...) ;; Pour chaque présentation (foreach l (layoutlist) ;; on la rend active (setvar "CTAB" l) ;; on sélectionne toutes les fenêtres (setq ss (ssget "_x" (list '(0 . "VIEWPORT") (cons 410 l)))) ;; on change leurs propriétés (command "_.chprop" ss "" "_co" "bylayer" "_lw" 0.18 "") ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant