Aller au contenu

Modifier le calque des étiquette d'attribut dans un bloc


nen
 Partager

Messages recommandés

Bonjour le forum,

J'ai besoin de votre aide😀.
J'ai un bloc sur le calque "0-INFO-LOCAL" composé de trois attributs sur le calque "0".

J'aimerais par un lisp ou toutes autres commandes changer le calque des étiquettes de l'attributs "0" en "0-INFO-LOCAL" ou tout autre calque de mon choix.
Il y a bien la commande "DEFDUCALQUE" le problème c'est que cela déplace uniquement sur DUCALQUE ou DUBLOC.
J'ai essayé aussi de changer directement dans mon bloc d'origine, de le réimporter et de redéfinir tous les blocs malheureusement cela ne fonctionne pas.

Est-ce quelqu'un à une astuce ou un lisp, car j'ai des plans avec des dizaines d'attributs à changer.

PS: bloc dans le fichier ci-joint


Merci d'avance pour votre aide
Meilleures salutations

Bloc01.dwg

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Maxime063,

Merci pour ton aide👍
Oui cette solution cela fonctionne nickel, je connaissais pas😃.
N'est-il pas possible d'automatiser avec un lisp ou macro ?🤔
En effet j'ai plusieurs dizaines de plans à modifier ses manipulations vont être fastidieuses vu le nombre de plan.😟
 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour le forum,

J’ai essayé de créer une macro avec la ligne de commande ci-dessous :
Malheureusement elle s’arrête juste après « MODIFBLOC ».

Est-ce que quelqu’un aurait une idée pourquoi ?

^C^C-MODIFBLOC;chprop;TOUT;CA;0-INFO-LOCAL;;

 

Merci d’avance

Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

Oui en effet c'est exactement ce que je veux faire, merci pour ton aide👍.
Je voudrais standardiser plusieurs dizaines de plans reçu de plusieurs prestataires différent et je bloque avec les attributs.
Le problème comment faire quand tu as des dizaines de plans à faire ?🤔

j'aurais voulut automatiser avec un script en lançant lisp et macro.

Si j'ose une petite remarque sur « Edit_Bloc », on change le calque, la couleur, il aurait été sympa d'y trouver la hauteur de texte aussi.😉

Elle est super cette petite appli, je ne connaissais pas, bon boulot bravo.👏

Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Dans un script, soit tu charges le LISP suivant et tu appelles la "commande LISP" XXX (tu peux la renommer comme tu veux).

(defun c:xxx (/ e l)
  (if
    (and
      (setq e (cdr (assoc -2 (tblsearch "BLOCK" "INFO-LOCAL_100_200"))))
      (setq l (tblobjname "LAYER" "0-INFO-LOCAL"))
    )
     (while e
       (setpropertyvalue e "LayerId" l)
       (setq e (entnext e))
     )
  )
  (princ)
)

soit tu mets directement dans le script l'expression suivante :

(if
  (and
    (setq e (cdr (assoc -2 (tblsearch "BLOCK" "INFO-LOCAL_100_200"))))
    (setq l (tblobjname "LAYER" "0-INFO-LOCAL"))
  )
   (while e
     (setpropertyvalue e "LayerId" l)
     (setq e (entnext e))
   )
)

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour😃,

J’ai modifié le lisp en rajoutant la fonction « attsync », j’ai essayé plusieurs fois sans succès, j’ai le message « erreur de syntaxe ».

Ou est mon erreur ?🤔

 

Merci d’avance

Meilleures salutations

(defun c:XXX (/ e l)
  (if
    (and
      (setq e (cdr (assoc -2 (tblsearch "BLOCK" "INFO-LOCAL_100_200"))))
      (setq l (tblobjname "LAYER" "0-INFO-LOCAL"))
    )
     (while e
       (setpropertyvalue e "LayerId" l)
       (setq e (entnext e))
     )
	(vl-cmdf "_.attsync" "_name" (vla-get-name def))
	(vla-endundomark adoc)
  )
  (princ)
)

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Luna😃,

Je te remercie pour ton aide👍.
En effet je voudrais une fois le lisp de Gile exécuté que la fonction attsync synchronise tous les blocs "INFO-LOCAL_100_200".
Je ne sais pas où se trouve l'erreur.
As-tu une idée ?🤔

Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

@Luna t'a dit d'où venait l'erreur :

Il y a 6 heures, nen a dit :
(vl-cmdf "_.attsync" "_name" (vla-get-name def))

Or, def n'existe pas dans ton code, mais par contre, tu connais très bien le nom du bloc... Donc fais simplement :

(command-s "_.attsync" "_name" "INFO-LOCAL_100_200")

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile😃,

Je te remercie pour ton aide et ce complément d’info
Super merci, j’ai essayé et cela fonctionne impeccable, merci aussi à Luna pour ton aide.👍

Comme exercice, J’ai modifié le bloc avec une hauteur de texte 20 et mon attribut forcé 15. Pour que les soit les deux pareils, j’ai écrit mon code comme ci-dessous et cela ne fonctionne pas ?
La fonction "tblobjname" c’est elle qui me permet de modifier mon bloc, non ?

(setq l (tblobjname "HEIGHT" "15"))

 

Meilleures salutations
 

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Alors non, (tblobjname) permet uniquement de récupérer le nom d'entité d'une entrée située dans une Symbol Table. Il existe 9 Symbol Table :

Symbol tables in each drawing database

Symbol table name

Description

APPID

Registered applications

BLOCK

Blocks (named and anonymous)

DIMSTYLE

Dimension styles

LAYER

Layers

LTYPE

Linetypes

STYLE

Text styles

