(gile) Posté(e) le 20 décembre 2005 Posté(e) le 20 décembre 2005 Un petit LISP pour mettre une sélection d'objets en réseau hélicoïdal. Nouvelle version Ammélioration des entrées utilisateurs concernant les angles, accepte désormais :- soit l'angle décrit, soit l'angle entre les éléments- des angles supérieurs à un tour complet- des entrés directement sous forme de formules mathématiques (du types de celles utilisées avec la calculatrice géométrique d'AutoCAD). En attendant une petite boite de dialogue... ;;; C:RES_HEL Crée un réseau hélicoïdal ;;; Redéfinition de *error* (defun RES_HEL_ERR (msg) (if (or (= msg "Fonction annulée") (= msg "quitter / sortir abandon") ) (princ) (princ (strcat "\nErreur: " msg)) ) (command) (command "_undo" "_end") (setvar "cmdecho" v1) (setvar "osmode" v2) (setq *error* m:err m:err nil ) (princ) ) ;;;Fonction principale (defun C:RES_HEL (/ ss nb ang ht axe) (setq m:err *error* *error* RES_HEL_ERR v1 (getvar "cmdecho") v2 (getvar "osmode") ) (command "_undo" "_begin") (setvar "cmdecho" 0) (while (not (setq ss (ssget)))) (initget 7) (setq nb (getint "\nEntrez le nombre d'éléments du réseau: ")) (initget 1) (setq ht (getdist "\nSpécifiez le décalage en hauteur: ")) (initget 1) (setq axe (getpoint "\nSpécifiez le centre du réseau: ")) (initget "Décrit Elément") (if (= (getkword "\nPrécisez : angle décrit ou angle entre les éléments [Décrit/Elément] : " ) "Elément" ) (setq ang_t "angle entre les éléments") (setq ang_t "angle décrit") ) (initget 4) (if (not (setq ang (getreal (strcat "\nEntrez l'" ang_t " ou : ") ) ) ) (setq ang (atof (angtos (+ (getangle axe "\nSpécifiez le second point: ") (getvar "ANGBASE") ) ) ) ) ) (if (= ang_t "angle décrit") (setq ang (/ ang nb)) ) (initget "Horaire Trigonométrique") (if (= (getkword "\nSpécifiez le sens de rotation [Horaire/Trigonométrique] : " ) "Horaire" ) (setq ang (- ang)) ) (if (= (getvar "ANGDIR") 1) (setq ang (- ang)) ) (setvar "osmode" 0) (repeat (1- nb) (command "_copy" ss "" axe axe) (command "_rotate" ss "" axe ang) (command "_move" ss "" '(0 0) (list 0 0 ht)) ) (command "_undo" "_end") (setvar "cmdecho" v1) (setvar "osmode" v2) (setq *error* m:err m:err nil ) (princ) ) Code modifié pour pouvoir être utlisé par ceux qui,comme les géomètres, utilisent des unités angulaires autres que les degrés et/ou mettent ANGBASE à une valeur autre que 0.[Edité le 20/12/2005 par (gile)][Edité le 31/12/2005 par (gile)] [Edité le 1/1/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 20 décembre 2005 Posté(e) le 20 décembre 2005 Excellent.De mon côté, j'ai fait quelque chose du même tonneau pour dessiner le ferraillage d'un pieux en béton armé. Cela dessine une polyligne qui suit une pente constante (pente=pas/2 pi R) le long du cercle de base. (defun c:hel () (setq OLD_CMD (getvar "cmdecho")) (setvar "cmdecho" 0) (setq OLDOS (getvar "osmode")) (setvar "osmode" 0) (setq PTC (getpoint "\nCentre du cercle :")) (setq R (getdist PTC "\nRayon du cercle :")) (setq P (getint "\nNombre de pas : ")) (setq PAS (getdist "\nValeur du pas : ")) (setq PREC (getint "\nPrécision : ")) (setq PENTE (/ PAS (* PI 2 R))) (setq N 0) (command "_3dpoly") (repeat (+ (* P PREC) 1) (setq ANGCUR (* N (/ (* 2 PI) PREC))) (setq LONGCUR (* ANGCUR R)) (setq PT (polar PTC ANGCUR R)) (setq Z (* LONGCUR PENTE)) (setq PT (list (car PT) (cadr PT) Z)) (command PT) (setq n (+ n 1)) ) (command "") (setvar "osmode" OLDOS) (setvar "cmdecho" OLD_CMD) ) Je ne suis pas assez fort en maths pour dire si c'est une hélice ou autre chose. Avis aux spécialistes ? Amicalement Zebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 20 décembre 2005 Auteur Posté(e) le 20 décembre 2005 Salut Zebulon_ D'abord, merci pour le compliment. Je ne suis pas expert en maths, mais je pense que le principe est celui d'une helice, en tout cas les sommets de chaque segments de la poly sont situés sur une hélice (comme dans 3dSpiral), les segments qui les réunissent étant des segments de droite. De mon côté, dans Hélicoïde, j'ai rejoins le même type de points par des arcs elliptiques. La courbe est plus lisse, mais on ne peut extruder que segment par segment. PS : Juste une petite remarque sur ton LISP, si je peux me permettre, j'aurais mis le (setvar "osmode" 0) après les (getxxx). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 20 décembre 2005 Posté(e) le 20 décembre 2005 ouaip, juste avant la commande 3dpoly C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 31 décembre 2005 Auteur Posté(e) le 31 décembre 2005 J'ai apporté quelques petites améliorations à RES_HEL. Peut-être prochainement une boite de dialogue ?... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 2 janvier 2006 Auteur Posté(e) le 2 janvier 2006 :present: Voilà la version 2006 de RES_HEL, avec en plus, la possibilité de spécifier le décalage en hauteur entre les objets ou la hauteur totale.Taper -RES_HEL pour entrer les données sur la ligne de commande ou RES_HEL pour ouvrir la boite de dialogue : http://img526.imageshack.us/img526/9844/reshel5ow.png NOUVELLE VERSION Ajout de l'option "Référence" dans la spécification à l'écran de l'angle décrit ou entre les éléments. Le code .DCL à enregistrer sous Res_hel.dcl dans un dossier du chemin de recherche d'AutoCAD : /// Res_hel boite de dialogue pour réseau hélicoïdal res_hel:dialog{ label="Réseau hélicoïdal"; initial_focus="nbre"; spacer; :row{ :edit_box{ label="Nombre d'éléments"; key="nbre"; edit_width=8; } spacer; :button{ label="Choix des objets"; key="jeu_sel"; fixed_width=true; } } spacer; :boxed_row{ label="Centre du réseau"; :edit_box{ label="X :"; key="x_coord"; edit_width=12; } spacer; :edit_box{ label="Y :"; key="y_coord"; edit_width=12; } spacer; :button{ label=">>"; key="cen_sel"; fixed_width=true; height=2; } } spacer; :boxed_row{ label="Décalage en hauteur"; :popup_list{ key="dec_ht"; width=22; } :edit_box{ key="ht_clv"; edit_width=12; } spacer; :button{ label=">>"; key="ht_sel"; fixed_width=true; height=2; } } spacer; :boxed_column{ label="Rotation"; :radio_row{ :radio_button{ label="Sens trigonométrique"; key="tri"; } :radio_button{ label="Sens horaire"; key="hor"; } } :row{ :popup_list{ key="ang_typ"; width=22; } :edit_box{ key="ang_clv"; edit_width=12; } spacer; :button{ label=">>"; key="ang_sel"; fixed_width=true; height=2; } } } spacer; ok_cancel; } Le LISP : Nouvelle version posté le 07/02/06 Il est aussi possible de télécharger seulement Res_hel.vlx (un seul fichier compilé). ;;; C:RES_HEL et C:-RES_HEL Gilles Chanteau -04/07/06- ;;; ;;; Crée un réseau hélicoïdal avec les objets sélectionnés (un réseau polaire ;;; où chaque occurence est incrémentée sur Z). ;;; Accepte tous les types d'unités angulaires et des angles supérieurs à 360°. ;;; Taper res_hel ouvre une boite de dialogue. ;;; Taper -res_hel permet la saisie à la ligne de commande. ;;;************************* SOUS-ROUTINES **************************;;; ;;; STR2ANG Convertit une chaine de caractères représentant un angle ;;; en sa valeur en radians (nombre réel) ;;; Accepte les angles supérieurs à 360° ;;; Ne prend pas en compte la valeur des variables ANGDIR et ANGBASE (defun STR2ANG (str unt / ang) (if (not unt) (setq unt (getvar "AUNITS")) ) (cond ((numberp (read str)) (setq ang (float (read str))) (cond ((or (= unt 0) (= unt 1) (= unt 4)) (* (/ ang 180) pi) ) ((= unt 2) (* (/ ang 200) pi) ) ((= unt 3) ang ) ) ) ((= unt 4) (if (= (getvar "ANGDIR") 1) (- (getvar "angbase") (angtof str)) (- (angtof str) (getvar "angbase")) ) ) ((angtof str) (if (not (member "geomcal.arx" (arx))) (arxload "geomcal") ) (* (/ (cal str) 180) pi) ) ) ) ;;; ANG2STR Convertit une valeur d'angle en radians en chaine de caractère ;;; représentant l'angle dans l'unité spécifiée ;;; Accepte les angles supérieurs à 360° ;;; Ne prend pas en compte la valeur des variables ANGDIR et ANGBASE (defun ang2str (ang unt prec / d m s) (if (numberp ang) (progn (if (not unt) (setq unt (getvar "AUNITS")) ) (if (not prec) (setq prec (getvar "AUPREC")) ) (cond ((= unt 0) (rtos (* (/ ang pi) 180) 2 prec) ) ((= unt 1) (setq d (* (/ ang pi) 180) m (* 60 (- d (setq d (fix d)))) s (* 60 (- m (setq m (fix m)))) ) (if (equal (abs s) 60 1e-009) (progn (setq s 0.0) (if (minusp m) (setq m (1- m)) (setq m (1+ m)) ) ) ) (if (= (abs m) 60) (progn (setq m 0) (if (minusp m) (setq d (1- d)) (setq d (1+ d)) ) ) ) (strcat (itoa d) "d" (if ( (strcat (itoa m) "'") "" ) (if ( (if ( (strcat (itoa (fix s)) "\"") (strcat (rtos s 2 (- prec 4)) "\"") ) "" ) ) ) ((= unt 2) (strcat (rtos (* (/ ang pi) 200) 2 prec) "g") ) ((= unt 3) (strcat (rtos ang 2 prec) "r") ) ((= unt 4) (if (= (getvar "ANGDIR") 1) (setq ang (- ang)) ) (angtos (+ (getvar "ANGBASE") ang) 4 prec) ) ) ) ) ) ;;; Redéfinition de la fonction *error* (defun RES_HEL_ERR (msg) (if (or (= msg "Fonction annulée") (= msg "quitter / sortir abandon") ) (princ) (princ (strcat "\nErreur: " msg)) ) (command) (command "_undo" "_end") (setvar "cmdecho" v1) (setvar "osmode" v2) (setvar "aunits" v3) (setq *error* m:err m:err nil ) (princ) ) ;;; CREAT_RES_HEL Création du réseau (defun CREAT_RES_HEL (ss nb axe ang ht / v1 v2 v3) (setq m:err *error* *error* RES_HEL_ERR v1 (getvar "cmdecho") v2 (getvar "osmode") v3 (getvar "aunits") ) (command "_undo" "_begin") (setvar "cmdecho" 0) (setvar "osmode" 0) (setvar "aunits" 3) (repeat (1- nb) (command "_copy" ss "" axe axe) (command "_rotate" ss "" axe ang) (command "_move" ss "" '(0 0) (list 0 0 ht)) ) (command "_undo" "_end") (setvar "cmdecho" v1) (setvar "osmode" v2) (setvar "aunits" v3) (setq *error* m:err m:err nil ) ) ;;;******************** FONCTIONS PRINCIPALES **********************;;; ;;; C:-RES_HEL Entrées utilisateur à la ligne de commande (defun C:-RES_HEL (/ ss nb ang ht cen) (while (not (setq ss (ssget)))) (initget 7) (setq nb (getint "\nEntrez le nombre d'éléments du réseau: ")) (initget 1) (setq cen (getpoint "\nSpécifiez le centre du réseau: ")) (if (not (setq ht (getdist "\nSpécifiez le décalage en hauteur ou : " ) ) ) (progn (initget 1) (setq ht (/ (getdist "\nSpécifiez la hauteur totale: ") nb)) ) ) (initget "Décrit Elément") (if (= (getkword "\nPrécisez : angle décrit ou angle entre les éléments [Décrit/Elément] : " ) "Elément" ) (setq ang_t "angle entre les éléments") (setq ang_t "angle décrit") ) (while (not (numberp ang)) (if (= (setq ang (getstring (strcat "\nEntrez l'" ang_t " ou : ") ) ) "" ) (progn (initget "Référence") (if (= "Référence" (setq ang (getangle cen "\nSpécifiez l'angle ou [Référence]: ")) ) (setq ang (+ (- (getangle cen "\nSpécifiez l'angle de référence: ")) (getangle cen "\nSpécifiez le nouvel angle: ") ) ) ) (if (= 1 (getvar "ANGDIR")) (setq ang (- ang)) ) (if (minusp ang) (setq ang (+ (* 2 pi) ang)) ) ) (setq ang (STR2ANG ang nil)) ) ) (if (= ang_t "angle décrit") (setq ang (/ ang nb)) ) (initget "Horaire Trigonométrique") (if (= (getkword "\nSpécifiez le sens de rotation [Horaire/Trigonométrique] : " ) "Horaire" ) (setq ang (- ang)) ) (CREAT_RES_HEL ss nb cen ang ht) (princ) ) ;;; C:RES_HEL Entrées utilisateur dans une boite de dialogue (defun C:RES_HEL (/ ss ang pt ht) (setq dcl_id (load_dialog "res_hel.dcl")) (setq what_next 2) (while ( (if (not (new_dialog "res_hel" dcl_id)) (exit) ) (start_list "ang_typ") (mapcar 'add_list '("Angle décrit" "Angle entre les éléments") ) (end_list) (start_list "dec_ht") (mapcar 'add_list '("Entre les éléments" "Hauteur totale") ) (end_list) (if (not *nb_res_hel*) (setq *nb_res_hel* 4) ) (if (null *cen_res_hel*) (setq *cen_res_hel* '(0.0 0.0)) ) (if (not *dec_res_hel*) (setq *dec_res_hel* 0) ) (if (not *ht_res_hel*) (setq *ht_res_hel* 1.0) ) (setq ht *ht_res_hel*) (if (not *tot_res_hel*) (setq *tot_res_hel* 0) ) (if (not *sens_res_hel*) (setq *sens_res_hel* 1) ) (if (not *ang_res_hel*) (setq *ang_res_hel* (* 2 pi)) ) (setq ang *ang_res_hel*) (if ss (mode_tile "accept" 0) (mode_tile "accept" 1) ) (if (zerop *tot_res_hel*) (set_tile "ang_typ" "0") (set_tile "ang_typ" "1") ) (if (zerop *dec_res_hel*) (set_tile "dec_ht" "0") (set_tile "dec_ht" "1") ) (if (minusp *sens_res_hel*) (set_tile "hor" "1") (set_tile "tri" "1") ) (set_tile "nbre" (itoa *nb_res_hel*)) (set_tile "ang_clv" (ANG2STR ang nil nil)) (set_tile "ht_clv" (rtos ht)) (set_tile "x_coord" (rtos (car *cen_res_hel*))) (set_tile "y_coord" (rtos (cadr *cen_res_hel*))) (action_tile "nbre" (strcat "(if (and (numberp (read $value))" "( "(progn (setq *nb_res_hel* (atoi $value))" "(set_tile \"nbre\" (itoa *nb_res_hel*)))" "(progn (alert \"Entrée non valide\")" "(mode_tile \"nbre\" 2)))" ) ) (action_tile "x_coord" (strcat "(if (numberp (read $value))" "(setq *cen_res_hel* (list (atof $value) (cadr *cen_res_hel*)))" "(progn (alert \"Entrée non valide\")" "(mode_tile \"x_coord\" 2)))" ) ) (action_tile "y_coord" (strcat "(if (numberp (read $value))" "(setq *cen_res_hel* (list (car *cen_res_hel*) (atof $value)))" "(progn (alert \"Entrée non valide\")" "(mode_tile \"y_coord\" 2)))" ) ) (action_tile "ht_clv" (strcat "(if (numberp (read $value))" "(progn (setq ht (atof $value))" "(setq *ht_res_hel* ht)" "(set_tile \"ht_clv\" (rtos ht)))" "(progn (alert \"Entrée non valide\")" "(mode_tile \"ht_clv\" 2)))" ) ) (action_tile "dec_ht" (strcat "(if (= $value \"0\")" "(setq *dec_res_hel* 0)" "(setq *dec_res_hel* 1))" ) ) (action_tile "ang_typ" (strcat "(if (= $value \"0\")" "(setq *tot_res_hel* 0)" "(setq *tot_res_hel* 1))" ) ) (action_tile "hor" (strcat "(if (= $value \"0\")" "(setq *sens_res_hel* 1)" "(setq *sens_res_hel* -1))" ) ) (action_tile "tri" (strcat "(if (= $value \"1\")" "(setq *sens_res_hel* 1)" "(setq *sens_res_hel* -1))" ) ) (action_tile "ang_clv" (strcat "(if (angtof $value)" "(progn (setq ang (STR2ANG $value nil))" "(setq *ang_res_hel* ang)" "(set_tile \"ang_clv\" (ANG2STR ang nil nil)))" "(progn (alert \"Entrée non valide\")" "(mode_tile \"ang_clv\" 2)))" ) ) (action_tile "jeu_sel" "(done_dialog 3)") (action_tile "ht_sel" "(done_dialog 4)") (action_tile "cen_sel" "(done_dialog 5)") (action_tile "ang_sel" "(done_dialog 6)") (action_tile "accept" "(done_dialog 1)") (setq what_next (start_dialog)) (cond ((= what_next 3) (setq ss (ssget)) ) ((= what_next 4) (setq ht (getdist "\nSpécifiez le premier point: ")) (setq *ht_res_hel* ht) ) ((= what_next 5) (setq *cen_res_hel* (getpoint "\nSpécifiez le centre: ")) ) ((= what_next 6) (initget "Référence") (if (= "Référence" (setq ang (getangle *cen_res_hel* "\nSpécifiez l'angle ou [Référence]: " ) ) ) (setq ang (+ (- (getangle *cen_res_hel* "\nSpécifiez l'angle de référence: " ) ) (getangle *cen_res_hel* "\nSpécifiez le nouvel angle: " ) ) ) ) (if (= 1 (getvar "ANGDIR")) (setq ang (- ang)) ) (if (minusp ang) (setq ang (+ (* 2 pi) ang)) ) (setq *ang_res_hel* ang) ) ((= what_next 1) (setq ang (* ang *sens_res_hel*)) (if (zerop *tot_res_hel*) (setq ang (/ ang *nb_res_hel*)) ) (if (not (zerop *dec_res_hel*)) (setq ht (/ ht *nb_res_hel*)) ) (CREAT_RES_HEL ss *nb_res_hel* *cen_res_hel* ang ht) ) ) ) (unload_dialog dcl_id) (princ) ) [Edité le 7/2/2006 par (gile)] [Edité le 4/7/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
winfield Posté(e) le 2 janvier 2006 Posté(e) le 2 janvier 2006 Comme d'habitude, tous les commentaires sont bienvenus... Je ne suis pas lispeur, mais plutot vba-i-ste. De mon côté, j'essaye de devenir le "Maîîître du moonnde" en vba , mais devant vos travaux, je ne puis qu'être admiratif. Alors je vous dis : Bravo, félicitations et surtout : bonne continuation. De tout coeur. Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.
bonuscad Posté(e) le 3 janvier 2006 Posté(e) le 3 janvier 2006 Juste un petit soucis à la 1ère utilisation, ça avorte Commande: res_hel; erreur:type d'argument incorrect: numberp: nil Je pense que c'est une variable qui n'est pas définies lors de la 1ère utilisation, mais qui le devient après cet échec. Donc pas bien grave (juste pour l'esthétique d'utilisation). Pas d'autres observations, ça fonctionne Nickel, il ne manque plus que les Chromes ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 3 janvier 2006 Auteur Posté(e) le 3 janvier 2006 Le petit soucis est réparé, c'était bien un problème de variable globale non définie. Merci aux testeurs ;) [Edité le 3/1/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 8 janvier 2006 Auteur Posté(e) le 8 janvier 2006 ERRATUM Des tests plus poussés m'ont révélé un oubli pouvant provoquer un dysfonctionnement en cas d'entrée de nombres entiers dans les cases pour le décalage en hauteur et la rotation. Cet oubli génère l'erreur de dédutant (dixit Tramber) du type :(/ 10 3) -> 3 au lieu de (/ 10.0 3) ->3.33333 Le code ci-dessus est corrigé. Sinon, on peut remplacer les lignes : (setq ang (/ ang *nb_res_hel*)) et(setq ht (/ ht *nb_res_hel*)) par, respectivement : (setq ang (/ (float ang) *nb_res_hel*)) et (setq ht (/ (float ht) *nb_res_hel*)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 7 février 2006 Auteur Posté(e) le 7 février 2006 J'ai encore modifié le LISP ci-dessus pour une nouvelle version (la dernière ?) intégrant les sous-routines ANG2STR et STR2ANG qui permettent l'affichage et les entrées dans le système d'unités angulaires courant et les calculs en radians pour conserver toute la précision d'AutoCAD. Cette petite application est aussi disponible dans les Téléchargements proposés par les membres sous la forme d'un unique fichier compilé : Res_hel.vlx. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 20 juin 2006 Auteur Posté(e) le 20 juin 2006 Grace au concours de notre cher "oueb-maistre" les fichiers source LISP et DCL sont maintenant inclus avec le VLX dans Res_hel.zip Télécharger Res_hel.zip Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 4 juillet 2006 Auteur Posté(e) le 4 juillet 2006 Suite à ce message, je modifie Res_hel pour y ajouter un option "Référence" dans la spécification de l'angle décrit ou entre les éléments. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
cloclo26000 Posté(e) le 18 février 2007 Posté(e) le 18 février 2007 FELISITATION GILE BONNE CONTINUATION TRES TRES BIEN :)
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