Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

Bonuscad m'avait fait une routine pour tracer des cercles sur un pas triangulaire (ou carré d'ailleurs), limités par un Ø d'inscription.

 

 (defun c:special_array ( / pt_c s_rad g_rad pas key js tmp_rad obj e_length t_length pt)
 (vl-load-com)
 (initget 1)
 (setq pt_c (getpoint "\nPoint centre: "))
 (initget 7)
 (setq s_rad (getdist pt_c "\nPetit rayon: ") g_rad s_rad)
 (while (<= g_rad s_rad)
   (initget 7)
   (setq g_rad (getdist pt_c "\nGrand rayon: "))
 )
 (initget 1 "Triangulaire Carré _Triangular Square")
 (setq key (getkword "\nPAs [Triangulaire/Carré]: "))
 (initget 7)
 (setq pas (getdist (if (eq key "Triangular") "\nPas triangulaire: " "\nPas carré: ")) js (ssadd))
 (setvar "cmdecho" 0)
 (command "_.undo" "_group")
 (command "_.circle" "_none" pt_c  s_rad)
 (setq js (ssadd (entlast) js))
 (command "_.circle" "_none" pt_c g_rad)
 (setq tmp_rad (if (eq key "Triangular") (* (sqrt 3) 0.5 pas) pas))
 (while (<= (+ tmp_rad s_rad) g_rad)
   (command "_.polygon" (if (eq key "Triangular") "3" "4") "_none" pt_c "_circumscribed" tmp_rad)
   (setq
     obj (vlax-ename->vla-object (setq e_last (entlast)))
     e_length 0.0
     t_length (vlax-get-property obj 'Length)
   )
   (while (< e_length t_length)
     (setq pt (vlax-curve-getPointAtDist obj e_length))
     (if (<= (+ (distance pt (trans pt_c 1 0)) s_rad) g_rad)
       (progn
         (command "_.circle" "_none" (trans pt 0 1) s_rad)
         (setq js (ssadd (entlast) js))
       )
     )
     (setq e_length (+ e_length pas))
   )
   (entdel e_last)
   (setq tmp_rad (if (eq key "Triangular") (+ tmp_rad (* (sqrt 3) 0.5 pas)) (+ tmp_rad pas)))
 )
 (command "_.undo" "_end")
 (setvar "cmdecho" 1)
 (command "_.rotate" js "" pt_c)
 (prin1)

Serait-il possible d'avoir une variante avec le Nombre total de cercles et non un Ø d'inscription ?

 

Merci à tous.

Posté(e)

Juste une info oubliée dans le message ci-dessus.

L'implantation se fait quand même de façon à être isncrite dans un cercle, mais le nombre de tubes prédomine sur le Ø d'inscription.

 

Merci à tous

Posté(e)

Salut,

Serait-il possible d'avoir une variante avec le Nombre total de cercles et non un Ø d'inscription ?

 

Et comment tu vas connaitre ce nombre total ainsi que la position de mise en place des cercles, car si le nombre fourni n'est pas en adéquation avec le réseau, le réseau va ressembler à rien, si celui-ci n'est pas régulier. Désolé mais je ne vois pas trop le truc !

 

Dans le lisp l'implantation ce fait en excentrique, donc n cercles par chemin de polygone.

Ce n cercles à une évolution d'excroissance à chaque éloignement du centre, donc ton Nombre total devrait être en cohérence avec cette évolution.

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci Bonuscad pour ta réponse.

Effectivement, j'étais arrivé à la même conclusion dans la démarche (uniquement en réfléchissant à la construction polygonale utilisée dans la routine).

Si la construction se faisait sur des cercles concentriques, on pourrait la stopper sur un nombre précis, mais je ne vois pas la logique mathématique de construction dans ce cas là....

 

Merci pour ton aide.

Posté(e)

Salut,

je ne vois pas la logique mathématique

C'est une progression arithmétique avec en résumé:

Un=U1+(n-1)*r

et dont la somme est:

S=(U1+Un)* n/2

 

En appliquant cela au code précédent, on pourrait demander le nombre de rang de progression (n) et en déduire le nombre de cercle à tracer, si cela te convient.

 

Exemple:

(defun c:special_array ( / pt_c s_rad key pas nb js tmp_rad obj e_length t_length pt)
 (vl-load-com)
 (initget 1)
 (setq pt_c (getpoint "\nPoint centre: "))
 (initget 7)
 (setq s_rad (getdist pt_c "\nPetit rayon: ") g_rad s_rad)
 (initget 1 "Triangulaire Carré _Triangular Square")
 (setq key (getkword "\nPAs [Triangulaire/Carré]: "))
 (initget 7)
 (setq pas (getdist (if (eq key "Triangular") "\nPas triangulaire: " "\nPas carré: ")) js (ssadd))
 (initget 7)
 (setq nb (getint "\nNombre de rangs de progression: "))
 (princ
   (strcat
     "\nSoit un nombre total de cercle de : "
     (itoa (1+ (* (+ (if (eq key "Triangular") 9 8) (+ (if (eq key "Triangular") 9 8) (* (1- nb) (if (eq key "Triangular") 9 8)))) (/ nb 2))))
     "\n"
   )
 )
 (princ "\nTapez une touche pour continuer!...")(getkword)
 (setvar "cmdecho" 0)
 (command "_.undo" "_group")
 (command "_.circle" "_none" pt_c  s_rad)
 (setq js (ssadd (entlast) js))
 (setq tmp_rad (if (eq key "Triangular") (* (sqrt 3) 0.5 pas) pas))
 (repeat nb
   (command "_.polygon" (if (eq key "Triangular") "3" "4") "_none" pt_c "_circumscribed" tmp_rad)
   (setq
     obj (vlax-ename->vla-object (setq e_last (entlast)))
     e_length 0.0
     t_length (vlax-get-property obj 'Length)
   )
   (while (not (equal e_length t_length 1E-08))
     (setq pt (vlax-curve-getPointAtDist obj e_length))
     (command "_.circle" "_none" (trans pt 0 1) s_rad)
     (setq
       js (ssadd (entlast) js)
       e_length (+ e_length pas)
     )
   )
   (entdel e_last)
   (setq tmp_rad (if (eq key "Triangular") (+ tmp_rad (* (sqrt 3) 0.5 pas)) (+ tmp_rad pas)))
 )
 (command "_.undo" "_end")
 (setvar "cmdecho" 1)
 (command "_.rotate" js "" pt_c)
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonjour et Merci Bonuscad de jeter un coup d'oeil à mon soucis.

 

Ne serait-il pas plus simple de laisser tourner ta 1ière routine jusqu'au bout et d'ensuite demander à l'utilisateur de rentrer un nombre de tubes et à ce moment là comptabiliser les tubes et les supprimer jusqu'a obtenir le nombre voulu ?

 

En imaginant partir de 0° et du Grand Ø, on effectue le travail en sens inverse (avec des cercles concentriques de + en + petits) et les tubes rencontrés sont supprimés.....

 

http://img21.imageshack.us/img21/6586/faisceauessai.jpg

 

La construction étant faite avec la logique du polygone (je pense que s'est la seule possible), gardons là.

 

Merci encore pour ton aide

Posté(e)

La construction étant faite avec la logique du polygone (je pense que s'est la seule possible), gardons là.

 

???

 

Je penses que tu devrais observé le déroulement des routines.

Mets par exemple un ";" (semi-colon) devant

(entdel e_last) 

pour mettre la ligne en remarque temporairement.

 

Fais tourner le lisp (l'un ou l'autre, ça n'a pas d'importance) pour bien voir le sens de la construction.

Celle-ci n'est pas du tout circulaire, ce sont des polygone (à 3 ou 4 cotés) dont le chemin sert à l'implantation des cercles.

Dans le 1er lisp, je vérifiais simplement que la distance du centre du petit cercle au centre du grand cercle (+ le rayon du petit cercle) soir inférieur au rayon du grand cercle pour dessiner ou non ce petit cercle.

 

Donc j'ai du mal à voir comment mettre en place ta suggestion de comptabilisation et de suppression d'une manière simple.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonjour Bonuscad.

Je vois bien la logique de ta construction (avec le triangle) et je ne là remet pas en cause.

Laissons la routine se dérouler.

A la suite, ce que je pensai :

- Comptabilser le nombre total de cercles (je n'ai rien d'autre à l'écran, le plan est vierge. Le nombre total d'objets à l'écran moins1 pour le Grand cercle).

- Si on utilise la logique du deuxième croquis (avec les cercles concentriques, bien que ta construction soit faite avec les triangles ;) ), n'y a t'il pas possibilité.....

 

Cette logique n'est peut-être pas facilement (ou du tout) retranscriptible en LISP..., ou la démarche bien mal choisie.... je n'en sais rien, voila pourquoi je m'adresse à vous en toute sincérité.

 

Merci pour votre aide

Posté(e)

Bon j'ai fais un truc simple, mais qui ne me plais pas spécialement (temps de réaction un peu long à mon goût)...

 

J'ai utilisé une boucle dynamique (grread) qui affiche le nombre de cercle mis en place par rapport à la position du curseur. Si ce nombre te convient, tu n'as plus qu'a valider.

 

(defun c:special_array ( / pt_c s_rad g_rad pas key c_ori js tmp_rad g_key loop gpt obj e_length t_length pt)
 (vl-load-com)
 (initget 1)
 (setq pt_c (getpoint "\nPoint centre: "))
 (initget 7)
 (setq s_rad (getdist pt_c "\nPetit rayon: ") g_rad s_rad)
 (initget 1 "Triangulaire Carré _Triangular Square")
 (setq key (getkword "\nPAs [Triangulaire/Carré]: "))
 (initget 7)
 (setq pas (getdist (if (eq key "Triangular") "\nPas triangulaire: " "\nPas carré: ")) js (ssadd))
 (setvar "cmdecho" 0)
 (command "_.undo" "_group")
 (command "_.circle" "_none" pt_c  s_rad)
 (setq c_ori (entlast))
 (setq loop T)
 (princ "\nDésigner le grand rayon\n")
(while (and (setq gkey (grread T 4 0)) (/= (car gkey) 3) loop (>= g_rad s_rad))
	(cond
		((eq (car gkey) 5)
       (if (not (zerop (sslength js))) (command "_.erase" js ""))
			(setq tmp_rad (if (eq key "Triangular") (* (sqrt 3) 0.5 pas) pas) gpt (cadr gkey) g_rad (distance pt_c gpt) nbc 1 js (ssadd))
       (while (<= (+ tmp_rad s_rad) g_rad)
         (command "_.polygon" (if (eq key "Triangular") "3" "4") "_none" pt_c "_circumscribed" tmp_rad)
         (setq
           obj (vlax-ename->vla-object (setq e_last (entlast)))
           e_length 0.0
           t_length (vlax-get-property obj 'Length)
         )
         (while (< e_length t_length)
           (setq pt (vlax-curve-getPointAtDist obj e_length))
           (if (<= (+ (distance pt (trans pt_c 1 0)) s_rad) g_rad)
             (progn
               (command "_.circle" "_none" (trans pt 0 1) s_rad)
               (setq js (ssadd (entlast) js) nbc (1+ nbc))
             )
           )
           (setq e_length (+ e_length pas))
         )
         (entdel e_last)
         (setq tmp_rad (if (eq key "Triangular") (+ tmp_rad (* (sqrt 3) 0.5 pas)) (+ tmp_rad pas)))
       )
       (princ (strcat "\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010Il y a " (itoa nbc) " cercles."))
		)
		((or (member gkey '((2 13) (2 32))) (eq (car gkey) 25)) (setq loop nil))
	)
)
(setq js (ssadd c_ori js))
 (command "_.undo" "_end")
 (setvar "cmdecho" 1)
 (command "_.rotate" js "" pt_c)
 (prin1)
)

 

Il y aurait peut être (et certainement mieux), mais pas trop d'idées qui me viennent à l'esprit.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é