Lisp : erreur: type d'argument incorrect: num

Fermé
bocman - 5 mars 2012 à 09:09
 Yoda - 6 juil. 2012 à 16:28
Bonjour,

J'au un problème avec une programmation lisp
quant le la créer elle marche puis lorsque ferme autocad et que je le relance ainsi que mon programme LISP il ne marche plus et m'affiche

erreur: type d'argument incorrect: numberp: nil

si qqun pourrai me dire ce qui cloche dans mon programme merci



(defun c:st20nappe_inf()
(setvar "cmdecho"0)
;(setq scu0 (getpoint "\n donner point d'origine:"))
;(setq scux (getpoint "\n donner X"))
;(setq scuy (getpoint "\n donner y"))
;(command "scu" "3" scu0 scux scuy)
;(setq d (getdist "\nDonner l'éspacement entre les poteaux: ")) ;Espacement entre les poteau
(setq p0 (getpoint "\nCliquer le point de début de la dalle de TS: ")) ; premier point de la dalle
(setq LONG 0) ; initialise la longueur à 0
(terpri)(setq rep "O") ; saute une ligne

(setq p1 (getpoint "\nCliquer le point extrémité de la dalle: ")) ; p1 = le point de fin de la dalle
(setq p2 (getpoint "\ndonner la ligne de départ:"))
(setq p3 (polar p2 alfa (distance p0 p1)))
(prompt "\nJe dessine patience patience...") ; l'ordi réfléchi
(setq d1 (distance p0 p1)); d1 et le calcul de la distance p0 et p1 qui correspond à la longueur de la dalle
(setq LONG (+ LONG d1)) ; aditionne toute les distances d1 de la boucle
(setq alfa (angle p0 p1)) ; alpha et l'angle entre l'axe horizontal et la droite P0P1
(setq nbre (/ d1 205)) ; nbre détermine le nombre d'espacement en divisant la distance d1 par d

(setq n (fix nbre)); n correspond au nombre de panneau entier pour le déterminer on récupère la valeur entière à nbre
(setq n (+ 1 n)); addtionne tous les n (nbre de panneau)de la boucle
(if (> 205 (rem d1 205))
(progn
(repeat (- n 1) ; repette le dessin panneau
(progn
(setq p4 (polar p2 alfa 0)) ; oriente les panneau
(command "inserer" "ST20_DALLE" p4 1 1 0 "") ; insère le bloc st20
(setq p2 (polar p2 alfa 205))
)
)
)
(progn
(repeat n ; répette le dessin du panneau
(progn
(setq p4 (polar p2 alfa 0)) ; oriente les panneau
(command "inserer" "ST20_DALLE" p4 1 1 0 "") ; insère le bloc st20
(setq p2 (polar p2 alfa 205))
)
)
)
)
(setq p0 p1)

(command "polylign" p1 "la" 0 0 p1 "")

(command "inserer" "Fraction_Panneau_ST20" p3 1 1 0 "")
(command "redess")
;(command "scu" "general")
)

2 réponses

Bonjour,

Quand tu execute le programme pour la première fois, l'angle alfa n'est pas initialisé.

(setq p3 (polar p2 alfa (distance p0 p1)))

;)
0
ok mais comment dois-je l initialiser
0
Initialiser ça veut dire donner une valeur de départ, sinon par défaut c'est nil.

la fonction polar demande un point, un angle et une distance.
pour alfa c'est peut-etre (setq alfa (angle p0 p1)), a voir dans ton cas précis.

(setq alfa (angle p0 p1))
(setq p3 (polar p2 alfa (distance p0 p1)))

;)
0
mdaroze Messages postés 3 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 6 juillet 2012
6 juil. 2012 à 11:54
bonjour, je ne connais pas la programmation autocad, ni d'autre d'autre, une commande que j'ai récupéré ne fonction pas, elle se termine par le message suivant "Commande: ; erreur: type d'argument incorrect: number: nil" plus haut Yoda indique qu'il faut initialiser l'angle alpha? mais comment fait on? sinon voici le fichier texte de la commande.

