Annonces

Les forums de la communauté Autodesk ont un nouveau look. Pour en savoir plus sur ce qui a changé, consultez le tableau des annonces de la communauté.

Autocad LISP Boucle while

Arthur.D21
Contributor

Autocad LISP Boucle while

Arthur.D21
Contributor
Contributor

Bonsoir à tous !

Je rencontre une petite difficulté avec mon programme que je souhaiterai "simplifier".

Je souhaite créer un programme qui demande 4 points afin de faire une forme !

 

Cependant je voudrais faire une boucle "while" pour que : 

"tant que l'utilisateur n'a pas appuyé sur c" --> continuer de demander le point suivant, sinon clore !

 

Je vous laisse le programme "grossier" que j'ai effectué :

 

(defun c:Aire_de_stockage()

 

(setq acro(getvar "osmode"))

 

(setvar "osmode" 0)

 

(setq p1 (getpoint "Coordonnées premier point : "))
(setq p2 (getpoint "Coordonnées deuxième point : ")
(command "Ligne" p1 p2 "")
(setq p3 (getpoint "Coordonnées troisième point : "))
(command "Ligne" p2 p3 "")
(setq p4 (getpoint "Coordonnées quatrième point : "))
(command "Ligne" p3 p4 "c")

 

;tracer les lignes puis clore
(command "ligne" p1 p2 p3 p4 "c")

 

(setvar "osmode" acro);retour valeur initiale

 

En vous remerciant par avance.

Bonne soirée à vous !

 

0 J'aime
Répondre
Solutions acceptées (1)
602 Visites
5 Réponses
  • Lisp
Replies (5)

_gile
Mentor
Mentor
Solution acceptée

Salut,

Pourquoi ré-inventer la roue ?

Ce que tu cherches à faire est exactement ce que fait la commande LIGNE (_LINE).

Sinon, pourquoi désactiver les accrochages alors que tu demandes à l'utilisateur de spécifier des points ?

Quoi qu'il en soit, un exemple simple qui fait ce que tu souhaites.

(defun c:Aire_de_stockage (/ p0 p1 p2)
  ;; si l'utilisateur spécifie le premier point
  (if (setq p0 (getpoint "\nPremier point: "))
    (progn
      ;; on stocke le premier point
      (setq p1 p0)
      ;; tant que l'utilisateur spéciife le point suivant
      (while (setq p2 (getpoint p1 "\nPoint suivant: "))
	;; on dessine la ligne
	(command "_.line" p1 p2 "")
	;; on affecte p2 à p1
	(setq p1 p2)
      )
      ;; on ferme la polyligne
      (command "_.line" p1 p0 "")
    )
  )
  (princ)
)

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

CADaSchtroumpf
Advisor
Advisor

Bonsoir,

Une suggestion: utiliser plutôt une polyligne

(defun c:Aire_de_stockage ( / acro cmd pt)
	(setq acro (getvar "osmode"))
	(setq cmd (getvar "osmode"))
	(setvar "osmode" 0)
	(setvar "cmdecho" 0)
	(initget 9)
	(command "_.pline" (setq pt (getpoint "\nPremier point: ")))
	(while (setq pt (getpoint pt "\nPoint suivant: "))
		(command pt)
		(initget 8)
	)
	(command "_close")
	(setvar "osmode" acro)
	(setvar "cmdecho" cmd)
	(prin1)
)

 

Arthur.D21
Contributor
Contributor

Bonsoir Gilles !

Tout d'abord merci pour votre réponse,

 

J'ai désactivé les accrochages justement pour que la fonction "clore" se fasse automatiquement sur le point de départ car sinon elle se fait sur le point le plus proche. 😅

 

Savez-vous comment on peut clore automatiquement la polyligne quand l'utilisateur appui sur une touche type "a" ou "c" ?

 

En vous remerciant par avance.

Très bonne soirée à vous !

@_gile 

0 J'aime

Arthur.D21
Contributor
Contributor

Bonsoir @CADaSchtroumpf ,

J'ai essayé votre programme, cependant ce n'est pas totalement ce que je recherche...

Celui de @_gile semble plus adapté à ma situation !

En tout cas merci pour la commande initget que je ne connaissais pas mais qui me sera très utile ...

 

Merci pour votre réponse et très bonne soirée à vous !

0 J'aime

-didier-
Advisor
Advisor

Bonjour @Arthur.D21 

 

Je me permets un peu d'auto-promo et vous conseille le lien dans ma signature.

Le site n'est pas complètement exhaustif, j'y travaille..., mais pour un débutant francophone, je pense être dans les clous.
Il y a un moyen de poser des questions par le formulaire de contact et je réponds à tous.

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature