jujugeometre Posté(e) le 18 juin 2021 Posté(e) le 18 juin 2021 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
didier Posté(e) le 18 juin 2021 Posté(e) le 18 juin 2021 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 Éternel débutant… Mon site perso : Programmer dans AutoCAD
jujugeometre Posté(e) le 18 juin 2021 Auteur Posté(e) le 18 juin 2021 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
Luna Posté(e) le 18 juin 2021 Posté(e) le 18 juin 2021 (modifié) 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é le 18 juin 2021 par Luna
didier Posté(e) le 18 juin 2021 Posté(e) le 18 juin 2021 Bonjour @jujugeometre Bon d'accord ! ... je n'ai pas tout compris, mais tu as l'air satisfait. Tu n'as pas donné de dessin on va dire que c'est que tu ne veux pas qu'on teste... Amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
jujugeometre Posté(e) le 18 juin 2021 Auteur Posté(e) le 18 juin 2021 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
jujugeometre Posté(e) le 18 juin 2021 Auteur Posté(e) le 18 juin 2021 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
Olivier Eckmann Posté(e) le 18 juin 2021 Posté(e) le 18 juin 2021 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant