Aller au contenu

Attsync everywhere !!


Messages recommandés

Posté(e)

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.

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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'aide

Restrictions 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é