lecrabe Posté(e) le 10 août 2006 Posté(e) le 10 août 2006 Bonjour à tous En espérant que comme d'habitude les Super Pros Sympas comme Gilles / Patrick_35 puissent me dépanner ... :) Je suis en train de retravailler des dessins d'Assainissement où les gens ont dessiné de temps en temps des cercles pour matérialiser les Regards / Tampons (Jusque là, ça va !) et parfois des horribles polygones réguliers (En fait des polylignes) pour simuler des cercles !!! :o Ces polygones réguliers ont par exemple: 34 sommets (Pourquoi ?) ... etc mais peut être que certaines ont 15 / 25 / 32 / 64 cotés ... je ne sais pas ! Je suppose que ce dessin a été traité par moment avec un logiciel XXX ou par une conversion qui ne supportait pas les CERCLEs !!! Donc SVP j'ai besoin d'une routine qui récupère le centre géométrique de ces polygones réguliers pour dessiner sur le calque courant (qui sera différent de celui des polygones) au centre un superbe cercle dont le rayon est celui du polygone régulier :) :D :cool: Ainsi après qq vérifications, je pourrais me débarrasser de ces horribles polygones réguliers !!! Merci d'avance de votre aide, Le Decapode (qui tourne en rond) Autodesk Expert Elite Team
(gile) Posté(e) le 10 août 2006 Posté(e) le 10 août 2006 Salut ô vénérable décapode, Voici une réponse à ta requète qui devrait fonctionner quelque soient le SCU courant et les SCO des polygones : Nouvelle version : (10/08/06 15h05)- sous routines remaniées pour qu'elles puissent re-servir pour d'autres fonctions- test qui filtre les polygones réguliers uniquement- fonctionnement avec les triangle équilatéraux ;;; PG2C Transforme une sélection de polygones inscrits en cercles (defun c:pg2c (/ ss n ent) (while (not (setq ss (ssget '((0 . "LWPOLYLINE") (70 . 1))))) ) (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n)))) (if (polygonp ent) (polygon2circle ent) ) ) (princ) ) ;;; MID_PT Retourne le milieu de 2 points (defun mid_pt (p1 p2) (mapcar '(lambda (x y) (/ (+ x y) 2)) p1 p2) ) ;;; ACOS Retourne l'arc cosinus du nombre, en radians (defun ACOS (num) (if ( (atan (sqrt (- 1 (expt num 2))) num) ) ) ;;; ANGLE_3PTS Retourne l'angle (radians) défini par son sommet et deux points ;;; L'angle retourné est toujours positif et inférieur à pi radians. (defun angle_3pts (som p1 p2 / d1 d2 d3) (setq d1 (distance som p1) d2 (distance som p2) d3 (distance p1 p2) ) (if (and ( (ACOS (/ (+ (* d1 d1) (* d2 d2) (- (* d3 d3))) (* 2 d1 d2) ) ) ) ) ;;; POLYGONP Retourne T si l'entité est un polygone régulier (lwpolyline) (defun polygonp (ent / lst nb ang) ;; Compare les angles et les longueurs entre les sommets (defun regularp (l1 l2 a) (cond ((null l2) T) ((not (and (equal (angle_3pts (car l1) (cadr l1) (car l2)) a 1e-9) (equal (distance (car l1) (cadr l1)) (distance (car l1) (car l2)) 1e-9 ) ) ) nil ) (T (regularp (cdr l1) (cdr l2) a)) ) ) (and (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE") (= (cdr (assoc 70 (entget ent))) 1) (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent) ) ) ) (setq nb (length lst)) (setq ang (- pi (/ (* 2 pi) nb))) (regularp (reverse (cons (car lst) (reverse lst))) (cons (last lst) (reverse (cdr (reverse lst)))) ang ) ) ) ;;; POLYGON2CIRCLE Transforme un polygone en cercle (poylgone inscrit) (defun polygon2circle (ent / e_lst v_lst nb cen) (setq e_lst (entget ent) v_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) e_lst ) ) nb (length v_lst) ) (if (= 0 (rem nb 2)) (setq cen (mid_pt (car v_lst) (nth (/ nb 2) v_lst))) (setq cen (inters (nth 0 v_lst) (mid_pt (nth (/ nb 2) v_lst) (nth (+ (/ nb 2) 1) v_lst) ) (nth 1 v_lst) (mid_pt (nth (+ (/ nb 2) 1) v_lst) (cond ((nth (+ (/ nb 2) 2) v_lst)) (T (nth 0 v_lst)) ) ) T ) ) ) (entmake (list '(0 . "CIRCLE") (cons 10 cen) (cons 40 (distance cen (car v_lst))) (assoc 67 e_lst) (assoc 410 e_lst) (assoc 38 e_lst) (assoc 210 e_lst) ) ) ) [Edité le 10/8/2006 par (gile)][Edité le 10/8/2006 par (gile)] Erratum : j'avais oublié de coller les définitions de angle_3pts et acos qui sont chargées en permaence sur mon poste.[Edité le 10/8/2006 par (gile)] [Edité le 11/8/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 10 août 2006 Auteur Posté(e) le 10 août 2006 Bonjour Oh Divin Lispeur, je te bénis jusqu'à la Nième génération ... Cela fonctionne parfaitement depuis un carré (4 cotés) jusqu'à 34 cotés en passant par le pentagone, hexagone, heptagone, octogone, etc ... Amusant mais pas important: la routine ne fonctionne pas avec les triangles équilatéraux ! Pour savoir "à peu près", si un polygone est régulier:- Longueur de chaque segment IDEM- Angle relatif de chaque segment par rapport au précédent IDEMSi en plus la polyligne est CLOSE, on peut supposer que l'on a affaire à un polygone régulier ! Cependant il pourrait faire N fois le tour mais on s'en fout ! Encore Merci et bonne journée, Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 10 août 2006 Posté(e) le 10 août 2006 Re, J'ai ajouté un filtre pour ne traiter que les polygones réguliers, ça permet de faire la sélection plus largement. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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