bonuscad Posté(e) le 17 mai 2004 Posté(e) le 17 mai 2004 Suite à la diccussion concernant la construction d'un cercle par 2 points et de rayon ou diamètre connu, voir:http://www.cadxp.com/sujetXForum-2488.htm Je vous propose d'examiner le code si-dessous. C'est un programme court, et facile à décortiquer.Vous pourrez vous attarder sur l'emploi de la fonction (grread) qui est un peu plus complexe, mais pouvant vous servir d'exemple pour une autre fonction écrite par vos soins. (Sélection alternative par déplacement de la souris) E allant voir la dicussion, vous pourrez voir l'évolution de ce code en plusieurs étapes, et les différentes solutions apportées. (Il y a tellement de façons de faire) (defun c:CD2P ( / p1 p2 pc1 pc2 rad ss1 ss2 s_osm key) (initget 1) (setq p1 (getpoint "\n1er point obligé: ")) (initget 33) (setq p2 (getpoint p1 "\n2eme point obligé: ") rad "Radius") (initget 3 "Diametre Rayon _Diameter Radius") (setq rad (getdist (strcat "\n[Diamètre/Rayon]<" rad "> ?: "))) (while (or (eq (type rad) 'STR) (< (* rad 2.0) (distance p1 p2))) (cond ((eq (type rad) 'STR) (initget 3 "Diametre Rayon _Diameter Radius") (setq rad (if(eq rad "Diameter") (eval '(/ (getdist (strcat "\n[Diamètre/Rayon]<" rad "> ?: ")) 2.0)) (eval '(getdist (strcat "\n[Diamètre/Rayon]<" rad "> ?: "))) ) ) ) (T (princ " **Incorrect** Valeur du rayon trop faible !") (initget 3 "Diametre Rayon _Diameter Radius") (setq rad (getdist (strcat "\n[Diamètre/Rayon]<" (rtos rad) "> ?: "))) ) ) ) (setvar "CMDECHO" 0) (setq s_osm (getvar "OSMODE")) (setvar "OSMODE" 0) (if (zerop (getvar "PICKFIRST")) (setvar "PICKFIRST" 1)) (command "_.arc" p1 "_en" p2 "_radius" rad) (setq ss1 (ssget "_L")) (command "_.arc" p2 "_en" p1 "_radius" (- rad)) (ssadd (entlast) ss1) (setq pc1 (cdr (assoc 10 (entget (entlast))))) (command "_.arc" p1 "_en" p2 "_radius" (- rad)) (setq ss2 (ssget "_L")) (command "_.arc" p2 "_en" p1 "_radius" rad) (ssadd (entlast) ss2) (setq pc2 (cdr (assoc 10 (entget (entlast))))) (setvar "OSMODE" s_osm) (if (and ss1 ss2 (= 0 (getvar "CMDACTIVE"))) (progn (sssetfirst nil ss2) (princ "\n pour choix; /[Espace]/Click+droit pour finir!.") (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25)) (cond ((eq (car key) 5) (if (< (distance pc1 (cadr key)) (distance pc2 (cadr key))) (sssetfirst nil ss1) (sssetfirst nil ss2) ) ) ) ) ) ) (command "_.erase") (setvar "CMDECHO" 1) (princ "\n*Cercle coupé aux points obligés* by me!!\n") (princ)) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 17 mai 2004 Posté(e) le 17 mai 2004 Très intéressant. Vraiment. Je découvre aussi "sssetfirst" Dans l'aide à propos de "grread", ils disent que c'est à réserver aux fonctions trés spécialisées. En effet. Remarquez le "_.arc", on dirait que tu as pris peur et que tu as pensé qu'on ait pu redéfinir la commande (raison pour laquelle tu as mis le "." !) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
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