Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

Je souhaite incrémenter la valeur d'une variable en fonction d'un nombre prédéfini :

 

(setq r (getreal "\nNombre de canalisation")) (nombre de fois que je veux incrémenter ma variable)

 

exple : 4

 

(repeat r (setq (1+ aa) (getpoint "\nFil d'eau")))

 

J'aimerai cliquer 4 points, et que s'incrémente aa en aa1 - aa2 - aa3 - aa4, ce afin de calculer des point géométriques à partir de ces points de base.

 

J'ai une erreur de syntaxe je ne sais pas comment le rédiger...

 

Merci

Posté(e)

Utilise plutôt GETINT pour demander un entier et non un réel.

 

Pour la suite, tu planifies de mémoriser n points ?

-> Tu devras créer une liste vide [nil] et l'abonder [(cons ..)] pour post-traitement.

 

Tu veux, toi, affecter les variables aa1, aa2, etc au fur et à mesure.

C'est possible mais pas à faire en tant que débutant.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Salut,

 

Il est possible de créer un nombre indéterminé de variables avec un nom incrémenté en utilisant les fonction set et read :

 

(setq r (getint "\nNombre de canalisation: ")
     i 1
)
(repeat	r
 (set (read (strcat "aa" (itoa i)))
      (getpoint "\nFil d'eau: ")
 )
 (setq i (1+ i))
)

 

Mais, en général, créer ce type de variables n'est pas indispensable et peu pratique à l'usage. De plus il est impossible de déclarer les variables puisqu'on ne connait pas leur nombre par avance.

 

Pour utiliser ces variables plus loin dans le programme, il faudra reconstruire leur nom et évaluer leur valeurs et probablement dans une boucle repeat puisque seule la routine en connait le nombre.

Exemple pour dessiner un point sur chacun des points spécifiés :

(setq i 1)
(repeat	r
 (command "_point" (eval (read (strcat "aa" (itoa i)))))
 (setq i (1+ i))
)

De même pour les remettre à nil (ce qu'on ne manquera pas de faire en fin de routine puisqu'elle n'ont pas pu être déclarées) :

(repeat	r
 (set (read (strcat "aa" (itoa i))) nil)
 (setq i (1+ i))
)

 

Comme le dit Tramber, il est plus facile et plus efficient d'utiliser une liste (LISP est un langage de traitement des listes. On n'a qu'une variable (lst par exemple) qu'on peut déclarer.

Collecter les points et les stocker dans la liste :

(setq r (getint "\nNombre de canalisation: "))
(repeat	r
 (setq lst (cons (getpoint "\nFil d'eau: ") lst))
)

Utiliser les points collectés :

(foreach p lst (command "_point" p))

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

Posté(e)

Bonjour

Merci pour vos réponses.

J'ai appris de nouvelles variables cette semaine donc je vais tenter de rédiger le début de mon programme... je pense que je referai rapidement appel à vous !

Posté(e)

Bonjour !

 

Bon, mon incrémentation marche. J'arrive à dessiner mes canalisations.

 

Maintenant, dans mon programme, j'aimerai faire 2 choses :

 

- Dessiner une polyligne en pouvant faire un nombre indéterminé de clique et clore sans quitter le lisp

 

- Faire une sélection multiple de polyligne en les cliquant et les effacer. j'ai essayer avec une command de selection et effacer mais soit ma sélection n'est pas prise en compte, soit elle l'est mais je ne lance pas la commande effacer...

Posté(e)

(command "_.pline"pause)
(while (/= 0 (getvar "CMDACTIVE"))
(command pause)
)

Voici le code le plus simple.

 

Pour ton "effacer", faut nous montrer car c'est facile... avec command je suppose ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Salut,

 

Plus sûr, ne lancer la commande que si la sélection n'est pas vide :

(if (setq ss (ssget '((0 . "*POLYLINE"))))
 (command "_.erase" ss "")
)

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

Posté(e)

A quoi sert le 0 dans ssget ?

La liste suivant ssget est un filtre de sélection elle est constituées de paires pointées dont le premier élément (car) est un code de groupe qui sert à spécifier le type de donnée contenu dans le second élément de la paire (cdr).

 

Je te recommandes de consulter l'aide aux développeurs ainsi que les références AutoLISP (en anglais) et/ou Introduction à AutoLISP (sur Exchange Apps ou sur gileCAD).

Concernant les codes DXF, la documentation officielle est en français avec la description de tous les codes groupe.

Concernant les filtres de sélections tu trouveras une description détaillée en anglais dans l'aide aux développeurs (ce sujet sans oublier les liens en bas de page) et en français dans Introduction à AutoLISP section 16.4.

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

Posté(e)

J'ai bien sous mon coude ton introduction à autolisp mais certains points restent flou.

Je suis actuellement une formation en programmation autolisp, je n'en suis qu'à ma deuxième journée sur 6... mais j'essaye de travailler entre mes jours de formations histoire d'en apprendre un maximum...

 

Pour ma sélection

 

J'ai une série de point que j'ai incrémenté dans une liste qui s'appelle sel_pt.

J'ai des polylignes qui passent par ces points et j'aimerai les supprimer ( polylignes de construction ).

 

Ne sachant pas comment faire, je me suis dit que j'allais mettre ces polylignes dans un calque "construction" que je supprimerai à un moment mais je n'y arrive pas non plus.

 

Je sèche...

Posté(e)

J'ai résolu mon problème en mettant ma polyligne dans un calque puis je les supprime avec cette syntaxe

 

(if (setq ss (ssget "X" '((0 . "*POLYLINE") (8 . "conscoutemp"))))

(command "_.erase" ss "")

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é