Aller au contenu

insertion blocS attribut


Messages recommandés

Posté(e)

Bonjour,

tout d'abord je m'excuse car ce sont des sujets déjà existant sur le forums.

Me je n'arrive pas à tout comprendre :( .

 

Dans une routine je souhaite

1- Dans un 1er temps: inserer plusieurs blocs(les uns apres les autres) sans compléter les differents attributs qu'ils contient.

2- a la fin compléter les attributs par des valeurs contenu dans des variables.

3- Donner un angle de rotation à ces divers attributs.

 

1r- J'ai compris ATTDIA, mais pas ATTREQ (Si l'attribut n'as pas de valeur pas défaut?).

2r- Pour éditer mes attributs, je compte utiliser (SETQ OB1 (SSGET "L")) et ensuite (command "-attedit".

3r- je compte utiliser la fonction entget (Mais pour le moment je n'y comprends rien.

 

Voilà j'espere avoir été clair,

Merci d'avance.

Le boulet du moment!

 

Posté(e)

Bonjour

 

La variable ATTREQ permet d'insérer un bloc sans tenir compte de ses éventuels attributs.

 

Pour obtenir les attributs d'un bloc, il faut utiliser un entnext sur le bloc pour trouver la première entité et boucler jusqu'à trouver un "SEQEND"

 

Par exemple

(setq ent (car (entsel))) ; Sélection du bloc
(setq ent (entget (entnext ent))) ; Pointer sur le premier attribut
(while (/= (cdr (assoc 0 ent)) "SEQEND") ; Boucle pour trouver les attributs
 (terpri)(princ ent) ; afficher les codes dxf de l'attribut
 (setq ent (entnext (cdr (assoc -1 ent)))) ; attribut suivant
 (setq ent (entget ent)) ; codes dxf de l'attribut
)

 

@+

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)

Merci Patrick_35,

Je me suis suis contente de copier/coller ta citation dans mon lisp, mais le truc qui me gene c'est que je ne voudrais pas avoir de sélectionne à faire par clic,dans une routine qui va inserer des blocs (Hormis un Pt d'insertion!) .

 

J'ai essayé de modifier tes quelques lignes pour arriver à mes besoins, mais je capitule:

Je voulais modifier la boucle pour qu'il cherche l'attribut dont le code 2 correspond à "diamétre" dans un bloc précedement inserer!

Merci encore.

Un veritable boulet :)

 

[Edité le 31/10/2008 par ScoAD]

Posté(e)

Prend le temps de lire mes quelques lignes.

J'ai utilisé la sélection d'un bloc afin que tu comprennes comment cela fonctionne.

Rien n'interdit de le faire sur une sélection et donc dans une boucle.

Pour trouver ton attribut, tu as plusieurs possibilités.

C'est par exemple le 3em et 5em à modifier, donc avec un compteur dans la boucle de recherche des attributs.

Ou alors, si toutes les valeurs d'étiquettes sont différentes (code dxf 2) dans le bloc, les utiliser.

 

@+

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)

merci,

mais il y a un truc que je ne pige décidemment pas!

Pourqoui ce qui suit ne fonctionne pas ?

(setq ent (car (ENTLAST)))

; erreur: type d'argument incorrect: consp

Posté(e)

Quand tu fais seulement la fonction (entlast), tu as comme réponse par exemple

<Nom d'entité: 7ea6f318>

Ce n'est pas une liste, because la fonction car retourne le premier élément d'une liste.

C'est la raison de ton message d'erreur.

 

Par contre, tu peux faire (car (entget (entlast)))

 

@+

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)

Ok je suis vraiment nul, mais je m'accroche!

En frafouillant sur le forum j'ai trouvé un exemple sympa

cela marche tres bien avec une selection manuel, mais je suis incapable de trouver la syntaxe

pour sélectionner automatiquement mon bloc!

