Aller au contenu

Comment récupérer les Types de ligne dans un DXF.


DenisHen

Messages recommandés

Bonjour la communauté.
Voilà, je cherche à connaitre, depuis un VBA sous Excel, les types de ligne "déclarées" dans un DXF.
J'entends par "déclarées" tous les types de ligne du DXF, même si elles ne sont pas utilisées (dans un calque, pour une entité...).
Je cherche dans un DXF pour que mon fichier Excel soit utilisable avec les version LT d'AutoCAD.
J'ai déjà fais le code pour lire un fichier .lin, j'aimerais maintenant le faire avec un DXF, car un DWG serait rédhibitoire pour moi...😉
Bien à toi, 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

il y a 11 minutes, DenisHen a dit :

j'aimerais maintenant le faire avec un DXF, car un DWG serait rédhibitoire pour moi.

Si tu veux lire le DXF comme un fichier texte, il faut que tu l'ouvres avec le bloc-note ou NotePad++ et que tu l'analyses pour voir comment récupérer ce que tu cherches.
Sinon, je ne vois pas la différence entre ouvrir et lire un DXF ou un DWG.

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

Lien vers le commentaire
Partager sur d’autres sites

Merci (gile) pour ta réponse.
En fait, j'aimerais éviter que l'utilisateur fasse lui-même cette liste (à la main), et la récupérer moi-même, à sa place.
Je pensais donc ouvrir le DXF en mode ASCII directement en VBA et chercher les types de ligne définis dans le DXF grâce au code DXF et dans l'entête du fichier.
D'après mes faibles souvenirs, ce serait après un "*LinetypeTable*" et le code DXF 2 ou 20 (je te l'ai dis, "mes faibles souvenirs").
Mais je ne suis sûr de rien...

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

Bonjour à tous.
Voici le code que j'ai fini par écrire qui fais ce que je souhaitais

Public Sub ImpTypLignDXF(control As IRibbonControl)
    NomFeuille = ActiveSheet.name
    Lign = 2
    Do While Sheets(NomFeuille).Cells(Lign, 55).Value <> ""
        Sheets(NomFeuille).Cells(Lign, 55).Value = ""
        Lign = Lign + 1
    Loop
    
    Fichier = Application.GetOpenFilename("Fichiers DXF ,*.dxf")
    If Not Fichier = False Then
        Open Fichier For Input As #1
    Else
        Exit Sub
    End If
    Sheets(NomFeuille).Cells(2, 55).Value = ""
    Lign = 3
    Do While Not EOF(1)
        Line Input #1, chaine$
        If Trim(chaine$) = "AcDbLinetypeTableRecord" Then
            Do While Not EOF(1)
                Line Input #1, chaine$
                If Trim(chaine$) = "2" Then
                    Line Input #1, chaine$
                    Sheets(NomFeuille).Cells(Lign, 55).Value = Trim(chaine$)
                    Lign = Lign + 1
                    Exit Do
                End If
            Loop
        End If
    Loop
    Close
End Sub

Un grand merci à vous tous pour votre aide et votre patience...
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

  • 3 semaines après...

Bonjour à la communauté.
Dans le même sujet, je cherche à récupérer la définition (ex:A,12,-3,0,-3,0,-3,0,-3) d'un type de ligne dans un DXF et/ou dans un fichier .lin pour pouvoir le recréer en VBA depuis Excel dans un dessin AutoCAD.
J'ai cherché dans les définitions DXF du site AutoDesk, mais je n'ai rien trouvé de probant, je n'ai trouvé que du .NET ou du Lisp.
Auriez-vous une idée ?
Bien à toi, 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

Pour les types de ligne simples,

  • le groupe 72 donne le code ASCII de l'alignement a priori toujours 65 pour : A
  • les groupes 49 successifs donnent les longueurs de tiret de point (0) ou d'espace (négatifs)

