Aller au contenu

Mon premier lisp bis


farfar974123

Messages recommandés

Bonjour à tous,

 

Après une longue absence me voila de retour sur ce forum toujours aussi riche et intéressant. ;)

 

Je voudrais créer un petit programme qui me permettrait de récupérer l'index d' un attribut de bloc et de l'insérer dans un texte simple :

 

- Faire une sélection sur des blocs avec attribut

 

- Ces blocs ont tous deux attributs, l'un s'appelle Mat, l'autre Alt

 

- Je veux récupérer tous les index de l'attribut Mat.

 

- Insérer cette liste dans un texte simple.

 

J'ai pensé à utiliser ssget pour la sélection, qui me donne en retour : "Selection set: 17f8" Comment récupérer la liste des attributs Mat à partie de cette sélection? :(

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Petite question : si tu passes par une sélection "multiple" avec un ssget, comment connaitre le point d'insertion des textes, représentant les matricules si j'ai bien compris ?

 

En gros, veux-tu que tous ces matricules se place à l'endroit de l'attribut ou plutôt à l'insertion du bloc, qui devrait être le point topo ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

ou lala...

 

Je n'ai jamais franchi le niveau initiation au lisp... je te donne donc le point de vue d'un candide.

Apprends à manipuler, sélectionner ect.. des entités simples avant de t'attaquer aux entités complexes.

Je dis ça à cause du titre de ton message

 

As tu potassé l'initiation de (gile) ?

As tu compris les mécanismes des filtres de sélections ?

As tu compris le fonctionnement des listes ? (lisp c'est quand même un acronyme formé à partir de "list processing"), Comment on manipule les textes ?...

 

J'ai fait qqs pages sur mes errances vécues au cours de cette initiation, sur la 1ere tu trouvera des liens vers toutes les ressource dont tu va avoir besoin et qu'il est indispensable d'avoir sous la main.. Ce ne sont pas des cours à proprement parler, mais plutôt des notes prises au fil du temps...

Lien vers le commentaire
Partager sur d’autres sites

Petite question : si tu passes par une sélection "multiple" avec un ssget, comment connaitre le point d'insertion des textes, représentant les matricules si j'ai bien compris ?

 

- Faire une sélection sur des blocs avec attribut

 

- Ces blocs ont tous deux attributs, l'un s'appelle Mat, l'autre Alt

 

- Je veux récupérer tous les index de l'attribut Mat.

 

- Indiquer la position du texte

 

- Insérer la liste extraite dans un texte simple

 

Disons que je dois ajouter cette étape à mon programme B)

 

En gros, veux-tu que tous ces matricules se place à l'endroit de l'attribut ou plutôt à l'insertion du bloc, qui devrait être le point topo ?

 

C'est beaucoup plus simple que cela, je veux juste extraire l'information MAT des blocs et les insérer dans un texte à part dans mon dessin

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

ou lala...

 

Je n'ai jamais franchi le niveau initiation au lisp... je te donne donc le point de vue d'un candide.

Apprends à manipuler, sélectionner ect.. des entités simples avant de t'attaquer aux entités complexes.

Je dis ça à cause du titre de ton message

 

As tu potassé l'initiation de (gile) ?

As tu compris les mécanismes des filtres de sélections ?

As tu compris le fonctionnement des listes ? (lisp c'est quand même un acronyme formé à partir de "list processing"), Comment on manipule les textes ?...

 

J'ai fait qqs pages sur mes errances vécues au cours de cette initiation, sur la 1ere tu trouvera des liens vers toutes les ressource dont tu va avoir besoin et qu'il est indispensable d'avoir sous la main.. Ce ne sont pas des cours à proprement parler, mais plutôt des notes prises au fil du temps...

 

En fait j'ai dèja fait qq lignes de codes à une époque. Je m'y replonge doucement. :blink:

 

Dans un premier temps, ma sélection de bloc se fera au préalable sans passer dans un filtre dans ma commande lisp.

 

Pour l’instant, ce qui m'embète c'est récupérer cette fameuse liste de matricule :)

 

Quelle fonction (ou suite de fonction) utiliser afin d'interroger cette sélection "Selection set: 17f8"

 

Puis récupérer l'info dont j'ai besoin.

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

les blocs sont des entité complexes, c'est à dire une entité composées d'entités simples.

Tu devra en passer par (entnext pour parcourir les 'sous entité'.

tester si cette entité est un attribut

voila une petite fonction en exemple

 

 

 

;;;Att-lst retourne la liste enget de l'attributs "nomatt" du bloc "entb" dans l'élément ou nil si non trouvé

;;;;;;; NOTA

;;;;;;; 2 nom de l'attribut

;;;;;;; 10 coordonnée du point de l'atrib

;;;;;;; 1 valeur attrib

(defun Att-lst (ent nomatt / lst-att dxf-1)

(while (= lst-att nil)

(setq ent (entnext ent))

(setq dxf-1 (entget ent))

(if (and (= (cdr (assoc 0 dxf-1)) "ATTRIB")

(= (cdr (assoc 2 dxf-1)) nomatt)

)

(setq lst-att dxf-1)

)

)

lst-att ;valeur de retour

)

 

 

tien ?... cadXP me rajoute un size=2 sur le bloc de code... c'est nouveau? du coup je l'ai viré car c'est plus lisible

 

Pour utiliser ça dans ton code il te faut connaitre le handle du bloc pour l'appeler dans un setq sous cette forme

(setq n-ref (read (cdr (assoc 1 (Att-lst (handent handle) "REF")))) donc toi c'est pas REF mais MAT le nom de ton attribut

Après il y a moyen de le faire en Vlisp, mais je maîtrise pas...

Lien vers le commentaire
Partager sur d’autres sites

Re.

 

Je ne comprend pas tellement ton but, mais bon, ce bout de code peut t'intéresser :

  (setq Obj (car (entsel "Clique l'entité :")))
 (setq Txt_Matri (getpropertyvalue Obj "MAT"))
 (setq Coord (cdr (assoc 10 (entget Obj))))
 (command "_.text" "j" "mc" Coord 0.15 100 (rtos (atof Txt_Matri) 2 0))

Tu cliques le bloc et ça écrit le matricule au point d'insertion du bloc, tu n'as plus qu'à faire un ssget et un while qui encadrera ce code.

 

J'ai laisser le command pour mieux comprendre le code.

 

N'hésite pas à revenir vers nous.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos pistes.

 

Appartement c'est plus complexe que je le pensais pour un débutant :)

 

Je ne comprend pas tellement ton but, mais bon, ce bout de code peut t'intéresser :

 

Si tu veux, j'ai un ensemble de points topo avec attibut. J'ai besoin de récupérer dans un mème texte l’ensemble des attributs MAT. Insérer ensuite ce texte dans une étiquette type covadis (Les covadiens comprendront :) )

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

Donc, pour reprendre, il te faut filtrer la sélection en ft du nom du bloc qui t’intéresse, parcourir cette sélection et extraire les valeurs de MAT, et concaténer tout ça dans une liste.

Ensuite je te conseillerai plutot de le balancer dans un Mtext pour pouvoir gérer la mise en forme plus facilement...

Lien vers le commentaire
Partager sur d’autres sites

;;;Att-lst retourne la liste enget de l'attributs "nomatt" du bloc "entb" dans l'élément ou nil si non trouvé

;;;;;;; NOTA

;;;;;;; 2 nom de l'attribut

;;;;;;; 10 coordonnée du point de l'atrib

;;;;;;; 1 valeur attrib

(defun Att-lst (ent nomatt / lst-att dxf-1)

(while (= lst-att nil)

(setq ent (entnext ent))

(setq dxf-1 (entget ent))

(if (and (= (cdr (assoc 0 dxf-1)) "ATTRIB")

(= (cdr (assoc 2 dxf-1)) nomatt)

)

(setq lst-att dxf-1)

)

)

lst-att ;valeur de retour

)

 

le bloc "entb" apparait ou dans le code?

Quand tu écris (ent nomatt / lst-att dxf-1)

 

C'est quoi cette fonction "ent"? :)

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

Donc, pour reprendre, il te faut filtrer la sélection en ft du nom du bloc qui t’intéresse, parcourir cette sélection et extraire les valeurs de MAT, et concaténer tout ça dans une liste.

Ensuite je te conseillerai plutot de le balancer dans un Mtext pour pouvoir gérer la mise en forme plus facilement...

 

c'est l'étape "parcourir la sélection" qui me bloque (sans jeux de mots :P )

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

 (setq Obj (car (entsel "Clique l'entité :")))

(setq Txt_Matri (getpropertyvalue Obj "MAT"))

(setq p(getpoint"\nPosition du texte "))

(command "texte" p 100 (rtos (atof txt_matri)))

 

Bon je suis arriver à lui faire écrire le numéro de matricule dans un texte.

 

Maintenant passons à ssget :o

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

Re, encore...

 

Voici ce que tu cherches à faire, la liste est dans Texte :

;;; ****************************************
;;; récupère les matricules du bloc TCPOINT 
;;;  et les concatene dans "Texte"          
;;; pour farfar974123 de CadXP.com          
;;; ****************************************
(defun c:RecupMatLst (/ ss Texte Obj i Txt_Matri Coord)
 (princ "\nDéveloppé par Denis H. (vers.1.0)")
 (setq Texte "")
 (if (setq ss (ssget "_X" '((0 . "INSERT") (8 . "TCPOINT"))))
   (progn (setq i 0)
          (while (setq ssObj (ssname ss i))
            (setq i (1+ i))
            (setq Txt_Matri (getpropertyvalue ssObj "MAT"))
            (setq Texte (strcat Texte "\n" Txt_Matri)) ;_ Fin de cond
          ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if
 (princ Texte)
 (princ)
) ;_ Fin de defun

Tiens nous au courant si c'est bien ce que tu souhaitais...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Ha?

j'aime bien...

je ne connaissait pas getpropertyvalue qui simplifie pas mal le pb...

du coup j'ai fait mes révisions et testé (dumpallproperties (ssname (ssget) 0)) sur pas mal d'entité, ça m'ouvre des perspectives... surtout qu'on a aussi setpropertyvalue dans la famille...

 

je retiens la leçon...

Lien vers le commentaire
Partager sur d’autres sites

Salut DenisHen et merci du coup de main :)

 

A la lecture du code, cela ressemble à ce que je veux. Par contre j'arrive pas à le lancer.

 

Je copie ton bout de code dans un fichier texte, change l'extension en .lsp

 

Charger le tout dans AutoCAD via la commande Load.

 

Je tape RecupMatLst au clavier et ... rien :unsure:

 

Une erreur dans ma manip?

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

un exemple ici ou je fait une grosse partie de ce que tu veux faire

http://joch04.free.f.../lisps-bloc.htm

 

entb est un argument passé à la fonction...

 

Yé merci pour le lien. C'est une petite mine d'or pour les débutants ton site !!!!

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites


(setq ss (ssget))

(setq Texte "")

(progn (setq i 0)

(While (setq ssObj (ssname ss i)) 

(setq i (1+ i))
(setq Matri (getpropertyvalue ssObj "MAT"))
(setq Texte (strcat Texte "\n" Matri))
	
	)
		)

(princ Texte)

(princ)

 

Bonjour à tous. J' ai simplifié le code, c'est à dire enlever le filtre histoire de comprendre ce que je suis en train de faire

 

J'ai quelques question :

 

- Pourquoi utiliser progn en début de code?

- Pourquoi cette ligne de commande : (setq Texte "")

 

:rolleyes:

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

Je copie ton bout de code dans un fichier texte, change l'extension en .lsp

Je te conseille fortement d'utiliser l'éditeur d'AutoCAD pour les lisp, avec la commande "_vlide". Tu trouveras plein de renseignement ICI.

 

- Pourquoi utiliser progn en début de code?

Tu a décomposé mon code, il ne sert plus à rien maintenant, c'était pour le (if...

 

- Pourquoi cette ligne de commande : (setq Texte "")

Parce que si Texte n'est pas "vide", j'ai eu une erreur avec (setq Texte (strcat Texte "\n" Txt_Matri)). Je n'ai pas compris pourquoi... Peut-être qu'une variable vaut nil si elle n'est pas prédéfinie ???

Mais tu peut le remplacer par (setq Texte "Liste des points").

Voici le code que tu as modifié :

(setq ss (ssget))
(setq Texte ""
     i 0
) ;_ Fin de setq
(While (setq ssObj (ssname ss i))
 (setq i (1+ i))
 (setq Matri (getpropertyvalue ssObj "MAT"))
 (setq Texte (strcat Texte "\n" Matri))
) ;_ Fin de While
(princ Texte)
(princ)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

(setq ss (ssget))

(setq Texte "")


(setq i 0)

(While (setq ssObj (ssname ss i)) 

(setq i (1+ i))
(setq Matri (getpropertyvalue ssObj "MAT"))
(setq Texte (strcat Texte "\n" Matri))
	
	)
		

(setq pt(getpoint))

(command "texte" pt 100 (strcat Texte))

(princ)

 

Trés modestement je suis arrivé à cela. Prendre les matricules d' un bloc-point et les insérer dans un texte.

 

1er bilan :

 

Comprendre l'association ssname et ssget.

 

Comprendre une boucle while.

 

 

(merci X-all et DenisHen ;) )

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je pense que ça, ce serait mieux, mais c'est à tester :

(command "_.text" pause 100 Texte)

Et tu n'auras plus besoin du (setq pt(getpoint))

 

Attention, ton style de texte doit avoir une hauteur de définie.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je pense que ça, ce serait mieux, mais c'est à tester :

(command "_.text" pause 100 Texte)

Et tu n'auras plus besoin du (setq pt(getpoint))

 

Attention, ton style de texte doit avoir une hauteur de définie.

 

Ca merche nikél (J'ai juste enlever le "." devant "text" B)

Imposer sa volonté aux autres, c'est force. Se l'imposer à soi-même, c'est force supérieure.

Lao-Tseu

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Question à farfar974123 :

 

Est-ce que tu as fini par résoudre le souci que tu nous as exposé ?

Je regarde de temps en temps ce post, ça bacaille, ça copie-colle mais je ne sens pas que ça avance

Si ce n'est pas résolu je veux bien que tu explicites clairement le résultat que tu souhaites obtenir

Ce que j'ai compris c'est que depuis un plan topo tu veux extraire tous les matricules des points et les concaténer dans un fichier texte

Ça va donner quelque chose comme ça :

123;212;Tn1;Tn2 ?

Ou bien ligne par ligne, et les coordonnées dans tout ça ?

Ou encore tout autre chose, je ne suis pas certain de comprendre donc je ne m'implique pas.

 

Amicalement

 

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é