Aller au contenu

Traduction de VBA en Lisp ( ou de superficie à contenance) ?


Messages recommandés

Posté(e)

Re bonsoir à tous....

 

Voilà, j'ai fais une routine en VBA qui transforme une superficie (exprimée en mètre carré) en une contenance cadastrale (exprimée en hectare ares centiares)

 

Je vous donnes quelques exemples de convertion... ( les 0 sont très importants...)

 

1m² = 0a 01ca

10m² = 0a 10ca

101m² = 1a 01ca

110m² = 1a 10ca

123456m² = 12ha 34a 56ca

123456789m² = 12 345ha 67a 89ca

 

Voilà, j'avais écris une routine en VBA mais je n'ai jamais eu l'occasion de la tester, Mais elle devait ressembler à ça (mais je n'en suis pas sûr...C'est de tête...) :

Public Sub Surf2Aire()
Dim Ha, A, Ca As String
Aire = "": Ca = "": A = "": Ha = "": Texte = ""
If Right(VarCherche, 2) = "m²" Then VarCherche = Left(VarCherche, Len(VarCherche) - 2)
'Isole les Centiares
If Len(VarCherche) > 1 Then Ca = Right(VarCherche, 2)
If Len(VarCherche) = 1 Then Ca = VarCherche: VarCherche = ""
If Len(VarCherche) > 2 Then VarCherche = Left(VarCherche, Len(VarCherche) - 2)
'Isole les Ares
If Len(VarCherche) > 1 Then A = Right(VarCherche, 2)
If Len(VarCherche) = 1 Then A = VarCherche: VarCherche = ""
If Len(VarCherche) > 2 Then VarCherche = Left(VarCherche, Len(VarCherche) - 2)
'Isole les Hectares
If Len(VarCherche) > 0 Then Ha = VarCherche
'Aire = Ha & " ha " & A & " a " & Ca & " ca"
If Ha <> "" Then Aire = Ha & " ha "
If A <> "" Then Aire = Aire & A & " a " Else Aire = "0 a "
If Len(Ca) = 1 Then Ca = "0" & Ca
If Ca <> "" Then Aire = Aire & Ca & " ca"
Texte = Aire
End Sub

 

Bon.... Qui veut répondre est le bienvenu...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

 

Un exemle avec substr, l'argument peut être une chaine de caractère du type :

"123456 m2" ou "123456m2" ou "123456"

ou un nombre (les décimales des réels sont tronquées (fix))

123456 ou 123456.25

 

(defun surf2aire (surf / len)
 
 ;; si l'argument est un nombre, il est transformé en chaine
 (if (numberp surf)
   (setq surf (itoa (fix surf)))
 )

 ;; suppression des caractères " m2" à la fin de la chaine
 (setq surf (vl-string-right-trim " m2" surf))

 ;; longueur de la chaine
 (setq len (strlen surf))

 ;; nouvelle chaine en fonction de la longueur
 (cond
   ((     (strcat (substr surf 1 (- len 4))
     "ha "
     (substr surf (- len 3) 2)
     "a "
     (substr surf (- len 1) 2)
     "ca "
    )
   )
   ((     (strcat (substr surf 1 (- len 2))
     "a "
     (substr surf (- len 1) 2)
     "ca "
    )
   )
   ((     (strcat "0a " surf "ca ")
   )
   (T (strcat "0a 0" surf "ca "))
 )
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Je pense qu'on pourrait aussi s'aider de la fonction (cvunit), voir le fichier AutoCAD.UNT pour les conversion possible.

 

Vite fait pour l'exemple, certainement à creuser:

 

((lambda ( / )

(setq l_s '(1 10 101 110 123456 123456789))

(foreach n l_s

(print (strcat (itoa n) " m2= " (rtos (cvunit n "centare" "centare")) " ca"))

(print (strcat (itoa n) " m2= " (rtos (cvunit n "centare" "are")) " a"))

(print (strcat (itoa n) " m2= " (rtos (cvunit n "centare" "hectare")) " ha"))

)

(prin1)

))

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

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é