Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous !

 

Tout d'abord, merci à tout ceux qui participe sur ce Forum,

j'ai déja appris beaucoup de choses !

Je commence donc a apprendre et comprendre le Lisp.

J'ai déja trouver pas mal de choses, et j'ai donc envi de créer mes propres Lisp

(même s'il existe peut être déja).

 

Donc voici mon tout premier Lisp.

Vraiment très simplet par rapport aux votre,

mais ca commence ...

 

;;; Création de profils
(defun c:corn (/ P1 P2 P3 P4 P5 P6 LA HT EP)
 (initget (+ 1 8))
 (setq P1 (getpoint "selectionner le point de base : "))
 (initget (+ 1 2 4 8))
 (setq LA (getreal "Largeur de la cornière : "))
 (setq HT (getreal "Hauteur de la cornière : "))
 (setq EP (getreal "Epaisseur de la cornière : "))
 (setq P2 (+ P1 (+ LA) (+ 0) (+ 0)))
 (setq P3 (+ P2 (+ 0) (+ EP) (+ 0)))
 (setq P4 (+ P3 (- LA EP) (+0) (+ 0)))
 (setq P5 (+ P4 (+ 0) (+ (- HT EP) (+0))))
 (setq P6 (+ P5 (- EP) (+ 0) (+ 0)))
 (command "polylign" P1 P2 P3 P4 P5 P6 "c")
 )
(princ)
)

 

Le début tout ce passe bien, mais a la fin, il me met :

"; erreur: type d'argument incorrect: numberp: (31241.5 23743.8 0.0)"

 

Le but de ce minuscule liste, est de créer des profils de cornières alu/laiton/inox.

Je demande donc le point de base, la largeur, la hauteur et l'épaisseur,

et ensuite il me crée la cornière.

 

Pouvez-vous m'aider à comprendre pourquoi ?

 

Merci d'avance à tous !

 

PS : Mon but est vraiment d'apprendre un maximum et de comprendre

tout ce que je met dans ma Lisp.

Pour le moment je veux donc uniquement corriger cette erreur,

et je rajouterai des choses après.

Posté(e)

Je pense que ce qu'il manque c'est que je n'ai pas la bonne syntaxe pour ajouter aux points P2 P3 P4 P5 P6 les coordonnées en X,Y,Z par rapport a P1.

Et ... je n'arrive pas a trouver la bonne façon de les mettres.

Je continu de chercher ...

Posté(e)

Dernières modifs

 

