Aller au contenu

Remplacement attribut aprés insertion bloc !


Messages recommandés

Posté(e)

Bonjour à tous,

 

Aprés une insertion d'un bloc nommé "testatt", depuis un programme lisp

 

(command "_.insert" "testatt" "0,0" (getvar "dimscale") "" "")

 

Comment modifier la fonction suivante pour que seul le dernier bloc insérer

puisse être sélectionné , et ses attributs modifés ?

 

Daniel OLIVES

 

(defun MAJREP (REP / AncVal LstEnt NomEnt)

(setq NomEnt (entnext))

(while NomEnt

(setq LstEnt (entget NomEnt))

(if (and (member '(0 . "ATTRIB") LstEnt) (member '(2 . "REP") LstEnt))

(progn

(setq AncVal (cdr (assoc 1 LstEnt)))

(setq LstEnt (subst (cons 1 REP) (cons 1 AncVal) LstEnt))

(entmod LstEnt)

(entupd NomEnt)

) ; fin progn

) ; fin If

(setq NomEnt (entnext NomEnt))

) ; fin while

(princ)

)

 

 

 

Posté(e)

Salut,

 

Je n'ai peut-être pas compris la question, mais si tu insères un bloc contenant des attributs à renseigner, tu peux les renseigner lors de l'insertion du bloc, plutôt que les modifier après. Il faut mettre la variable ATTDIA à 0 pour ne pas avoir de boite de dialogue :

 

(setq old_dia (getvar "ATTDIA"))
(setvar "ATTDIA" 0)
(command "_.insert"
 "testatt"
 "0,0"
 (getvar "dimscale")
 ""
 ""
 "Valeur de l'attribut 1"
 "Valeur de l'attribut 2"
 "Valeur de l'attribut 3"
)
(setvar "ATTDIA" old_dia) 

 

Sinon, pour pour récupérer la dernière entité créée on utilise la fonction (entlast) et on peut ensuite boucler sur les sous entités du bloc (attributs) pour en modifier la valeur.

 

Tu peux voir, par exemple, ce sujet récent où la référence de bloc est sélectionnée. Tu peux donc remplacer :

(setq BlocSelec (car (entsel)))

par :

(setq BlocSelec (entlast))

et ensuite faire la boucle sur les attributs avec les nouvelles valeurs contenues dans des variables incrémentées.

Pour la boucle, comme dit plus bas dans le sujet cité, je pense qu'il est préférable d'utiliser (repeat...)

 

[Edité le 3/9/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour Gile,

 

C'est bien mon problème, mais j'obtiens en fin de command, ce message d'erreur

lors de l'envoi des valeurs d'attribut ! (copie écran F2)

Commande: insbloc

_.insert Entrez le nom du bloc ou [?]: testatt Spécifiez le point d'insertion

ou [PointdeBase/Echelle/X/Y/Z/Rotation/PEchelle/PX/PY/PZ/PRotation]: 0,0

Entrez le facteur d'échelle en X, spécifiez le coin opposé ou [Coin/XYZ] <1>:

1.000000000000000 Entrez le facteur d'échelle en Y

d'échelle en X>:

Spécifiez l'angle de rotation <0>:

Commande: _.insert Entrez le nom du bloc ou [?] : testatt Spécifiez le

point d'insertion ou

[PointdeBase/Echelle/X/Y/Z/Rotation/PEchelle/PX/PY/PZ/PRotation]: 0,0

Entrez le facteur d'échelle en X, spécifiez le coin opposé ou [Coin/XYZ] <1>:

1.000000000000000 Entrez le facteur d'échelle en Y

d'échelle en X>:

Spécifiez l'angle de rotation <0>:

Commande: Val att 1 Commande inconnue "VAL ATT 1". Appuyez sur F1 pour obtenir

de l'aide.

 

Commande: Val att 2 Commande inconnue "VAL ATT 2". Appuyez sur F1 pour obtenir

de l'aide.

 

Commande: Val att 3 Commande inconnue "VAL ATT 3". Appuyez sur F1 pour obtenir

de l'aide.

 

Commande: 0

(defun c:insbloc ( / LstEnt LstEntIns)

(command "_.insert" "testatt" "0,0" (getvar "dimscale") "" "")

(setq old_dia (getvar "ATTDIA"))

(setvar "ATTDIA" 0)

(command "_.insert"

"testatt"

"0,0"

(getvar "dimscale")

""

""

"Val att 1"

"Val att 2"

"Val att 3"

)

(setvar "ATTDIA" old_dia)

)

[fin code]

 

J'avais bien trouvé un exemple de ce type mais avec "AutoCAD 2006", il semble que j'ai qqs PB !

C'est pour celà que j'essayais une autre méthode !

 

Daniel OLIVES

Posté(e)

Re bonjour,

 

juste une petite question de mise en page !

 

derrière [ texte code ] ma justification est à droite pourquoi ?

 

daniel OLIVES

 

 

 

[fin code]

 

 

Posté(e)

Re aprés essai , c'est ma facons d'écrire :

 

crochet code puis crochet qui à ouvert le mode "code"

 

puis le second crochet fin code crochet à perturbé 'affichage !

 

Aprés lecture de l'aide j'ai compris l'utilisation du bouton "dièse" !

 

 
Il suffisait de lire l'aide !

 

Daniel Olivès

Posté(e)

Salut,

 

Le problème de mise en page n'est pas résolu, tu devrais éditer la réponse N°2 et fermer le code correctement.

 

Sinon, dans le code que tu donnes tu insères 2 fois le bloc, en faisant comme je disais, ça devrait marcher (en tout cas ça marche chez moi) :

 

(defun c:insbloc ( / old_dia)
(setq old_dia (getvar "ATTDIA"))
(setvar "ATTDIA" 0)
(command "_.insert"
"testatt"
"0,0"
(getvar "dimscale")
""
""
"Val att 1"
"Val att 2"
"Val att 3"
)
(setvar "ATTDIA" old_dia)
) 

 

 

Vérifie aussi la valeur de ATTREQ qui doit être à 1

 

[Edité le 4/9/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re bonjour,

 

Merci Gile la première ligne était due à un copié coller malheureux !

 

C'est "ATTREQ" qui me posait un problème !

 

Cà marche !

Je vais pouvoir finir la routine d'insertion de bloc dans une polyligne pour y inscrire

la surface et autres données propres au local concerné !

 

Daniel OLIVES

Posté(e)

tyrese69_,

 

Je me permet d'interférer dans ce sujet car moi aussi je me met au lisp. Gile m'a donné une petite routine qui ressemble à la tienne sauf qu'en plus la surface change automatiquement car c'est à base de "champs dynamiques". Va voir dans :

 

Accueil du Forum > LISP et Visual LISP > Routines LISP > Bloc avec champ dynamique

 

Je ne sais pas faire un lien vers un post.

 

En espérant que cela puisse t'aider...

"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.

  • 11 mois après...
Posté(e)

[/code]

Résolution de page incorrect depuis la réponse N°2

 

 

[Edité le 29/8/2007 par Maximilien]

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

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é