Aller au contenu

setpropertyvalue


Messages recommandés

Bonjour,

Je fais une boucle pour modifier des attributs OBS1 à OBS9 d'un bloc vers un autre avec un repeat :

(repeat 9 
		    (setq k 1)
		    (setpropertyvalue (ssname listsommets j) (strcat "OBS" (itoa k) ) (getpropertyvalue (ssname listgeoapp i ) (strcat "OBS" (itoa k) ) ) )
		    (setq k (1+ k))
		    );repeat

Je comprends que quand il lance la première modification, setpropertyvalue retourne nil ce qui bloque la boucle.

y a t il un moyen de shunter ce retour nil?

Merci d'avance.

Geometre - Autocad 2016 - Covadis v17.0

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @jujugeometre

Je ne comprends pas grand-chose à ce code, à commencer par le k qui est à 1 au début du repeat bien que tu l'incrémentes à la fin, à chaque boucle il revient à 1 !
Tu pourrais nous donner le code en entier s'il te plaît.
Et un dessin avec le bloc, ce serait bien pour tester.
Ce que je lis ne me parler pas du tout...

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @didier;

A ma décharge, j'ai du suspendre mes développements depuis quelques mois et j'ai un peu de mal à raccrocher les wagons mais effectivement la boucle était pourrave et ça fonctionne maintenant, ce n'était pas du tout le retour de la fonction "setpropertyvalue" qui bloquait.

Merci pour ton message, je demande de l'aide sur une commande, j'ai mal identifié le problème et ton commentaire me débloque, merci beaucoup.

je te laisse le bout de code auquel cela correspond :

(setq 	listsommets 	(ssget "_X" '((0 . "INSERT")		(2 . "alp_bloc_fli_0201_pip_90")))
	listgeoapp 	(ssget "_X" '((0 . "INSERT") 		(2 . "alp_bloc_fli_0202")))
	listannot 	(ssget "_X" '((0 . "MULTILEADER") 	(8 . "FLI-T0" )))
	i		(sslength listgeoapp)
  )

  ;code DXF c'est 10 pour les coordonnées
  ;code 110 pour le point d'insertion du MLEADER

(while	(ssname listgeoapp  ( 1- i ) )
	(setq PTGEOAPP (cdr (assoc 10 (entget (ssname listgeoapp  (setq i (1- i)) ))))) ;coordonnées du pt d'insertion du bloc GEOAPP
	(repeat (setq j (sslength listsommets)) 	;je parcours la liste des sommets pour identifier le sommet qui est à moins de 0.20m
		(setq PTSOMMET (cdr (assoc 10 (entget (ssname listsommets (setq j (1- j)) )))))
	  	(if (< (distance PTGEOAPP PTSOMMET) 0.20) ;je dois remplacer les attributs OBS1 à OBS9 de PTGEOAPP vers PTSOMMET
		  (progn
		    (setq k 1)
		  	(repeat 9 
		    	(setpropertyvalue (ssname listsommets j) (strcat "OBS" (itoa k) ) (getpropertyvalue (ssname listgeoapp i ) (strcat "OBS" (itoa k) ) ) )
		    	(setq k (1+ k))
		    	);repeat
		    );progn
		  );if
	  );while j
);while i
  

j’insère à partir de fichiers externes des données dans autocad et il faut que je transfère des infos ensuite d'un bloc vers un autre inséré précédemment puis vers un MLEADER. ces infos sont dans des attributs qui s'appellent OBS1, OBS2, OBS3... dans les différents blocs.

Bien à toi,

 

Geometre - Autocad 2016 - Covadis v17.0

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Je suis d'accord avec didier, le code n'est pas très clair (notamment avec les appels de variables j, i, listsommets, listgeoapp, ... qui pourraient être la source du problème). Si on part du principe que les variables déclarées précédemment sont juste, on peut déjà corriger le k ainsi :

(repeat (setq k 9) ;; Définition de 'k' à la valeur max
	(setpropertyvalue
		(ssname listsommets j) ;; Nom d'entité à l'indice 'j' du jeu de sélection 'listsommets'
		(strcat "OBS" (itoa k)) ;; Nom de la propriété (ici l'étiquette d'attribut)
		(getpropertyvalue ;; Valeur de la propriété...
			(ssname listgeoapp i) ;; Nom d'entité à l'indice 'i' du jeu de sélection 'listgeoapp'
			(strcat "OBS" (itoa k)) ;; Nom de la propriété (ici l'étiquette d'attribut)
		)
	)
	(setq k (1- k)) ;; Incrémentation décroissante de 'k' jusqu'à 0
)

EDIT: je remarque que tu as de très nombreux appels (ssname), je te conseille d'alléger ton code en affectant les nom d'entités à des variables pour t'éviter cette écriture à base de (ssname) répétitifs et identiques :3

Bisous,
Luna

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

A @didier

Comme ton commentaire réglait le pb et que c'était une erreur basique (j'ai quand même un peu honte), je pensais pas que cela t’intéressait de poursuivre, pas de souci pour fournir mon fichier avec les blocs, je te le joins bien sur.

j'ai des pbs d'encodage sur certains champs mais cela vient de mon appli terrain qui exporte mal, je suis en train de regarder cela.

du coup je vais dupliquer ma boucle pour mettre à jour les MLEADER également, je ne l'ai pas encore fait.

20210618.dwg

Geometre - Autocad 2016 - Covadis v17.0

Lien vers le commentaire
Partager sur d’autres sites

il y a 31 minutes, Luna a dit :

EDIT: je remarque que tu as de très nombreux appels (ssname), je te conseille d'alléger ton code en affectant les nom d'entités à des variables pour t'éviter cette écriture à base de (ssname) répétitifs et identiques :3

@Luna Bonjour, merci pour ta réponse, elle rejoint celle de Didier et règle mon souci.

Pour les appels de nom, comme je parcours une selection pour chercher des blocs proches, tu proposes d'affecter d'abord le nom à une variable à chaque itération? il n'y a pas de fonction qui permet de parcourir une sélection comme "ENTNEXT" permet de parcourir les entités?

 

Geometre - Autocad 2016 - Covadis v17.0

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

Ce que proposait Luna c'est de stocker ton objet issu du ssname dans une variable pour éviter un appel à ssname chaque fois que tu as besoin de cet objet.

(while	(setq entBlocGeoApp (ssname listgeoapp  (setq i (1- i)) ))
	(setq PTGEOAPP (cdr (assoc 10 (entget entBlocGeoApp))))	;coordonnées du pt d'insertion du bloc GEOAPP
	(repeat (setq j (sslength listsommets)) 		;je parcours la liste des sommets pour identifier le sommet qui est à moins de 0.20m
	        (setq entBlocPtSommet (ssname listsommets (setq j (1- j))))
		(setq PTSOMMET (cdr (assoc 10 (entget entBlocPtSommet))))
	  	(if (< (distance PTGEOAPP PTSOMMET) 0.20) 	;je dois remplacer les attributs OBS1 à OBS9 de PTGEOAPP vers PTSOMMET
		  (repeat (setq k 9) 
		    (setpropertyvalue entBlocPtSommet (strcat "OBS" (itoa k) ) (getpropertyvalue entBlocGeoApp (strcat "OBS" (itoa k) ) ) )
		    (setq k (1- k))
		  );repeat k
		);if
	  );repeat j
 );while i

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

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é