Lisp : erreur: type d'argument incorrect: num
bocman
-
Yoda -
Yoda -
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")
)
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)))
;)
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)))
;)
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
;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
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)))
;)
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)))
;)
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
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
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+.
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+.
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)))
;)