;;; Création de profils
(defun c:corn (/ P1 P2 P3 P4 P5 P6 LA HT EP)
 (initget (+ 1 8))
 (setq P1 (getpoint "selectionner le point de base : "))
 (initget (+ 1 2 4 8))
 (setq LA (getreal "Largeur de la cornière : "))
 (setq HT (getreal "Hauteur de la cornière : "))
 (setq EP (getreal "Epaisseur de la cornière : "))
 (setq X1 '(+ car P1 LA))
 (setq Y1 '(cadr P1))
 (setq Y2 '(+ Y1 EP))
 (setq X2 '(- X1 (- LA EP)))
 (setq X3 '(car P1))
 (setq Y3 '(+ cadr P1 HT))
 (setq P2 '(X1 Y1))
 (setq P3 '(X1 Y2))
 (setq P4 '(X2 Y2))
 (setq P5 '(X2 Y3))
 (setq P6 '(X3 Y3))
 (command "polylign" P1 P2 P3 P4 P5 P6 "c")
)


 

Maintenant ça m'indique ça :

 

Commande: corn

selectionner le point de base : Largeur de la cornière : 30

Hauteur de la cornière : 20

Epaisseur de la cornière : 2

polylign

Spécifiez le point de départ:

La largeur courante est de 0.0000.

Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]:

Commande:

Commande:

Commande:

Commande:

Commande: c Commande inconnue "C". Appuyez sur F1 pour obtenir de l'aide.

Commande: nil

Posté(e)

Bonjour,

 

En partant de ton 1er code, voici les suggestions et remarques:

En lisp les point sont représenter sous forme de liste dont le X est le 1er élément, le Y le 2ème et éventuellement le Z en 3ème.

Pour obtenir le X il faut prendre le (car) de la liste, pour le Y ce sera le (cadr) et pour le Z (caddr)

 

Lors de l'usage de (getxxx) il faut armer le bit (initget) juste avant chaque appel.

ATTENTION aux accroches objet avec l'appel (command)

Un corrigé pour mieux comprendre

 

(defun c:corn ( / P1 P2 P3 P4 P5 P6 LA HT EP)
 (initget (+ 1 8))
 (setq P1 (getpoint "\nSelectionner le point de base : "))
 (initget (+ 1 2 4))
 (setq LA (getdist P1 "\nLargeur de la cornière : ")) ;(getreal "Largeur de la cornière : ")
 (initget (+ 1 2 4))
 (setq HT (getdist P1 "\nHauteur de la cornière : "))  ;(getreal "Hauteur de la cornière : ")
 (initget (+ 1 2 4))
 (setq EP (getdist P1 "\nEpaisseur de la cornière : ")) ;(getreal "Epaisseur de la cornière : ")
 (setq P2 (list (+ (car P1) LA) (cadr P1))) ;(+ P1 (+ LA) (+ 0) (+ 0))
 (setq P3 (list (car P2) (+ (cadr P2) EP))) ;(+ P2 (+ 0) (+ EP) (+ 0))
 (setq P4 (list (- (car P3) (- LA EP)) (cadr P3))) ;(+ P3 (- LA EP) (+0) (+ 0))
 (setq P5 (list (car P4) (+ (cadr P4) (- HT EP)))) ;(+ P4 (+ 0) (+ (- HT EP) (+0)))
 (setq P6 (list (- (car P5) EP) (cadr P5))) ;(+ P5 (- EP) (+ 0) (+ 0))
 (command "_.pline" "_none" P1 "_none" P2 "_none" P3 "_none" P4 "_none" P5 "_none" P6 "_close")
 (princ)
)

 

La manipulation des listes est la base du Lisp ;)

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

Posté(e)

Oui d'accord, c'est ce que j'ai justement essayé d'appliquer lors de la deuxieme version.

Et ce que tu as fait, est précisément ce que j'imaginai, mais je n'arrivait pas a l'exprimer

en langage lisp.

 

Deux petites questions par rapport a ce que tu as fait :

- Quel est l'intéret de mettre "\n" devant le dexte que l'on veut afficher ?

- As quoi sert le "_none" entre chaque point dans la création de la polyligne ?

- Et le (princ) à la fin, c'est quoi sont but ?

 

Merci encore !

 

Quand je vous ce que vous faites ...

Même les dieux ne savent pas comment faire !

 

:D

Posté(e)
- Quel est l'intéret de mettre "\n" devant le dexte que l'on veut afficher ?

Cela oblige l'affichage du message en ligne de commande sur une nouvelle ligne. Sans cela si tu valide ton entrée utilisateur par la barre espace' date=' la prochaine invite va s'afficher à la suite. (C'est du "paufinage" ;) )

Tu trouvera les caractères spéciaux dans l'aide autolisp concernant la fonction (prin1).

 

- As quoi sert le "_none" entre chaque point dans la création de la polyligne ?

C'est simplement le mode forcé d'accrochage à "aucun" ("_none" en international)

 

- Et le (princ) à la fin, c'est quoi sont but ?

Une sortie silencieuse du programme, autrement tu as le retour de la dernière évaluation (qui est souvent "nil") qui s'affiche. On peut mettre indifféremment (prin1)

 

A part le "_none" qui a vraiment son importance (si tu ne gère pas la variable OSMODE dans ton code), le reste n'est qu'une histoire de présentation afin de simuler proprement un comportement de ta nouvelle commande comme celle d'autocad.

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

  • 3 semaines après...
Posté(e)

Salut a tous ! de retour pour de nouvelles aventures ! :)

 

Donc depuis j'ai appris a gérer osmode, et je l'ai intégré dansle lisp.

Pour info, je partagerai le lisp une fois le problème ci-dessous réglé. (ca pourra peut être servir ...)

 

Donc je voulai intégrer un nouveau type de profil dans ce lisp,

je pensai l'avoir bien écrit, mais je rencontre un petit souci !

 

(defun c:tubf (/ VAR1 P1 P2 P3 P4 LA HT EP EP2)
 (setvar "cmdecho" 0)
 (setq VAR1 nil P1 nil P2 nil P3 nil P4 nil LA nil HT nil EP nil EP2 nil)
 (setq VAR1 (getvar "osmode"))
 (initget (+ 1 2 4))
 (setq LA (getreal "\nLargeur du tube : ")) 
 (initget (+ 1 2 4))
 (setq HT (getreal "\nHauteur du tube : "))  
 (initget (+ 1 2 4))
 (setq EP (getreal "\nEpaisseur de l'acier : "))
 (initget (+ 1 8))
 (setq P1 (getpoint "\nSelectionner le point de base : "))
 (setq EP2 (* EP 2))
 (setq P2 '((+ (car P1) LA) (+ (cadr P1) HT)))
 (setq P3 '((+ (car P1) EP) (+ (cadr P1) EP)))
 (setq P4 '((+ (car P1) (- LA EP)) (+ (cadr P1) (- HT EP))))
 (setvar "osmode" 0)
 (command "_.rectang" "r" EP2 P1 P2)
 (command "_.rectang" "r" EP P3 P4)
 (setvar "osmode" VAR1)
 (setq VAR1 nil P1 nil P2 nil P3 nil P4 nil LA nil HT nil EP nil EP2 nil)
 (princ)
)

 

Mais seulement ça ne fonctionne pas.

il me demande bien l'ensemble des 4 variables,

mais ne créé par les deux rectangle ...

Il m'indique pourtant dans la barre de commande les raccords de rectangle qui sont modifié.

 

Par contre quand je tape dans la barre de commande ceci : (command "_.rectang" "r" EP2 P1 P2)

il me créé bien mon rectangle. (en ayant préalablement intégrer les variable EP2 P1 et P2 evidement)

 

je n'arrive pas à comprendre d'ou viens le souci.

Même avec un "arret sur erreur", il ne me dit rien.

 

Avez vous une idée du problème ?

 

Merci d'avance !

Posté(e)

Attention à la fonction (quote) abrégée avec '

Celle-ci n'évalue pas les arguments.

 

Choisis simplement (cons) ou (list) pour construire tes points

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

Posté(e)

Attention à la fonction (quote) abrégée avec '

Celle-ci n'évalue pas les arguments.

 

Choisis simplement (cons) ou (list) pour construire tes points

 

Ah super !

Merci !

et merci aussi pour la réactivité ! :)

 

Je viens également de voir autre chose,

le rayon de raccord du rectangle reste actif au rayon indiquer par le lisp.

Y as t'il un moyen simple de remettre le raccord à 0 sans pour autant créer un rectagle.

 

Merci encore

Posté(e)
le rayon de raccord du rectangle reste actif

 

RECTANG est en fait un programme externe en arx, donc illisible. Je suppose qu'il doit stocker la valeur dans une variable (mais laquelle!) car quand on annule (_undo) pour remonter avant la construction du rectangle, si on relance la commande rectang, la valeur du raccord est toujours la dernière entrée.

 

Bizarrement il ne se sont pas servi de la variable standard FILLETRAD. Sans trouver le nom de leur variable, je ne vois pas de façon élégante pour réinitialiser le raccord.

 

Tu pourrais utiliser la commande polyligne avec l'option clore, puis la commande raccord avec l'option polyligne qui produirait le même résultat et remettre la variable FILLETRAD à sa valeur avant utilisation.

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

Posté(e)

 

Tu pourrais utiliser la commande polyligne avec l'option clore, puis la commande raccord avec l'option polyligne qui produirait le même résultat et remettre la variable FILLETRAD à sa valeur avant utilisation.

 

Ah ok ! je comprend très bien ta démarche, ca me parait une bonne idée !!!

mais justement, là on aborde un sujet que je n'ai pas encore compris.

Comment peut tu choisir ta polyligne une fois celle-ci crée, pour en faire ensuite le raccord sur la première, puis sur la deuxieme.

 

Car si j'ai bien compri la démarche tu fait d'abord les deux polylignes,

puis tu appliques a celles-ci le raccord que tu souhaite.

 

Pour être sur qu'on se comprend, le but est de créer un profil tel l'image ci-jointe.post-31843-0-57349100-1334239225_thumb.png

Posté(e)

Voici la partie qui t’intéresse:

 (setq old_fillet (getvar "FILLETRAD"))
 (setvar "FILLETRAD" EP2)
 (command "_.pline"
   P1
   (list (+ (car P1) LA) (cadr P1))
   (list (+ (car P1) LA) (+ (cadr P1) HT))
   (list (car P1) (+ (cadr P1) HT))
   "_close"
 )
 (command "_.fillet" "_polyline" (entlast))
 (setvar "FILLETRAD" EP)
 (command "_.pline"
   (list (+ (car P1) EP) (+ (cadr P1) EP))
   (list (+ (car P1) (- LA EP)) (+ (cadr P1) EP))
   (list (+ (car P1) (- LA EP)) (+ (cadr P1) (- HT EP)))
   (list (+ (car P1) EP) (+ (cadr P1) (- HT EP)))
   "_close"
 )
 (command "_.fillet" "_polyline" (entlast))
 (setvar "FILLETRAD" old_fillet)

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

Posté(e)

Oh énorme, je viens de faire des essais dans la barre de commande,

excellent ! c'est interressant tout ça !

Merci beaucoup !!!

et en plus tu m'as maché le travail pour les points de position,

je n'ai plus de mérite du coup :huh:

 

Et ... question à la con !

si jamais je veux choisir qu'un seul angle de ma polyligne, c'est possible ?

Posté(e)
Et ... question à la con !

si jamais je veux choisir qu'un seul angle de ma polyligne, c'est possible ?

 

Ta question est loin d'être con.

Le raccord est possible sur un seul angle, mais la procédure et totalement différente.

En effet dans ce que je t'ai proposé, _FILLET se contente du nom de l'entité à raccorder pour fonctionner.

Si tu veux le faire sur un seul angle il va falloir lui simuler les points de sélection sur les cotés adjacents.

Pour que cela fonctionne l'argument ne peut plus être le nom de l'entité mais une liste similaire à ce que pourrait retourner la fonction (entsel); c'est à dire le point de sélection et le nom de l'entité sous forme de liste.

 

Les points de sélection sont important avec RACCORD, ils déterminent dans quel sens va se faire le raccord.

 

Donc c'est faisable mais un peu plus compliqué, je te laisse cogiter un peu si tu veux faire cela:

tu m'as maché le travail
;)

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

Posté(e)
Deuxieme question a la con !

tu as appris ou tout ça ? :D

 

Avec PATIENCE (il est très sympa), j'ai commencé en 1986 sur un PC 286 avec le bouquin Autolisp d'Autodesk (Hé oui, la bibliothèque internet n'était pas vraiment disponible, en même temps je n'était pas distrait à surfer sur le net.)

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

Posté(e)

Avec PATIENCE (il est très sympa), j'ai commencé en 1986 sur un PC 286 avec le bouquin Autolisp d'Autodesk (Hé oui, la bibliothèque internet n'était pas vraiment disponible, en même temps je n'était pas distrait à surfer sur le net.)

 

Respet ! je t'avoue qu'en 86 j'était encore en couche culotte :(rires forts):

Mais je dit respect, autodidacte, j'ai la même manière de procédé, avec l'avantage d'avoir internet comme solide appui ! :D

Sinon j'ai un livre que j'ai télécharger sur ce forum de "la programmation autolisp" de Jean-Claude TESTE.

Je le trouve pas mal, j'en apprend pas mal avec.

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é