Aller au contenu

Lancement de fonction avec argument


Messages recommandés

Posté(e)

Bonjour,

 

Je cherche à lancer une commande puis une fonction avec paramètre. Je n'ai droit qu'à un nil :

 

;dessiner un tube
(defun c:tubpvc ()
(setq diam (getint "Diamiètre :"))
(setq P1 (getpoint "premier point :"))
(setq P2 (getpoint "second point :"))



(command "_line" P1 P2 "")

;selectionner l'ancien objet
;et le décaler de la moitié du diamètre


;(setq der (entget (entlast)))

;(setq coord (cadr (assoc '10 der)))



;(command "DECALER" (/ diam 2) der @-1 "")



;(while (setq der (entnext der))
;(ssadd der js)
;)


;(command "DECALER" diam/2 der "-1" "")
(initget 1 "Embranchement Fin")
(setq choix (getkword "Embranchement, Fin"))
(if (= choix "Embranchement")
(Embranchement))

(if (= choix "Fin")
(command "Fin"))


)


(defun Embranchement ()

(if (= diam "100")

(command "_insert" "culotte_bt144_back.dwg" P2 1 1 pause)
)

(if (= diam "110")

(command "_insert" "culotte_bv144_back.dwg" P2 1 1 pause)
)

(if (= diam "125")

(command "_insert" "culotte_bx144_back.dwg" P2 1 1 pause)
)

)

 

pour l'instant je n'arrive pas décaler l'axe des 2 cotés pour faire du bifilaire, mais déjà si j'arrive à insérer les blocs...

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

Pas mal de choses à optimiser tout de suite mais pourquoi la commande FIN. sur 2011, elle n'existe même plus !?

 

Je comprends bien ton code mais pas du tout ta question...

 

En résumé on peut faire un IF tout simple pour lancer la commande.

(j'ai enlevé le bit 1 du INITGET pour sortir rapidement.)

Mais pour aller plus loin on peut utiliser COND pour décider d'options multiples et non plus d'un simple OUI ou NON (IF). J'ai imaginé ici 4 possibilités. 3 diamètres qui donnent une insertion d'un bloc particulier et un dernier pour les autres diamètres.

C'est juste pour expliquer COND.

 

;dessiner un tube
(defun c:tubpvc ()
(setq diam (getint "Diamiètre :"))
(setq P1 (getpoint "premier point :"))
(setq P2 (getpoint "second point :"))
(command "_line" P1 P2 "")
(initget  "Embranchement Sortir")
(setq choix (getkword "\nEmbranchement/Sortir <Sortir> :"))
(if(= choix "Embranchement")(Embranchement))
)


(defun Embranchement ()
 (command "_insert"
   (cond((= diam "100")"culotte_bt144_back.dwg")
	((= diam "110")"culotte_bt156_AAA.dwg")
	((= diam "125")"culotte_bt178_BBBB.dwg")
	(T"culotte_onsaitjamais.dwg"))
   P2
   1 1 pause)
)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

La commande FIN qui lancera une fonction d'insertion d'un autre bloc. Je ne l'ai pas mise ici.

 

je viens de regarder ton code et de le tester :

 

lorsque que je rentre le diamètre à 100, il ne cherche pas à insérer la bonne culotte pourquoi ?

 

TUBPVC
Diamiètre :100
premier point :second point :_line Spécifiez le premier point:
Spécifiez le point suivant ou [annUler]:
Spécifiez le point suivant ou [annUler]:
Commande:
Embranchement/Sortir <Sortir> :e
_insert Entrez le nom du bloc ou [?]: culotte_onsaitjamais.dwg
"culotte_onsaitjamais.dwg": Impossible de trouver le fichier dans le chemin de 
recherche:

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

je viens de trouver il faut mettre un itoa pour transformer la variable dim en chaine

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

bon maintenant que j'ai un peu compris le fonctionnement de tout ça voici mon code :

 

;dessiner un tube
(defun c:tubpvc ()
;;;  ICI il manquerait l'enregistrement de l'état de OSMODE
(setq diam_pvc (getint "Diamiètre :"))
(setq P1 (getpoint "premier point :"))
(setq P2 (getpoint "second point :"))
(command "_line" P1 P2 "")
(initget  "Embranchement Coude Sortir")
(setq choix (getkword "\nEmbranchement/Sortir/Coude <Sortir> :"))
(if(= choix "Embranchement")(Embranchement_f))
(if(= choix "Coude")(Coude_f))
;;;Et ici sa restitution
)




(defun Embranchement_f ()

;transformer la variable diam_pvc en chaine de carctère pour la comparer par la suite
(setq str_diam_pvc (itoa diam_pvc) )


(initget  "Gauche Droite")
(setq choix (getkword "\nGauche/Droite <Gauche> :"))
(if(= choix "Gauche")

  (command "_insert"
           (cond((= str_diam_pvc "100")"culotte_bt144_back.dwg")
                ((= str_diam_pvc  "110")"culotte_bv144_back.dwg")
                ((= str_diam_pvc  "125")"culotte_bx144_back.dwg")
                (T"culotte_onsaitjamais.dwg"))
           P2
           -1 1 P1)
)

(if(= choix "Droite")

  (command "_insert"
           (cond((= str_diam_pvc "100")"culotte_bt144_back.dwg")
                ((= str_diam_pvc  "110")"culotte_bv144_back.dwg")
                ((= str_diam_pvc  "125")"culotte_bx144_back.dwg")
                (T"culotte_onsaitjamais.dwg"))
           P2
           -1 -1 P1)
)

)

(defun Coude_f ()

;transformer la variable diam_pvc en chaine de carctère pour la comparer par la suite
(setq str_diam_pvc (itoa diam_pvc) )


(initget  "Gauche Droite")
(setq choix (getkword "\nGauche/Droite <Gauche> :"))
(if(= choix "Gauche")

  (command "_insert"
           (cond((= str_diam_pvc "100")"coude_ct44_back")
                ((= str_diam_pvc  "110")"coude_cv44_back")
                ((= str_diam_pvc  "125")"coude_cx44_back")
                (T"coude_onsaitjamais.dwg"))
           P2
           -1 1 P1)
)

(if(= choix "Droite")

  (command "_insert"
           (cond((= str_diam_pvc "100")"coude_ct44_back")
                ((= str_diam_pvc  "110")"coude_cv44_back")
                ((= str_diam_pvc  "125")"coude_cx44_back")
                (T"coude_onsaitjamais.dwg"))
           P2
           -1 -1 P1)
)

)


 

 

Est-ce que l'on pourrait m'expliquer comment faire pour décaler la ligne de la moitié du diamètre ?

 

j'avais tenter un truc du genre :

;(setq der (entget (entlast)))

;(setq coord (cadr (assoc '10 der)))



;(command "DECALER" (/ diam 2) der @-1 "")

mais je n'arrivais pas à grand chose...

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

Je suis content que tu avances et comprennes !

 

command "DECALER" ! ? On y arrive, je pense que ton @-1 est vraiment bizarre ! "@-1,0" ?

Bon. A toi de dépatouiller ton COMMAND ! Pour l'autre côté, il suffit de faire (/ DIAM -2.0), partir en négatif avec le même point de décalage.

 

Il y a une autre méthode pour "DECALER", c'est du Vlisp. Promis je te donne la formule si tu te débrouilles d'abord en command :(rires forts):

 

Mais une chose : fais toujours très attention.

(setq diam (getint "Diamiètre :"))

 

Un INTEGER, c'est pas terrible. Mieux vaut un REAL.

D'autant que (/ 51 2) renvoie 25 ! (/ 51 2.0) renvoie 25.5

Donc l'autre réflexe serait aussi de plutôt écrire (/ DIAM 2.0) ! Et oui !

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

La commande FIN qui lancera une fonction d'insertion d'un autre bloc. Je ne l'ai pas mise ici.

 

Ah oui ? Ca nous fait "Embranchement/Fin/Sortir" donc là, tu pourras utiliser COND.

Genre :

 

(cond((= choix "Embranchement")(Embranchement))
      ((= choix "Fin")(routine_fin))
      (T ligneinutilepuisquechoix=nilnelancerien)
      )
équivalent à 
(cond((= choix "Embranchement")(Embranchement))
      ((= choix "Fin")(routine_fin))
      )

 

Qui est équivalente à IF avec valeur_si_vrai et valeur_si_faux.

 

Mais avec COND, tu pourras mettre N options, autant que tu veux.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Et bien, après plusieurs test, je bloque toujours sur DECALER :

 

 

;dessiner un tube
(defun c:tubpvc ()
;;;  ICI il manquerait l'enregistrement de l'état de OSMODE
(setq diam_pvc (getint "Diamiètre :"))
(setq P1 (getpoint "premier point :"))
(setq P2 (getpoint "second point :"))
(command "_line" P1 P2 "")


(setq der (entget (entlast)))

(setq coord (cadr (assoc '10 der)))



(command "_offset" (/ diam -2.0) der )

(initget  "Embranchement Coude Sortir")
(setq choix (getkword "\nEmbranchement/Sortir/Coude <Sortir> :"))
(if(= choix "Embranchement")(Embranchement_f))
(if(= choix "Coude")(Coude_f))
;;;Et ici sa restitution
)




(defun Embranchement_f ()

;transformer la variable diam_pvc en chaine de carctère pour la comparer par la suite
(setq str_diam_pvc (itoa diam_pvc) )


(initget  "Gauche Droite")
(setq choix (getkword "\nGauche/Droite <Gauche> :"))
(if(= choix "Gauche")

  (command "_insert"
           (cond((= str_diam_pvc "100")"culotte_bt144_back.dwg")
                ((= str_diam_pvc  "110")"culotte_bv144_back.dwg")
                ((= str_diam_pvc  "125")"culotte_bx144_back.dwg")
                (T"culotte_onsaitjamais.dwg"))
           P2
           -1 1 P1)
)

(if(= choix "Droite")

  (command "_insert"
           (cond((= str_diam_pvc "100")"culotte_bt144_back.dwg")
                ((= str_diam_pvc  "110")"culotte_bv144_back.dwg")
                ((= str_diam_pvc  "125")"culotte_bx144_back.dwg")
                (T"culotte_onsaitjamais.dwg"))
           P2
           -1 -1 P1)
)

)

(defun Coude_f ()

;transformer la variable diam_pvc en chaine de carctère pour la comparer par la suite
(setq str_diam_pvc (itoa diam_pvc) )


(initget  "Gauche Droite")
(setq choix (getkword "\nGauche/Droite <Gauche> :"))
(if(= choix "Gauche")

  (command "_insert"
           (cond((= str_diam_pvc "100")"coude_ct44_back")
                ((= str_diam_pvc  "110")"coude_cv44_back")
                ((= str_diam_pvc  "125")"coude_cx44_back")
                (T"coude_onsaitjamais.dwg"))
           P2
           -1 1 P1)
)

(if(= choix "Droite")

  (command "_insert"
           (cond((= str_diam_pvc "100")"coude_ct44_back")
                ((= str_diam_pvc  "110")"coude_cv44_back")
                ((= str_diam_pvc  "125")"coude_cx44_back")
                (T"coude_onsaitjamais.dwg"))
           P2
           -1 -1 P1)
)

)

 

 

voilà l'erreur produite

 

_offset
Paramètres courants: Effacer source=Non  Calque=Source  OFFSETGAPTYPE=0
Spécifiez la distance de décalage ou [Par/Effacer/Calque] <1.0000>: ; erreur: 
type d'argument incorrect: numberp: nil

 

faut-il récupérer des coordonnées pour les indiquer à la commande _offset ?

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

Salut,

 

J’ai pas tout suivi la discussion, mais rapidement pour répondre à ton interrogation pour la commande _offset

 

Tout d’abord l’erreur qui t’as été retourné est une erreur de type d’argument non valable, regardons rapidement les lignes de codes incriminé :

(setq diam_pvc (getint "Diamiètre :"))
(setq der (entget (entlast)))
(command "_offset" (/ diam -2.0) der )

 

Rapidement diam n’est jamais renseigné (ou affecté d’une valeur) dans ton code, par contre diam_pvc oui !

(/ diam -2.0) avec cette ligne tu risques un nombre négatif, (ce qui n’est pas une valeur de décalage acceptable).

Puis (entget (entlast)) retourne la liste des codes dxf de l’entité, et pas son nom d’entité..

 

 

Le mieux c’est de reprendre calmement le fonctionnement de la fonction décalé en la faisant tourner sous AutoCAD que voyons nous, en ligne de commande la fonction _offset (décaler) réclame 3 arguments :

 

En 1 : Spécifiez la distance de décalage ou [Par/Effacer/Calque] <>:

Une valeur strictement positive et nom nulle, je suppose pour ton cas:

(/ diam_pvc 2.0)

 

En 2 : Sélectionnez l'objet à décaler ou [Quitter/annUler] <Quitter>:

L’objet (entité en Lisp) à décaler, dans ton cas si j’ai bien compris le dernier objet dessiné c.a.d.

(entlast)

 

En 3 : Spécifiez un point sur le côté à décaler ou [Quitter/Multiple/annUler]

Un point pour la direction, soit spécifié à l’écran ou automatiquement de ce que j’ai compris un point en fonction du dernier cliqué, peut être :

"@-1,0"

 

 

Voilà pour résumer essaye de faire tourner les lignes de codes suivantes elle devrait t’aider..

((lambda (/)
  (command "_line"
    (getpoint "premier point :")
    (getpoint (getvar 'lastpoint) "second point :")
    ""
  )
  (command "_offset"
    (/ (setq diam_pvc (getint "Diamiètre :")) 2.0) 
    (entlast)
    "@-1,0"
  )
)
)

 

A+

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é