Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
18 replies to this topic

#1 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 26 March 2012 - 04:33 PM

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))

  • 3

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 26 March 2012 - 04:55 PM

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: ")))))))))
  • 3

#3 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 27 March 2012 - 06:22 AM

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
  • 0

#4 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 28 March 2012 - 04:55 PM

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.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 28 March 2012 - 05:36 PM

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!
  • 0

#6 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 14 December 2012 - 02:25 PM

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ì?
  • 0

#7 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 14 December 2012 - 03:06 PM

À, 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!
  • 0

#8 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 14 December 2012 - 11:43 PM

À, 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ì?
  • 1
http://khuyen.space

#9 HoaVien

HoaVien

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 15 December 2012 - 08:01 AM

À, 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 ?
  • 0

#10 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 15 December 2012 - 08:23 AM

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
  • 0

#11 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 15 December 2012 - 08:47 AM

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)
  • 0

#12 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 15 December 2012 - 08:58 AM

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
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#13 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 15 December 2012 - 12:19 PM

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
  • 0

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 15 December 2012 - 01:28 PM

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é.......
  • 0

#15 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 15 December 2012 - 02:11 PM

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ế.
  • 0

#16 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 15 December 2012 - 02:51 PM

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ó ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#17 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 15 December 2012 - 03:56 PM

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 ^^
  • 0

#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 15 December 2012 - 04:11 PM

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" ""))))

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#19 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 15 December 2012 - 04:29 PM

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 :">
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC