Aller au contenu

Routine: Cercle à la place de Polygone !?


Messages recommandés

Posté(e)

 

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

Posté(e)

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

Posté(e)

 

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 IDEM

Si 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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité