Aller au contenu

Petit problème de lecture et de tri...


DenisHen

Messages recommandés

Coucou,

Denis, la fonction (explore-DXF) est une fonction que j'ai écrite moi même car j'ai souvent eut besoin de fouiller mes listes DXF pour comprendre leur fonctionnement et jusqu'où je devais creuser pour récupérer l'information que je recherche. Si tu la cherches, je l'ai postée sur CADxp à cette adresse Explore-DXF (le seul défaut -qu'il faudrait que je corrige - c'est que l'on ne peut pas accéder aux données étendues car j'effectue l'(entget) dans ma fonction et non dans l'argument mais c'est facile à modifier :3 )

Ce qu'il faut comprendre avec les données étendues c'est qu'elles sont dépendantes d'une "application" (certaines applications existent déjà dans AutoCAD mais il est également possible d'en créer via la fonction (regapp), didier en parle sur son site). Ces données ne sont pas visibles à moins de spécifier le second argument de la fonction (entget) comme le dit (gile) avec '("*"). Ce second argument permet de spécifier le(s) nom(s) des applications que l'on souhaite pour afficher les données étendues spécifiques à un objet, donc avec cette liste-ci on peut récupérer les données étendues de chaque applications liées à cet objet (cf. l'aide AutoCAD pour (entget) :3).

Toutes les données étendues sont contenues dans une liste pointée par le code DXF -3. En faisant le (cdr) de cette paire pointée, la liste obtenue est composées à son tour de paires pointées ayant le nom de l'application comme key, et les données étendues comme values. Donc dans ton exemple "(-3 ("AcAecLayerStandard" (1000 . "") (1000 . "Mobilier intérieur et urbain"))))" l'application porte le nom "AcAecLayerStandard" et possède plusieurs valeurs chacunes portant ici le code 1000

1000 ASCII string (up to 255 bytes long) in extended data.

La gestion de données étendues n'est pas la meilleure manière de commencer pour apprendre l'utilisation des (entmake). Sur le net et avec l'aide d'AutoCAD, tu trouveras les codes DXF essentiels en fonction des objets, mais à savoir que les codes 0 et 100 sont primordiaux, le reste dépends du type d'objet et on peut le découvrir en testant :3

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et à tous.

Merci Luna pour ton aide, mais je viens de voir avec mes collègues et on est d'accord sur un point, il n'y aura que des couleur de base (de 0 à 255).

Mais il y a autre chose, j'essai de créer un calque avec (entmake mais je n'y arrive pas, j'ai peut-être commencé par la fin avec

