Aller au contenu

Insertion de blocs à partir d'un CSV


zebzeb

Messages recommandés

Bonjour,

 

Je cherche à inserer des plusieurs blocs avec un lisp qui charge un fichier CSV

 

Mon CVS à le format suivant:

TITRE;BLOC1;BLOC2;BLOC3; etc...

Local1;Qantité1;Qantité2;Qantité3; etc...

Local2;Qantité1;Qantité2;Qantité3; etc...

 

Mon soucis est que j'avance à tâton donc pas très vite, , mais je me heurte à ce message continuellement: erreur: fonction incorrecte: ""

 

(defun c:go (/)
(setq dataCSV (getfiled "Selection du fichier" "" "CSV" 0))
(setq openCSV (open dataCSV "r"))
(setq lireL (read-line openCSV))

(setq Titre (gc:str2lst (read-line openCSV) ";"))
(setq LongueurL (length Titre))

(setq echelle 1 angle 0)
(setq dataL " ")

(setq Lpt ("" "0.5,-0.5" "1,-0.5" "0.5,-1" "1,-1" "1.5,-1"))

(while (/= lig nil) 
	(setq DataL (gc:str2lst (read-line openCSV) ";"))
	
	(setq pt (Getpoint (strcat "\nPoint d'insertion: " (nth x DataL))))
	
	(setq x 2)
	
	(while (> LongueurL x) 
		(command "inserer" (nth x Titre) (nth x pt) echelle echelle angle (nth x DataL))
		(setq x (+ x 1))
	)
)
(princ)
)

(defun gc:str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )(list str))
)

 

Merci pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

Tu utilises une variable nommée angle qui écrase la fonction angle d'AutoLISP. Renomme la ang par exemple.

 

Et quand tu fais :

 

(setq Lpt ("" "0.5,-0.5" "1,-0.5" "0.5,-1" "1,-1" "1.5,-1"))

 

Il faut préfixer ta liste d'un guillemet simple (') car sinon elle est évaluée directement. Donc :

 

(setq Lpt '("" "0.5,-0.5" "1,-0.5" "0.5,-1" "1,-1" "1.5,-1"))

 

Et quantité, il y a un u entre le q et le a... ;)

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Juste à la lecture (pas de test) de ton code, deux choses me chagrine...

 

(while (/= lig nil)

lig est une variable qui n'est pas définie, donc déjà ton code n'exécutera jamais ta boucle while.

 

               (setq pt (Getpoint (strcat "\nPoint d'insertion: " (nth x DataL))))
               (setq x 2)

Pareil tu définis ta variable x après l'usage de celle-ci, donc à la première évaluation x est à nil (donc (nth x DataL) va échouer)ou une valeur erronée sera retourné car tes variables ne sont pas définie en local.

(defun c:go (/) devrait être (defun c:go (/ dataCSV openCSV etc...)

 

Et dernier point tu ne ferme pas le fichier CSV ouvert par (close openCSV)

 

Peut être qu'avec ces incohérences corrigées, cela fonctionnera...

NB: Pour info (nth 0 liste) renvoie le 1er élément de la liste, donc (nth 2 DataL) renvoie le 3eme élément.

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Oui en effet hier soir, j'ai pu constater ces problèmes et d'autre d'ailleurs!!

 

Par contre

(defun c:go (/)

devrait être

(defun c:go (/ dataCSV openCSV etc...)

 

Je crois que c'est le chargement des variables (?) un peu comme "Option Explicit" en VBA

Mais en lisp je n'ai jamais vu de différence les programmes fonctionnent avec et sans (?)

 

J'en profite également pour soliciter une explication (avec un exemple simple si possible) de la fonction

polar car je ne m'en sort pas !

Je chercher à faire des pas de 1 horizontal vers la droite mais le "retour à la ligne" pas de 1 je galère

 

Merci à vous

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Enfin ça fonctionne ...

Donc si ça peut intéresser quelqu'un d'autre, même je sais que l'on peut faire mieux en moins brouillon ;)

 

(defun gc:str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )(list str))
)
(defun c:goCSV (/ dataCSV openCSV lireL Titre LongueurL echelle ang DataL ptOrigine pt x)
(setq dataCSV (getfiled "Selection du fichier" "" "CSV" 0))
(setq CoefEch (getint "\nCoef (1|mm, 10|cm, 1000|m etc...),: "))
(setq openCSV (open dataCSV "r"))
(setq lireL (read-line openCSV))
(setq Titre (gc:str2lst lireL ";"))
(setq LongueurL (length Titre))
(setq d2r90 (* Pi (/ 90.0 180.0)))
(setq d2r180 (* Pi (/ 180.0 180.0)))
(setq echelle (* CoefEch 1))
(setq ang 0 )
(setq dataL " ")
(while (/= DataL nil)
	(setq lireL (read-line openCSV))
	(setq DataL (gc:str2lst lireL ";"))
	(setq ptOrigine (Getpoint (strcat "\nPoint d'insertion du local: " (nth 0 DataL))))
	(command "_TEXT" "S" "SB_TITRE" ptOrigine "0.15" 0 "%%UCourants forts:"); "" "")
	(setq x 1)
	(while (> LongueurL x)
		(setq Bloc (nth x Titre))
		(setq ValAtt (strcat "x" (nth x DataL)))
		(if (/= Bloc "")
			(progn
				(if (= x 1) 
					(setq pt (polar ptOrigine d2r90 -0.4))
					(setq pt (polar pt d2r180 -0.8))
				)
				(if (/= CFA "on")
					(command "inserer" Bloc pt echelle echelle ang ValAtt )
					(command "inserer" Bloc pt echelle echelle ang ValAtt ) 
				)
			)
			(progn
				(setq CFA "on")
				(setq pt (polar ptOrigine d2r90 -0.8))
				(command "_TEXT" "S" "SB_TITRE" pt "0.15" 0 "%%UCourants faibles:" "" "")
				(setq pt (polar ptOrigine d2r90 -1.2))
				(setq pt (polar pt d2r180 0.8))
			)
		)
		(setq x (+ x 1))
		(princ (strcat "\nX + 1 = " (itoa x) "\n"))
	)
	(setq CFA "off")
)
(close openCSV)
(princ)
)

 

Type de fichier CSV extrait d'une base excel après un filtre:

NOM DE ZONE;NOM-BLOC-CFO1;NOM-BLOC-CFO2;NOM-BLOC-CFO.etc;;NOM-BLOC-CFA1;NOM-BLOC-CFA.etc
ZONE 1 ;1;2;3;;4;5
ZONE 2;1;0;3;;1;9
ZONE Etc...;7;2;?;;4;8

 

Les chiffres sont des quantités

Le double ;; permet de différencier le CFO du CFA

Les blocs son prévu avec un seul attribut

 

Bonne journée et merci pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

Bravo,

 

On a une certaine satisfaction quand on y arrive de par soi même ;)

Et en plus on progresse plus vite dans l'apprentissage du langage.

En dernier point: On a envie d'aider les personnes qui s'investissent...

 

Bonne continuation.

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

Lien vers le commentaire
Partager sur d’autres sites

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é