Pour les types de ligne complexes, en plus des éléments ci-dessus,

  • le groupe 74 indique le type d'élément (forme ou  texte)
  • le groupe 340 est un pointeur vers le style de texte
  • le groupe 46 indique l'echelle
  • le groupe 50 indique la rotation
  • le groupe 44 indique le décalage en X
  • le groupe 45 indique le décalage en Y
  • le groupe 9 la chaîne de caractère (si 74 contient le code binaire 2)

De plus, les types de ligne complexes peuvent avoir des éléments imbriqués.

Pour décortiquer les listes DXF, le plus simple reste le LISP (désolé...).
en faisant :

(entget (tblobjname "LTYPE" "AXES"))

tu obtiens la liste DXF du type de ligne AXES sous forme de liste de paires pointées et tu peux la décortiquer en la comparant à la définition du type de ligne.

;; *AXES,Centre ____ _ ____ _ ____ _ ____ _ ____ _ ____
;; A, 31.75, -6.35, 6.35, -6.35

  (2 . "AXES")
  (70 . 0)
  (3 . "Centre ____ _ ____ _ ____ _ ____ _ ____ _ ____")
  (72 . 65)				; A
  (73 . 4)
  (40 . 50.8)
  (49 . 31.75)				; 31.75
  (74 . 0)
  (49 . -6.35)				; -6.35
  (74 . 0)
  (49 . 6.35)				; 6.35
  (74 . 0)
  (49 . -6.35)				; -6.35
  (74 . 0)

idem pour RAILS :

(entget (tblobjname "LTYPE" "RAILS"))

 

;; *RAILS,Rails -|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-
;; A,3.81,[TRACK1,ltypeshp.shx,s=6.35],3.81

  (2 . "RAILS")
  (70 . 0)
  (3 . "Rails -|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-")
  (72 . 65)				; A
  (73 . 2)
  (40 . 7.62)
  (49 . 3.81)				; 3.81
  (74 . 4)				; indique une forme
  (75 . 130)
  (340 . <Nom d 'entité: 1b50829a820>)	; pointeur vers le style de texte (ltypeshp.shx)
  (46 . 6.35)				; s=6.35
  (50 . 0.0)
  (44 . 0.0)
  (45 . 0.0)
  (49 . 3.81)				; 3.81
  (74 . 0)

ou EAU_CHAUDE :

(entget (tblobjname "LTYPE" "EAU_CHAUDE"))

 

;; *EAU_CHAUDE,Eau chaude ---- HW ---- HW ---- HW ----
;; A,12.7,-5.08,["HW",STANDARD,S=2.54,U=0.0,X=-2.54,Y=-1.27],-5.08

  (2 . "EAU_CHAUDE")
  (70 . 0)
  (3 . "Eau chaude ---- HW ---- HW ---- HW ----")
  (72 . 65)				; A
  (73 . 3)
  (40 . 22.86)
  (49 . 12.7)				; 12.7
  (74 . 0)
  (49 . -5.08)				; -5.08
  (74 . 10)				; indique une chaîne de caractères
  (75 . 0)
  (340 . <Nom d 'entité: 1b508297910>)	; pointeur ver le style de texte (STANDARD)
  (46 . 2.54)				; S=2.54
  (50 . 0.0)				; U=0.0
  (44 . -2.54)				; X=-2.54
  (45 . -1.27)				; Y=-1.27
  (9 . "HW")				; "HW"
  (49 . -5.08)				; -5.08
  (74 . 0)

 

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @(gile) et un grand merci pour ton aide (une fois de plus).
J'en ai pour des heures à analyser ton message, mais il va bien m'aider... J'en suis certain...
Mais je n'ai pas compris les paires 72, 73, 74 et 75, mais je m'en vais les chercher...
Mais ça va être coton de faire un code pour récupérer la définition d'une ligne en VBA... Mais je n'ai pas peur... 😉 
Je cherche à pouvoir recréer un type de ligne issu, soit d'un DXF, soit d'un dessin pour pouvoir le recréer dans un .scr ou un autre dessin.
Et comment faire avec le code DXF 340, quand le dessin est vierge ?
Comme toujours, tu es d'un soutient exceptionnel.
Encore merci à toi, je reviendrais si je ne trouve pas d'issu au développement de mon code VBA...
Bien à toi, 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

il y a 16 minutes, DenisHen a dit :

Et comment faire avec le code DXF 340, quand le dessin est vierge ?

Si le type de ligne complexe existe dans la table des types de ligne du dessin, alors le style de texte qu'il utilise est forcément aussi présent dans la table des styles de texte. Peut importe que le dessin soit vierge ou non, il s'agit là d'objets non graphiques.

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

Lien vers le commentaire
Partager sur d’autres sites

Je ne suis pas sur qu'un fichier .lin contient les style de texte qui peuvent être inclus dans ce type de ligne...
Je n'ai jamais rien vu la dessus...
Ou alors je n'ai pas compris ton message...
Mais il me semblait que, dans un nouveau dessin, si on charge un type de ligne qui contient un style de texte, il fallait que ce style de texte soit existant dans le dessin, avant la définition du style de ligne...
Je me trompe ?

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

il y a 50 minutes, DenisHen a dit :

Je ne suis pas sur qu'un fichier .lin contient les style de texte qui peuvent être inclus dans ce type de ligne...

Attention à ce que tu lis, je n'ai jamais parlé de fichier .lin.

Les types de ligne dit "complexes" sont ceux qui utilisent des chaînes de caractère ou des formes.
Les chaînes de caractères comme les formes utilisent des styles de texte.
Le groupe (ou les groupes) 340 pointe vers le style de texte utilisé.
Ce style de texte est celui du style utilisé par les éléments de type chaîne de caractères (STANDARD) il contient le nom du fichier des polices où sont définies les formes (ltypeshp.shx).

Encore une fois, c'est en LISP qu'il est le plus facile d'accéder à ces informations.

(entget (cdr (assoc 340 (entget (tblobjname "LTYPE" "EAU_CHAUDE")))))

 

(entget (cdr (assoc 340 (entget (tblobjname "LTYPE" "RAILS")))))

Tout ça est décrit en détail dans le manuel d'utilisation DXF > section TABLES > LTYPE et STYLE.

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

Lien vers le commentaire
Partager sur d’autres sites

Ah ah ah ! ! !
Encore une fois, c'est du Lisp... Mais je le savais. C'est ton truc (et parfois le mien).
C'était curieux qu'un style de texte était décrit dans un style de ligne sans autre forme... On est bien d'accord...
Mais j'ai déjà du mal avec les style de ligne, mais je sais que si un style de ligne fasse appel à un style de texte, ce style de texte doit être défini avant la création du style de ligne...
Mais là, on passe dans un autre monde...
Encore merci à toi... Ô grand @(gile).
 

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

il y a 30 minutes, DenisHen a dit :

c'est du Lisp... Mais je le savais. C'est ton truc (et parfois le mien).

Non, la question n'est pas que ce soit mon truc ou pas. La question c'est que AutoLISP est en grande partie basé sur le DXF et que c'est le moyen le plus facile d'accéder aux données DXF des objets AutoCAD (le seul autre à ma connaissance, c'est ObjectARX C++ et là, c'est loin d'être facile).

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

Lien vers le commentaire
Partager sur d’autres sites

Ok, merci pour ton aide.
Donc, pour l'instant, j'abandonne la "récupération" des définitions des types de ligne depuis Excel/VBA.
Mais je pourrais, plus tard, faire un petit Lisp que je lancerais depuis Excel/VBA et récupèrerais le résultat.
J'ai déjà réussi à le faire sur un autre projet (la récupération du résultat d'un Lisp lancé dans AutoCAD depuis Excel, mais pas les types de ligne).
Bien que je pense que l'utilisation de LinOut.vlx de CAD Studio serait beaucoup plus simple à mon goût, et pour tout le monde.
Encore un grand merci à toi (gile).
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é