Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Doan Van Ha

[Đã xong] Lấy FontFile của Font Name bất kỳ

Các bài được khuyến nghị

Việc đặt Text Style bằng Dialoge là đã rõ ràng.

Tuy nhiên, việc đặt Text Style bằng lisp, dùng hàm (command "style"...), thường gặp trở ngại vì cần phải biết chính xác FontFile.

Chẳng hạn, Font Name là .VnArial NarrowH thì FontFile là gì? Trả lời: nó là Vharialn_0.ttf

Hoặc, Font Name là Times New Roman thì FontFile là gì? Trả lời: nó là times.ttf

Làm sao để biết được? Lisp này giúp chúng ta lấy được FontFile chính xác ứng với từng Font Name.

Cách dùng:

1). Dùng lệnh Style để đặt 1 kiểu nào đó ứng với Font Name mà ta muốn biết FontFile.

2). Viết 1 Text ứng với kiểu đó ra screen.

3). Dùng lisp này để xác định FontFile của nó.

;----- Lay FontFile cua Text duoc chon
(defun C:HA( / sty ff)
(setq sty (cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: "))))))
(foreach ass (VxGetTextStyles)
 (if (= (car ass) sty) (setq ff (cdr ass))))
(alert ff)
ff)
(defun VxGetTextStyles ( / StyLst)
(vlax-for Sty (vla-get-TextStyles (vla-get-ActiveDocument (vlax-get-acad-object)))
 (setq StyLst (cons (cons (vla-get-Name Sty) (vla-get-FontFile Sty)) StyLst)))
(reverse StyLst))

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Việc đặt Text Style bằng Dialoge là đã rõ ràng.

Tuy nhiên, việc đặt Text Style bằng lisp, dùng hàm (command "style"...), thường gặp trở ngại vì cần phải biết chính xác FontFile.

Chẳng hạn, Font Name là .VnArial NarrowH thì FontFile là gì? Trả lời: nó là Vharialn_0.ttf

Hoặc, Font Name là Times New Roman thì FontFile là gì? Trả lời: nó là times.ttf

Làm sao để biết được? Lisp này giúp chúng ta lấy được FontFile chính xác ứng với từng Font Name.

Cách dùng:

1). Dùng lệnh Style để đặt 1 kiểu nào đó ứng với Font Name mà ta muốn biết FontFile.

2). Viết 1 Text ứng với kiểu đó ra screen.

3). Dùng lisp này để xác định FontFile của nó.

