Aller au contenu

Autolisp - Variables infinies?


Hey_Its_Sanka

Messages recommandés

Bonjour!

Je débute un petit peu en programmation et malgré mes recherches, je n'ai toujours pas trouvé la solution à mon problème :

Je souhaite créer des programmes avec des enregistrements de variables infinies. Pour le moment je sais juste utiliser le "setq" avec une quantité fixe dans mes lisp.

Pour faire simple, j'aimerai sélectionner plusieurs entités qui soit elles-mêmes enregistrées dans mon lisp (peu importe la quantité).

 

Actuellement je voudrais sélectionner des textes et points d'altitude sur un topo, et que ça me trace une ligne de TN automatiquement (en vue de face pour mes façades), peu importe la quantité d'alti. 

 

Merci ^^

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Il va falloir être un peu plus clair avec les termes utilisés car j'ai bien peur de ne pas tout avoir compris...

Le 14/09/2023 à 13:47, Hey_Its_Sanka a dit :

Je souhaite créer des programmes avec des enregistrements de variables infinies.

Qu'est-ce que tu veux dire par là ? Faut-il que les valeurs que tu affectes à une variable soient conservées dans le dessin en cours pour la session actuelle (et donc même une fois l'exécution du programme terminée, tu puisses accéder à leur valeur) ou bien également pour les sessions prochaines ?

Le 14/09/2023 à 13:47, Hey_Its_Sanka a dit :

Pour le moment je sais juste utiliser le "setq" avec une quantité fixe dans mes lisp.

Qu'entends-tu par "quantité fixe" exactement ? Car il n'y a (à ma connaissance) pas de limitation en terme de nombre de variables par programmes. Ou bien tu voulais dire que tu ne savais que affecter des valeurs constantes à tes variables (donc par exemple 7, "ceci est un texte", ...) ?
Si c'est cela, sache que tu peux affecter n'importe quelle valeur à une variable sans forcément que celle-ci soit fixe. Par exemple :

(setq dernier_objet (entlast)) ;; Affecte à la variable 'dernier_objet' le nom d'entité du dernier objet créé dans le dessin

(setq point (getpoint "\nPoint : ")) ;; Affecte à la variable 'point' les coordonnées 3D du point (sous forme de liste) sélectionné par l'utilisateur

(setq valeur_A (+ 8 2)) ;; Affecte à la variable 'valeur_A' le résultat de l'addition 8+2 soit 10

(setq valeur_B (* valeur_A 2)) ;; Affecte à la variable 'valeur_B' le résultat de la multiplication 2x valeur_A soit 2x10 donc 20

 

Le 14/09/2023 à 13:47, Hey_Its_Sanka a dit :

Pour faire simple, j'aimerai sélectionner plusieurs entités qui soit elles-mêmes enregistrées dans mon lisp (peu importe la quantité).

Pour réaliser un jeu de sélection, il faut utiliser la fonction (ssget) dans le cas de sélection d'objets multiples ou complexe, sinon la fonction (entsel) qui permet de sélectionner un seul objet. Cependant, la fonction (ssget) me semble peut-être un peu trop complexe pour toi pour l'instant et si je comprends bien le but ultime de ton programme, (entsel) devrait être plus adapté pour toi puisqu'il faut que l'utilisateur détermine un ordre de sélection afin de tracer la ligne correctement entre les différents points (autrement si tu fais une sélection de tous les points d'un coup, comment le programme est-il supposé connaître l'ordre des points ?).

Evidemment, je pourrais te proposer des programmes tout fait pour répondre à ton besoin mais je n'ai pas l'impression que c'est ce que tu souhaites ici (peut-être que je fais fausse route cependant). J'ai plutôt la sensation que tu aimerais avoir juste des pistes afin de te guider et t'aider à réaliser ce programme par toi-même.
J'ai un peu peur que tu t'attaques à un programme un peu complexe pour débuter mais on va faire au mieux pour t'épauler 🙂

Dans un premier temps, afin de ne pas te perdre dans les étapes cruciale de ton programme, je te conseille vivement de réaliser un logigramme du programme afin d'identifier clairement les étapes clés du programme mais également d'identifier l'ensemble des données nécessaires à la bonne exécution du programme tout en respectant les contraintes que tu t'imposes (et les contraintes du logiciel évidemment).
Tu peux également t'appuyer sur les cours d'apprentissage de l'AutoLISP de (gile) ainsi que le site de didier qui sont d'une aide précieuse pour tout niveau confondu.
Aux vues du programme que tu désires réaliser, voici une liste non exhaustive de fonctions qui pourront t'être utile et qui pourra ainsi te donner quelques pistes de recherches :

- (setq) -> affecte une valeur à une variable
- (entsel) -> demande à l'utilisateur de sélectionner un objet unique
- (ssget) -> permet de réaliser ou demander à l'utilisateur de sélectionner un ensemble d'objets ou un seul en filtrant la sélection si besoin en fonction des arguments spécifiés
- (car) -> renvoie le premier élément d'une liste
- (cdr) -> renvoie la liste moins le premier élément de la liste
- (while) -> effectue une boucle Tant Que...
- (if) -> fonction SI...
- (command) -> permet de faire appel à une commande AutoCAD
Je t'invite grandement à consulter l'aide AutoCAD sur chacune de ces fonctions pour comprendre plus précisément leur rôle et également avoir un exemple d'utilisation. Il s'agit, encore une fois, d'une liste non exhaustive donc il y aura d'autres fonctions qui seront nécessaire au programme.

Si jamais tu as également besoin d'exemple plus concrets ou de bouts de codes pour certaines parties de ton programme (notamment lorsque tu devras consulter les attributs de tes blocs par exemple), n'hésites pas ! On s'adaptera à tes besoins.

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je pense que te souhaites stocker une liste d'objet.

Soit tu les sélectionnes et tes objets sont ajoutés à un jeu de sélection, ou bien tu les stockes dans une liste.

Pour le jeu de sélection : 

; sélectionne les objets de type référence de bloc dont le nom de bloc est XXXXX 
(setq  ssPtTopo (ssget (list (cons 0 "INSERT") (cons 2 "XXXXX"))))
(setq I 0)
; boucle sur les éléments sélectionnés
(repeat (sslength ssPtTopo)
  ; récupère le Ième objet du jeu
  (setq oPtTopo (ssname ssPtTopo I))
  (setq I (1+ I))
  ; fait ce que tu veux avec cet objet :
  ; par exemple extraire son point d'insertion
  (setq PT (cdr (assoc 10 (entget oPtTopo))))
  ...
)

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Hey_Its_Sanka

Je constate deux choses :

Message posté jeudi et quatre jours plus tard, malgré des réponses bien tournées, toujours pas de visite ou de commentaire en retour. À moins d'une incapacité à se connecter au site, ce n'est pas très respectueux pour les gens qui travaillent aux réponses.

Je débute un petit peu en programmation, pour un début, il ne faut pas se lancer dans des programmes trop compliqués. Il faut intégrer les règles de base, ensuite, on les englobera dans des programmes plus complexes. Je donne souvent l'image du solfège et des gammes pour l'apprentissage. Le plus virtuose des musiciens a toujours commencé par des gammes, diatoniques puis chromatiques...

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Le 16/09/2023 à 20:14, Olivier Eckmann a dit :

Bonjour,

 

Je pense que te souhaites stocker une liste d'objet.

Soit tu les sélectionnes et tes objets sont ajoutés à un jeu de sélection, ou bien tu les stockes dans une liste.

Pour le jeu de sélection : 

; sélectionne les objets de type référence de bloc dont le nom de bloc est XXXXX 
(setq  ssPtTopo (ssget (list (cons 0 "INSERT") (cons 2 "XXXXX"))))
(setq I 0)
; boucle sur les éléments sélectionnés
(repeat (sslength ssPtTopo)
  ; récupère le Ième objet du jeu
  (setq oPtTopo (ssname ssPtTopo I))
  (setq I (1+ I))
  ; fait ce que tu veux avec cet objet :
  ; par exemple extraire son point d'insertion
  (setq PT (cdr (assoc 10 (entget oPtTopo))))
  ...
)

 

Olivier

Merci Olivier ! Ton repeat et ton compteur m'ont ouvert les yeux 🙂

Lien vers le commentaire
Partager sur d’autres sites

Le 15/09/2023 à 22:11, Luna a dit :

Coucou,

Il va falloir être un peu plus clair avec les termes utilisés car j'ai bien peur de ne pas tout avoir compris...

Qu'est-ce que tu veux dire par là ? Faut-il que les valeurs que tu affectes à une variable soient conservées dans le dessin en cours pour la session actuelle (et donc même une fois l'exécution du programme terminée, tu puisses accéder à leur valeur) ou bien également pour les sessions prochaines ?

Qu'entends-tu par "quantité fixe" exactement ? Car il n'y a (à ma connaissance) pas de limitation en terme de nombre de variables par programmes. Ou bien tu voulais dire que tu ne savais que affecter des valeurs constantes à tes variables (donc par exemple 7, "ceci est un texte", ...) ?
Si c'est cela, sache que tu peux affecter n'importe quelle valeur à une variable sans forcément que celle-ci soit fixe. Par exemple :

(setq dernier_objet (entlast)) ;; Affecte à la variable 'dernier_objet' le nom d'entité du dernier objet créé dans le dessin

(setq point (getpoint "\nPoint : ")) ;; Affecte à la variable 'point' les coordonnées 3D du point (sous forme de liste) sélectionné par l'utilisateur

(setq valeur_A (+ 8 2)) ;; Affecte à la variable 'valeur_A' le résultat de l'addition 8+2 soit 10

