@gex53 a écrit :
salut @CADaSchtroumpf
aurait tu le temps stp de me faire un lisp qui récupère les donné de mes fichier ACC pour les transférer sur autocad car je les retape a la main et autant te dire que je suis entrain de pété un plomb lol
je te met un fichier ACC en model
merci d'avance si tu trouve le temps
@gex53
C'est sûr que + 1000 lignes à la main ça fait du taf!
Alors je te propose deux solutions.
La plus simple donnant des entités TEXT séparées que tu pourras manipuler comme tu veux:
(defun c:Import-ACC2Text ( / input f_open js l_read ins_pt p h_t l_read n dxf_ent l_d l_p d)
(setq
input (getfiled "Sélectionner un fichier ACC" "" "acc" 2)
f_open (open input "r")
js (ssadd)
)
(initget 9)
(setq ins_pt (getpoint "\nPoint de départ haut gauche des textes: ") p (trans ins_pt 1 0))
(initget 6)
(setq h_t (getdist ins_pt (strcat "\nHauteur du texte <" (rtos (getvar "textsize")) ">: ")))
(if (null h_t) (setq h_t (getvar "textsize")) (setvar "textsize" h_t))
(while (setq l_read (read-line f_open))
(entmake
(list
'(0 . "TEXT")
(cons 8 (getvar "CLAYER"))
(cons 10 p)
(cons 40 (getvar "textsize"))
(cons 1 l_read)
'(50 . 0)
)
)
(setq js (ssadd (entlast) js))
(setq
p
(polar
p
(* 1.5 pi)
(* (getvar "TEXTSIZE") 1.606412005457025)
)
)
)
(close f_open)
(repeat (setq n (sslength js))
(setq
dxf_ent (entget (ssname js (setq n (1- n))))
l_d (cons (apply '- (reverse (mapcar 'car (textbox dxf_ent)))) l_d)
l_p (cons (cdr (assoc 10 dxf_ent)) l_p)
)
)
(setq d (apply 'max l_d))
(mapcar
'(lambda (x)
(entmakex
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
(cons 8 (getvar "CLAYER"))
'(90 . 4)
'(70 . 1)
(cons 10 x)
(list 10 (+ (car x) d) (cadr x))
(list 10 (+ (car x) d) (+ (cadr x) (* (getvar "TEXTSIZE") 1.606412005457025)))
(list 10 (car x) (+ (cadr x) (* (getvar "TEXTSIZE") 1.606412005457025)))
)
)
)
l_p
)
)
La seconde qui offre l'avantage d'être une entité unique: un tableau
Mais avec + de 1000 lignes, ça bouffe pas mal de processus.
D'ailleurs Autodesk recommande de scinder en plusieurs tableaux pour éviter ce risque; ce que j'ai fais...
Tu auras plusieurs tableaux de 128 lignes qui seront accolés (cela me semble plus facilement consultable).
Toute fois tu peux changer dans le code (à la ligne 14) ce nombre. Avec 1500 et ton fichier ACC tu n'auras qu'un seul tableau. A toi de voir... avec 1500 lignes tu commence à être limite mais ça le fait !
(defun c:Import-ACC2Tab ( / input f_open count l_read w_c el list_all AcDoc Space ins_pt_cell h_t n_row ename_cell)
(initget 9)
(setq ins_pt_cell (getpoint "\nPoint d'insertion haut gauche du tableau: "))
(initget 6)
(setq h_t (getdist ins_pt_cell (strcat "\nHauteur du texte <" (rtos (getvar "textsize")) ">: ")))
(if (null h_t) (setq h_t (getvar "textsize")) (setvar "textsize" h_t))
(setq
input (getfiled "Selectionner un fichier ACC" "" "acc" 2)
f_open (open input "r")
count 0
)
(while (setq l_read (read-line f_open))
(setq count (1+ count) w_c (cons (apply '- (reverse (mapcar 'car (textbox (list (cons 1 l_read)))))) w_c))
(if (eq (rem count 128) count)
(setq el (cons l_read el))
(setq list_all (cons (cons l_read el) list_all) count 0 el nil)
)
)
(close f_open)
(setq
list_all (cons el list_all)
w_c (+ (apply 'max w_c) (* 2 (getvar "textsize")))
AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space
(if (= 1 (getvar "CVPORT"))
(vla-get-PaperSpace AcDoc)
(vla-get-ModelSpace AcDoc)
)
)
(setq ins_pt_cell (polar ins_pt_cell 0 (* (1- (length list_all)) w_c)))
(foreach el list_all
(setq n_row (length el))
(setq ename_cell (vla-addTable Space (vlax-3d-point (trans ins_pt_cell 1 0)) n_row 1 (+ h_t (* h_t 0.25)) w_c))
(vla-put-RegenerateTableSuppressed ename_cell :vlax-true)
(vla-put-TitleSuppressed ename_cell :vlax-false)
(vla-put-HeaderSuppressed ename_cell :vlax-false)
(mapcar
'(lambda (x)
(vla-SetText ename_cell (setq n_row (1- n_row)) 0 x)
(vla-SetCellTextHeight ename_cell n_row 0 (vlax-make-variant h_t 5))
(vla-SetCellAlignment ename_cell n_row 0 4)
)
el
)
(vla-put-RegenerateTableSuppressed ename_cell :vlax-false)
(setq ins_pt_cell (polar ins_pt_cell pi w_c))
)
(prin1)
)