Aller au contenu

lisp calcul de différent niveau


Messages recommandés

Invité pleche.damien
Posté(e)

Bonjour je me suis réaliser un programme lisp mais j'ai le problème suivant:

 

erreur: type d'argument incorrect: fixnump: nil

 

Je pense que le problème est à la ligne suivante de mon lisp:

 

 

(setq Nivbis (itoa Niv_inf)) ; réatribue les données de la variable Niv_inf à Nivbis; itoa permet de retransrire la valeur entière du réel.

 

Car quand je lance la command "inspecter" de visual lisp sur la variable "Nivbis" il me marque "nil" comme s'il ne trouvai rien. Comment sa se fait alors que j'ai réaliser la même manipulation avec :"(setq Niv (itoa Niv_sup))" alors que sa marche...???? A moins qu'il y à une autre érreur.

 

 


(defun c:arase ()

 (setq pt08 (getpoint "\n point d'insertion départ arase sup: coupe "))
 (setq pt01 (getpoint "\n point d'insertion départ arase inf: coupe "))
 (setq Niv_sup (getint "/n donner le Niv de l'arase sup semelle (m)"))
 
 (setq accrochage (getvar "osmode"))
 (setvar "osmode" 0)

 

 (setq pt20 (polar pt08 (/ pi) 50))             ; défini le point haut du Niv
 (setq pt21 (polar pt01 (/ pi) 50))             ; défini le point bas du Niv
 (setq pt22 (polar pt20 (/ pi ) 42))
 (setq pt23 (polar pt21 (/ pi) 42))
 
 (command "inserer" "Niv" pt20 1 1 0 long "")   ; inserer bloc
 (command "inserer" "Niv" pt21 1 1 0 long "")


 (setq Pttext_Niv_sup (polar pt22 (/ pi 2) 18))  ; défini le point du text
 ;(setq Pttext_Niv_inf (polar pt23 (/ pi 2) 18))  

 (setq Niv (itoa Niv_sup))                      ; réatribue les données de la variable Niv_sup à Niv; itoa permet de retransrire la valeur entière du réel
 
 (setq texte_Niv_sup (strcat Niv " ""m Arase sup "))  ; défini le texte au point 

 (command "texte" Pttext_Niv_sup 4 0 texte_Niv_sup)   ; lance la command texte





 (setq long_delta_arase (distance pt08 pt01))         ; définition automatique du Niv inf. semelle
 (setq Niv_inf (- Niv_sup long_delta_arase))
  
 (setq Pttext_Niv_inf (polar pt23 (/ pi 2) 18))

 (setq Nivbis (itoa Niv_inf))

 
 (setq texte_Niv_inf (strcat Nivbis " ""m Arase inf "))

 (command "texte" Pttext_Niv_inf 4 0 texte_Niv_inf)

 
 )

 

 

Pour information mon lisp créer, insert deux blocs de niveaux, apres avoir inséré les deux blocs de niveaux, mon lisp calcul automatiquement la distance entre les 2 niveaux(voir la variable long_delta_arase ). Pour info le Niveau de l'arase supérieur est une valeur connu puisque on la rentre dans la variable "Niv_sup" au début du programme. Ensuite mon programme rentre directement mon texte pour le niveau Sup. Jusque la tout fonctionne, mais ensuite il ne reconné pas le texte Niv inférieur, donc pour se qui veulent m'aider... N'hésitez pas

Merci d'avance.

 

Posté(e)

Bonjour,

 

Ton erreur vient bien d'où tu la suspecte.

 

Le problème est que tu fais

(setq Niv_inf (- Niv_sup long_delta_arase))

 

mais long_delta_arase est une distance entre 2 point (pt08 et pt01), donc une valeur réelle.

 

En conséquence ton Niv_inf EST une valeur réelle et tu demande à autocad de convertir un entier en alphanumérique (itoa) !?!?

 

soit tu fais (itoa (fix Niv_inf)) , soit (rtos Niv_inf 2 0), sachant que la 2ème proposition arrondi au supérieur.

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

Invité pleche.damien
Posté(e)

merci sa marche trés bien

 

Invité pleche.damien
Posté(e)

Pour améliorer se prog. j'aimerai qu'il me passe mon Niv inférieur en cm, je m'explique:

 

Etant donné que le Niveau supérieur rentré et en "métre" et que la variable delta qui calcul la distance automatiquement entre les deux point est en "cm" (car mon programme d'ensemble et en cm)

(setq long_delta_arase (distance pt08 pt01)) 

il faut que j'applique donc un multiplicateur " * 0.01 " pour obtenir mon Niveau inférieur en Mètre.

 

Alors j'ai pensé faire sa :

(setq long_delta_arase (* (distance pt08 pt01) 0.01)) 

 

Sa a laire de fonctioner malheuresement j'ai l'impression que le résultat que me donne le Niveau inférieur arrondie par défau mon calcul.

 

Alors que je veux une présision de deux chiffres aprés le virgul: 5 m=5.00 m

 

Sauf si mon analyse est mauvaise sur la cause du problème....

 

Merci d'avance pour votre aide.

 

Invité pleche.damien
Posté(e)

je pense peut etre faire sa

 

command "units" "t" "decimal" "p" "0.00" "") 

 

et metre mon multiplicateur 0.01 pour la distance:(setq long_delta_arase (* (distance pt08 pt01) 0.01))

 

Invité pleche.damien
Posté(e)

