Hummm
… pas sûr …mais attention, ils sont susceptibles tout de même.
Et puis … il n’y a qu’un seul moyen pour le savoir.

Je vais faire du limite hors sujet …
Perplexity me propose un script Python (avec la bibliothèque ezdxf) qui serait censé pouvoir convertir un fichier DXF en symbole utilisable avec la bibliothèque Solidworks *.sym:
import ezdxf
# Fonction pour normaliser une valeur selon l'étendue min-max à l'intervalle [0,1]
def normalize(value, min_val, max_val):
return (value - min_val) / (max_val - min_val) if max_val > min_val else 0.0
# Fonction principale de conversion DXF -> fichier .sym
def dxf_to_sym(dxf_path, sym_path):
# Charger le fichier DXF
dwg = ezdxf.readfile(dxf_path)
msp = dwg.modelspace()
# Récupérer toutes les coordonnées (x,y) pour une normalisation correcte
coords_x = []
coords_y = []
for e in msp:
if e.dxftype() == 'LINE':
coords_x.extend([e.dxf.start.x, e.dxf.end.x])
coords_y.extend([e.dxf.start.y, e.dxf.end.y])
elif e.dxftype() in ('CIRCLE', 'ARC'):
coords_x.append(e.dxf.center.x)
coords_y.append(e.dxf.center.y)
elif e.dxftype() == 'TEXT':
coords_x.append(e.dxf.insert.x)
coords_y.append(e.dxf.insert.y)
# Définir les bornes min et max
min_x, max_x = min(coords_x), max(coords_x)
min_y, max_y = min(coords_y), max(coords_y)
with open(sym_path, 'w', encoding='utf-8') as file:
file.write(";; Bibliothèque de symboles générée automatiquement\n")
file.write("#MySymbols, Bibliothèque personnelle\n")
# Parcourir les entités pour exporter en format .sym
for e in msp:
if e.dxftype() == 'LINE':
x1 = normalize(e.dxf.start.x, min_x, max_x)
y1 = normalize(e.dxf.start.y, min_y, max_y)
x2 = normalize(e.dxf.end.x, min_x, max_x)
y2 = normalize(e.dxf.end.y, min_y, max_y)
file.write(f"*LineSymbol,Ligne simple\n")
file.write(f"A,LINE {x1:.3f},{y1:.3f},{x2:.3f},{y2:.3f}\n")
elif e.dxftype() == 'CIRCLE':
cx = normalize(e.dxf.center.x, min_x, max_x)
cy = normalize(e.dxf.center.y, min_y, max_y)
# Normalisation du rayon approximative selon largeur (ajustable)
r = e.dxf.radius / (max_x - min_x) if max_x != min_x else 0
file.write(f"*CircleSymbol,Cercle simple\n")
file.write(f"A,CIRCLE {cx:.3f},{cy:.3f},{r:.3f}\n")
elif e.dxftype() == 'ARC':
cx = normalize(e.dxf.center.x, min_x, max_x)
cy = normalize(e.dxf.center.y, min_y, max_y)
r = e.dxf.radius / (max_x - min_x) if max_x != min_x else 0
start_angle = int(e.dxf.start_angle)
end_angle = int(e.dxf.end_angle)
file.write(f"*ArcSymbol,Arc simple\n")
file.write(f"A,ARC {cx:.3f},{cy:.3f},{r:.3f},{start_angle},{end_angle}\n")
elif e.dxftype() == 'TEXT':
x = normalize(e.dxf.insert.x, min_x, max_x)
y = normalize(e.dxf.insert.y, min_y, max_y)
text = e.text.replace(',', '') # enlever virgules
file.write(f"*TextSymbol,Texte simple\n")
file.write(f"A,TEXT {x:.3f},{y:.3f},<{text}>\n")
if __name__ == "__main__":
dxf_to_sym('votre_fichier.dxf', 'symboles.sym')
Explications :
ezdxf charge et lit les entités 2D du fichier DXF à partir du "modelspace".
On collecte toutes les coordonnées X et Y de toutes les entités pour calculer les bornes min/max, ce qui permet de normaliser chaque coordonnée entre 0 et 1. Cette normalisation est nécessaire car SolidWorks attend des coordonnées relatives dans la grille de symbole.
On traite les types essentiels : LINE, CIRCLE, ARC, TEXT ; pour chacun, on écrit une ligne dans le format lisible par SolidWorks.
Le rayon d’un cercle ou d’un arc est normalisé aussi, approximativement selon la largeur du dessin.
Le texte est nettoyé pour éviter les virgules incompatibles.
Le fichier .sym produit peut être ajouté à la bibliothèque de SolidWorks et utilisé directement.
Et c’est là que je m’arrête … à ce jour je n’ai jamais utilisé/créé de script Python et suis, pour l’instant, incapable d’interpréter ou d’évaluer la pertinence de ce script.
De plus il s’agit d’un « direct from IA (Perplexity) » avec tous les problèmes inhérent à ce postulat.
Si des plus téméraires que moi souhaitent tester ce script et bien … merci et bonne chance…