Même en copiant ton exemple!

 

 (defun c:TEST
(/ NEWVAL1 NEWVAL2 NEWVAL3 BlocSelec att n newval)

(setq NEWVAL1 (getstring t "\nEntrez le repere : "))
(setq NEWVAL2 (getstring t "\nEntrez le diametre : "))
(setq NEWVAL3 (getstring t "\nEntrez les donées élec : "))
(Command "-inserer" "Z:\\AUTOCAD\\XXX.dwg" BOCPt1 1 1 0)
;;(setq BlocSelec (entlast))
;;(setq BlocSelec (car(entget BlocSelec))) ; pour sélectionner un bloc contenant des attributs
(setq BlocSelec (car (entget (entlast))))
(setq att (entget (entnext BlocSelec)))
; pour trouver le premier attribut
(setq n 0) ; mise du compteur à 0
(while (= (cdr (assoc 0 att)) "ATTRIB")
; boucle tant que att est un attribut
(setq n (1+ n)) ; incrémentation du compteur
(setq newval (eval (read (strcat "NEWVAL" (itoa n)))))
; valeur de NEWVALn
(setq att (subst (cons 1 newval) (assoc 1 att) att))
; pour changer la valeur de l'attribut
(entmod att)
(entupd (cdr (assoc -1 att)))
(setq att (entget (entnext (cdr (assoc -1 att)))))
; données de l'attribut suivant
(setq att (subst (cons 1 NEWVAL2) (assoc 1 att) att))
; pour changer la valeur de l'attribut
(entmod att)
(entupd (cdr (assoc -1 att)))
) ; fin de while
(princ)
)

 

Je suis vraiment un boulet!

Posté(e)

Re

 

J'ai légèrement modifié ton lisp

Une chose. tu as une boucle while pour parcourir les attributs, donc inutile d'aller chercher le suivant.

 

(defun c:TEST
 (/ NEWVAL1 NEWVAL2 NEWVAL3 BlocSelec att n newval)

(setq NEWVAL1 (getstring t "\nEntrez le repere : "))
(setq NEWVAL2 (getstring t "\nEntrez le diametre : "))
(setq NEWVAL3 (getstring t "\nEntrez les données élec : "))
(Command "-inserer" "Z:\\AUTOCAD\\XXX.dwg" BOCPt1 1 1 0)
(setq BlocSelec (entlast))
;;(setq BlocSelec (car(entget BlocSelec))) ; pour sélectionner un bloc contenant des attributs
;;(setq BlocSelec (car (entget (entlast))))
(setq att (entget (entnext BlocSelec)))
; pour trouver le premier attribut
(setq n 0) ; mise du compteur à 0
(while (= (cdr (assoc 0 att)) "ATTRIB")
; boucle tant que att est un attribut
(setq n (1+ n)) ; incrémentation du compteur
;;(setq newval (eval (read (strcat "NEWVAL" (itoa n)))))
(setq newval (strcat "NEWVAL" (itoa n)))
; valeur de NEWVALn
(setq att (subst (cons 1 newval) (assoc 1 att) att))
; pour changer la valeur de l'attribut
(entmod att)
(entupd (cdr (assoc -1 att)))
(setq att (entget (entnext (cdr (assoc -1 att)))))
; données de l'attribut suivant
;(setq att (subst (cons 1 NEWVAL2) (assoc 1 att) att))
; pour changer la valeur de l'attribut
;(entmod att)
;(entupd (cdr (assoc -1 att)))
) ; fin de while
(princ)
)

 

Ok je suis vraiment nul, mais je m'accroche!

Non, tu n'es pas nul car ce n'est pas facile au départ de comprendre le lisp.

Il faut en faire, regarder et comprendre les exemples que l'on peut trouver.

 

@+

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)

merci beaucoup,

je juste modifier:

(setq newval (eval (read (strcat "NEWVAL" (itoa n)))))

;;(setq newval (strcat "NEWVAL" (itoa n)))

 

Parqu'il completait les attributs avec NEWVAL1, NEWVAL2 ....

 

 

Posté(e)

un autre jour, un autre probleme:

Je voudrais modifier la valeur de l'attibut (Ok ça j'y arriver) et ensuite le remettre à l'horizontal, et ça je n'y arrive pas, d'après ce que j'ai vu c'est le code 50!

 

 

(setq BlocSelec3 (entlast))

(setq att (entget (entnext BlocSelec3)))

(setq newval DiaOUT1)

(setq att (subst (cons 1 newval) (assoc 1 att) att))

(setq att (subst (cons 50 "0") (assoc 50 att) att))

(entmod att)

 

Et tant que j'y suis comment modifier la position d'un attribut dans le bloc?

 

Merci d'avance

 

[Edité le 5/11/2008 par ScoAD]

Posté(e)

Salut

 

Oui, c'est bien le code 50

 

Pour cela, il faut convertir les degrées en radiants

 

Extrait de l'aide

(* pi (/ numberOfDegrees 180.0))

 

 