aprés avoir fouillé dans le forum il y a peut etre une autre solution avec "round"

 

 

  ;;; ROUND (gile)
;;; Arrondit à la valeur la plus proche en fonction de prec
;;; (round pi 0.01) -> 3.14
;;; (round pi 1e-5) -> 3.14159
;;; (round 5456.50 1) -> 5457
;;; (round 5456.50 100.0) -> 5500.0

(defun round (num prec)
 (if (zerop (setq prec (abs prec)))
   num
   (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5)))
 )
)



  • 2 mois après...
Posté(e)

Bonjour Guest_pleche.damien_*,

 

Je suis assez intéressé par votre petit programme, et j'ai essayé de le faire fonctionné chez moi.

Malheureusement, je ne mis connait pas en langage lisp.

J'ai compris le principe, et je vois qu'il faut un autre fichier "Niv.dwg" servant de bloc.

Je l'ai donc créé, en mettant un repère rapide et un texte quelconque, et je crois que c'est ça qui cause problème.

 

Dans mon fichier (je travail en mètre), quand je lance la commande, je pointe le niveau sup, le niveau inf, puis je donne la valeur de mon niveau sup (36), et c'est là qu'il se passe un problème,

Voici ce que m'affiche Autocad :

 

point d'insertion départ arase sup: coupe

point d'insertion départ arase inf: coupe /n donner le Niv de l'arase sup

semelle (m)36

inserer Entrez le nom du bloc ou [?]: Niv Définition en double de l'état de

calque "50405" ignorée.Définition en double de l'état de calque "_LAYISO_STATE"

ignorée.Définition en double de l'état de calque "ACAD_VIEWS_VP PF" ignorée.

Unités: Millimètres Conversion: 1.0000

Spécifiez le point d'insertion ou [Pointdebase/Echelle/X/Y/Z/Rotation]:

Entrez le facteur d'échelle en X, spécifiez le coin opposé ou [Coin/XYZ] <1>:

1 Entrez le facteur d'échelle en Y <utiliser le facteur d'échelle en X>: 1

Spécifiez l'angle de rotation <0.0000g>: 0

Commande:

Commande: ARASE Commande inconnue "ARASE". Appuyez sur F1 pour obtenir de

l'aide.

Commande: inserer Entrez le nom du bloc ou [?] <Niv>: Niv

Unités: Millimètres Conversion: 1.0000

Spécifiez le point d'insertion ou [Pointdebase/Echelle/X/Y/Z/Rotation]:

Entrez le facteur d'échelle en X, spécifiez le coin opposé ou [Coin/XYZ] <1>:

1 Entrez le facteur d'échelle en Y <utiliser le facteur d'échelle en X>: 1

Spécifiez l'angle de rotation <0.0000g>: 0

Commande:

Commande: ARASE Commande inconnue "ARASE". Appuyez sur F1 pour obtenir de

l'aide.

Commande: ; erreur: type d'argument incorrect: numberp: nil

 

Le bloc a bien été inséré au 2 niveaux (sup et inf), mais rien d'autre ne se passe.

 

Merci.

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

tu pose la question avec la variable Niv_sup

 

(setq Niv_sup (getreal "\n donner le Niv de l'arase sup semelle (m): "))

 

Il est très difficile de prendre un programme d'une personne pour l'adapter ensuite comme les variables

sont propres au programmeur.

J'ai fait également un bout de programme dans le même principe.

OU le deuxième niveau est calculer par rapport au 1er Niv.

 

 

   ;;;;;calcul des niveau semelle;;;;;




;(setq accrochage (getvar "osmode"))
 ;(setvar "osmode" 0)

 
 
(setvar "ATTREQ" 1)
(setvar "ATTDIA" 0)
(setvar "DIMZIN" 1)
 
 (setq pt20 (polar pt08 (/ pi) 50))             ; défini le point haut du Niv
 (setq pt21 (polar pt01 (/ pi) 50))             ; défini le point bas du Niv
 (setq pt22 (polar pt20 (/ pi ) 42))
 (setq pt23 (polar pt21 (/ pi) 42))

 
 


 (command "inserer" "Niv" pt20 1 1 0 long "")   ; inserer bloc
 (command "inserer" "Niv" pt21 1 1 0 long "")
 


 (setq Pttext_Niv_sup (polar pt22 (/ pi 2) 18))  ; défini le point du text


 (setq Niv (rtos Niv_sup 2 2))
 ; réatribue les données de la variable Niv_sup à Niv; itoa permet de retransrire la valeur entière du réel
 
 (setq texte_Niv_sup (strcat Niv))  ; défini le texte au point 
 (command "couleur" "5")                              ; changer couleur
 (command "texte" Pttext_Niv_sup 8 0 texte_Niv_sup)   ; lance la command texte
 (command "couleur" "DuCalque")                       ; revient calque initiale 




 (setq long_delta_arase (* (distance pt08 pt01) 0.01))        ; définition automatique du Niv inf. semelle

 (setq Niv_inf (- Niv_sup long_delta_arase))
  
 (setq Pttext_Niv_inf (polar pt23 (/ pi 2) 18))

 ;(setq Nivbis (rtos Niv_inf 2 0))

 (setq Nivbis (rtos Niv_inf 2 2))

 
 
 (setq texte_Niv_inf (strcat Nivbis))

 (command "couleur" "5")
 (command "texte" Pttext_Niv_inf 8 0 texte_Niv_inf)
 (command "couleur" "DuCalque")

 

jète y un coup d'œil.

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é