Aller au contenu

J\'ai bcp de mal avec entnext entlast


Messages recommandés

Posté(e)

Salut ...

voila je ne comprends pas

Je crèe un jeu de sélection

 

[surligneur] (setq sel_poly (ssget (list(cons 0 "CIRCLE,SOLID,LINE,LWPOLYLINE,ARC"))))[/surligneur]

 

j'utilise les elts de ce jeu pour une commande sel_poly

 

a la deuxieme commande

 

en utlisant ce jeu ça va marcher

mais si je rajoute une commande utilisant encore ce jeu sel_poly alors plus rien ......

 

sel_poly contient 8 elts de [surligneur] 1 2 3 4 5 6 7 8 [/surligneur]

Donc enlast => la derniere entité OK.... est [surligneur] 8[/surligneur]

ensuite (entnext(entlast)) devrait me retourner [surligneur] 7[/surligneur]

la je boucle pour remonter ?????

 

:casstet:

 

 

 

Posté(e)

Salut,

 

Il me semble que tu fais une confusion entlast et entnext dépendent de la création des entités.

 

(entlast) c'est la dernière entité créée.

 

(entnext) sans argument, retourne la première entité créée du dessin courant, avec un argument (entnext ent) l'entité (ou sous-entité) créée après ent.

 

Pour parcourir un jeu de sélection, tu peux utiliser (ssname sel_poly n) où n est incrémenté de 0 à (sslength sel_poly)

 

Par exemple pour appliquer une fonction (entdel par exemple, mais çà pourait être une fonction lambda) à toutes les entités d'un jeu de sélection (ss) tu peux faire :

 

(repeat (setq n (sslength ss))
     (apply 'entdel (list (ssname ss (setq n (1- n)))))
   ) 

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

Posté(e)

Salut gile ...

En faite lorsque j'ai crée un jeu de sélection

ex: toutes les lignes rouges

donc [surligneur] sel_poly,[/surligneur] j'utilise ce jeu pour les transformes en polyligne fermé, la ça marche

mais après je veux récupérer avec ce même jeu de sélection

je veux transformé ces poly...

en region puis les mettres dans un calque .

Donc ces pour cela que je voulais utiliser les élts du jeu surligneur] sel_poly,[/surligneur] avec entlast et entnext .

Sans avoir a recrée un autre filtre du style

 

(setq ss_region (ssget "p" (list(cons 0 "LWPOLYLINE"))))

 

(setq n 0)

 

(setq Long_sel (sslength ss_region))

 

(repeat Long_sel

 

(setq ent_last ( ssname ss_region n))

 

(command "region" ent_last "" )

 

(command "_chprop" ent_last "" "CO" "DUCALQUE" "CA" "toto" "EP" "0" "" "" )

(setq n(+ 1 n))

 

)

 

en faite je ne vois comment placé un entnext dans ce code

 

 

merci....

Posté(e)

(setq ss_region (ssget  (list(cons 0 "LWPOLYLINE"))))
(setq n 0)
(setq Long_sel (sslength ss_region))

(repeat Long_sel
(setq ent_last ( ssname ss_region n))
 (if(not(zerop(cdr(assoc 70(entget ent_last))))); on s'assure que la poly est fermée
   (command "region" ent_last "" ))
(command "_chprop" (entlast) "" "CO" "DUCALQUE" "" "" ); là, un vrai entlast
(setq n(+ 1 n))
)

 

Ton CHPROP ne prend pas le vrai entlast, c'est pour ca que j'ai corrigé.

 

Attention, pour ce genre d'opération, tu dois prendre le contrôle de la variable DELOBJ

 

vois SETVAR et GETVAR.

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Re,

 

Je ne suis pas sur de bien comprendre, mais si tu as transformé les entités du jeu de sélection sel_poy en polylignes fermées, les entités de sel_poly transformées n'existent plus dans le dessin.

 

Tu peux récupérer chaque poly juste après sa création dans une liste poly_lst par un

(setq poly_lst (cons (entlast) poly_lst))

et ensuite traiter toutes les entités de la liste :

(foreach n poly_lst
  (command "region" n "" )
(command "_chprop" (entlast) "" "CO" "DUCALQUE" "CA" "toto" "EP" "0" "")
 )

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

Posté(e)

Salut TRAMBER ....

 

merci pour tes infos ......

