Aller au contenu

Messages recommandés

Posté(e)

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)
)

Posté(e)

Super !

 

Utilise donc un (REPEAT n

qui simplifiera ton code plutôt que de faire un test WHILE.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

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

Posté(e)

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...

Posté(e) (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é par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

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 hauteur

si une marche monte de 0.17

que l'escalier monte de 2.72

tu sais qu'il faut 16 marches

donc tu feras

(repeat 16 ...

);ne pas oublier la fermeture du repeat

ou mieux encore

(repeat (/ 2.72 0.17)

)

mais dans ce cas tu devras bien vérifier que le résultat est un entier

on ne sait pas encore faire 12.72 boucles (hihi)

 

amicalement

Posté(e)

@VDH-Bruno

moi 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...

 

@didier

je 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...

:)

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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élection

Non 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 vie

Au 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

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é