;Détermine les éléments pour faire les dist/sol pour un point souhaité.
(defun c:l05 ()
(vl-load-com)
(setq ppc (mgetpoint ppc "\nOrigine PROFIL ... : "))
(setq ppcx (car ppc))
(setq ppcy (car (cdr ppc)))
(setq vpc (mgetreal vpc "Valeur PC (m)"))
(setq osmde (getvar "osmode"))
(setq cal (getvar "clayer"))
(command "-calque" "n" "_Ptbas" "e" "_Ptbas" "co" "2" "" "t" "a" "" "")
(setq pt (getpoint "\nPoint au sol ... : "))
(setq cab (car (entsel "\Sélectionner le câble: ")))
(while pt
(command "osmode" 0)
(setq ptocable (vlax-curve-getstartpoint cab))
(setq xo (nth 0 pt))
(setq yo (nth 1 pt))
(setq altiobs (+ vpc (/ (- yo ppcy) 5)))
(setq positionobs (- xo (car ptocable)))
(command "polylign" (list xo yo) (list xo (+ 1000 yo)) "")
(setq po (entlast))
(setq po1 (vlax-ename->vla-object po))
(setq cab (vlax-ename->vla-object cab))
(setq int (3d-coord->pt-lst
(vlax-invoke po1 'IntersectWith cab acExtendNone)
)
)
(command "effacer" po "")
(setq pt1x (caar int))
(setq pt1y (car (cdr (car int))))
(setq txtx (+ pt1x 5))
(setq txty (+ (/ (- pt1y (cadr ptobs)) 2) (cadr ptobs)))
(command "polylign" pt (list pt1x pt1y) "")
(setq distca (/ (distance pt (car int)) 5))
(command "_mtext" (list txtx txty) "h" 3 "r" 0 "l" 0
(strcat (strcat "Dist supp gauche: " (rtos positionobs 2 2) "m") "\\P"
(strcat "Alti obs: " (rtos altiobs 2 2) "m") "\\P"
(strcat "Dist sol/cable: " (rtos distca 2 2) "m"))
""
)
(command "osmode" osmde)
(setq pt (getpoint "\nPoint au sol ...<Entrer> : "))
(if (/= pt nil)
(setq cab (car (entsel "\Sélectionner le câble: ")))
)
)
(command "osmode" osmde)
(command "clayer" cal)
)

merci d'avance
0
Bonjour,

Je n'ai pas pu essayer ton lisp, ne sachant pas quelles sont les données de départ, ni ce qu'il est sensé faire.
Mais cette ligne doit générer une erreur:
(setq txty (+ (/ (- pt1y (cadr ptobs)) 2) (cadr ptobs)))
en effet l'élément ptobs n'est pas initialisé plus haut dans le programme, donc sa valeur est nil. On ne peut pas faire d'opération arithmétique avec des valeurs non initialisées.

Essayes de cette façon:
(setq txty (+ (/ (- pt1y (cadr positionobs)) 2) (cadr positionobs)))

;)
0
mdaroze Messages postés 3 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 6 juillet 2012
6 juil. 2012 à 14:38
merci de cette réactivité Yoda vraiment merci,

j'ai essayé mais pas de résultat, l'erreur n'arrive qu'à la fin, c'est la première fois que je l'utilise sur mon PC, j'ai récupérai un fichier .lsp qui contient une vingtaine de petite manip et c'est la seule qui ne fonctionne pas... peut être que le problème ce trouve au début de l'ouverture autocad?

merci pour tout
0
Si tu me disais à quoi sert ce programme, je pourrais l'essayer sur ma bécane et voir ce qui ne va pas.

A+
0
mdaroze Messages postés 3 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 6 juillet 2012
6 juil. 2012 à 16:14
il faudrait que je t'envoie un fichier sur lequel je travaille pour que tu vois cela, et que je t'explique ce que je recherche. tu aurais une adresse mail?
0
Je ne répond que sur ce forum.

Mais tu peux m'expliquer en quelque mots. D'après ce que j'ai compris, tu essayes de tracer un profil en long?
Dis moi de quoi tu parts et ce que tu veux faire. Si tu veux joindre un fichier, passe par le site cjoint.com, depose ton fichier et colle le lien dans le prochain post.

Je dois interrompre pour le moment. A+.
0