Pour le point d'insertion, c'est le code 10

 

@+

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)

merci,

mais je n'y arrive pas:

ce qui suis n'a aucun éffet?

 

(setq attang3 ((* pi (/ 0 180.0))))

(setq BlocSelec3 (entlast))

(setq att (entget (entnext BlocSelec3)))

(setq newval DiaOUT1)

(setq att (subst (cons 1 newval) (assoc 1 att) att))

(setq att (subst (cons 50 attang3) (assoc 50 att) att))

(entmod att)

 

pour le point d'insertion le code 10 est une liste, comme je peux la recuperer pour la modifier?

 

Merci encore pour ton aide!

Posté(e)

Re

 

(setq attang3 ((* pi (/ 0 180.0))))

Tu peux faire

(setq attang3 (* pi (/ 0 180.0)))

 

Tu indiques un angle à 0 et si celui qui existe est déjà à 0, effectivement, il y a aucun changement.

 

comme je peux la recuperer pour la modifier?

Regarde les fonctions, car, cadr, caddr ou encore nth puis la fonction list

 

@+

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)

Tout d'abord merci pour les parentheses en trop.

 

Et je n'ai pas compris comment "enregistrer" la valeur du code 10 dans une varible pour ensuite la modifier avec des "car" ou "cadr"...

 

[Edité le 5/11/2008 par ScoAD]

Posté(e)

Re

 

Un exemple

 

(setq att (entget (car (nentsel)))) ; sélection d'un attribut

(setq att (subst (cons 50 (* pi (/ 90 180.0))) (assoc 50 att) att)) ; rotation à 90°

(entmod att) ; mise à jour

 

(setq x (cadr (assoc 10 att))) ; position x de l'attribut --> cadr = car + cdr

(setq y (caddr (assoc 10 att))) ; position y de l'attribut --> caddr = cadr + cdr

(setq z (cadddr (assoc 10 att))) ; position z de l'attribut --> cadddr = caddr + cdr

 

(setq new_xyz (list 50.0 y z)) ; par exemple, changer la position x à 50.0

 

(setq att (subst (cons 10 new_xyz) (assoc 10 att) att)) ; changement de la position de l'attribut

(entmod att) ; mise à jour

 

 

 

 

Erratum :

Cela peut-être aussi le code 11 au lieu du code 10

 

Extrait de l'aide

Point d'alignement (dans le SCO) (facultatif)

 

DXF : valeur X ; APP : point 3D

 

Présent seulement si le groupe 72 ou 74 est présent et non nul

 

 

 

 

ps : il est possible de faire plusieurs changements avec subst et de finir avec un seul entmod

 

@+

 

[Edité le 5/11/2008 par Patrick_35]

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)

Avec beaucoup de mal, j'ai REUSSI !!!

Voici mon exploit (merci de ne pas rire) :) :

 

(defun c: DiaOUT02 (/)

(setq att (entget (entnext BlocSelec3)))

(setq att (subst (cons 1 DiaOUT1) (assoc 1 att) att))

(setq att (subst (cons 50 (* pi (/ 0 180.0))) (assoc 50 att) att))

(setq x (+ -1.5 (cadr (assoc 11 att)))) ; position x de l'attribut --> cadr = car + cdr

(setq y (caddr (assoc 11 att))) ; position y de l'attribut --> caddr = cadr + cdr

(setq z (cadddr (assoc 11 att))) ; position z de l'attribut --> cadddr = caddr + cdr

(setq new_xyz (list x y z))

(setq att (subst (cons 11 new_xyz) (assoc 11 att) att)) ; changement de la position de l'attribut

(entmod att)

(princ)

)

 

Cela fonctionne mais, pour moi cela tiens de la magie!

Quel est l'origine de ces coordonnées?

pourquoi: "(setq x (+ -1.5 (cadr (assoc 11 att))))" fonctionne

et pas "(setq x (- 1.5 (cadr (assoc 11 att))))" ?

 

pourqoui pour Y c'est caddr et pas cadr et pourqoui "(setq y (- 0.5 (caddr (assoc 11 att))))" envoie mon attribut sur la lune ?

 

Enfin le résultat est là.

Encore merci à super Patrick_35.

 

 

 

 

Posté(e)

Avec beaucoup de mal, j'ai REUSSI !!!

 

C'est bien! C'est en forgeant qu'on devient forgeron

 

