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

[Yêu cầu] Lisp đánh số thứ tự vào phần text của các block attribute

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

Lisp em muốn yêu cầu có nguyên lý hơi giống với lisp trong topic cũ của em:” [Yêu cầu]1 Lisp vẽ đường polyline nối basepoint của các block”

 

Yêu cầu của lisp này:

- Có phần nhập tên block attribute(viết tắt ba) để không nhầm lẫn với block khác khi chẳng may chọn nhầm

- Trong text của ba có 1 phần sẽ thay đổi và 1 phần giữ nguyên. Ví dụ: text cũ “D2.T1.01” thì “01” sẽ thay đổi, còn “D2.T1.” giữ nguyên, text cũ “D2.T1.01” sẽ thay đổi thành” D2.T1.05, D2.T1.06, D2.T1.07…”)

- Có phần nhập số bắt đầu: ví dụ: nếu text là” D2.T1.01” và số bắt đầu là 5 thì nó sẽ thành ” D2.T1.05”

- Có phần chọn ba đầu: nếu em chọn bên trái thì nó sẽ tăng dần từ trái sang phải, nếu em chọn bên phải thì nó sẽ tăng dần từ phải sang trái (lấy theo trục X)

- Có phần chọn gia số

- Có phần chọn số chữ số: ví dụ là 3 thì text sẽ là 001,002… thay vì 1,2…

- Chiều cao text giữ nguyên như text cũ, không thay đổi

 

Ví dụ : ta có 3 ba có text giống nhau là “D2.T1.01”

Sau khi dùng lisp với các thông số đầu vào:

- Số bắt đầu:5

- Chọn ba đầu: chọn ba bên phải ngoài cùng

- Gia số: 1

Thì kết quả các ba sẽ có nội dung:

- Ba bên phải ngoài cùng: D2.T1.05

- Ba ở giữa: D2.T1.06

- Ba bên trái: D2.T1.07

Em không biết cách up ảnh lên diễn đàn nên chỉ tải lên mediafire : http://www.mediafire.com/?fwoc5vgriq4e2ih

Mong các anh chị thông cảm. hix :unsure:

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

Lisp em muốn yêu cầu có nguyên lý hơi giống với lisp trong topic cũ của em:” [Yêu cầu]1 Lisp vẽ đường polyline nối basepoint của các block”

 

Yêu cầu của lisp này:

- Có phần nhập tên block attribute(viết tắt ba) để không nhầm lẫn với block khác khi chẳng may chọn nhầm

- Trong text của ba có 1 phần sẽ thay đổi và 1 phần giữ nguyên. Ví dụ: text cũ “D2.T1.01” thì “01” sẽ thay đổi, còn “D2.T1.” giữ nguyên, text cũ “D2.T1.01” sẽ thay đổi thành” D2.T1.05, D2.T1.06, D2.T1.07…”)

- Có phần nhập số bắt đầu: ví dụ: nếu text là” D2.T1.01” và số bắt đầu là 5 thì nó sẽ thành ” D2.T1.05”

- Có phần chọn ba đầu: nếu em chọn bên trái thì nó sẽ tăng dần từ trái sang phải, nếu em chọn bên phải thì nó sẽ tăng dần từ phải sang trái (lấy theo trục X)

- Có phần chọn gia số

- Có phần chọn số chữ số: ví dụ là 3 thì text sẽ là 001,002… thay vì 1,2…

- Chiều cao text giữ nguyên như text cũ, không thay đổi

 

Ví dụ : ta có 3 ba có text giống nhau là “D2.T1.01”

Sau khi dùng lisp với các thông số đầu vào:

- Số bắt đầu:5

- Chọn ba đầu: chọn ba bên phải ngoài cùng

- Gia số: 1

Thì kết quả các ba sẽ có nội dung:

- Ba bên phải ngoài cùng: D2.T1.05

- Ba ở giữa: D2.T1.06

- Ba bên trái: D2.T1.07

Em không biết cách up ảnh lên diễn đàn nên chỉ tải lên mediafire : http://www.mediafire.com/?fwoc5vgriq4e2ih

Mong các anh chị thông cảm. hix :unsure:

Hề hề hề,

Bạn dùng thử cái này coi có ưng ý không nhé:

(defun c:chatt (/ oldos bln ssbl atn n k i a j att atlst atv pre num)
(vl-load-com)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq bln (getstring t "\n Nhap ten block: "))
(setq ssbl (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 2 bln) (cons 66 1)))))
(if ssbl
      (progn
             (setq atn (getstring t "\n Nhap ten thuoc tinh: ") 
                     n (getint "\n Nhap so ky tu can giu cua gia tri thuoc tinh: ")                    
                     k (getint "\n Nhap so ky tu bieu dien so: ")
                     i (getint "\n Nhap so bat dau danh so: ")
                     a (getreal "\n Nhap gia so: ")
                     j 0 )
             (if (> k 4) (setq k 4))     
             (if (= atn "") (setq atn bln))
             (setq ans (getstring t "\n Ban muon danh so theo chieu thuan <y or n>: "))
             (if (= (strcase ans) "Y")
                 (setq ssbl (vl-sort ssbl '(lambda (x y) (< (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))
                 (setq ssbl (vl-sort ssbl '(lambda (x y) (> (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))
             )
             (foreach bl ssbl
                     (setq att (entnext bl))
                     (while (/= (cdr (assoc 0 (entget att))) "SEQEND")
                              (setq atlst (entget att))
                              (if (= (cdr (assoc 2 atlst)) (strcase atn))
                                  (progn
                                         (setq atv (cdr (assoc 1 atlst))
                                                 pre (substr atv 1 n)
                                                 num (rtos (+ i (* j a)) 2 0))
                                         (if (and (= (strlen num) 1) (= k 4)) (setq num (strcat "000" num)))
                                         (if (and (= (strlen num) 2) (= k 4)) (setq num (strcat "00" num)))
                                         (if (and (= (strlen num) 3) (= k 4)) (setq num (strcat "0" num)))
                                         (if (and (= (strlen num) 1) (= k 3)) (setq num (strcat "00" num)))
                                         (if (and (= (strlen num) 2) (= k 3)) (setq num (strcat "0" num)))
                                         (if (and (= (strlen num) 1) (= k 2)) (setq num (strcat "0" num)))
                                         (setq atlst (subst (cons 1 (strcat pre num)) (assoc 1 atlst) atlst))
                                         (entmod atlst)

                                         (setq j (1+ j))
                                   )
                                )
                                (setq att (entnext att))
                     )
             )
        )
)
(command "regenall")
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)

 

Hề hề hề,

Do cái sự biết chưa đến nơi đến chốn nên lisp này mới chỉ giải quyết cho bạn được đến số chữ số tối đa là 4. Nếu bạn muốn hơn thì phải bổ sung thêm vào lisp.

Phần chọn chiều đánh số mình chưa làm mà mới chỉ đánh số theo thứ tự hiện hành của các block trong tập chọn. Mình sẽ bổ xung sau nhé.

 

Hề hề hê, minh đã bổ sung phần chọn chiều đánh số váo lisp. Thay vì chọn ba đầu như bạn nói mình cho chọn chiều đánh số là thuận (từ trái qua phải) và nghịch (từ phải qua trái). Khi lisp hỏi " Ban muon danh so theo chieu thuan <y or n>: " nếu bạn nhập y vào dòng command lisp sẽ đánh số theo chiều thuận. Còn nếu bạn không nhập gì hoặc nhập bất cứ ký tự nào thì lisp sẽ đánh số theo chiều nghịch.

 

Chúc bạn vui.

Chỉnh sửa theo phamthanhbinh
Bổ sung phần chọn hướng đánh số vào lisp
  • 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

@Bạn dauquangminh : về bản chất mình thấy lisp bạn yêu cầu không khác là mấy với lisp đánh stt bản vẽ bằng ATT, và cách thao tác bạn đưa ra vẫn thiếu hiệu quả :)

 

@bác Bình : mục chọn số ký tự thể hiện số, bác có thể làm 1 hàm con để triệt để hơn, đại loại như :

(defun test (k num / rt num_len) ;k : so ky tu quy dinh, num : Int

(cond

((>= (setq num_len (strlen (setq num (rtos num 2 0)))) k)(setq rt num))

((< num_len k)(setq rt(repeat (- k num_len)(setq num (strcat "0" num)))))

)

rt

)

Và theo em, bác có thể thay ý của bạn ấy là user nhập tên block bằng cách chọn block trong 1 list, hoặc pick block mẫu, hoặc lấy tên thằng block đầu tiên trong tập chọn làm chuẩn....v..v

Vì việc phải nhớ tên Block thật là khó khăn ^^

CŨng như vậy với ATT tag, vì block chỉ có duy nhất 1 em thôi

  • 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

Hề hề hề,

Bạn dùng thử cái này coi có ưng ý không nhé:

(defun c:chatt (/ oldos bln ssbl atn n k i a j att atlst atv pre num)
(vl-load-com)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq bln (getstring t "\n Nhap ten block: "))
(setq ssbl (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 2 bln) (cons 66 1)))))
(if ssbl
      (progn
             (setq atn (getstring t "\n Nhap ten thuoc tinh: ") 
                     n (getint "\n Nhap so ky tu can giu cua gia tri thuoc tinh: ")                    
                     k (getint "\n Nhap so ky tu bieu dien so: ")
                     i (getint "\n Nhap so bat dau danh so: ")
                     a (getreal "\n Nhap gia so: ")
                     j 0 )
             (if (> k 4) (setq k 4))     
             (if (= atn "") (setq atn bln))
             (setq ans (getstring t "\n Ban muon danh so theo chieu thuan <y or n>: "))
             (if (= (strcase ans) "Y")
                 (setq ssbl (vl-sort ssbl '(lambda (x y) (< (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))
                 (setq ssbl (vl-sort ssbl '(lambda (x y) (> (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))
             )
             (foreach bl ssbl
                     (setq att (entnext bl))
                     (while (/= (cdr (assoc 0 (entget att))) "SEQEND")
                              (setq atlst (entget att))
                              (if (= (cdr (assoc 2 atlst)) (strcase atn))
                                  (progn
                                         (setq atv (cdr (assoc 1 atlst))
                                                 pre (substr atv 1 n)
                                                 num (rtos (+ i (* j a)) 2 0))
                                         (if (and (= (strlen num) 1) (= k 4)) (setq num (strcat "000" num)))
                                         (if (and (= (strlen num) 2) (= k 4)) (setq num (strcat "00" num)))
                                         (if (and (= (strlen num) 3) (= k 4)) (setq num (strcat "0" num)))
                                         (if (and (= (strlen num) 1) (= k 3)) (setq num (strcat "00" num)))
                                         (if (and (= (strlen num) 2) (= k 3)) (setq num (strcat "0" num)))
                                         (if (and (= (strlen num) 1) (= k 2)) (setq num (strcat "0" num)))
                                         (setq atlst (subst (cons 1 (strcat pre num)) (assoc 1 atlst) atlst))
                                         (entmod atlst)

                                         (setq j (1+ j))
                                   )
                                )
                                (setq att (entnext att))
                     )
             )
        )
)
(command "regenall")
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)

 

Hề hề hề,

Do cái sự biết chưa đến nơi đến chốn nên lisp này mới chỉ giải quyết cho bạn được đến số chữ số tối đa là 4. Nếu bạn muốn hơn thì phải bổ sung thêm vào lisp.

Phần chọn chiều đánh số mình chưa làm mà mới chỉ đánh số theo thứ tự hiện hành của các block trong tập chọn. Mình sẽ bổ xung sau nhé.

 

Hề hề hê, minh đã bổ sung phần chọn chiều đánh số váo lisp. Thay vì chọn ba đầu như bạn nói mình cho chọn chiều đánh số là thuận (từ trái qua phải) và nghịch (từ phải qua trái). Khi lisp hỏi " Ban muon danh so theo chieu thuan <y or n>: " nếu bạn nhập y vào dòng command lisp sẽ đánh số theo chiều thuận. Còn nếu bạn không nhập gì hoặc nhập bất cứ ký tự nào thì lisp sẽ đánh số theo chiều nghịch.

 

Chúc bạn vui.

Mình chưa hiểu "tên thuộc tính", "số ký tự cần giữ của giá trị thuộc tính" trong lisp của bạn nghĩa là gì? Bạn giải đáp giúp mình nhé. :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

Mình chưa hiểu "tên thuộc tính", "số ký tự cần giữ của giá trị thuộc tính" trong lisp của bạn nghĩa là gì? Bạn giải đáp giúp mình nhé. :D

Hề hề hề,

Ten thuoc tinh chính là cái tên của thuộc tính (attribute) mà bạn muốn nó thay đổi giá trị, tỷ như trong một block có thể có nhiều attribute, bạn cần thay thằng nào thì nhặt thằng đó thôi. Trong cái bản vẽ bạn gửi thì tên block trùng tên của thuộc tính và đều là HOGA cả. cái block của bạn cũng chỉ có duy nhất một thuộc tính mà thôi.

So ky tu can giu cua gia tri thuoc tinh là số ký tự trong chuỗi giá trị của cái thuộc tính mà bạn không muốn thay đổi. Tỷ như ở cái bản vẽ bạn gửi thì cái thuộc tính HOGA có giá trị là "D2.T1.01", bạn muốn giữ lại "D2.T1." tức là giữ lại 6 ký tự.

 

Hề hề hề, hãy chịu khó mò vào trong Help của CAD để đọc thêm về các thuộc tính của các block bạn nhé. Còn nhiều điều cần biết về nó lắ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

@Bạn dauquangminh : về bản chất mình thấy lisp bạn yêu cầu không khác là mấy với lisp đánh stt bản vẽ bằng ATT, và cách thao tác bạn đưa ra vẫn thiếu hiệu quả :)

 

@bác Bình : mục chọn số ký tự thể hiện số, bác có thể làm 1 hàm con để triệt để hơn, đại loại như :

 

Và theo em, bác có thể thay ý của bạn ấy là user nhập tên block bằng cách chọn block trong 1 list, hoặc pick block mẫu, hoặc lấy tên thằng block đầu tiên trong tập chọn làm chuẩn....v..v

Vì việc phải nhớ tên Block thật là khó khăn ^^

CŨng như vậy với ATT tag, vì block chỉ có duy nhất 1 em thôi

Hề hề hề,

Đồng ý với ý kiến của bác, song bác cho mình một ít thời gian để sửa nhé. Rất cám ơn về món quà bác biếu....

Hề hề hề,..

 

Và nó dây ạ:

(defun c:chatt (/ oldos bln ssbl atn n k i a j  ans att atlst atv pre num)
(vl-load-com)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq bln (cdr (assoc 2 (entget (car (entsel "\n Chon block mau can thay doi gia tri thuoc tinh"))))))
(setq ssbl (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 2 bln) (cons 66 1)))))
(if ssbl
      (progn
             (setq atn (cdr (assoc 2 (entget (car (nentsel "\n Chon thuoc tinh can thay doi gia tri ")))))
                     n (getint "\n Nhap so ky tu can giu cua gia tri thuoc tinh: ")                    
                     k (getint "\n Nhap so ky tu bieu dien so: ")
                     i (getint "\n Nhap so bat dau danh so: ")
                     a (getreal "\n Nhap gia so: ")
                     j 0 )
             ;;;;(if (> k 4) (setq k 4))     
             (if (= atn "") (setq atn bln))
             (setq ans (getstring t "\n Ban muon danh so theo chieu thuan <y or n>: "))
             (if (= (strcase ans) "Y")
                 (setq ssbl (vl-sort ssbl '(lambda (x y) (< (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))
                 (setq ssbl (vl-sort ssbl '(lambda (x y) (> (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))
             )
             (foreach bl ssbl
                     (setq att (entnext bl))
                     (while (/= (cdr (assoc 0 (entget att))) "SEQEND")
                              (setq atlst (entget att))
                              (if (= (cdr (assoc 2 atlst)) (strcase atn))
                                  (progn
                                         (setq atv (cdr (assoc 1 atlst))
                                                 pre (substr atv 1 n)
                                                 num (rtos (+ i (* j a)) 2 0))
                                         ;;;(if (and (= (strlen num) 1) (= k 4)) (setq num (strcat "000" num)))
                                         ;;;(if (and (= (strlen num) 2) (= k 4)) (setq num (strcat "00" num)))
                                         ;;;(if (and (= (strlen num) 3) (= k 4)) (setq num (strcat "0" num)))
                                         ;;;(if (and (= (strlen num) 1) (= k 3)) (setq num (strcat "00" num)))
                                         ;;;(if (and (= (strlen num) 2) (= k 3)) (setq num (strcat "0" num)))
                                         ;;;(if (and (= (strlen num) 1) (= k 2)) (setq num (strcat "0" num)))
                                         (if (< (strlen num) k)
                                             (setq num (repeat (- k (strlen num)) (setq num (strcat "0" num))))
                                         )
                                         (setq atlst (subst (cons 1 (strcat pre num)) (assoc 1 atlst) atlst))
                                         (entmod atlst)

                                         (setq j (1+ j))
                                   )
                                )
                                (setq att (entnext att))
                     )
             )
        )
)
(command "regenall")
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)

Chỉnh sửa theo phamthanhbinh
Bổ sung lisp đã sửa
  • Vote tăng 2

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

 

Hề hề hề,

Đồng ý với ý kiến của bác, song bác cho mình một ít thời gian để sửa nhé. Rất cám ơn về món quà bác biếu....

Hề hề hề,..

 

Và nó dây ạ:

(defun c:chatt (/ oldos bln ssbl atn n k i a j  ans att atlst atv pre num)(vl-load-com)(command "undo" "be")(setq oldos (getvar "osmode"))(setvar "osmode" 0)(setq bln (cdr (assoc 2 (entget (car (entsel "\n Chon block mau can thay doi gia tri thuoc tinh"))))))(setq ssbl (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 2 bln) (cons 66 1)))))(if ssbl       (progn              (setq atn (cdr (assoc 2 (entget (car (nentsel "\n Chon thuoc tinh can thay doi gia tri ")))))                      n (getint "\n Nhap so ky tu can giu cua gia tri thuoc tinh: ")                                          k (getint "\n Nhap so ky tu bieu dien so: ")                      i (getint "\n Nhap so bat dau danh so: ")                      a (getreal "\n Nhap gia so: ")                      j 0 )              ;;;;(if (> k 4) (setq k 4))                   (if (= atn "") (setq atn bln))              (setq ans (getstring t "\n Ban muon danh so theo chieu thuan <y or n>: "))              (if (= (strcase ans) "Y")                  (setq ssbl (vl-sort ssbl '(lambda (x y) (< (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))                  (setq ssbl (vl-sort ssbl '(lambda (x y) (> (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))              )              (foreach bl ssbl                      (setq att (entnext bl))                      (while (/= (cdr (assoc 0 (entget att))) "SEQEND")                               (setq atlst (entget att))                               (if (= (cdr (assoc 2 atlst)) (strcase atn))                                   (progn                                          (setq atv (cdr (assoc 1 atlst))                                                  pre (substr atv 1 n)                                                  num (rtos (+ i (* j a)) 2 0))                                          ;;;(if (and (= (strlen num) 1) (= k 4)) (setq num (strcat "000" num)))                                          ;;;(if (and (= (strlen num) 2) (= k 4)) (setq num (strcat "00" num)))                                          ;;;(if (and (= (strlen num) 3) (= k 4)) (setq num (strcat "0" num)))                                          ;;;(if (and (= (strlen num) 1) (= k 3)) (setq num (strcat "00" num)))                                          ;;;(if (and (= (strlen num) 2) (= k 3)) (setq num (strcat "0" num)))                                          ;;;(if (and (= (strlen num) 1) (= k 2)) (setq num (strcat "0" num)))                                          (if (< (strlen num) k)                                              (setq num (repeat (- k (strlen num)) (setq num (strcat "0" num))))                                          )                                          (setq atlst (subst (cons 1 (strcat pre num)) (assoc 1 atlst) atlst))                                          (entmod atlst)                                                                                    (setq j (1+ j))                                    )                                 )                                 (setq att (entnext att))                      )              )         ))(command "regenall")(setvar "osmode" oldos)(command "undo" "e")(princ))

sao mình down về mà ko dùng được nhỉ, nó báo lỗi là "Command: nil

Command: UNDO Current settings: Auto = On, Control = All, Combine = Yes, Layer 
= Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back] 

<1>: END"

rồi sau đó gõ lệnh thì nó báo là không có lệnh đó, bạn xem lại cá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

Các bác đóng topic sớm thế, đang hay mà.Lisp này rất tiện,cám ơn các bác trước. Nhưng nếu như có thể tăng cả tẽt nữa thì quá tốt. VD A1A, A1B, A1C......

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

sao mình down về mà ko dùng được nhỉ, nó báo lỗi là "Command: nil

Command: UNDO Current settings: Auto = On, Control = All, Combine = Yes, Layer 
= Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back] 

<1>: END"

rồi sau đó gõ lệnh thì nó báo là không có lệnh đó, bạn xem lại cái

Hề hề hề,

Có nhẽ codebox của diễn đàn có vấn đề gì đó rồi.

Bạn download lại cái mình mới sửa lại này cói sao nhé.

http://www.cadviet.com/upfiles/3/5194_chatt.lsp

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

Lisp của anh Bình rất hay nhưng có cái này e thắc mắc : em làm bên block att thuần tuý thì được nhưng block att có dynamic(nghĩa là block động có att ) thì không được. nếu anh Bình hay anh em nào điều chỉnh được thì giúp e với.

em xin cảm ơn!

chúc diễn đàn ngày càng vững mạ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

Lisp của Pham Thanh Binh rất hay. Nhưng trong trường hợp Block Att không được copy theo thứ tự thì dẫn đến Lisp làm việc Sai yêu cầu. Bạn kiểm tra lại nhé. Tks :)

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  

×