(if(not(zerop(cdr(assoc 70(entget ent_last))))); on s'assure que la poly est fermée

mais juste est 'il nécéssaire de spécifier que la polyli... soit fermé qui d toute façon ne transforme pas l'objet en région ..Non?....

....

tchao

 

 

 

Posté(e)

Gile,

 

Tu peux récupérer chaque poly juste après sa création dans une liste poly_lst par un

(setq poly_lst (cons (entlast) poly_lst))

 

Si j'ai bien compris je crée un jeu de sel_poly qui contient 4elts, que je transforme en poly fermé

 

Les poly fermées après transformation font t-elles tjs partit du jeu sel_poly ????

 

Mais lorsque je crée ma liste (setq poly_lst (cons (entlast) poly_lst)), il me mettra dedans que le 4° elt mais pas les 3 autres ??????NON ...

 

 

Posté(e)

mais juste est 'il nécéssaire de spécifier que la polyli... soit fermé qui d toute façon ne transforme pas l'objet en région ..Non?....

 

S'il n'y a pas de création de région, le (entlast) de chprop s'appliquera à la derniére entité créée (qui ne sera pas la région ...).

 

Je ne comprends toujours pas pourquoi tu fais un deuxième jeu de sélection ?

Pourquoi ne crée tu as ta région juste après avoir créé la polyligne fermée :

(command "region" (entlast) "" ) là, (entlast) retourne la dernière entité créée (la poly). Puis :

(command "_chprop" (entlast) "" "CO" "DUCALQUE" "CA" "toto" "EP" "0" "") et là entlast retoune la région

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

Posté(e)

Les poly fermées après transformation font t-elles tjs partit du jeu sel_poly ????

 

Non, sel_poly existe toujours, il contient les noms d'entités du départ (les 4 elts) mais ces entités ne sont plus dans le dessin puisqu'elles ont été tranformées en une polyligne (si j'ai bien compris)

un (entlast) juste après cette transformation retourne la dernière entité créée, soit la polyligne en question.

 

Ce qu'il me manque, pour bien comprendre, c'est comment tu traites le premier jeu de sélection sel_poly pour transformer les entités en polylignes (joindre plusieurs entités ? 1 entité -> 1poly ? ...)

 

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

Posté(e)

 

 

Parce que je sélectionne plusieurs entités, donc entlast renvois que le dernier elt,

mais pas le premier ...Non ???,

et la tjs mon exemple :

si j'ai séléctionné toutes mes lignes puis effectivement je les transforment en poly puis region et chgt de calque ...

Entlast ne me modifiera que le dernier .......

 

 

 

Posté(e)

Voici le code

 

 (defun C:join_mac (/ )
 
(setq j_mc (getreal "\n Epaisseur des murs < >: "))  

(command "pedit" "multiple" (setq sel_poly (ssget (list(cons 0 "CIRCLE,SOLID,LINE,LWPOLYLINE,ARC")))) "" "J" j_mc "" "" )

;;Transforme les lignes en polyligne et les joints 
(setvar "cecolor" "DUCALQUE" )

 (setq ss_region (ssget  (list(cons 0 "LWPOLYLINE"))))
 
(setq n 0)
 
(setq Long_sel (sslength ss_region))
 
(repeat Long_sel
 
(setq ent_last ( ssname ss_region n))
  
 (command "region" ent_last "" )
 
(command "_chprop"  [i] entlast[/i] "" "CO" "DUCALQUE" "CA" "maconneries" "EP" "0" "" "" ) 
;;entlast corrigé par tramber
(setq n(+ 1 n))
 
);;fin de repeat

)

 

effectivement lorsque je fais une recherche des polylignes, il me passe tout le dessin en revu

alors que je voudrais qu'il se concentre sur ma sélection qui est sel_poly

 

C'est pour cela que je pensais au entnext enlast .....

 

 

 

Posté(e)

Comme je disais dans ma première réponse (entlast) ne retourne pas le dernier élément du jeu de sélection mais la dernière entité créée dans le dessin.

 

Quand tu transformes une (ou plusieurs) ligne(s) en une polyligne (entlast) retourne le nom d'entité de la polyligne qui vient d'être créé. Si tu transformes cette polyligne en région (command "region" (entlast) "" ), (entlast) retournera le nom d'entité de la région qui viendra d'être créée. Tu pourra donc faire (command "_chprop" (entlast) "" "CO" "DUCALQUE" "CA" "toto" "EP" "0" "").

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

Posté(e)

 

 

Comme je disais dans ma première réponse (entlast) ne retourne pas le dernier élément du jeu de sélection mais la dernière entité créée dans le dessin.

 

 

Ouais bien compris,

 

mais les autres entités crées car dans mon exemple je crée d'autres entités ????

Posté(e)

 

Si j'ai bien compris apès la création des entités (region )

 

 

Tu peux récupérer chaque poly juste après sa création dans une liste poly_lst par un

(setq poly_lst (cons (entlast) poly_lst))

 

 

et ensuite traiter toutes les entités de la liste :

(foreach n poly_lst

(command "region" n "" )

(command "_chprop" (entlast) "" "CO" "DUCALQUE" "CA" "toto" "EP" "0" "")

)

 

je crèe [surligneur] (setq poly_lst (cons (entlast) poly_lst)) [/surligneur]

 

qui me récupère toutes les entité crées ( n ) ?????

 

Et ensuite ....

 

[surligneur] (foreach n poly_lst

(command "region" n "" )

(command "_chprop" (entlast) "" "CO" "DUCALQUE" "CA" "toto" "EP" "0" "")[/surligneur]

 

 

 

 

 

 

 

Posté(e)

Au temps pour moi,

 

en utilisant l'option "multiple" de PEDIT tu traites tout ton jeu de sélection en une seule fois, je pensait que tu parcourais ta sélection et traitais les éléments un par un (d'où les exemples ci-dessus).

 

Tu peux donc utiliser entnext, mais il faut tout d'abord mettre une "balise" pour le départ du entnext.

 

Au début de ton LISP, avant (command "_pedit" ... tu crées une entité (un point par exemple) dont tu attribues le nom d'entité à 2 variables (dep et point par exemple) :

 

(command "_.point" '(0 0 0))
 (setq	point (entlast)
dep   point
 )  

 

Pour faire un jeu se sélection de toutes les entités créées depuis le point (les polylignes) à la place de (setq ss_region (ssget (list (cons 0 "LWPOLYLINE")))), tu fais :

 

(setq ss_region (ssadd))
 (while (setq dep (entnext dep))
   (ssadd dep ss_region)
 ) 

 

À la fin du LISP tu supprimes le point :

 

(entdel point) 

 

Comme çà, effectivement, tu utilises bien entlast et entnext.

 

PS : dans ton code, tu as oublié les paranthèses de (entlast)

 

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

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

Posté(e)

Gile

 

merci pour ton information sur ce pb ......

Mais peux tu me faire donner quelque explication sur entnext et entlast ....

Car je ne pige mais vraiment que "dalle"""""

 

tu crèe un pt de depart ...ok!!!!

 

(setq ss_region (ssadd)) [surligneur] ;; création d'un jeu vide[/surligneur]

(while (setq dep (entnext dep))

c'est la pb

création d'une boucle ???;;Pour y mettre toutes les entitées crées depuis le point [surligneur] dep[/surligneur] entnext scan toutes les entitées crées ...

(ssadd dep ss_region)

)

 

Bon si tu as le temps,je te remercie pour ta patience ...

Posté(e)

(entlast) retourne le nom d'entité du dernier objet créé dans le dessin, du style : .

 

J'attribue cette valeur à une variable dep (à une autre aussi, point, qui conservera le nom initial pour pouvoir la supprimer à la fin)

 

De nouvelles entités sont créées avec PEDIT, des polylignes.

 

(entnext dep) retourne le nom de la première entité créée après dep.

 

Je fais une boucle en attribuant à dep successivement le nom d'entité de chaque entité créée après l'entité précédemment attribuée à dep :

 

(while (setq dep (entnext dep)) ...

 

et j'ajoute ce nom d'entité au nouveau jeu de sélection ss_region.

Donc, en premier la poly créée après le point, puis la poly créée après celle-ci et ainsi de suite tant qu'il existe une poly créée après la précédente :

 

... (ssadd dep ss))

 

Dans ce cas, il s'agit "d'entités simples" si ent est une entité complexe (bloc avec attrbut, poly3D, surface maillée...) et qu'on fait un (entnext ent) il sera retourné la première "sous-entité" de ent (attribut, vertex ...).

C'est aussi avec des boucles qu'on peut récupérer les attributs des blocs ou les sommets des polylignes non optimisées.

 

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

Posté(e)

Salut

C'est une méthode plus que valable avec le entnext de dep mais, car il y a toujours un mais, il faut faire gaffe que la dernière entité n'est pas un bloc

 

@+

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)

il faut faire gaffe que la dernière entité n'est pas un bloc

 

C'est pour çà que je faisait un point au début (que je supprime à la fin) pour être sûr de la première entité.

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

Posté(e)

il faut faire gaffe que la dernière entité n'est pas un bloc

 

Oui et Non

 

Il est vrai que si un bloc sert de marque dans le dessin et que celui-ci est de nouveau réinsérer dans le dessin par la suite, cela pose un problème d'identification de la marque.

 

Mais si le lisp ne se sert pas de ce bloc ayant servi de repère, normalement cela ne pose pas de problème. Enfin je pense....

 

Mais il est certain que la méthode de (gile) est plus sure.

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é