Ellionel Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 bonjour , Pour des problemes de norme , j'ai bessoin de connaitre le diametre du cercle circonscrit à ma polyligne ou région ..J'ai pensé passer par la zone de contour , ms je ne vois pas trop comment me servir de ses resultats .. Merci de votre aide ... Ps : N'hésitez pas à me poser des questions si , je ne suis pas clair .. Donc ;- J'ai une région ( je travaille ne 2d ) - Je lit les propmeca .-J'aimerais connaitre le diametre du cercle dans lequel est " contenu" ma région ... Encore merci ..
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Salut, Si ça peut aider, le centre le centre du cercle circonscit d'un triangle (quelconque) c'est l'intersection des médiatrices. Il en est de même pour tous les polygones réguliers et le rectangle. Les autres polygones n'ont pas, à proprement parler, de cercle circonscrit. Pour trouver le cercle dans le quel est contenu ton polygone, il faut d'abord trouver le triangle dont les sommets sont le plus éloignés de ce que sera le centre du cercle, puis déterminer le centre du cercle circonscrit au triangle. en blanc le polygone, en gris le triangle de référence, en trait interrompu les médiatrices en rouge le cercle : http://img403.imageshack.us/img403/7203/circons1zr6.png Le triangle à trouver n'est pas toujours évident, et le centre du cercle peut se situer à l'extérieur du triangle (le cercle de droite à un diamètre très légèrement inférieur) : http://img249.imageshack.us/img249/2473/circons3wc8.png Pour dessiner les médiatrices, tu peux utiliser le LISP Médiatrice (commande = med) sur cette page. [Edité le 5/12/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Ellionel Posté(e) le 5 décembre 2007 Auteur Posté(e) le 5 décembre 2007 Merci de cette définition . je pensait faire un lisp :-Tracer la zone de contour -Puis la diagonale de ce rextangle . -Puis le cercle de centre le milieu de cette diagonale te passant par le point le plus eloigné .. Bonne ou mauvaise idée ????
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 En reprenant l'exemple de la première polyligne, à gauche avec le contour (bounding-box), à droite en partant du centre de gravité. Le polygone est certes contenu dans le cercle, mais assez largement. http://img91.imageshack.us/img91/5259/circons4wn5.png Je vais essayer de faire un LISP avec la méthode des triangles. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Voilà Le LISP fonctionne avec les polylignes (les propriétés des régions sont quasi inaccessibles), il crée le plus petit cercle contenant tous les sommets de la polyligne et retourne son diamètre sur la ligne de commande. Version corrigée ;; COMBI3 ;; Retourne la liste de toutes les combinaisons par 3 (defun combi3 (lst / subr1 subr2) (defun subr1 (l1 l2) (if l2 (cons (append l1 (list (car l2))) (subr1 l1 (cdr l2)) ) ) ) (defun subr2 (e l) (if (cdr l) (append (subr1 (list e (car l)) (cdr l)) (subr2 e (cdr l)) ) ) ) (if (cddr lst) (append (subr2 (car lst) (cdr lst)) (combi3 (cdr lst)) ) ) ) ;; CIRCONS-CEN ;; Retourne les coordonnées du centre du cercle circonscrit au triangle p1 p2 p3 (defun circons-cen (p1 p2 p3 / mid1 mid2) (setq mid1 (mapcar (function (lambda (x1 x2) (/ (+ x1 x2) 2.0))) p1 p2) mid2 (mapcar (function (lambda (x1 x2) (/ (+ x1 x2) 2.0))) p2 p3) ) (inters mid1 (polar mid1 (+ (/ pi 2) (angle p1 p2)) 1.0) mid2 (polar mid2 (+ (/ pi 2) (angle p2 p3)) 1.0) nil ) ) ;; CIRCONS ;; Crée le plus petit cercle contenant tous les sommets de la polyligne (defun c:circons (/ pl elst plst tlst clst cen rad) (if (and (setq pl (car (entsel))) (setq elst (entget pl)) (= (cdr (assoc 0 elst)) "LWPOLYLINE") (setq plst (mapcar 'cdr (vl-remove-if-not (function (lambda (x) (= (car x) 10))) elst ) ) ) (setq tlst (combi3 plst)) ) (progn (foreach tri tlst (and (setq cen (circons-cen (car tri) (cadr tri) (caddr tri))) (setq rad (distance cen (car tri))) (if (vl-every (function (lambda (p) (or ( (equal (distance cen p) rad 1e-9) ) ) ) plst ) (setq clst (cons (list cen rad) clst)) ) ) ) (setq clst (vl-sort clst (function (lambda (x1 x2) ( ) ) (entmake (list '(0 . "CIRCLE") (cons 10 (list (caaar clst) (cadaar clst) (cdr (assoc 38 elst))) ) (cons 40 (cadar clst)) (assoc 210 elst) ) ) ) ) (princ (strcat "\nDiamètre = " (rtos (* 2 (cadar clst))))) (princ) ) [Edité le 5/12/2007 par (gile)] [Edité le 5/12/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Le LISP ci-dessus crée en fait le plus petit cercle passant par 3 sommets de la polyligne. Dans le cas de polygones où les cercles ciconscrits de 2 triangles contiennent tous les sommets, la routine ci dessus dessine le plus petit (le jaune sur l'image).Mais si les centres de ces deux cercles sont de part et d'autre de la base commune aux deux triangles le plus petit cercle contenant tous les sommet a pour centre le milieu de cette base mais ne contient que deux sommets (le vert sur l'image). Comme je ne sais pas exactement ce que tu veux faire, je met une autre version du LISP qui crée ce cercle , tu choisira celui que tu veux. http://img511.imageshack.us/img511/4725/circons5dt1.png Version corrigée et optimisée ;; COMBI3 ;; Retourne la liste de toutes les combinaisons par 3 (defun combi3 (lst / subr1 subr2) (defun subr1 (l1 l2) (if l2 (cons (append l1 (list (car l2))) (subr1 l1 (cdr l2)) ) ) ) (defun subr2 (e l) (if (cdr l) (append (subr1 (list e (car l)) (cdr l)) (subr2 e (cdr l)) ) ) ) (if (cddr lst) (append (subr2 (car lst) (cdr lst)) (combi3 (cdr lst)) ) ) ) ;; MID_PT ;; Retourne le milieu de deux points (defun mid_pt (p1 p2) (mapcar (function (lambda (x1 x2) (/ (+ x1 x2) 2))) p1 p2) ) ;; CIRCONS-CEN ;; Retourne les coordonnées du centre du cercle circonscrit au triangle p1 p2 p3 (defun circons-cen (p1 p2 p3 / mid1 mid2) (setq mid1 (mid_pt p1 p2) mid2 (mid_pt p2 p3) ) (inters mid1 (polar mid1 (+ (/ pi 2) (angle p1 p2)) 1.0) mid2 (polar mid2 (+ (/ pi 2) (angle p2 p3)) 1.0) nil ) ) ;; CIRCONS ;; Crée le plus petit cercle contenant tous les sommets de la polyligne (defun circons (pl / elst plst tlst cen rad clst mid ray) (setq elst (entget pl) plst (mapcar 'cdr (vl-remove-if-not (function (lambda (x) (= (car x) 10))) elst ) ) tlst (combi3 plst) ) (foreach tri tlst (and (setq cen (circons-cen (car tri) (cadr tri) (caddr tri))) (setq rad (distance cen (car tri))) (if (vl-every (function (lambda (p) (or ( (equal (distance cen p) rad 1e-9) ) ) ) plst ) (setq clst (cons (list cen rad tri) clst)) ) ) ) (setq clst (car (vl-sort clst (function (lambda (x1 x2) ( ) ) ) tri (caddr clst) ) (foreach l (list (list (car tri) (cadr tri)) (list (cadr tri) (caddr tri)) (list (car tri) (caddr tri)) ) (setq mid (mid_pt (car l) (cadr l)) ray (distance mid (car l)) ) (if (vl-every (function (lambda (p) (or ( (equal (distance mid p) ray 1e-9) ) ) ) plst ) (setq clst (list mid ray)) ) ) (entmake (list '(0 . "CIRCLE") (cons 10 (list (caar clst) (cadar clst) (cdr (assoc 38 elst))) ) (cons 40 (cadr clst)) (assoc 210 elst) ) ) ) ;; Fonction d'appel (defun c:circons (/ pl elst) (if (and (setq pl (car (entsel))) (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE") ) (setq elst (circons pl)) (princ "\nEntité non valide") ) (and elst (princ (strcat "\nDiamètre = " (rtos (* 2 (cdr (assoc 40 elst))))) ) ) (princ) ) [Edité le 5/12/2007 par (gile)] [Edité le 5/12/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Matt666 Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Salut Gile ! :D Bon chu déjà désolé pour la remarque que je vais te faire... Paske je suis bien conscient que la compatibilité de tes routines avec des moteurs autres qu'autocad peut t'indifférer (un peu, déjà)... Alors voilà, a force d'essayer tes routines avec BircsCAD mais sans avoir creusé la chose, j'en suis venu à ceci : je pense que ta fonction "sort" d'équivalence à "vl-sort" diffère de l'originale. Ici ta routine (qui est très intéressante à lire, merci !) ne fonctionne pas du fait de cette fonction... :casstet: voilà.En plus je n'ai pas de message d'erreur, après la routine. Après le test su la fonction non plus, d'ailleurs. Bing.Est-ce que tu peux qqh ? Merci !A bientot.Matt. "Chacun compte pour un, et nul ne compte pour plus d'un."
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 Salut Matt666, Je ne peux pas certifier que la routine sort fonctionne exactement comme vl-sort, mais dans le cas présent elle fonctionne (chez moi en tout cas).La compatitbilité avec les clones ne m'indifère pas, j'ai un temps travaillé sur Intellideesk 2005 et je n'aurais pas fait toutes ces routines juste pour le plaisir (quoique ...) la syntaxe à utiliser : (setq clst (car (sort clst '(lambda (x1 x2) ( ) ) ) EDIT : Au temps pour moi, j'ai réussi à reproduire un dysfonctionnement dans la routine sort, j'avais mis un contrôle de trop. Essaye avec celle là (je modifie aussi le sujet avec toutes les routines). (defun sort (lst comp_fun / lst_s) (setq lst_s (remove_doubles lst)) (cond ((= 2 (length lst_s)) (if (apply comp_fun lst_s) lst_s (reverse lst_s) ) ) ((every '(lambda (x) (apply comp_fun (list (car lst_s) x))) (cdr lst_s) ) (cons (car lst_s) (sort (cdr lst_s) comp_fun)) ) (T (sort (reverse (cons (car lst_s) (reverse (cdr lst_s)))) comp_fun ) ) ) ) [Edité le 5/12/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 5 décembre 2007 Posté(e) le 5 décembre 2007 J'ai optimisé la dernière version : - j'ai séparé c:circons en une sous routine circons qui crée le cercle (et pourra ainsi être utilisée dans d'autre LISP) et une fonction d'appel c:circons pour sélectionner la polyligne, lancer circons et retourner le diamètre du cercle- j'ai aussi modifié la recherche de cercle sur 2 sommets pour essayer de n'oublier aucun cas. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Matt666 Posté(e) le 6 décembre 2007 Posté(e) le 6 décembre 2007 Génial ça marche !!! j'ai un temps travaillé sur Intellideesk 2005Ok, c'est pour ça toutes ces équivalences.... (quoique ...) :D Merci Gile !A bientot.Matt. "Chacun compte pour un, et nul ne compte pour plus d'un."
Ellionel Posté(e) le 7 décembre 2007 Auteur Posté(e) le 7 décembre 2007 :D :D :D :D :D :D :) :) :) :) :) :) :) :) :) MerciCela marche bien et correspond exactement à ce que je voulais ...Gile Tu est un champion !!! Merci
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