Aller au contenu

récup valeur de rotation bloc dans xdata


Messages recommandés

Posté(e)

Bonjour

 

J'ai des plans de réseaux d'assainissement (fourni par un délégataire) avec des xdata déjà existantes sur mes fichiers dwg.

 

Les dessinateurs de mon entreprise crée des tampons d'assainissement sous forme de blocs qu'ils orientent suivant la direction de la canalisation.

 

Je souhaite récupérer la valeur d'orientation de chaque tampon d'assainissement pour la mettre dans mes xdata.

 

Es-ce que cette valeur d'orientation est récupérable ?

 

Si oui peut-on encore la mettre dans les xdata existantes (nouveau champ) de mes fichiers dwg ?

 

 

Merci et bonne journée.

 

PHPELLOUX

Posté(e)

Bonjour,

 

tu peux utilisé un champ qui récupère la propriété "rotation" de ton bloc. Avec un lisp tu pourras remplir tes xdata (juste par curiosité c'est quoi exactement un xdata et ca sert a quoi ?:()

 

Cyprien

Utilisateur AutoCAD depuis la R12

Longue Vie à CADxp

 

Posté(e)

Salut Papyrus1985

 

Le problème c'est que je n'ai aucune idée comment crée ce lisp puisque je ne développe pas.

 

Les xdata sont des données alpha associés à des éléménts géométriques. Dans les Express tools tu peux crée tes xdata et les interroger.

 

@+

 

PHPELLOUX

Posté(e)

Oui bien sûr...

 

Voici un exemple à adapter:

 

- la rotation du bloc est le code dxf 50

- comme je ne connais pas le nom de ton appli de xdata j'en ai créé une pour l'exemple et je rajoute donc les xdata à l'entité sélectionnée (sois en chaine, code 1000 dans les unités angulaire utilisées, soit en valeur réelle, code 1040, en choisissant le radian)

 

((lambda ( / ang dxf_ent)
(print (angtos (setq ang (cdr (assoc 50 (entget (car (entsel "\nChoisir un bloc: ")))))) (getvar "AUNITS") 4))
(setq dxf_ent (entget (car (entsel "\nDonnée de rotation à attacher à: "))))
 (if (null (tblsearch "appid" "pelloux2008"))
	(regapp "pelloux2008")
 )
 (entmod
	(append
		dxf_ent
		(list
			(list -3
				(list
					"pelloux2008"
					(cons 1002 "{")
						(cons 1000 (angtos ang (getvar "AUNITS") 4))
						(cons 1040 ang)
					(cons 1002 "}")
				)
			)
		)
   )
 )
))

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

Posté(e)

Bonuscad

 

J'ai essayé ton lisp avec un fichier dwg.

 

Ca semble fonctionner.

 

J'ai essayé sur un bloc ("référence de bloc" dans les propriétés avec comme angle indiqué = 37)

 

A la suite de la création de l'appli "pelloux2008", j'interroge le bloc :

 

Commande: xdlist
Choix de l'objet:
Enter application name <*>:


* Registered Application Name: pelloux2008
* Code 1002, Starting or ending brace: {
* Code 1000, ASCII string: 36.6593
* Code 1040, Real number: 0.6398
* Code 1002, Starting or ending brace: }

* Registered Application Name: E-DECHAR-APIC
* Code 1002, Starting or ending brace: {
* Code 1000, ASCII string: E-DECHAR2TYPE=DECHARGE
* Code 1000, ASCII string: E-DECHAR2DIAMETRE=INCONNU
* Code 1000, ASCII string: E-DECHAR2CODINSEE=76474
* Code 1000, ASCII string: E-DECHAR2NUMERO=76474-DV-3915
* Code 1002, Starting or ending brace: }

Object has 16133 bytes of Xdata space available.

Commande:

 

2 remarques.

 

- Comment faire pour que le champ rotation ne fasse pas l'objet d'une nouvelle appli mais qu'il aille s'ajouter à celle déjà existante dans "E-DECHAR-APIC" ?

 

- Lorsque j'essaie d'attacher un autre bloc avec pelloux 2008, ça ne fonctionne plus ???

 

Il me dit :

commande: _vlide
Choisir un bloc:
"18.8418"
Donnée de rotation à attacher à: pelloux2008
*Sélection non valable*
Attend un point ou Dernier

 

Merci.

 

PHPELLOUX

Posté(e)

- Comment faire pour que le champ rotation ne fasse pas l'objet d'une nouvelle appli mais qu'il aille s'ajouter à celle déjà existante dans "E-DECHAR-APIC" ?

 

Comme ceci (en me donnant le nom de l'appli c'est déjà plus simple) ;) :

 