;----- Lay FontFile cua Text duoc chon
(defun C:HA( / sty ff)
(setq sty (cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: "))))))
(foreach ass (VxGetTextStyles)
 (if (= (car ass) sty) (setq ff (cdr ass))))
(alert ff)
ff)
(defun VxGetTextStyles ( / StyLst)
(vlax-for Sty (vla-get-TextStyles (vla-get-ActiveDocument (vlax-get-acad-object)))
 (setq StyLst (cons (cons (vla-get-Name Sty) (vla-get-FontFile Sty)) StyLst)))
(reverse StyLst))

Hoặc là :

 

(alert (cdr(assoc 3 (tblsearch "STYLE" (cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: ")))))))))

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Việc đặt Text Style bằng Dialoge là đã rõ ràng.

Tuy nhiên, việc đặt Text Style bằng lisp, dùng hàm (command "style"...), thường gặp trở ngại vì cần phải biết chính xác FontFile.

Chẳng hạn, Font Name là .VnArial NarrowH thì FontFile là gì? Trả lời: nó là Vharialn_0.ttf

Hoặc, Font Name là Times New Roman thì FontFile là gì? Trả lời: nó là times.ttf

Làm sao để biết được? Lisp này giúp chúng ta lấy được FontFile chính xác ứng với từng Font Name.

Cách dùng:

1). Dùng lệnh Style để đặt 1 kiểu nào đó ứng với Font Name mà ta muốn biết FontFile.

2). Viết 1 Text ứng với kiểu đó ra screen.

3). Dùng lisp này để xác định FontFile của nó.

;----- Lay FontFile cua Text duoc chon
(defun C:HA( / sty ff)
(setq sty (cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: "))))))
(foreach ass (VxGetTextStyles)
 (if (= (car ass) sty) (setq ff (cdr ass))))
(alert ff)
ff)
(defun VxGetTextStyles ( / StyLst)
(vlax-for Sty (vla-get-TextStyles (vla-get-ActiveDocument (vlax-get-acad-object)))
 (setq StyLst (cons (cons (vla-get-Name Sty) (vla-get-FontFile Sty)) StyLst)))
(reverse StyLst))

Vì hàm con VxGetTextStyles đã trả về 1 dotted pair rồi nên trong hàm chính ta cũng không cần phải dùng vòng lặp Foreach để duyệt qua từng phần tử mà lúc này ta chỉ cần dùng hàm assoc . Code sẽ ngắn gọn hơn.

 

Ta có thể viết :

(setq sty (cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: "))))))

(cdr(assoc sty (VxGetTextStyles))) -> Đây là kết quả cần tìm

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Vì hàm con VxGetTextStyles đã trả về 1 dotted pair rồi nên trong hàm chính ta cũng không cần phải dùng vòng lặp Foreach để duyệt qua từng phần tử mà lúc này ta chỉ cần dùng hàm assoc . Code sẽ ngắn gọn hơn.

Chả cần phải là dotted pair list mới dùng được hàm assoc. list bình thường có các phần tử là list cũng dùng được mà bác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chả cần phải là dotted pair list mới dùng được hàm assoc. list bình thường có các phần tử là list cũng dùng được mà bác.

Đồng ý! Cứ nhìn vào data của (entget ename) là biết liền.

Và bài viết trên của mình là để góp ý để code gọn gàng hơn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chẳng hạn, Font Name là .VnArial NarrowH thì FontFile là gì? Trả lời: nó là Vharialn_0.ttf

Hoặc, Font Name là Times New Roman thì FontFile là gì? Trả lời: nó là times.ttf

Làm sao để biết được? Lisp này giúp chúng ta lấy được FontFile chính xác ứng với từng Font Name.

Cho mình đặt câu hỏi ngược lại. Biết Font File, vậy Font Name của nó là gì?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

À, Câu hỏi này dùng cho lập trình viên. hãy suy nghĩ như 1 lập trình viên thì bạn sẽ hiểu vì sao mình đặt câu hỏi ngược như vậy. thân!

 

Mình không phải là lập trình viên nên rất khó để suy nghĩ như một lập trình viên. Nó chẳng khác gì mình là kỹ sư nước, bạn không phải kỹ sư nước, nhưng mình lại bảo bạn: "Bạn hãy suy nghĩ như một kỹ sư nước" vậy. Vậy bạn có thể giải thích rõ ràng hơn được không? Nếu bạn là lập trình viên, tại sao bạn không tự trả lời? Nếu bạn suy nghĩ như một lập trình viên, thì bạn hãy giải thích suy nghĩ của bạn cho mình (và mọi người) được biết. xin cảm ơn

Mình chỉ thắc mắc là: câu hỏi của bạn có tác dụng gì, có ứng dụng gì?

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

À, Câu hỏi này dùng cho lập trình viên. hãy suy nghĩ như 1 lập trình viên thì bạn sẽ hiểu vì sao mình đặt câu hỏi ngược như vậy. thân!

Chả cần "suy nghĩ như 1 lập trình viên", suy nghĩ nhu 1 họa-viên cũng có câu trả lời!

 

Vấn đề là ThuyLinh313 có muốn mọi người hiểu ThuyLinh313 đang suy nghĩ gì không thôi ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình nói như vậy có nghĩa là nếu bạn không phải dân lập trình thì câu trả lời cũng không giúp ích gì cho bạn thôi. Mình cần nó khi thiết kế giao diện cho ứng dụng.

Khi chọn font chữ, Bạn muốn nhìn thấy Times New Roman hay times.ttf ?

Có danh sách file font -> phải suy ra được danh sách tên font. Trên giao diện, người dùng muốn nhìn thấy tên font chứ không phải tên file của nó.

 

PS: Bạn mà bảo mình suy nghĩ như 1 kỹ sư nước thì mình làm được, bởi mình chính xác là 1 kỹ sư nước :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Vì hàm con VxGetTextStyles đã trả về 1 dotted pair rồi nên trong hàm chính ta cũng không cần phải dùng vòng lặp Foreach để duyệt qua từng phần tử mà lúc này ta chỉ cần dùng hàm assoc . Code sẽ ngắn gọn hơn.

 

Ta có thể viết :

(setq sty (cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: "))))))

(cdr(assoc sty (VxGetTextStyles))) -> Đây là kết quả cần tìm

Em có chút thắc mắc, hiện em đang dùng cách như của bác

(cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: ")))))

(ứng dụng cho lisp liệt kê toàn bộ TextStyle với nội dùng là tên T.Style và font sử dụng)

Em thấy nó khá là đúng, vậy lisp của bác Hà có gì khác, có bổ sung gì không ? hay kết quả tương đương

Thêm nữa, em dùng lisp của bác Hà thì không thấy TexStyle sử dụng font .VnArial NarrowH không thấy hiện là Vharialn_0.ttf

hêm Không rõ là do có sự khác nhau trong kết quả, hay là do dùng nguồn font khác nhau ạ? (trên máy em là VNarialN.ttf)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em có chút thắc mắc, hiện em đang dùng cách như của bác

(cdr (assoc 7 (entget (car (entsel "\nChon 1 Text de lay FontFile: ")))))

(ứng dụng cho lisp liệt kê toàn bộ TextStyle với nội dùng là tên T.Style và font sử dụng)

Em thấy nó khá là đúng, vậy lisp của bác Hà có gì khác, có bổ sung gì không ? hay kết quả tương đương

Thêm nữa, em dùng lisp của bác Hà thì không thấy TexStyle sử dụng font .VnArial NarrowH không thấy hiện là Vharialn_0.ttf

hêm Không rõ là do có sự khác nhau trong kết quả, hay là do dùng nguồn font khác nhau ạ? (trên máy em là VNarialN.ttf)

Hai kiểu cho kết quả giống nhau. Tôi vừa test cả 2 đều OK (bạn kiểm tra lại xem): .VnArial NarrowH thì hiện Vharialn_0.ttf

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hai kiểu cho kết quả giống nhau. Tôi vừa test cả 2 đều OK (bạn kiểm tra lại xem): .VnArial NarrowH thì hiện Vharialn_0.ttf

OK, cảm ơn bác, có lẽ là do nguồn khác nhau, vấn đề không lớn không cần bàn sâu. Em cũng chỉ cần biết kết quả thôi, quá trình thì bỏ qua, hì hì, Chúc bác vui khỏe

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cho mình đặt câu hỏi ngược lại. Biết Font File, vậy Font Name của nó là gì?

Lấy fontname hiện hành:

Bạn thử lisp này xem nhé :

(defun c:gfont (/ st)
(vl-load-com)
(setq st (vla-get-activetextstyle
               	(vla-get-activedocument
                       	(vlax-get-acad-object))))
(vla-GetFont st 'n 'b 'i 'c 'p)
(alert n )
);defun

Với lisp này, bạn tự tìm câu trả lời nhé.......

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn Tue_NV! Có lẽ bạn đã hiểu sai câu hỏi của mình vì nội dung đoạn code bên trên của bạn Doan Van Ha. Đoạn code của bạn DVH dùng để lấy font file từ textstyle. hàm Getfont bên trên cũng vậy, lấy font name từ 1 textstyle.

 

Mình muốn lấy được font name từ 1 font file có sẵn rồi cơ. Mình đang viết 1 ứng dụng trong đó có hộp thoại cho phép người dùng thay đổi font chữ (giống việc ta chọn font trong hộp thoại textstyle). Mình đã có danh sách font file trong thư mục font của window, nhưng ta không thể bắt người dùng chọn font bằng font file được nên mình muốn chuyển danh sách font file đó thành font name là vì thế.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Nếu là các font ttf đã đc cài vào win thì bạn tạo list file - name bằng cách lấy trong reg hklm/software/microsoft/window + window nt/ current version/ font .. ( hoặc tương tự thế, vì mình k ngồi máy, k nhớ chính xác)

Nếu là file chưa cài thì bạn phải biết định dạng file th. nếu k lần thì các file font đếu có record file name, n với lisp xài nó chắc khó ^^

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không biết từ cái này có suy ra sự tương ứng 1-1 giữa fontname và fontfile không?

(defun C:HA()
(if
 (not (setq lst (vl-registry-descendents "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Fonts" "")))
 (setq lst (vl-registry-descendents "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts" ""))))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Phải chăng ketxu đã viết gì đó sử dụng đến danh sách font name? Bạn nói chính xác những gì mình đang cần luôn. Giỏi quá đi ^^

Không, chỉ là mình đã có thời gian khá dài ngụp lặn trong đó (registry) nên nhớ vậy thôi ^^ Hy vọng sớm được download sản phẩm của bạn :">

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×