Jump to content

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


Recommended Posts

Bonjour à tous, et bienvenue sur ce nouveau graphisme dû la la refonte de notre extrêmement aimé site CadXP... Perso, j'adore, même si je le trouve un peu trop "grand", car beaucoup d'info sur une page, mais j'adore...
Donc, je ne suis pas venu ici pour tergiverser sur cette superbe "refonte"... (le 2.0, je ne peux que subventionner...).
J'ai un souci, et j'ai beau faire des aller/retour sur la console, je ne m'en sors pas...
Je suis en train de faire un Lisp que je croyais plutôt simple...

Je cherche un fichier ("ECPS_Calques.LstCalq\") que je trouve...
Grace à un "FindFile", je l'ouvre, Jusque là, pas de problème...
Mais je ne sais pas pourquoi ça déconne...

Voici mon bout de code pour trouver et ouvrir le fichier (ce fichier est trouvé et ouvert sans aucun problème) :

 

  (if (findfile "ECPS_Calques.LstCalq")
    (load "ECPS_Calques.LstCalq")
    (progn (princ "\nAttention, le fichier \"ECPS_Calques.LstCalq\" est introuvable ! ! !") (exit)) ;_ Fin de progn
  ) ;_ Fin de if
  (setq FichLstCalq
         (open (findfile "ECPS_Calques.LstCalq")
        "r")
  ) ;_ Fin de setq
 

Ensuite, voici la structure du fichier lu : qui a pour extension "LstCalq" :

Murs#7#Continu#035#O#Murs perimetriques et de refends
Cloisons#121,129,211#Continu#025#O#Cloisonnements
Aire Evac#5#Continu#018#O#Aire d'evacuation
Construction#8#Continu#025#Polygone de construction (non imprimable)
Mobilier"124,199,237#Continu#050#Mobilier intérieur et urbain
Outils d'intervention#1#Continu#025#Exctincteurs, RIA...

C'est tout simple... Nom du calque # Couleur # Type de ligne # Épaisseur et enfin # Commentaire...

Mais voici la suite de mon code (j'utilise depuis des années les sous-routines de Maître (gile), je parle de Str2Lst...

Voici mon code de lecture :

Quote

(while (setq LstCalqLine (read-line FichLstCalq))
    (setq ListLine (str2lst LstCalqLine "#"))
    (if (/= nil (vl-string-search "," (cadr ListLine)))
      (command "-calque"
               "e"
               (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq") "_" (car PosLst))
               "co"
               "u"
               (cdr (assoc (car PosLst) LstCalq))
               (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq") "_" (car PosLst))
               ""
      ) ;_ Fin de progn
      (command "-calque"
               "e"
               (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq") "_" (car PosLst))
               "co"
               (cdr (assoc (car PosLst) LstCalq))
               (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq")e "_" (car PosLst))
               ""
      ) ;_ Fin de command
    ) ;_ Fin de if
  )


Mais là où ça se complique, c'est que dans ce fichier de type TXT (ASCII), il y a des couleurs de 0 à 255 (aucun problème avec ça) mais il y en a aussi avec les trois couleurs primaires, et sont séparées par une virgule (fichiers joints), sauf si cette couleur fait partie des 255 premières couleurs d'AutoCAD... Selon les clients, il y a des couleurs dites "vrai", donc en trois variables, un mélange des trois couleurs primaires... 

J'ai essayé de faire un truc qui, en un premier temps, regarde si le texte de la couleur contient une virgule (car mon séparateur du TXT est un dièse) et si oui, j'agis différemment que si c'est une couleur "unique (de 0 à 255)... Mais je ne m'en sors pas...
Je cherche depuis deux jours avec la console et tout, mais je n'arrive pas à voire d'où vient mon erreur...

Si une bonne âme pouvait me porter secours, me conseiller, aurait une astuce... (didier, t'as vu, j'ai changer mon laïus...) 

Merci à toutes personne pouvant me venir en aide...

Si Maître Gilles montre sont nez expert et Ô combien bienveillant (ou un autre expert), je le remercierais de bien me décrire sa démonstration, car pour toi, Ô Gilles c'est évident, pour nous, simples mortels, ce n'est pas si facile, et tous ne tiens qu'à un fil...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Coucou,

Alors premièrement si on regarde la liste DXF d'un calque ayant une couleur ACI (de 0 à 255)

Quote

Commande: (explore-dxf (tblobjname "LAYER" "1") 0 nil nil)
Explore DXF in progress from "LAYER" (<Nom d'entité: 3e18a360>) :
|      (-1 . <Nom d'entité: 3e18a360>)
|      (0 . "LAYER")
|      (330 . <Nom d'entité: 3e18e020>)
|      (5 . "2E6")
|      (100 . "AcDbSymbolTableRecord")
|      (100 . "AcDbLayerTableRecord")
|      (2 . "1")
|      (70 . 0)
|      (62 . 1)
|      (6 . "Continuous")
|      (290 . 1)
|      (370 . -3)
|      (390 . <Nom d'entité: 3e18e0f0>)
|      (347 . <Nom d'entité: 3e18e600>)
|      (348 . <Nom d'entité: 0>)
|
End of exploration...

On sait que le code DXF associé est le code DXF 62 (ici 1 = "rouge"). Cependant, une couleur RGB fait appel à un code supplémentaire, le code 420 :

Quote

Commande: (explore-dxf (tblobjname "LAYER" "2") 0 nil nil)
Explore DXF in progress from "LAYER" (<Nom d'entité: 3e18a380>) :
|      (-1 . <Nom d'entité: 3e18a380>)
|      (0 . "LAYER")
|      (330 . <Nom d'entité: 3e18e020>)
|      (5 . "2E8")
|      (100 . "AcDbSymbolTableRecord")
|      (100 . "AcDbLayerTableRecord")
|      (2 . "2")
|      (70 . 0)
|      (62 . 203)
|      (420 . 12009663)
|      (6 . "Continuous")
|      (290 . 1)
|      (370 . -3)
|      (390 . <Nom d'entité: 3e18e0f0>)
|      (347 . <Nom d'entité: 3e18e600>)
|      (348 . <Nom d'entité: 0>)
|
End of exploration...

Et si on pousse encore plus loin, les catalogues font appel au code 430 en plus (format 'STR)...Bref, plus la couleur devient complexe, et plus sa liste DXF se complexifie !

Après je pense à cela sous forme de liste DXF, mais étant donné que tu utilises les (command) et non (entmake), cela ne correspond qu'à une simple solution de contournement, à voir

A quel moment ton programme ne fonctionne pas exactement ?

La (command) fonctionne bien chez moi donc après le soucis peut provenir d'ailleurs...tu es sûr que  chaque ligne de ton fichier correspond à une définition d'un seul et unique calque ? Car tu fais la vérification sur le (cadr ListLine) pour la "," mais possiblement que ton (cadr) ne pointe pas la couleur obligatoirement et auquel cas, le format n'est pas le bon donc échec de la (command)...

De plus j'ai remarqué sur ton exemple de fichier que l'un de tes nom de calque possède un ", donc cela peut complètement break la chaîne de caractère et générer une erreur...^^"

 

Bisous,

Luna

Link to post
Share on other sites

sinon remplace les dièses par des ; avant tout

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

le (str2lst) fonctionne très bien avec les "#" (excepté justement pour le " perdu au milieu de la chaîne qui génère une erreur, mais si on n'en tient pas compte, tout baigne !) :3

Link to post
Share on other sites

Salut,

Je ne sais pas d'où vient ce fichier .LstCalq, mais la première chose quand on fait un fichier de données de ce type est de le structurer de façon à ce qu"il soit facilement "lisible".

Le format le plus simple (.csv) utilise un séparateur pour le données (la virgule -le comma dans Comma Separated Values- remplacée par le point-virgule dans les langues (comme le français) qui utilisent la virgule comme séparateur décimal) et un séparateur pour les lignes (\n ou \r\n). Dans ton fichier il semble qu'il n'y en ait qu'un (#) ce qui déjà ne facilite pas la lecture.

Ensuite, pour la couleur, tu peux utiliser str2lst avec la virgule comme séparateur sur le champ 'couleur' et si la liste contient 3 éléments, c'est du RGB, si elle ne contient qu'un élément, c'est une couleur de l'index, dans tous les autres cas, c'est une erreur...


PS : quand on fait (open ...), bien penser à faire un (close ...) pour refermer le flux.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

Essaye comme ça :
 

(setq ListLine nil)
;; on crée une liste de sous-listes en lisant le fichier
(while (setq LstCalqLine (read-line FichLstCalq))
  (setq ListLine (cons (str2lst LstCalqLine "#") ListLine))
)
;; on ferme le fichier
(close FichLstCalq)
;; pour chaque sous-liste (ligne)
(foreach line Listline
  (setq	nomCalque (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq")
			  "_"
			  (car line)
		  )
  )
  (command "_layer" "_make" nomCalque "_color")
  ;; si on est en couleur RGB, on ajoute l'option _true
  (if (vl-string-search "," (cadr line))
    (command "_true")
  )
  (command
	   (cadr line)
	   nomCalque
	   "_ltype"
	   (caddr line)
	   nomCalque
	   "_lweight"
	   (/ (atoi (cadddr line)) 100.)
	   nomCalque
	   "_description"
	   (last line)
	   nomCalque
	   ""
  )
)

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

Je ne suis pas sûr du tout que le code ci-dessus corresponde à ce que tu cherches à faire parce que l'extrait de code que tu as posté n'est pas compréhensible.

Tu crée une liste de chaîne en lisant le fichier : LstCalqLine du type : ("Murs" "7" "Continu" "035" "O" "Murs perimetriques et de refends").

Puis tu n'utilises plus jamais LstCalqLine mais d'autres variables dont on ne sait rien : PosLst et LstCalq.

Par ailleurs, chaque ligne n'a pas le même nombre de champ, certaines ont un "O" entre l'épaisseur de ligne et la description d'autre n'ont rien.

Globalement, il manque à tout ça un ingrédient indispensable à toute tentative de programmation : la rigueur.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

Bonjour à tous et merci pour votre aide.

Effectivement, le séparateur ";" est bien plus simple et efficace, comme le dit si bien (gile), je peux faire un .csv et donner la possibilité à l'utilisateur de l'éditer dans un tableur ou avec le bloc-note...

J'ai donc changer mon code pour prendre celui de (gile), que je suis en train d'analyser.

Je m'explique sur le .csv :

NomDuCalque,Couleur(s),TypeDeLigne,Épaisseur,Impression,Commentaire

Murs;7;Continu;35;O;Murs perimetriques et de refends
Murs_Hach;253;Continu;35;O;Murs perimetriques et de refends (Hachures)
Cloisons;8;Continu;25;O;Cloisonnements
Cloisons_Hach;254;Continu;25;O;Cloisonnements (Hachures)
Aire Evac;5;Continu;18;O;Aire d'evacuation
Construction;4;Continu;25;N;Polygone de construction (non imprimable)
Mobilier;124,199,237;Continu;50;O;Mobilier intérieur et urbain
Outils d'intervention;1;Continu;25;O;Exctincteurs, RIA...

Mon principal problème est la différence entre la couleur à nombre unique (0-255) et la couleur "composée" (RGB). Mais (gile) l'a très bien compris.
Bon, mon code ne fonctionne toujours pas, mais je travaille dessus, le voici :

;;; *****************************************
;;;  Création des calques du niveau courant  
;;; *****************************************
(defun c:ECPS_CreaCalqCourant ()
  (if (findfile "ECPS_Calques.csv")
    (load "ECPS_Calques.csv")
    (progn (princ "\nAttention, le fichier \"ECPS_Calques.csv\" est introuvable ! ! !") (exit)) ;_ Fin de progn
  ) ;_ Fin de if
  (setq FichLstCalq (open (findfile "ECPS_Calques.csv") "r")) ;_ Fin de setq
  (while (setq LstCalqLine (read-line FichLstCalq))
    (setq ListLine (cons (str2lst LstCalqLine ",") ListLine))
  ) ;_ Fin de while
  (close FichLstCalq)
  ;; pour chaque sous-liste (ligne)
  (foreach line Listline
    (setq nomCalque (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq") "_" (car line)))
    (command "_layer" "_make" nomCalque "_color")
    ;; si on est en couleur RGB, on ajoute l'option _true
    (if (vl-string-search "," (cadr line))
      (command "_true")
    ) ;_ Fin de if
    (command (cadr line)
             nomCalque
             "_ltype"
             (caddr line)
             nomCalque
             "_lweight"
             (/ (atoi (cadddr line)) 100.)
             nomCalque
             "_description"
             (last line)
             nomCalque
             ""
    ) ;_ Fin de command
  ) ;_ Fin de foreach  
) ;_ Fin de defun

Encore merci à vous, et bonne journée à la communauté.

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Bonjour à tous et merci pour votre aide.

Effectivement, le séparateur ";" est bien plus simple et efficace, comme le dit si bien (gile), je peux faire un .csv et donner la possibilité à l'utilisateur de l'éditer dans un tableur ou avec le bloc-note...

J'ai donc changer mon code pour prendre celui de (gile), que je suis en train d'analyser.

Je m'explique sur le .csv :

NomDuCalque,Couleur(s),TypeDeLigne,Épaisseur,Impression,Commentaire

Murs;7;Continu;35;O;Murs perimetriques et de refends
Murs_Hach;253;Continu;35;O;Murs perimetriques et de refends (Hachures)
Cloisons;8;Continu;25;O;Cloisonnements
Cloisons_Hach;254;Continu;25;O;Cloisonnements (Hachures)
Aire Evac;5;Continu;18;O;Aire d'evacuation
Construction;4;Continu;25;N;Polygone de construction (non imprimable)
Mobilier;124,199,237;Continu;50;O;Mobilier intérieur et urbain
Outils d'intervention;1;Continu;25;O;Exctincteurs, RIA...

Mon principal problème est la différence entre la couleur à nombre unique (0-255) et la couleur "composée" (RVB). Mais (gile) l'a très bien compris.
Bon, mon code ne fonctionne toujours pas, mais je travaille dessus, le voici :

;;; *****************************************
;;;  Création des calques du niveau courant  
;;; *****************************************
(defun c:ECPS_CreaCalqCourant ()
  (if (findfile "ECPS_Calques.csv")
    (load "ECPS_Calques.csv")
    (progn (princ "\nAttention, le fichier \"ECPS_Calques.csv\" est introuvable ! ! !") (exit)) ;_ Fin de progn
  ) ;_ Fin de if
  (setq FichLstCalq (open (findfile "ECPS_Calques.csv") "r")) ;_ Fin de setq
  (while (setq LstCalqLine (read-line FichLstCalq))
    (setq ListLine (cons (str2lst LstCalqLine ",") ListLine))
  ) ;_ Fin de while
  (close FichLstCalq)
  ;; pour chaque sous-liste (ligne)
  (foreach line Listline
    (setq nomCalque (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq") "_" (car line)))
    (command "_layer" "_make" nomCalque "_color")
    ;; si on est en couleur RGB, on ajoute l'option _true
    (if (vl-string-search "," (cadr line))
      (command "_true")
    ) ;_ Fin de if
    (command (cadr line)
             nomCalque
             "_ltype"
             (caddr line)
             nomCalque
             "_lweight"
             (/ (atoi (cadddr line)) 100.)
             nomCalque
             "_description"
             (last line)
             nomCalque
             ""
    ) ;_ Fin de command
  ) ;_ Fin de foreach  
) ;_ Fin de defun

Encore merci à vous, et bonne journée à la communauté.

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Bonjour DenisHen

Je ne sais pas de quoi parle ton sujet, car je n'ai pas suivi ne venant que de temps en temps.

Par contre, je remarque que tu utilises un type de ligne CONTINU,
c'est plutôt déconseillé de l'utiliser il faut préférer CONTINUOUS
qui est la véritable appellation AutoCAD

Amicalement

Link to post
Share on other sites

Salut didier.

Effectivement, c'est un oubli de ma part, et merci de me le rappeler 😉

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Je sais que j'ai improvisé ce code avec un peu trop d'entrain...

C'est bon, j'ai réussi, voici le code final :

;;; *****************************************
;;;  Création des calques du niveau courant  
;;; *****************************************
(defun c:ECPS_CreaCalqCourant ()
  (if (findfile "ECPS_Calques.csv")
    (load "ECPS_Calques.csv")
    (progn (princ "\nAttention, le fichier \"ECPS_Calques.csv\" est introuvable ! ! !") (exit)) ;_ Fin de progn
  ) ;_ Fin de if
  (setq FichLstCalq (open (findfile "ECPS_Calques.csv") "r")) ;_ Fin de setq
  (while (setq LstCalqLine (read-line FichLstCalq))
    (setq ListLine (cons (str2lst LstCalqLine ";") ListLine))
  ) ;_ Fin de while
  (close FichLstCalq)
  ;; pour chaque sous-liste (ligne)
  (foreach line Listline
    (setq nomCalque (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq") "_" (car line)))
    (command "_layer" "_make" nomCalque "_color")
    ;; si on est en couleur RGB, on ajoute l'option _true
    (if (vl-string-search "," (nth 0 line))
      (command "_true")
    ) ;_ Fin de if
    (command (nth 1 line)
             nomCalque
             "_ltype"
             (nth 2 line)
             nomCalque
             "_lweight"
             (/ (atoi (nth 3 line)) 100.)
             nomCalque
             "t"
             (nth 4 line)
             nomCalque
             "_description"
             (nth 5 line)
             nomCalque
             ""
    ) ;_ Fin de command
  ) ;_ Fin de foreach  
) ;_ Fin de defun

Milles mercis à toi (gile)...

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Bonjour,

Je vais me permettre de te donner quelques conseils.

Tu n'as pas déclaré de variables après ton defun tu devrais avoir (/  FichLstCalq LstCalqLine nomCalque ...)

Sinon elle deviennent globales. (on te l'a déjà dit plusieurs fois)

Tu fait 2 fois (findfile "ECPS_Calques.csv") une fois suffit, tu place le chemin dans une variable

plutôt que de faire un (exit) tu devrais parcourir le disque

et dans une boucle foreach, j' évite la fonction command, je pense qu'il faudrait mieux utiliser entmake ou vla-add

de toute façon essayer de se passer de command, ce n'est pas qu'un simple sport de programmeur,

car cette fonction simule l'entrée utilisateur d'Autocad, c'est donc très lourd. mais vraiment lourd au point de contribuer au réchauffement !!!!

de plus, si ton csv contient 50 lignes, je doute que ton lisp arrive jusqu'au bout.

amicalement

 

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

Salut Fraid, et merci pour tes bons conseils.

Effectivement, je n'avais pas déclaré les variables dans mon code, c'est chose faite maintenant.

Oui, j'avais 2 (findfile, c'est aussi réparé grâce à un (setq au premier (findfile.

Par contre, (entmake reste un peu complexe pour moi, mais je vais tenter de l'utiliser, dès maintenant, car je n'arrive pas à faire la différence entre les couleurs "simples" (de 0 à 255) et les couleurs RGB. De plus, je ne trouve pas la totalité des codes DXF pour la définition de calques, mais je cherche.

Tu me dis que si mon fichier contient plus de 50 lignes, mon code n'ira pas jusqu'au bout, là, je n'ai pas compris. Peux-tu me dire pourquoi s'il te plaît ?

Bon dimanche à la communauté.

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Bonjour Luna,

Je n'ai pas trouvé la commande "explore-dxf".

Bon dimanche.

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Bon, ça fait plus d'une heure que je cherche la liste "complète" des codes DXF pour créer un calque avec (entmake, mais je n'ai, par exemple, pas trouvé le code pour le commentaire. Ni quels sont les codes minimum à "déclarer"...

Quelqu'un aurait une solution ?

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

J'ai fini par sauvegarder mon DWG en DXF et j'ai fouillé ce fichier, le code DXF du commentaire est le 1000.

En outre, j'ai lu dans l'aide que le code 420 (couleur RGB) est une "Valeur de couleur sur 24 bits, exprimée à l'aide de trois octets dont la valeur est comprise entre 0 et 255."
Comment obtenir cette valeur sur 24 bits depuis une variable sur trois couleurs : "128,234,95" ?

ReBon dimanche à toutes et à tous.

Denis...

PS : en fait, le code 1000 génère une erreur DXF.

Quote

Commande: (entmake '((0 . "LAYER") (8 . "Test") (1000 . "Commentaire")))
; erreur: groupe DXF incorrect: (1000 . "Commentaire")

Je ne comprend pas, même ça ne fonctionne pas

Quote

Commande: (entmake '((0 . "LAYER") (8 . "Test")))
nil

 

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Salut,

Tu as mis la barre un peu haut pour débuter avec entmake.

Pour avoir la liste DXF d'un calque :

(entget (tblobjname "layer" nomDuCalque))

Les codes DXF 1000 et plus sont réservés aux données étendues (xdata). pour avoir la liste DXF d'un calque avec toutes ses données étendues :

(entget (tblobjname "layer" nomDuCalque) '("*"))

Pour convertir les valeurs RGB (RVB en français) en un entier, il faut décaler la valeur R (rouge) de 16 bits vers la gauche et la valeur G (vert) de 8 bits vers la gauche :

(defun rgb2int (r g b)
  (logior (lsh r 16) (lsh g 8) b)
)

Pour la fonction inverse, on décale l'entier de 16 bits vers la droite pour récupérer le R et pour le G et le B on décale d'abord vers la gauche de 16 ou 24 bits pour supprimer les bits du R (et du V pour le bleu) puis on revient de 24 bits vers la droite.

(defun int2rgb (i)
  (list	(lsh i -16)
	(lsh (lsh i 16) -24)
	(lsh (lsh i 24) -24)
  )
)

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

allez, pour une fois je vais prendre du temps pour t'aider, 

d'habitude je suis bien trop court dans mes post...

C'est une étape importante de "maîtriser" ENTMAKE, même si on le lâche une fois qu'on connais le vla.

voici l'exemple mini pour créer un calque.

(defun addlay (nom)
  (if (null (tblsearch "LAYER" nom))
    (entmake
      (list
        (cons 0 "LAYER")
        (cons 100 "AcDbSymbolTableRecord")
        (cons 100 "AcDbLayerTableRecord")
        (cons 2 nom)
        (cons 70 1);état du calque
      )
    )
  )
  nom
)

Pour l'instant oublie ton rvb, inutile car tu peux trouver une couleurs avoisinante en ACI avec le carnet de couleur.

Le RVB est intéressant quant on fait des rendus, ou que l'on a plus de 225 calques avec une couleurs différentes.

Sinon, pour un plan ???? 

Certain préconise l'utilisation de ENTMAKEX pour les calques, je n'ai jamais compris pourquoi...

Sinon, je vais revenir à ton code.

Tu n'as pas du tester avec un csv de plus de 2 lignes, car la variable ListLine n'est pas remis à nil

donc cumule les lignes.

De plus tu n'ignore pas la 1er lignes qui contient la description.

Tu ne teste pas l’existence du calque avant de la créer.

et il me semble que tu peut tout faire dans la première boucle au fur et à mesure de la lecture.

avec tous ça, tu as déjà de bonne piste.

aller, courage, tu vas finir par la montée cette marche, cela fait des années que tu essaye...

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites
(logior (lsh r 16) (lsh g 8) b)

Bonjour Gile,

J'ai toujours du mal avec les fonctions "bitiennes"

Sur ta page d'intro au lisp et celle de Didier, ce n'est pas super clair et surtout pas dans l'aide.

J'arrive à m'en passé avec des pirouettes mathématiques, mais j'aimerais bien comprendre.

y a t'il une page consacrées que je n'aurais pas trouvée. 

Merci

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

Salut à toute la communauté.

Merci pour votre aide.

Je vais essayer d'être clair (comme me le dit souvent notre ami didier) :

@(gile) : merci pour ces petits codes qui me permettront de créer mes couleurs RGB, car je n'ai pas le choix, j'ai beaucoup de trames "à plat".
Dans ton 

(entget (tblobjname "layer" nomDuCalque))

Je n'ai pas le code du commentaire du calque, c'est dommage, car je comptais dessus pour créer mes légendes. mais je l'ai dans 

(entget (tblobjname "layer" nomDuCalque) '("*"))

Mais il est précédé d'un "(-3 ("AcAecLayerStandard" (1000 . "") (1000 . "Mobilier intérieur et urbain"))))" (comment l'intégrer dans une liste de paires pointés ?), Qui me fait penser au fichier DXF que j'ai créé, il comporte effectivement deux ligne avec le code 1000 (une vide et une contenant le commentaire). Je ne saisi pas bien, mais je vais essayer de faire quelque-chose avec ça.

@Fraid : je n'ai pas le choix, j'ai plein de calques avec des couleurs RGB, on a beaucoup de trames et d'"à plat".
               Le dernier code que j'ai posté est inspiré à 99% de celui de (gile) posté plus haut, je ne me suis pas permis de le remettre en question,
               je pense que tu devines pourquoi 😉 .
               Avec (command "_layer", on n'a pas besoin de savoir si le calque existe car, s'il n'existe pas, il sera créé, s'il existe, il sera redéfini.
               Oui, ça fait longtemps que je "lispe", mais j'ai toujours du mal avec sa logique, d'autres y arrivent très bien (comme BonusCAD par exemple), mais je rame beaucoup.
               Peut-être suis-je à mon maximum dans ce langage ? ? ?
               Merci pour tes encouragements pour cette (grande) marche à gravir, mais je persévère...

En tous cas, un grand merci à vous et bon dimanche au forum.

Denis...

Denis...

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites
9 hours ago, Fraid said:

J'ai toujours du mal avec les fonctions "bitiennes"

Sur ta page d'intro au lisp et celle de Didier, ce n'est pas super clair et surtout pas dans l'aide.

J'arrive à m'en passé avec des pirouettes mathématiques, mais j'aimerais bien comprendre.

y a t'il une page consacrées que je n'aurais pas trouvée. 

Wikipédia est ton ami : Opération de bit à bit.

Pour le couleurs, chaque valeur R, G ou B est codée sur un octet (8 bits) de 0 à 225 en décimal (ou de 00 à FF en hexadécimal), du bit0 au bit 7 pour le bleu du bit 8 au bit 15 pour le vert et du bit 16 au bit 23 pour le vert (les bits 24 à 31 étant réservés à la transparence)*.
Avec les valeurs hexadécimales, comme un octet est représenté par deux caractères, on comprendra peut-être plus facilement à quoi correspond cet entier qui représente les couleurs RGB (le code DXF 420) et aussi pourquoi les couleurs sont représentées avec ces valeurs hexadécimales (en HTML par exemple).

Si on considère une couleur dont le RGB est : (170, 187, 204), soit (AA, BB, CC) en hexadécimal (notée #AABBCC en HTML), le code DXF sera la valeur décimale de AABBCC ou 11189196 (soit AA0000 + BB00 + CC ou, plus rigoureusement : 00AA0000 | 0000BB00 | 000000CC (où | est le OR logique dans beaucoup de langages).
00AA0000 correspond au décalage de 16 bits à gauche de la valeur R (AA).
0000BB00 correspond au décalage de 8 bits à gauche de la valeur G (BB).
000000CC correspond à la valeur B (CC) qui n'est pas décalée.
Soit, en LISP :

(logior (lsh r 16) (lsh g 8) b)

Dans l'autre sens, on a un entier 11189196 ou 00AABBCC.
On trouve la valeur de R en décalant l'entier 00AABBCC de 16 bits à droite ce qui fait perdre les valeurs en deçà du bit 0 : 000000AA. En LISP :

(lsh i -16)

Pour les autres valeurs, on utilise le fait que, avec les entiers codés sur 32bits, si on décale à gauche, on perd les valeurs au delà du bit 31.
En décalant à gauche de 16 bits la valeur 00AABBCC, on obtient : BBCC0000 qui décalé à droite de 24 bits donne : 000000BB. En LISP :

(lsh (lsh i 16) -24)

En décalant à gauche de 24 bits la valeur 00AABBCC, on obtient : CC000000 qui décalé à droite de 24 bits donne : 000000CC. En LISP :

(lsh (lsh i 24) -24)

 

* Attention, Microsoft, dans l'environnement OLE (Excel par exemple), utilise une notation inversée : BGR

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

Wouaouw ! ! !

Mille mercis pour cette excellente explication, je comprend mieux d'un coup... 😉 

Windows 10 Pro 64bits / AutoCAD MAP 3D 2019

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)

Link to post
Share on other sites

Merci Gile pour ce lien

cela fait pourtant longtemps que je cherche, jamais tombé sur cette page...

super

ce n'est pas toujours évident de trouver les bonnes requêtes.

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...