Peut être n'es tu pas un peu familier avec l'anglais! Mais une consultation de l'aide (rien que pour les exemples donnés) t'aurais aiguillé sur ton erreur.

 

En lisp la soustraction; par la syntaxe (- 50 40.0 2.5) -> 7.5

Soustrait le deuxième nombre ET les nombres suivants du premier nombre et renvoie la différence.

 

pourqoui pour Y c'est caddr et pas cadr

 

Ici tu manipule une liste AVEC un code DXF identifiant les données suivante

Par exemple le code 10 ou 11 sont souvent lié à un point 3D définissant une position.

Dans ton cas la liste ressemble à ceci (11 25.36 55.47 100.25)

11 est le code DXF

25.36 est le X, 55.47 le Y et 100.25 le Z

pour avoir simplement la liste des coordonnées à partir de (assoc) qui extrait le code DXF associé, tu fais simplement un (cdr (assoc 11 att)) pour supprimer la clé du code DXF.

 

Et à partir de là, le (car) de cette liste te donne bien le X, le (cadr) le Y et (caddr) le Z.

 

Si tu garde le code DXF d'identification, ça décale tout, il faut intégré le (cdr) aux autre fonction d'extraction d'éléments:

(cadr) renverra alors le X, (caddr) le Y et (cadddr) le Z.

(cadr) = (car (cdr))

(caddr) = (cadr (cdr))

(cadddr) = (caddr (cdr))

 

Un petit coup d'œil dans l'aide ?! ;)

 

[Edité le 5/11/2008 par bonuscad]

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci pour ces explications.

Et je suis decouvert : je ne maitrise par trop l'anglais.

Mais promis je consulterais l'aide avant de poster sur le forum.

 

  • 2 semaines après...
Posté(e)

Bonjour,

Je ne comprends pas pourqoui ce qui suis ne fonctionne pas?

J'ai l'impression que "n" ne peut pas dépasse la valeur 9 !

(setq BOCinfo1(GETSTRING "\nIndiquez le type de raccordement? Clamp ou Sms < S >:"))

(if (= BOCinfo1 "")(setq BOCinfo1 "S"))

(setq NEWVAL1 (getstring t "\nEntrez le repere : "))

(setq NEWVAL2 "Echangeur à plaques")

(setq NEWVAL3 "Plate heat exchanger")

(setq NEWVAL4 "SMS")

(setq NEWVAL5 (getstring t "\nEntrez le diamétre de raccordement : "))

(if (= NEWVAL5 "") (setq NEWVAL5 "XX"))

(setq NEWVAL6 "XX")

(setq NEWVAL7 "XX")

(setq NEWVAL8 "XX")

(setq NEWVAL9 "XX")

(setq NEWVAL10 "")

(setq NEWVAL11 "")

(setq NEWVAL13 "")

(GRAPHSCR)

(Setq BOCPt1 (GETPOINT "\nIndiquer le point d'insertion:"))

(Command "-inserer" "Z:\\....dwg" BOCPt1 1 1 0)

(setq BlocSelec1 (entlast))

(setq att (entget (entnext BlocSelec1))); pour trouver le premier attribut

(setq n 0) ; mise du compteur à 0

(prompt "PASSAGE 1")

(while (= (cdr (assoc 0 att)) "ATTRIB"); boucle tant que att est un attribut

(setq n (1+ n)) ; incrémentation du compteur

(setq newval (eval (read (strcat "NEWVAL" (itoa n))))); valeur de NEWVALn

(setq att (subst (cons 1 newval) (assoc 1 att) att)) ; pour changer la valeur de l'attribut

(entmod att)

(entupd (cdr (assoc -1 att)))

(setq att (entget (entnext (cdr (assoc -1 att)))))

(prompt "PASSAGE 2")

) ; fin de while

 

Merci d'avance

Posté(e)

Bonjour,

 

(while (= (cdr (assoc 0 att)) "ATTRIB"); boucle tant que att est un attribut

 

Le test pour la boucle ne convient pas, suivant comment est composé ton bloc, d'autre entités peuvent être intercalé (ordre chronologique de création) entre les attributs.

Le mieux est d'aller jusqu'à la fin de la définition du bloc.

 

(while (/= (cdr (assoc 0 att)) "SEQEND"); boucle jusqu'à la dernière entité constituant le bloc.

 

Dans ta boucle après du test pour savoir à quel type d'entité tu as affaire, ou aussi si l'étiquette de l'attribut correspond à celui que tu veux modifier s'il existe.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é