UCS

Named User Coordinate Systems (UCSs)

VIEW

Named views

VPORT

Named viewports

"Symbol tables are used to store non-graphical information in a drawing’s database.", Aide AutoCAD.
Si tu veux modifier la hauteur d'un attribut, la méthode est un peu différente car il te faut parcourir les sous-objets de la définition de bloc (ce que le programme fait actuellement avec la boucle (while) et le (cdr (assoc -2 (tblsearch ...))) ), mais il te faut surtout retrouver parmi ces objets, l'entité correspondant à ton attribut pour en modifier le code DXF 40 (correspondant à la propriété de hauteur de texte d'un attribut) dans sa liste DXF via (entmod). Ou bien en modifiant la propriété "Height" dans sa liste de propriétés accessibles via (dumpallproperties).
Essaye quelque chose comme ceci :

(defun c:XXX (/ e l)
  (if
    (and
      (setq e (cdr (assoc -2 (tblsearch "BLOCK" "INFO-LOCAL_100_200"))))
      (setq l (tblobjname "LAYER" "0-INFO-LOCAL"))
    )
     (progn
       (while e
         (setpropertyvalue e "LayerId" l)
         (if (= "ATTDEF" (cdr (assoc 0 (entget e)))) ;; Vérifie si le sous-objet est un attribut
		   (setpropertyvalue e "Height" 15) ;; En passant par les propriétés (dumpallproperties)
	     )
         (setq e (entnext e))
       )
	   (command-s "_.attsync" "_name" "INFO-LOCAL_100_200")
     )
  )
  (princ)
)

Je n'ai pas testé mais à voir. J'ai également supprimé la ligne

(vla-endundomark adoc)

vu que la variable 'adoc est elle aussi non définie dans ton programme donc cette ligne est inutile en l'état. Tu peux éventuellement remplacer cette ligne par

(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))

Je pense que avant de te pencher sur l'aide concernant les fonctions et méthodes du Visual LISP, il faudrait que tu regardes les bases de programmation concernant la déclaration des variables et leur utilisation.
- Site de (gile)
- Site de didier
Ce n'est qu'un début mais cela est déjà pas mal 😉
Tu pourras ensuite checker le site de didier, il a justement fait une partie sur le langage Visual LISP.

Bisous,
Luna

Modifié par Luna
Modification du code
Lien vers le commentaire
Partager sur d’autres sites

Bonjour Luna,

Merci pour ton aide et ses précieuses informations😉👍.
En effet je consulte de temps en temps ce genre de site, malheureusement je n’arrive pas à acquérir les bases pour progresser.😟

J'ai dû déplacer la ligne de commande "(command-s "_.attsync" "_name" "INFO-LOCAL_100_200")" et le placer juste en dessous de la ligne "(setq e (entnext e))".
Par contre, pour la hauteur du texte il le fait dans l’autre sens, cela ne change pas la hauteur du texte du bloc en 15, mais change la hauteur du texte de l'attribut en 20.🤔
Je joins un dwg avec le bloc.
 

Meilleures salutations

Dessin1.dwg

Lien vers le commentaire
Partager sur d’autres sites

@nen, vui désolée la position du (command-s ...) était dans le sinon du (if) donc c'était une erreur. J'ai donc ajouté un (progn) pour pouvoir avoir le (while) et le (command) qui s'exécute si VRAI (et éviter de faire un ATTSYNC à chaque sous-objet de ton bloc...). J'ai également corrigé le type d'objet qui est "ATTDEF" et non "ATTRIB". Sinon je ne comprends pas ton histoire de hauteur du texte du bloc et de hauteur du texte de l'attribut... Ici le programme modifie la hauteur de l'attribut situé dans la définition du bloc et c'est tout !

PS Le code modifié est sur mon post précédent.

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Luna,

Je te remercie pour ton aide et me permets de supprimer le précédent post je n'avais pas tout vérifié, désolé.

Avec la modification du code, j'ai fait plusieurs tests sur diffèrent plan dans certain plan le lisp fonctionne à merveille et sur d'autre il me change par exemple le facteur de largeur du texte en 0.9 ?

Je me rends compte que j'aurais des différents problèmes suivant l'origine du plan.

J'ai essayé de changer la couleur, j'ai modifié le code "(setpropertyvalue e "Color" 5)", cela fonctionne, maintenant je voudrais rajouter ce code au précédent ou dois-je le placer, j'ai essayé sans succès ?

Je désire aussi changer le facteur de largeur, angle oblique, style de texte, etc. ou est-ce que peut trouver ses infos "Libellé" ?

 

Meilleures salutations

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Par rapport au code plus haut dans le post, je remercie Gile et Luna.

J'aimerais modifier quelques options supplémentaires du texte des attributs.
Pour la couleur et la rotation, j'ai trouvé c'est --> (setpropertyvalue e "Color" 5) et (setpropertyvalue e "rotation" 0)

Je voudrais savoir comment s'appellent les options suivantes (ou comment les trouver) : --> Style de texte, facteur de largeur, angle oblique, etc.

Pour le facteur de largeur que j'ai essayé (setpropertyvalue e "width" 0,75), cela ne fonctionne pas.


Merci de votre aide.
Bon weekend
 

Img1.png

Lien vers le commentaire
Partager sur d’autres sites

La fonction dumpallproperties permet de connaitre toutes les propriétés accessible avec getpropertyvalue ou getpropertyvalue pour l'objet passé en argument (le résultat s'affiche dans la fenêtre de texte (F2)).

Pour sélectionner un attribut de bloc, tu peux utiliser nentsel :

(dumpallproperties (car (nentsel)))

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...