(setq valeur_B (* valeur_A 2)) ;; Affecte à la variable 'valeur_B' le résultat de la multiplication 2x valeur_A soit 2x10 donc 20

 

Pour réaliser un jeu de sélection, il faut utiliser la fonction (ssget) dans le cas de sélection d'objets multiples ou complexe, sinon la fonction (entsel) qui permet de sélectionner un seul objet. Cependant, la fonction (ssget) me semble peut-être un peu trop complexe pour toi pour l'instant et si je comprends bien le but ultime de ton programme, (entsel) devrait être plus adapté pour toi puisqu'il faut que l'utilisateur détermine un ordre de sélection afin de tracer la ligne correctement entre les différents points (autrement si tu fais une sélection de tous les points d'un coup, comment le programme est-il supposé connaître l'ordre des points ?).

Evidemment, je pourrais te proposer des programmes tout fait pour répondre à ton besoin mais je n'ai pas l'impression que c'est ce que tu souhaites ici (peut-être que je fais fausse route cependant). J'ai plutôt la sensation que tu aimerais avoir juste des pistes afin de te guider et t'aider à réaliser ce programme par toi-même.
J'ai un peu peur que tu t'attaques à un programme un peu complexe pour débuter mais on va faire au mieux pour t'épauler 🙂

Dans un premier temps, afin de ne pas te perdre dans les étapes cruciale de ton programme, je te conseille vivement de réaliser un logigramme du programme afin d'identifier clairement les étapes clés du programme mais également d'identifier l'ensemble des données nécessaires à la bonne exécution du programme tout en respectant les contraintes que tu t'imposes (et les contraintes du logiciel évidemment).
Tu peux également t'appuyer sur les cours d'apprentissage de l'AutoLISP de (gile) ainsi que le site de didier qui sont d'une aide précieuse pour tout niveau confondu.
Aux vues du programme que tu désires réaliser, voici une liste non exhaustive de fonctions qui pourront t'être utile et qui pourra ainsi te donner quelques pistes de recherches :

- (setq) -> affecte une valeur à une variable
- (entsel) -> demande à l'utilisateur de sélectionner un objet unique
- (ssget) -> permet de réaliser ou demander à l'utilisateur de sélectionner un ensemble d'objets ou un seul en filtrant la sélection si besoin en fonction des arguments spécifiés
- (car) -> renvoie le premier élément d'une liste
- (cdr) -> renvoie la liste moins le premier élément de la liste
- (while) -> effectue une boucle Tant Que...
- (if) -> fonction SI...
- (command) -> permet de faire appel à une commande AutoCAD
Je t'invite grandement à consulter l'aide AutoCAD sur chacune de ces fonctions pour comprendre plus précisément leur rôle et également avoir un exemple d'utilisation. Il s'agit, encore une fois, d'une liste non exhaustive donc il y aura d'autres fonctions qui seront nécessaire au programme.

Si jamais tu as également besoin d'exemple plus concrets ou de bouts de codes pour certaines parties de ton programme (notamment lorsque tu devras consulter les attributs de tes blocs par exemple), n'hésites pas ! On s'adaptera à tes besoins.

Bisous,
Luna

Merci Luna, Olivier a réglé mon problème, je connais déjà les commandes que m'a cité, il ne me manquais que le repeat et le length ! 😄 maintenant je peux sélectionner ce que je veux et traiter chaque élément, comme je le souhaitais 

Lien vers le commentaire
Partager sur d’autres sites

Le 18/09/2023 à 10:48, didier a dit :

Bonjour @Hey_Its_Sanka

Je constate deux choses :

Message posté jeudi et quatre jours plus tard, malgré des réponses bien tournées, toujours pas de visite ou de commentaire en retour. À moins d'une incapacité à se connecter au site, ce n'est pas très respectueux pour les gens qui travaillent aux réponses.

Je débute un petit peu en programmation, pour un début, il ne faut pas se lancer dans des programmes trop compliqués. Il faut intégrer les règles de base, ensuite, on les englobera dans des programmes plus complexes. Je donne souvent l'image du solfège et des gammes pour l'apprentissage. Le plus virtuose des musiciens a toujours commencé par des gammes, diatoniques puis chromatiques...

Amicalement

Bonjour Didier, tout dabord merci pour ton site! Et ensuite, je ne vois pas en quoi ça dérange que vous n'ayez pas de réponse rapidement, c'est moi qui suis en galère, pas vous.

Certes, je suis occupé avec mon travail, mes études et ma vie privée et je ne pense pas tout les jours à me connecter sur un forum pour voir si y a du neuf, je n'ai pas que Cadxp dans ma vie ! J'espère que tu comprend cela.

Et le jour où je le reconsulte, soi sans crainte que je finis toujours par répondre, ne serait-ce que par politesse, même si le staff n'a pas résolut mon problème !

Donc merci à vous tous pour votre aide 😄 A une prochaine

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é