x_all Posté(e) le 12 novembre 2011 Posté(e) le 12 novembre 2011 yeah !!trop contant, je viens de pondre mon premier lisp !! bon, je vous cache pas que j'ai pioché grandement dans plusieurs bout de code dont telle ou telle partie ressemblait à ce que je voulais faire. Au bout du compte ça marche à peu près. Il y aurai plein de truc à améliorer bien sur, mais il n'y a qu'un truc qui me turlupine... c'est comment faire pour boucler (et sortir du coup) sans donner au départ le nombre de cycle... ; fait une extrusion par une valeur qui s'incrémente à chaque entité (defun c:extud_inc (/ test ss h hauteur nb) (setq h (getreal "\nHauteur à répéter: ")) (setq nb (getint "\nNombre de marches: ")) (setq test 0) (setq hauteur h) (while (<= test nb) (setq ss (ssget)) (command "_extrude" ss "" hauteur) (setq hauteur (+ hauteur h)) (setq test (1+ test)) ) (princ) ) quelques trucs sur autocad
Tramber Posté(e) le 12 novembre 2011 Posté(e) le 12 novembre 2011 Super ! Utilise donc un (REPEAT nqui simplifiera ton code plutôt que de faire un test WHILE. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
VDH-Bruno Posté(e) le 13 novembre 2011 Posté(e) le 13 novembre 2011 Bonsoir, c'est comment faire pour boucler (et sortir du coup) sans donner au départ le nombre de cycle... En faisant ton test while sur la sélection (ou non séléction d’une entité), par exemple tu pourrais réécrire ton code de la façon suivante : (defun c:extud_inc (/ ss h hauteur) (setq h (getreal "\nHauteur de marche: ")) (setq hauteur h) (while (setq ss (ssget)) (command "_extrude" ss "" hauteur) (setq hauteur (+ hauteur h)) ) (princ) ) Il y aurai plein de truc à améliorer bien sur A mes yeux le principal serait de pouvoir faire la sélection par trajet ou capture de tous les éléments à extruder plutôt que de sélectionner les éléments un a un à chaque itération. Bonne continuation.A+ Apprendre => Prendre => Rendre
x_all Posté(e) le 13 novembre 2011 Auteur Posté(e) le 13 novembre 2011 oki... repeat... je me documente sur cette fonction, mais je comprend pas bien comment elle marche... il n'y a rien la dessus dans l'aide au développeur de la 2008, et les exemples d'utilisation que je trouve reste un peu obscurs... (REPEAT n .. ) ça semble revenir au même en plus élégant je te l'accorde. ce que je ne voudrai, c'est ne pas avoir à préciser de nombre de marches mais simplement lancer la commande et stopper la routine .... je sais pas moi, en tapant tapant la lettre "S" par exemple, ou en cliquant dans le vide (ce qui est moins top si on rate une polyligne on sort...) mais bon, c'est pas essentiel je vous l'accorde... quelques trucs sur autocad
VDH-Bruno Posté(e) le 13 novembre 2011 Posté(e) le 13 novembre 2011 (modifié) Re, ce que je ne voudrai, c'est ne pas avoir à préciser de nombre de marches mais simplement lancer la commande et stopper la routine [...] en cliquant dans le vide (ce qui est moins top si on rate une polyligne on sort...) En cliquant dans le vide, c'est ce que fait l'exemple que je donne... sauf que comme tu dois valider ta sélection si tu rate une polyligne tu ne sort pas forcément, d’ailleurs si tu es toujours sur de cliquer des polylignes je te conseil l’emploie d’un filtre de sélection dans l’utilisation de ssget du type (ssget '((0 . "LWPOLYLINE"))). Si tu veux utiliser un mot clef pour quitter regarde du coté des fonctions initget & entsel (attention à la valeur de retour d’entsel) car pour utiliser la commande _extrude tu as besoin d’un jeu de sélection. Pour l’emploie d’entsel avec while tu peux t’inspirer de ce qui est proposé dans ce sujet. A+ Modifié le 13 novembre 2011 par VDH-Bruno Apprendre => Prendre => Rendre
didier Posté(e) le 14 novembre 2011 Posté(e) le 14 novembre 2011 coucou pour faire une boucle dont tu ne connais pas a priori le nombre d'itérations mais qui est calculable par le programme. Par exemple dans ton cas le nombre de marches dépend de la hauteursi une marche monte de 0.17que l'escalier monte de 2.72tu sais qu'il faut 16 marchesdonc tu feras (repeat 16 ...);ne pas oublier la fermeture du repeatou mieux encore(repeat (/ 2.72 0.17))mais dans ce cas tu devras bien vérifier que le résultat est un entieron ne sait pas encore faire 12.72 boucles (hihi) amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
x_all Posté(e) le 14 novembre 2011 Auteur Posté(e) le 14 novembre 2011 @VDH-Brunomoi qui croyais avoir fini journée... me voila avec des devoirs ...je c'est bien par ce bout là qu'il faut prendre le pb... je m'y colle... @didierje me prend déja la tête comme ça si en plus je me fait embrouiller avec des boucle de 12.72 je vais péter un plomb...:) quelques trucs sur autocad
didier Posté(e) le 14 novembre 2011 Posté(e) le 14 novembre 2011 Coucou me voila avec des devoirseh ! oh !on est déjà bien sympa de relever les copies dans le temps imparti (hihihi) amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
x_all Posté(e) le 14 novembre 2011 Auteur Posté(e) le 14 novembre 2011 il faut reconnaitre que:(while (setq ss (ssget))me convient tout à fait. effectivement comme je valide à chaque fois, ça rempli parfaitement son rôle... A mes yeux le principal serait de pouvoir faire la sélection par trajet ou capture de tous les éléments à extruder plutôt que de sélectionner les éléments un a un à chaque itération. en fait j'ai fait ce bout de code car je suis en train de vérifier des plans archi que je n'ai qu'en 2d avec des escaliers balancé qui arrivent dans des rampant de toiture. en plan le découpage des marche est toujours le même, mais les volées changent donc je recopie toujours les mêmes polylignes mais pas toujours dans l'ordre, je suis pas sur qu'une sélection par trajet me complique pas excessivement la vie. Je monte la 3d vite fait et je sort la coupe pour vérifier les coup de tête et le but c'était quand même de me faire gagner du temps :)Idem pour le lien vers le post "pb pour la sortie du while"... si je dois écrire plus de ligne pour le test que pour ma fonction ce n'est pas rentable... je ne suis pas encore accro au lisp au point de chercher des finesses pareilles... peut être ça viendra, mais ce n'est pas d'actualité (ssget '((0 . "LWPOLYLINE"))).... la vache !je dois avouer que pour arriver à lire cette ligne ça m'a pris 20mn... qu'est ce qu'une paire pointé?... pourquoi ce 0 ? cette ' ?du reste je coince un peu... si la quote sert à ne pas évaluer une expression, pourquoi la mettre entre double parenthèse? vous êtes loin les gars... vachement loin... tien, pour exemple voila un exemple de mes test... j'en ai une bonne douzaine ça faisait lourd a extruder à la pogne...... http://joch04.free.fr/images/tmp/cp1.jpg quelques trucs sur autocad
Tramber Posté(e) le 14 novembre 2011 Posté(e) le 14 novembre 2011 On se doutait très bien de ton boulot :P Moi je déroule plutôt ma ligne de foulée mais la 3D est utile aussi. Toujours se méfier des concepteurs d'escaliers tels les architectes. C'est pas eux qui se font des bosseSs (ouh la profession me maudit) 0 est le code DXF identifiant les entités. Tu verras, en faisant quelques exos sur SSGET, cela n'aura plus de secret pour toi ! Tout un panel de solutions. Mais en effet, tu devrais essayer une routine qui automatise tout ou qui utilise la boucle de VDH-Bruno Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
VDH-Bruno Posté(e) le 18 novembre 2011 Posté(e) le 18 novembre 2011 Bonjour x_all, Tout d’abord je souhaite corriger l’affirmation suivante :(attention à la valeur de retour d’entsel) car pour utiliser la commande _extrude tu as besoin d’un jeu de sélectionNon la commande _extrude comme toutes les commandes AutoCAD accepte aussi bien un nom d’entité (ENAME), qu’un jeu de sélection (PICKSET). Pour me faire pardonner j’ai rapidement émulé (de façon simple) ta routine, qui consiste à passer d’une représentation d’un escalier 2D (vue en plan et représenté par des polylignes optimisées), en représentation 3D.. … les volées changent donc je recopie toujours les mêmes polylignes mais pas toujours dans l'ordre, je suis pas sur qu'une sélection par trajet me complique pas excessivement la vieAu contraire la sélection par trajet va te simplifier la vie et te faire économiser des clics de souris, car les entités seront sélectionné dans l’ordre de ta sélection (ou l’ordre de parcours du trajet) contrairement à la sélection par capture ou fenêtre qui peut s’avérer un peu plus délicat à gérer. Le code que je donne est simple, c’est surtout l’occasion d’introduire l’utilisation des jeux de sélections et leurs manipulations avec ssget, ssadd, sslength, ssname. Contrairement à ta version, valide la sélection une fois que tu auras sélectionné (dans l’ordre soi par trajet ou pointage) toutes les entités à extruder. Le code à tester: (defun c:extud_inc (/ ss1 ss2 h hauteur) (cond ((setq ss2 (ssadd) ; Définit un jeu de sélection nul n 0 ; Initialise un compteur h (getreal "\nHauteur de marche: ") hauteur h ; Hauteur d'extrusion ss1 (ssget '((0 . "LWPOLYLINE"))) ; Sélection utilisateur ) (princ "Sélectionnez les objets par trajet (ou dans le sens de la montée...)") (repeat (sslength ss1) (command "_extrude" (ssname ss1 n) "" hauteur) (setq hauteur (+ hauteur h) n (1+ n) ss2 (ssadd (entlast) ss2); remplie le jeu de sélection ) ) (command "_union" ss2 "") ) ) (princ) ) J’ai volontairement respecté l’esprit de ta routine, mais en général pour un escalier on connait la hauteur d’étage, il semble donc plus évident de renseigner cette dernière et de laisser le soin au programme de calculer la hauteur de marche. J’ai plus trop de temps mais si j’ai une minute ce W.E. j’essaierai de répondre à tes interrogations sur les fonctions quote list et les paires pointées.. vous êtes loin les gars... vachement loin...En ce qui me concerne, à peine une année plus loin… alors tu vois pas tant que cela… ;) Bonne continuation, Apprendre => Prendre => Rendre
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