arnaudalp Posté(e) le 4 mai 2016 Posté(e) le 4 mai 2016 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
Tramber Posté(e) le 4 mai 2016 Posté(e) le 4 mai 2016 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 ./__\. (.°=°.)
(gile) Posté(e) le 4 mai 2016 Posté(e) le 4 mai 2016 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
arnaudalp Posté(e) le 10 mai 2016 Auteur Posté(e) le 10 mai 2016 BonjourMerci 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 !
arnaudalp Posté(e) le 12 mai 2016 Auteur Posté(e) le 12 mai 2016 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...
Tramber Posté(e) le 12 mai 2016 Posté(e) le 12 mai 2016 (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 ./__\. (.°=°.)
arnaudalp Posté(e) le 12 mai 2016 Auteur Posté(e) le 12 mai 2016 Je fais (command "effacer" pause) mais quand je valide je sors du lisp
Olivier Eckmann Posté(e) le 12 mai 2016 Posté(e) le 12 mai 2016 Bonjour, (command "_erase" (ssget) "") ou mieux si tu veux limiter la sélection aux seules polylignes (command "_erase" (ssget (list (cons 0 "*POLYLINE")) ) "") Olivier
(gile) Posté(e) le 12 mai 2016 Posté(e) le 12 mai 2016 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
Olivier Eckmann Posté(e) le 12 mai 2016 Posté(e) le 12 mai 2016 Effectivement, c'est plus propre comme cela. Olivier
arnaudalp Posté(e) le 12 mai 2016 Auteur Posté(e) le 12 mai 2016 A quoi sert le 0 dans ssget ?et pour être encore pénible, sélectionner tous les objet d'un calque pour les supprimer?J'ai du mal avec le ssget...
(gile) Posté(e) le 12 mai 2016 Posté(e) le 12 mai 2016 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
arnaudalp Posté(e) le 12 mai 2016 Auteur Posté(e) le 12 mai 2016 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...
arnaudalp Posté(e) le 13 mai 2016 Auteur Posté(e) le 13 mai 2016 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 "")
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