((lambda ( / ang dxf_ent xd_list)
(setq
	ang (cdr (assoc 50 (entget (car (entsel "\nChoisir un bloc: ")))))
	dxf_ent (entget (car (entsel "\nDonnée de rotation à attacher à: ")) (list "E-DECHAR-APIC"))
	xd_list (cdr (assoc -3 dxf_ent))
)
(entmod
	(append
		(vl-remove (assoc -3 dxf_ent) dxf_ent)
		(list
			(list
				-3
				(append '("E-DECHAR-APIC")
					(append
						(list (cons 1002 "{") (cons 1000 (strcat "E-DECHAR2ROTATION="(angtos ang (getvar "AUNITS") 4))))
						(cddar xd_list)
					)
				)
			)
		)
	)
)
(princ (strcat "\nLa donnée E-DECHAR2ROTATION=" (angtos ang (getvar "AUNITS") 4) " a été cumulée."))
(prin1)
))

 

- Lorsque j'essaie d'attacher un autre bloc avec pelloux 2008, ça ne fonctionne plus ???

 

C'est normal, une fonction lambda ne reste pas en mémoire, il faut à chaque fois la réexécuter.

 

NB: Tu peux changer ((lambda ( / ang dxf_ent xd_list) en par exmple (defun c:pelloux ( / ang dxf_ent xd_list)

Enlever la parenthèse fermante supplémentaire en fin de code...

 

puisque je ne développe pas.

:casstet: Les Xdata sont surtout intéressantes justement si on développe, donc je reste dubitatif sur l'usage que tu peux en faire...

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

Posté(e)

Bonuscad

 

Ok ça fonctionne bien.

 

Je ne veux pas abuser de ton temps.

 

Sais tu comment je peux éviter d'avoir à ajouter le champ rotation objet par objet pour le faire en une seule fois sur tout le calque ?

 

Si c'est vraiment trop long, dis le moi je comprendrais.

 

Bonne journée et merci encore.

 

PHPELLOUX

 

PS : Effectivement je ne développe pas, j'ai acheté un bouquin pour voir comment on fait (en attendant que mon entreprise me paye une formation).

Posté(e)

Je connais pas du tout le contexte de ton dessin, il est peut être possible d'automatiser complètement, mais en l'absence d'exemple concret...

 

En effet je ne peux pas deviner par programmation à quelle entité tu veux rattacher les données collectées.

 

Cependant il est possible d'améliorer l'exemple ci-dessus pour diminuer le nombre d'intervention.

Voici ce que je te propose (à tester...)

 

((lambda ( / e_model cod_dxf js n ang pt pt_sel dxf_ent xd_list)
(princ "\nSélectionner une entité modèle: ")
(while (null (setq e_model (ssget "_+.:E:S" '((0 . "INSERT"))))))
(setq cod_dxf (entget (ssname e_model 0)))
(setq js (ssget "_X" (list (assoc 0 cod_dxf) (assoc 2 cod_dxf) (assoc 8 cod_dxf))) n -1)
(cond
	(js
		(repeat (sslength js)
			(setq
				ang (cdr (assoc 50 (entget (ssname js (setq n (1+ n))))))
				pt (cdr (assoc 10 (entget (ssname js n))))
			)
			(initget 1)
			(setq
				pt_sel (getpoint pt "\nDonnée de rotation à attacher à: ")
				dxf_ent (entget (car (nentselp pt_sel)) (list "E-DECHAR-APIC"))
				xd_list (cdr (assoc -3 dxf_ent))
			)
			(entmod
				(append
					(vl-remove (assoc -3 dxf_ent) dxf_ent)
					(list
						(list
							-3
							(append '("E-DECHAR-APIC")
								(append
									(list (cons 1002 "{") (cons 1000 (strcat "E-DECHAR2ROTATION="(angtos ang (getvar "AUNITS") 4))))
									(cddar xd_list)
								)
							)
						)
					)
				)
			)
			(princ (strcat "\nLa donnée E-DECHAR2ROTATION=" (angtos ang (getvar "AUNITS") 4) " a été cumulée à " (cdr (assoc 0 dxf_ent))))
		)
	)
)
(prin1)
))

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

Posté(e)

Bonuscad

 

J'ai essayé mais ça me donne ceci :

 

 Sélectionner une entité modèle:
Choix des objets:
Donnée de rotation à attacher à:

 

Et là je ne comprends plus ??? Il me met un fil à la patte au réticule ???

 

 

Pour rappel :

 

J'ai des plans de réseaux d'assainissement (fourni par un délégataire) avec des xdata déjà existantes sur mes fichiers dwg.

 

Les dessinateurs de mon entreprise crée des tampons d'assainissement sous forme de blocs qu'ils orientent suivant la direction de la canalisation.

 

Je souhaite récupérer la valeur d'orientation de chaque tampon d'assainissement pour la mettre dans mes xdata.

 

Sur un même calque, je cherche à récupérer tous les angles de mes tampons pour les mettre sur chacune des xdata existantes de mes tampons.

 

En fait avec ton code le plus gros est fait puisqu'on peut le faire tampon par tampon.

 

Le mieux, je crois, serait de pouvoir faire une sélection graphique de tous les objets souhaités sur le calque et de lui indiquer le nom de l'application E-DECHAR-APIC.

 

Je ne sais pas si c'est clair ?

 

Encore merci et @+

 

PH PELLOUX

Posté(e)

Et là je ne comprends plus ??? Il me met un fil à la patte au réticule ???

 

Je croyais que tu devais rattacher les Xdata à d'autres entités, canalisation par exemple.

 

je cherche à récupérer tous les angles de mes tampons pour les mettre sur chacune des xdata existantes de mes tampons.

 

En fait si je comprend bien les xdata sont à rattacher aux tampons sélectionnés.

 

Je suis pas devin, il faut être plus précis dans les explications ou/et donner un extrait du dessin.

 

Essayes ce qui suit:

((lambda ( / e_model cod_dxf js n dxf_ent ang xd_list)
(princ "\nSélectionner une entité modèle: ")
(while (null (setq e_model (ssget "_+.:E:S" '((0 . "INSERT"))))))
(setq cod_dxf (entget (ssname e_model 0)))
(setq js (ssget "_X" (list (assoc 0 cod_dxf) (assoc 2 cod_dxf) (assoc 8 cod_dxf))) n -1)
(cond
(js
(repeat (sslength js)
(setq
dxf_ent (entget (ssname js (setq n (1+ n))) (list "E-DECHAR-APIC"))
ang (cdr (assoc 50 dxf_ent))
xd_list (cdr (assoc -3 dxf_ent))
)
(entmod
(append
(vl-remove (assoc -3 dxf_ent) dxf_ent)
(list
(list
-3
(append '("E-DECHAR-APIC")
(append
(list (cons 1002 "{") (cons 1000 (strcat "E-DECHAR2ROTATION="(angtos ang (getvar "AUNITS") 4))))
(cddar xd_list)
)
)
)
)
)
)
(princ
(strcat
 "\nLa donnée E-DECHAR2ROTATION="
 (angtos ang (getvar "AUNITS") 4)
 " a été cumulée à "
 (cdr (assoc 0 dxf_ent))
 " au point: "
 (rtos (car (cdr (assoc 10 dxf_ent))))
 ","
 (rtos (cadr (cdr (assoc 10 dxf_ent))))
 ","
 (rtos (caddr (cdr (assoc 10 dxf_ent))))
)
)
)
)
)
(prin1)
))

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

Posté(e)

Bonuscad

 

Ok merci :D c'est exactement ce que je cherche.

 

Je continue de tester et je te dis dans quelques jours si on clôture le sujet.

 

@+

 

Paul-Henri PELLOUX

 

 

 

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é