(entmake '((0 . "LAYER") (8 . "Denis") (62 . 1) (290 . 1)))

Mais sans résultat, j'ai donc fais le minimum :

_$ (entmake '((0 . "LAYER") (8 . "Denis")))
nil

Toujours rien. Quelqu'un peut-il me dire ce que je fais de mal ?

Bonne journée au forum.

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)

Lien vers le commentaire
Partager sur d’autres sites

comme je l'ai dit, les codes DXF essentiels sont à minima les codes 0 et 100 !! De plus, le nom d'un calque n'est pas spécifié par le code 8 dans sa liste DXF mais le code 2.
Donc essaye ainsi :
 

(entmake
	(list 
		'(0 . "LAYER")
		'(100 . "AcDbSymbolTableRecord")
		'(100 . "AcDbLayerTableRecord")
		(cons 2 "DenisHen")
		'(70 . 0)
	)
)

Le plus simple est de partir de la liste DXF de l'objet que tu veux créer et de supprimer les éléments facultatifs jusqu'à ne trouver que l'essentiel :3
Au départ, je suis parti de :
 

Commande: (explore-dxf (entget (tblobjname "layer" "0")) 0 nil nil)
Explore DXF in progress from "LAYER" (<Nom d'entité: 3fd24100>) :
|      (-1 . <Nom d'entité: 3fd24100>)
|      (0 . "LAYER")
|      (5 . "10")
|      (102 . "{ACAD_XDICTIONARY")
|      (360 . <Nom d'entité: 3fd231e0>)
|      (102 . "}")
|      (330 . <Nom d'entité: 3fd24020>)
|      (100 . "AcDbSymbolTableRecord")
|      (100 . "AcDbLayerTableRecord")
|      (2 . "0")
|      (70 . 0)
|      (62 . 7)
|      (6 . "Continuous")
|      (290 . 1)
|      (370 . -3)
|      (390 . <Nom d'entité: 3fd240f0>)
|      (347 . <Nom d'entité: 3fd24600>)
|      (348 . <Nom d'entité: 0>)
|
End of exploration...

Pour ne prendre que :

(entmake
	(list
		'(0 . "LAYER")
		'(100 . "AcDbSymbolTableRecord")
		'(100 . "AcDbLayerTableRecord")
		'(2 . "0")
	)
)

Mais il s'est avéré que le code DXF 70 est indispensable à la création du calque :

Quote

70

Standard flags (bit-coded values):

1 = Layer is frozen; otherwise layer is thawed

2 = Layer is frozen by default in new viewports

4 = Layer is locked

16 = If set, table entry is externally dependent on an xref

32 = If both this bit and bit 16 are set, the externally dependent xref has been successfully resolved

64 = If set, the table entry was referenced by at least one entity in the drawing the last time the drawing was edited. (This flag is for the benefit of AutoCAD commands. It can be ignored by most programs that read DXF files and need not be set by programs that write DXF files)

Le reste prend les valeurs par défaut donc si tu veux préciser sa couleur, le code 62 sera nécessaire, etc...

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Luna, et merci pour ton aide.

Déjà, (explore-dxf ne fonctionne pas chez moi (??).

Et j'ai réussi un truc, mais j'ai une erreur dès le début, ce doit être le (cons de la couleur (code 62) qui n'est pas correcte, encore un problèble d'interprétation je pense. 

; erreur: groupe DXF incorrect: (62 . "60")

Je crois qu'autolisp attent un 60 et non un "60". Qu'en penses-tu ? Car je vais avoir le même problème avec d'autre codes...

Je n'ai rien trouvé sur l'épaisseur des lignes, et quel est ce code DXF 5 (Entity handle), je n'ai rien trouvé non plus ?

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)

Lien vers le commentaire
Partager sur d’autres sites

Vouih le code DXF 62 attend un entier compris entre 1 et 255 (théoriquement 0=DuBloc et 256=DuCalque et chat fonctionne même pour la création d'un calque mais avoir un calque de couleur "DuCalque" ne fait aucun sens) et non un string :3

Pour info, j'ai remarqué que le code 62 n'est pas uniquement destiné à définir la couleur d'un calque. Lorsque sa valeur est positive, le calque est "actif", si la valeur est négative alors le calque est "inactif".

Concernant l'explore-dxf, j'ai modifié la fonction le 05/04/2021 pour intégrer directement en argument la fonction (entget) et ainsi pouvoir récupérer les données étendues d'un objet :3

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci Luna pour ton aide précieuse...

voilà ce que j'ai fini par écrire, mais aucun calque ne se créé ? ? ?

;;; *****************************************
;;;  Création des calques du niveau courant  
;;; *****************************************
(defun c:ECPS_CreaCalqCourant (/ doc CherchFich Fichier FichLstCalq lstCalqLine nomCalque line)
  (princ "\nDéveloppé par Denis H. (1.0)")
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark doc)
  (command "-calque" "e" "0" "")
  ;; Sélection du fichier de configuration...
  (setq Fichier (getfiled "Sélectionner un fichier 'Config-calque'" "" "csv" 0))
  (if (setq CherchFich (findfile Fichier))
    (load Fichier)
    (progn (princ "\nAttention, le fichier \"ECPS_Calques.csv\" est introuvable ! ! !") (exit)) ;_ Fin de progn
  ) ;_ Fin de if
  (setq FichLstCalq (open Fichier "r")) ;_ Fin de setq
  (setq LstCalqLine (read-line FichLstCalq)) ; Lecture de la ligne d'entête
  (while (setq LstCalqLine (read-line FichLstCalq))
    (setq ListLine (cons (str2lst LstCalqLine ";") ListLine))
  ) ;_ Fin de while
  (close FichLstCalq)
;;; (entmake '((0 . "CIRCLE") (62 . 3) (10 4.0 4.0 0.0) (40 . 1.0)))
  ;; 0    Type d'entité
  ;; 2    Nom du calque
  ;; 60   Visibilité de l'objet
  ;; 62   Numéro de couleur
  ;; 290  Drapeau de traçage. S'il est défini sur 0, ne tracez pas ce calque
  ;; 370  Valeur d'énumération d'épaisseur de ligne
  ;; 420  Valeur de couleur sur 24 bits, exprimée à l'aide de trois octets dont la valeur est comprise entre 0 et 255.
  ;;      Le premier octet représente la valeur de la couleur bleue, l'octet intermédiaire celle de la couleur verte et le troisième celle de la couleur rouge.
  ;;      L'octet de poids fort a toujours pour valeur 0. Le code de groupe ne peut pas être utilisé par des entités personnalisées pour leurs propres données
  ;;      car il est réservé pour AcDbEntity (données de couleur de niveau classe) et AcDbEntity (données de transparence de niveau classe).
  ;; 1000 Commentaire
  ;; (entmake '((0 . "LAYER") (8 . "Test") (60 . 1) (62 . 6) (290 . 1) (370 . 5) (1000 . "Commentaire")))
  ;; pour chaque sous-liste (ligne)
  (foreach line Listline
    (setq nomCalque (car line))
    (if (null (tblsearch "LAYER" nomCalque))
      (entmake (list (cons 0 "LAYER") ; Type d'entité
                     (cons 2 nomCalque) ; Nom du calque
                     (cons 100 "AcDbSymbolTableRecord")
                     (cons 100 "AcDbLayerTableRecord")
                     (cons 6 (nth 2 line)) ; Type de ligne
                     ;(cons ? (nth ? line)) ; Épaisseur de ligne
                     (cons 62 (atoi (nth 1 line))) ; Couleur
                     (cons 70 1) ; État du tracé
                     (cons 290 1) ;état du calque
               ) ;_ Fin de list
      ) ;_ Fin de entmake
    ) ;_ Fin de if
  ) ;_ Fin de foreach
  (vla-endundomark doc)
  (princ)
) ;_ Fin de defun

Et voici un petit extrait de mon fichier .csv :

Nom;Couleur;Type de ligne;Epaisseur de ligne;Tracer;Description;
ECPS-000_BAT BETON;1;CONTINUOUS;18;T;;
ECPS-000_BAT ESCALIER-ASC;3;CONTINUOUS;18;T;;
ECPS-000_BAT FONDATION;13;CONTINUOUS;18;T;;
ECPS-000_BAT GAINES;52;CONTINUOUS;18;T;;
ECPS-000_BAT MACONNERIE;233;CONTINUOUS;18;T;;
ECPS-000_BAT POUTRE;40;CACHE;18;T;;
ECPS-010_BAT ALLEGE-ACRO;31;CONTINUOUS;18;T;;
ECPS-010_BAT ARRIERE PLAN;9;CONTINUOUS;18;T;;
ECPS-011_BAT AXES;8;AXES;18;T;;
ECPS-012_BAT AXES REPERES;8;CONTINUOUS;18;T;;
ECPS-012_BAT AXES REPERES COTE;8;CONTINUOUS;18;T;;
ECPS-013_BAT HACHURE PLAN;9;CONTINUOUS;18;T;;
ECPS-013_BAT HACHURE PORTEUR;41;CONTINUOUS;18;T;;
ECPS-013_BAT POCHAGE PLAN;7;CONTINUOUS;18;T;;
ECPS-014_BAT ASSISE COUPE;7;CONTINUOUS;18;T;;
ECPS-014_BAT TRAIT COUPE;7;CONTINUOUS;18;T;;
ECPS-015_BAT FACADE PLAN 1;60;CONTINUOUS;18;T;;
ECPS-015_BAT FACADE PLAN 2;63;CONTINUOUS;18;T;;
ECPS-015_BAT FACADE PLAN 3;251;CONTINUOUS;18;T;;
ECPS-015_BAT POCHAGE;57;CONTINUOUS;9;T;;

J'avoue ne plus rien comprendre, pour l'instant.

Si quelqu'un a le code DXF pour l'épaisseur du type de ligne, je suis preneur...

Merci encore ) toutes et à tous pour votre aide.

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)

Lien vers le commentaire
Partager sur d’autres sites

@DenisHen La rubrique DXF Reference de l'aide aux développeurs est en français (et ce depuis que je connais AutoCAD).

Il est bon de lire la rubrique DXF Format pour bien comprendre le reste de cette aide.

Ensuite, les codes des entités graphiques sont dans la rubrique Entities Section, ceux des différentes tables (calques, types de ligne, styles de texte, etc.) dans Tables Sections.

Et puis il faut expérimenter, tester, tester, et encore tester. On a la chance en LISP de pouvoir entrer des expressions LISP directement dans la ligne de commande ou, mieux, dans la console de l'éditeur Visual LISP.  
(entget (car (entsel))) renvoie la liste DXF de l'entité sélectionnée
(entget (tblobjname "layer" "0") renvoie la liste DXF du calque "0" (remplacer "0" par un autre nom de calque du dessin.

Dans l'éditeur, tu peux copier la liste renvoyée dans une nouvelle fenêtre pour la formater afin qu'elle soit plus facilement lisible.

Pour connaître les codes de groupe indispensables à la fonction entmake, là encore il faut tester (ce ne sont pas toujours le mêmes suivant les objets).

41 minutes ago, DenisHen said:

Si quelqu'un a le code DXF pour l'épaisseur du type de ligne, je suis preneur...

Encore un fois, teste par toi même en faisant : (entget (tblobjname "layer" nomDuCalque) avec des noms de calque ayant des épaisseurs de ligne différentes. C'est comme ça qu'on apprend et qu'on retient le mieux.

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

Lien vers le commentaire
Partager sur d’autres sites

Plusieurs remarques :

1 hour ago, DenisHen said:

Si quelqu'un a le code DXF pour l'épaisseur du type de ligne, je suis preneur...

Lorsque tu apprends à utiliser la fonction (entmake), n'hésites surtout pas à consulter des objets existants et l'aide d'AutoCAD !! Les informations que je t'ai fournies ne sortent pas d'un chapeau magique, je me suis simplement contentée d'afficher la liste DXF du calque "0" et d'ouvrir l'aide AutoCAD sur la page "LAYER (DXF)"...
EDIT : +1 avec (gile) !! (entmake) comme beaucoup d'autres fonctions en vrai nécessite un minimum de recherches personnelles pour mieux comprendre leur fonctionnement et surtout comprendre que parfois, il n'y a pas de recette miracle ! Une polyligne n'aura pas besoin des mêmes codes DXF qu'un calque ou d'un bloc. Ne serait-ce qu'entre une "LWPOLYLINE" et une "POLYLINE" la création de ces deux objets pourtant proches diffère complètement !!! Et c'est d'ailleurs pour cette raison que j'ai créer la fonction (explore-dxf), parce qu'à force d'étudier des listes DXF d'objets, j'avais besoin de me faciliter la lecture :3

1 hour ago, DenisHen said:

(command "-calque" "e" "0" "")

La variable système "CLAYER" correspond à la valeur courante (tout comme "CTAB", "CECOLOR", ...) pour les calques. Donc quittes à s'épargner les (command), il est plus simple d'utiliser 

(setvar "CLAYER" "0")
;; ou
(setvar 'CLAYER "0")

Ensuite, pourquoi faire une boucle (while) pour lire le fichier et construire une liste pour chaque ligne, pour ensuite faire une boucle (foreach) de lecture de cette liste pour créer un calque avec chacune des lignes ? As-tu essayé de grouper la création du calque pendant la lecture du fichier ? Car cela pourrait t'épargner une boucle si la lecture du fichier ne gêne pas la création d'objet sur AutoCAD.

Ensuite, tu peux t'épargner le code DXF 70 (qui doit d'ailleurs être à 0 et non à 1 si tu veux qu'il soit actif, libéré, déverrouillé, etc) et le code 290 est par défaut sur 1 donc ne pas le mettre sauf si dans ton texte, tu as spécifié qu'il est non imprimable (à quoi correspond le T ? Lorsqu'il est non imprimable, quel est la lettre ?). Concernant l'épaisseur de ligne, il faut faire attention, car si l'épaisseur de ligne n'existe pas (il faut savoir que la valeur que l'on spécifie dans le code 370 c'est l'épaisseur en mm multipliée par 100, donc normalement tu as les bonnes valeurs dans ton fichier .csv car pour avoir "0.05 mm" tu as le couple DXF (370 . 5) :3)

Ensuite le problème vient peut-être de ";;" car avec un essaie de (str2lst) j'ai :

Commande: (str2lst "ECPS-000_BAT BETON;1;CONTINUOUS;18;T;;" ";")
("ECPS-000_BAT BETON" "1" "CONTINUOUS" "18" "T" "" "")

Donc le nom du calque (code DXF 2) attend un string, la couleur (code DXF 62 pour couleurs ACI) attend un entier (positif ou négatif selon l'état du calque), le type de ligne (code DXF 6) attend un string (et il faut que la valeur existe dans le .dwg), l'épaisseur de ligne (code DXF 370) attend un entier (correspond à l'épaisseur en mm multipliée par 100), le tracé (code DXF 290) attend soit 0 (non imprimable) soit 1 (imprimable) et le commentaire apparaît sous forme de donnée étendue donc code DXF -3, puis nom d'application puis code 1000 !

Commande: (explore-dxf (entget (tblobjname "layer" "0") '("*")) 0 nil nil)
Explore DXF in progress from "LAYER" (<Nom d'entité: 3fd24100>) :
|      (-1 . <Nom d'entité: 3fd24100>)
|      (0 . "LAYER")
|      (5 . "10")
|      (102 . "{ACAD_XDICTIONARY")
|      (360 . <Nom d'entité: 3fd231e0>)
|      (102 . "}")
|      (330 . <Nom d'entité: 3fd24020>)
|      (100 . "AcDbSymbolTableRecord")
|      (100 . "AcDbLayerTableRecord")
|      (2 . "0")
|      (70 . 0)
|      (62 . 7)
|      (6 . "Continuous")
|      (290 . 1)
|      (370 . 5)
|      (390 . <Nom d'entité: 3fd240f0>)
|      (347 . <Nom d'entité: 3fd24600>)
|      (348 . <Nom d'entité: 0>)
|      (-3 ("AcAecLayerStandard" (1000 . "") (1000 . "description")))
|
End of exploration...

Si avec tout chat, tu ne parviens pas à tes fins, alors il faudra reprendre l'exercice étape par étape sur un sujet plus simple pour commencer..

Bisous,
Luna

Modifié par Luna
Lien vers le commentaire
Partager sur d’autres sites

Bonjour (gile) et merci pour ton aide.

J'ai cherché "Reference de l'aide aux développeurs" sur le site AutoDesk, mais je n'ai rien trouvé.

Je sais qu'un jour, tu avais posté le lien sur CadXP, mais je n'ai pas retrouvé ce message.

L'aurais-tu encore ?

Oui, je fais beaucoup de testes, surtout dans la console, ce qui me permet d'éviter pas mal de questions, et je fini par trouver les réponses seul.

Encore merci au forum.

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)

Lien vers le commentaire
Partager sur d’autres sites

1 minute ago, Luna said:

Ensuite, pourquoi faire une boucle (while) pour lire le fichier et construire une liste pour chaque ligne, pour ensuite faire une boucle (foreach) de lecture de cette liste pour créer un calque avec chacune des lignes ?

Ça c'est ce que je recommande, surtout en phase de tests. On ouvre le fichier, on récupère les données et on referme le fichier. Si on traite les données dans la même boucle et qu'une erreur de se produit, la routine plante et le fichier reste ouvert.

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

Lien vers le commentaire
Partager sur d’autres sites

1 minute ago, DenisHen said:

J'ai cherché "Reference de l'aide aux développeurs" sur le site AutoDesk, mais je n'ai rien trouvé.

Le lien pour l'aide de la version 2019 (tu peux changer la version dans l'url) à mettre dans tes favoris :
https://help.autodesk.com/view/OARX/2019/ENU/

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

Lien vers le commentaire
Partager sur d’autres sites

@(gile) oki doki !

Perso le problème des fichiers ouverts je déclare localement la fonction (*error*) pour la redéfinir afin de fermer le fichier en cas de pépin comme chat plus de soucis de fichier encore ouvert :3
Mais il faut surtout pas oublier de déclarer la variable localement car c'est une fonction existante me semble-t-il donc la redéfinir de manière globale serait une catastrophe (enfin c'est ce que j'ai compris) ^^

@DenisHen, ou directement accessible depuis AutoCAD via la touche F1 ! Par contre j'ai remarqué que l'aide n'a pas beaucoup envie de montrer en premier résultats d'une recherche l'aide au développeurs....le nombre de fois où j'ai été obligée de filtrer la recherche sur "Developper" en cherchant (initget) car il ne voulait pas me l'afficher...

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci à vous deux pour votre aide, ça m'aide beaucoup.

@Luna Il me semble que (setvar 'CLAYER "0") ne fonctionne pas si le calque est gelé. Mais je vais controler mes dires. Je vais utiliser le lien de (gile) pour toutes tes remarques judicieuses. 😉

@(gile) : mille mercis pour ton lien, je l'avais perdu. ☹️ 

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)

Lien vers le commentaire
Partager sur d’autres sites

1 hour ago, Luna said:

Perso le problème des fichiers ouverts je déclare localement la fonction (*error*) pour la redéfinir afin de fermer le fichier en cas de pépin

Bien sûr, mais ici on n'en est pas là, et puis je pense que c'est une bonne habitude en programmation de scinder le problème général en plusieurs problèmes plus simples, testables séparément (tests unitaires) et, éventuellement, réutilisables.

Par exemple, ici on cherche à : "créer des calques avec des données d'un fichier externe", ce qu'on pourrait scinder en :
1. lire un fichier texte ligne par ligne
2. convertir le texte d'une ligne en données LISP
3. créer un calque à partir de ces données

Dans l'absolu, on crée une fonction séparée et autonome pour chacun de ces 3 points (pour le 2. c'est str2lst) on peut tester chaque fonction indépendamment les unes des autres et si une autre fois il s'il s'agit d'insérer des blocs, on n'a qu'à écrire une fonction pour remplacer la troisième fonction, si on récupère les données depuis une autre source (fichier Excel, table de données, ...) on n'a qu'à ré-écrire la première.

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

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

@DenisHen je peux te proposer quelque chose comme ceci en LISP (en me basant sur ton programme publié) :
 

(defun c:ECPS_CreaCalqCourant (/ *error* maplist lt_check get-linetypes file line layer n i lst lt_lst)

	(defun *error* (msg /)

		(if file (close file))
		(princ msg)

	)

	(defun maplist (lst1 lst2 c /)

		(if (and lst1 lst2)
			(cons (cons (car lst1) (if (member (car lst1) c) (atoi (car lst2)) (car lst2))) (maplist (cdr lst1) (cdr lst2) c))
		)

	)

	(defun lt_check (lst lt_lst /)

		(if (not (member (cdr (assoc 6 lst)) lt_lst))
			(subst '(6 . "Continuous") (assoc 6 lst) lst)
			lst
		)

	)

	(defun get-linetypes (/ item lst)

		(vlax-for item (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'linetypes)
			(setq lst (cons (vla-get-name item) lst))
		)
		(reverse lst)

	)

	(if (and
		(setq file (getfiled "Sélectionner un fichier 'Config-calque'" "" "csv" 0))
		(setq file (open file "R"))
		(setq n 0 i 0 line (read-line file))
		(setq lt_lst (get-linetypes))
	    )
		(progn
			(while (setq line (read-line file))
				(setq i (1+ i)
				      layer (str2lst line ";")
				      lst (maplist '(2 62 6 370 290 -3) layer '(62 370 290))
				      lst (lt_check lst lt_lst)
				)
				(if (and
					(not (tblsearch "LAYER" (car layer)))
					(entmakex
						(append
							'((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (70 . 0))
							(if (or (not (assoc -3 lst)) (= "" (cdr (assoc -3 lst))))
								(vl-remove (assoc -3 lst) lst)
								(subst
									(cons
										-3
										(list
											(cons
												"AcAecLayerStandard"
												(list
													'(1000 . "")
													(cons 1000 (cdr (assoc -3 lst)))
												)
											)
										)
									)
									(assoc -3 lst)
									lst
								)
							)
						)
					)
				    )
					(setq n (1+ n))
					(progn
						(foreach dxf lst
							(entmod
								(subst
									(if (= (car dxf) -3)
										(cons	-3
											(subst
												(cons
													"AcAecLayerStandard"
													(list
														'(1000 . "")
														(cons 1000 (cdr (assoc -3 lst)))
													)
												)
												(assoc "AcAecLayerStandard" (entget (tblobjname "LAYER" (car layer)) '("*")))
												(cdr (assoc -3 (entget (tblobjname "LAYER" (car layer)) '("*"))))
											)
										)
										dxf
									)
									(assoc -3 (entget (tblobjname "LAYER" (car layer)) '("*")))
									(entget (tblobjname "LAYER" (car layer)) '("*"))
								)
							)
						)
						(setq n (1+ n))
					)
				)
			)
			(prompt (strcat	"\nUn total de "
					(itoa n)
					" / "
					(itoa i)
					" calques ont été créé ou modifiés avec succès."
				)
			)
		)
		(prompt "\nAttention le fichier \"ECPS_Calques.csv\" est introuvable !")
	)
	(setq file (close file))
	(princ)

)

Je l'ai testé avec le fichier .csv ci-dessous :

Nom;Couleur;Type de ligne;Epaisseur de ligne;Tracer;Description;
ECPS-000_BAT BETON;1;CONTINUOUS;18;1;
ECPS-000_BAT ESCALIER-ASC;3;CONTINUOUS;18;1;
ECPS-000_BAT FONDATION;13;CONTINUOUS;18;1;
ECPS-000_BAT GAINES;52;CONTINUOUS;18;1;
ECPS-000_BAT MACONNERIE;233;CONTINUOUS;18;1;
ECPS-000_BAT POUTRE;40;CACHE;18;1;
ECPS-010_BAT ALLEGE-ACRO;31;CONTINUOUS;18;1;
ECPS-010_BAT ARRIERE PLAN;9;CONTINUOUS;18;1;
ECPS-011_BAT AXES;8;AXES;18;1;
ECPS-012_BAT AXES REPERES;8;CONTINUOUS;18;1;
ECPS-012_BAT AXES REPERES COTE;8;CONTINUOUS;18;1;
ECPS-013_BAT HACHURE PLAN;9;CONTINUOUS;18;1;
ECPS-013_BAT HACHURE PORTEUR;41;CONTINUOUS;18;1;
ECPS-013_BAT POCHAGE PLAN;7;CONTINUOUS;18;1;
ECPS-014_BAT ASSISE COUPE;7;CONTINUOUS;18;1;
ECPS-014_BAT TRAIT COUPE;7;CONTINUOUS;18;1;
ECPS-015_BAT FACADE PLAN 1;60;CONTINUOUS;18;1;
ECPS-015_BAT FACADE PLAN 2;63;CONTINUOUS;18;1;
ECPS-015_BAT FACADE PLAN 3;251;CONTINUOUS;18;1;
ECPS-015_BAT POCHAGE;57;CONTINUOUS;9;1;

Soit 2 modifications par rapport à ton exemple de fichier .csv : l'option Tracer est une valeur numérique Booléenne (0 pour non imprimable et 1 pour imprimable) pour éviter les conversions par la suite et la suppression d'un séparateur inutile situé après la description (cela évite de trimbaler un "" dans chaque liste n'ayant aucune utilité)

Je l'ai testé pour créer des calques, fonctionnel mais je ne l'ai pas essayé sur des calques existants donc à peaufiner au besoin. J'ai dû créer une vérification d'existence du type de ligne dans le fichier car si l'on spécifie un type de ligne invalide, le programme s'arrête sur une erreur donc c'est plus sûr de vérifier cette donnée et de la définir sur "Continuous" par défaut en cas d'erreur.

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonjour Luna et merci pour ton code et ton aide.

Cha fonctionne très bien, mais dans mon nouveau poste, je m'aperçois que tout se complique à mesure que le temps passe.

J'ai donc opté pour un VBA qui est, finalement, plus facile pour moi. Comme je l'ai déjà dis, je pense être à mon maximum de mes compétences en Lisp. 

Attention, j'aime beaucoup le Lisp, et je sais très bien que je ne l'utilise pas comme il le mérite, mais je m'en sers souvent à ma hauteur.

J'utilise donc, maintenant un mélange Lisp/VBA... Je communique entre VBA et Lisp avec les vlax-ldata, ce n'est pas si simple, mais c'est à ma portée...

En tout cha, merci pour ton aide...

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)

Lien vers le commentaire
Partager sur d’autres sites

4 hours ago, DenisHen said:

Je communique entre VBA et Lisp avec les vlax-ldata, ce n'est pas si simple, mais c'est à ma portée...

Tu arrives à accéder aux ldata depuis VBA ?!
Ça m'intéresse, j'étais persuadé que les ldata (LISP data) n'étaient accessibles qu'en LISP.

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

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile), pour une fois que je peux t'aider, je ne vais pas te faire défaut. 😉

Pour écrire :

    ThisDrawing.SendCommand "(vlax-ldata-put " & """ECPS""" & " " & """CalqCourant""" & """" & CalqCourant & """" & ")" & vbCr
    'pour vérifier dans AutoCAD : (vlax-ldata-get "ECPS" "CalqCourant")

Pour lire :

    ThisDrawing.SetVariable "users1", ""
    ThisDrawing.SendCommand "(setvar " & """users1""" & " (vlax-ldata-get " & """ECPS""" & " " & """TypCat""" & "))" & vbCr
    TypCat = ThisDrawing.GetVariable("users1")

Voilà, je pense que tu comprendras sans plus de commentaires, mais je passe par du Lisp dans VBA. Je ne répond donc pas réellement à ta question.  😉

Et je t'avoue que j'en ai bavé pour trouvé ce truc...

Bon week-end à la communauté.

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)

Lien vers le commentaire
Partager sur d’autres sites

OK, je comprends mieux. En fait tu ne communiques pas entre LISP et VBA via les ldata, mais plutôt via SendCommand pour entrer des expressions LISP. Cette méthode a un inconvénient majeur : on ne peut utiliser que des chaînes de caractères avec SendCommand.

Il serait plus simple d'utiliser directement les variables système USERS1-5, USERI1-5 et USERR1-5 qui sont accessibles directement en lecture et écriture par les deux environnements et qui permettent de passer aussi des données de type nombre entier ou réel.

Sinon, pour des données conservées dans le dessin entre deux sessions, plutôt que d'utiliser les ldata, préférer des dictionnaires et xrecords standards qui sont directement accessibles en lecture et écriture depuis LISP comme depuis VBA et peuvent contenir tout type de donnée AutoCAD (chaînes, nombres, entités, etc.).

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

Lien vers le commentaire
Partager sur d’autres sites

6 minutes ago, (gile) said:

Sinon, pour des données conservées dans le dessin entre deux sessions, plutôt que d'utiliser les ldata, préférer des dictionnaires et xrecords standards qui sont directement accessibles en lecture et écriture depuis LISP comme depuis VBA et peuvent contenir tout type de donnée AutoCAD (chaînes, nombres, entités, etc.).

Merci (gile) pour cette information, mais je ne sais pas comment utiliser les dictionnaires ou XRecords, ni dans le Lisp ni dans le VBA, et je craint que ce soit trop complexe pour moi.

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)

Lien vers le commentaire
Partager sur d’autres sites

17 hours ago, DenisHen said:

je ne sais pas comment utiliser les dictionnaires ou XRecords, ni dans le Lisp ni dans le VBA, et je craint que ce soit trop complexe pour moi

Et quand je lis par ailleurs que tu veux te mettre au .NET, je suis absolument convaincu qu'il s'agit d'une fuite en avant qui va immanquablement te mener à l'échec.
Il est plus "complexe" de comprendre commet insérer un bloc avec attributs en .NET que de comprendre l'utilisation des dictionnaires en LISP ou VBA (je parle bien de comprendre et pas de copier/coller des extraits de code, ce qui, en .NET mène directement à la catastrophe).

Si j'ai un conseil à te donner, c'est de continuer à apprendre à programmer AutoCAD avec des langages de très haut niveau avec un IDE intégré à AutoCAD pour pouvoir tester plus facilement ton code (c'est comme ça qu'on apprend) et de ne te poser la question d'aborder un environnement de programmation plus puissant mais beaucoup plus complexe que quand tu auras le sentiment d'avoir épuiser les possibilités du LISP et du VBA.

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

Lien vers le commentaire
Partager sur d’autres sites

C'est un peu ce que je pensais, je voulais aborder le problème d'un autre angle, mais effectivement, un IDE intégré à AutoCAD reste mon premier choix.

Merci pour tous tes conseils (que tu m'avais déjà donné il me semble), je les suivrais avec plaisir.

Je vais tout de même voir comment "jouer" avec les dictionnaires et les Xrecords.

Bonne journée à la communauté.

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)

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é