Chuyển đến nội dung
Diễn đàn CADViet
ustoichivost

Hỏi về LISP

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

Mình mới học AutoLISP viết một chương trình đơn giản,nhưng không hiểu lỗi ở chỗ nào.Các bạn giúp mình với nhé.Cảm ơn nhiều:

 

(defun c:Triangle(/ P1 P2 P3)

(setq P1 (getpoint "\n Vao dinh thu nhat"))

(setq P2 (getpoint "\n Vao dinh thu hai"))

(setq P3 (getpoint "\n Vao dinh thu ba "))

(command "line" P1 P2 P3 "c")

)

;the end

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 mới học AutoLISP viết một chương trình đơn giản,nhưng không hiểu lỗi ở chỗ nào.Các bạn giúp mình với nhé.Cảm ơn nhiều:

 

(defun c:Triangle(/ P1 P2 P3)

(setq P1 (getpoint "\n Vao dinh thu nhat"))

(setq P2 (getpoint "\n Vao dinh thu hai"))

(setq P3 (getpoint "\n Vao dinh thu ba "))

(command "line" P1 P2 P3 "c")

)

;the end

Chạy tốt, chẳng lỗi ở chỗ nào 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ạy tốt, chẳng lỗi ở chỗ nào cả!

 

Nhưng tạo sao em load thì xuất hiện thông báo sau:

_appload triangle.lsp successfully loaded

; error: syntax error

 

Thế là thế nào ạ?

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
Nhưng tạo sao em load thì xuất hiện thông báo sau:

_appload triangle.lsp successfully loaded

; error: syntax error

 

Thế là thế nào ạ?

Bạn thử download (bằng cách phải chuột rồi chọn save link as hoặc save target as) file này về rồi appload xem sao: http://www.cadviet.com/upfiles/triangle.lsp

Đây là file mã lệnh của bạn tôi đã save thành 1 file lisp. Tôi load file này không có một lỗi nào 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
Bạn thử download (bằng cách phải chuột rồi chọn save link as hoặc save target as) file này về rồi appload xem sao: http://www.cadviet.com/upfiles/triangle.lsp

Đây là file mã lệnh của bạn tôi đã save thành 1 file lisp. Tôi load file này không có một lỗi nào cả.

 

Cam on anh nha.OK rui!

Nhân đây em cũng xin hỏi luôn là nếu như em muốn biết các thông số của các lệnh trong AutoCad thì phải làm thế nào? Chẳng hạn như là em muốn dùng AutoLisp để vẽ một đường tròn khi biết bán kính và tâm thì có thể viết:

 

(command "circle" P1 r)

; P1 -tam duong tron

;r-ban kinh duong tron

;được không ạ?

; hay là phải tìm hiểu các biến hệ thống của AutoCad như Chamfera hay la chamferb chamferc chamferd của lệnh Chamfer ạ?

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
Cam on anh nha.OK rui!

Nhân đây em cũng xin hỏi luôn là nếu như em muốn biết các thông số của các lệnh trong AutoCad thì phải làm thế nào? Chẳng hạn như là em muốn dùng AutoLisp để vẽ một đường tròn khi biết bán kính và tâm thì có thể viết:

 

(command "circle" P1 r)

; P1 -tam duong tron

;r-ban kinh duong tron

;được không ạ?

; hay là phải tìm hiểu các biến hệ thống của AutoCad như Chamfera hay la chamferb chamferc chamferd của lệnh Chamfer ạ?

 

Có vẻ như bạn còn lúng túng về phương pháp học lisp, ssg có vài gợi ý:

1) Có thể nhập trực tiếp biểu thức lisp tại dòng nhắc command. Ví dụ trên:

Command: (setq P1 (list 100 100) r 20). Kết quả: P1 được gán toạ độ 100, 100 và r được gán giá trị 20

Command: (command "circle" p1 r). Kết quả: Acad vẽ vòng tròn tâm (100,100) bán kính 20

2) Nếu không rõ hoặc không nhớ các tham số của một lệnh, bạn có thể dùng biến pause. Ví dụ:

Command: (command "circle" pause) . Căn cứ vào các yêu cầu tiếp theo của Acad, bạn sẽ biết nó cần tham số gì.

3) Nếu bạn đã biết về ss và entity, có thể dùng hàm entmake để tạo đối tượng thay vì dùng command. Ví dụ:

Command: (entmake (list (cons 0 "CIRCLE") (cons 10 (list 100 120)) (cons 40 30))) . Kết quả: vẽ vòng tròn tâm (100, 120), bán kính 30.

4) Lật Help ra xem, không thiếu thứ 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

Em viết một đoạn Lisp chia đoạn thẳng cho trước với tỉ lệ k như sau:

 

(defun c:chiadt (/ k)

(setq k -1

P1 (getpoint "\n Nhap diem dau cua doan thang")

P2 (getpoint "\n Nhap diem cuoi cua doan thang")

)

(while (= k -1)

(setq k (getreal "\n Nhap ti le"))

)

(setq X1 (car P1)

Y1 (cdr P1)

Z1 (cdr (cdr P1))

X2 (car P2)

Y2 (cdr P2)

Z2 (cdr (cdr P2))

)

(setq X3 (/ (+ (* k X2) X1) (1+ k))

Y3 (/ (+ (* k Y2) Y1) (1+ k))

Z3 (/ (+ (* k Z2) Z1) (1+ k))

)

(setq P3 (list ( X3 Y3 Z3)))

(command "point" P3)

(princ)

)

;het

;nhung khong hieu sao may lai bao loi :bad argument type

;khong hiu

;cac anh xem ho em voi

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 viết một đoạn Lisp chia đoạn thẳng cho trước với tỉ lệ k như sau:

 

(defun c:chiadt (/ k)

(setq k -1

P1 (getpoint "\n Nhap diem dau cua doan thang")

P2 (getpoint "\n Nhap diem cuoi cua doan thang")

)

(while (= k -1)

(setq k (getreal "\n Nhap ti le"))

)

(setq X1 (car P1)

Y1 (cdr P1)

Z1 (cdr (cdr P1))

X2 (car P2)

Y2 (cdr P2)

Z2 (cdr (cdr P2))

)

(setq X3 (/ (+ (* k X2) X1) (1+ k))

Y3 (/ (+ (* k Y2) Y1) (1+ k))

Z3 (/ (+ (* k Z2) Z1) (1+ k))

)

(setq P3 (list ( X3 Y3 Z3)))

(command "point" P3)

(princ)

;het

;nhung khong hieu sao may lai bao loi :bad argument type

;khong hiu

;cac anh xem ho em voi

 

 

(setq P3 (list X3 Y3 Z3))

hoac

(setq P3 '(X3 Y3 Z3))

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 đã sửa nhưng mà vẫn không được.Chẳng hạn nhập vào :

Điểm đầu:P1(0,0,0)

Điểm cuối:P2(50,50,0)

Tỉ lệ :1

thì nó xuất hiện dòng báo lối như sau:

;error : bad argument type :numberp(50.0 0.0)

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 đã sửa nhưng mà vẫn không được.Chẳng hạn nhập vào :

Điểm đầu:P1(0,0,0)

Điểm cuối:P2(50,50,0)

Tỉ lệ :1

thì nó xuất hiện dòng báo lối như sau:

;error : bad argument type :numberp(50.0 0.0)

Chữ Điểm đầu:P1 nằm đâu trong đoạn mã trên của bạn?

 

Sở dĩ tôi hỏi vậy là vì tôi thắc mắc không hiểu trong dòng 'Điểm cuối:P2(50,50,0)' thì đâu là dòng nhắc lệnh, đâu là mã bạn nhập vào. Nhưng cho dù thế nào đi nữa, nhập liệu tọa độ điểm từ ACAD không bao cần có dấu ngoặc - nếu có dấu ngoặc là sai.

Nếu là nhập tọa độ, bạn chỉ cần nhập 0,0,0 hoặc pick điể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

À không.Ý em ở đây là :

Điểm đầu P1(0,0,0):nghĩa là khi nhập lệnh chiadt thì xuất hiện dòng nhắc:

Nhap diem dau cua doan thang:(click vào điểm P1)

Nhap diem cuoi cua doan thang:(click vào điểm P2)

Nhap ti le:1

thì xuất hiện dòng nhắc

; error: bad argument type: numberp: (50.0 0.0)

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.Ý em ở đây là :

Điểm đầu P1(0,0,0):nghĩa là khi nhập lệnh chiadt thì xuất hiện dòng nhắc:

Nhap diem dau cua doan thang:(click vào điểm P1)

Nhap diem cuoi cua doan thang:(click vào điểm P2)

Nhap ti le:1

thì xuất hiện dòng nhắc

; error: bad argument type: numberp: (50.0 0.0)

Bạn nhầm ở dòng mã gán Y, Z. Dòng lệnh đúng là:

(setq X1 (car P1)
[color="#0000FF"]Y1 (cdar P1);; hoac (car (cdr P1))
Z1 (caddr P1);; hoac (car (cdr (cdr P1)))[/color]
X2 (car P2)[color="#0000FF"]
Y2 (cadr P2)
Z2 (caddr cdr P2)[/color]
)

Vì (cdr '(X Y Z)) bằng '(Y Z) chứ không phải bằng Y

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âng cảm ơn anh.Em áy náy quá vì mình nhầm lỗi ngớ ngẩn như vậy.Em fát hiện ra lỗi xong lên mạng thì thấy anh trả lời rồi.

Em viết lại hoàn chỉnh lisp như sau:

(defun c:cdt (/ k)

(setq P1 (getpoint "\n Dua vao diem dau :")

P2 (getpoint "\n Dua vao diem cuoi :")

k (getreal "\n Nhap ti le :")

)

(if (/= k -1)

(progn

(setq

X1 (car P1)

Y1 (cadr P1)

Z1 (cadr (cdr P1))

X2 (car P2)

Y2 (cadr P2)

Z2 (cadr (cdr P2))

X3 (/ (+ (* k X2) X1) (1+ k ))

Y3 (/ (+ (* k Y2) Y1) (1+ k ))

Z3 (/ (+ (* k Z2) Z1) (1+ k ))

P3 (list X3 Y3 Z3)

)

(command "point" P3)

)

(progn

(princ "\n Ti le phai khac -1!")

(princ )

)

)

)

Có gì không ổn,mong mấy anh chỉ giáo cho em 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

Em muốn hỏi về sự khác nhau giữa (defun c: ) và (defun)

 

Chẳng hạn ta xem xét đoạn lisp sau:(của anh Nguyen Hoanh):

(defun pos (sub st / l1 l2 index)

(setq index 1

l1 (strlen sub)

l2 (strlen st)

)

(while (and (<= (+ index l1 -1) l2) (/= sub (substr st index l1)))

(setq index (1+ index))

)

(if (= sub (substr st index l1))

index

nil

)

)

 

Nhưng nếu ở dòng một em sửa thành

(defun c:pos (sub st / l1 l2 index)

 

thì khi thực hiện trong cad :

Không thể nhập theo dạng :pos st sub

Thế là thế nào ạ? hay là trong những trường hợp thế này thì không nên dùng 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
Em muốn hỏi về sự khác nhau giữa (defun c: ) và (defun)

 

Chẳng hạn ta xem xét đoạn lisp sau:(của anh Nguyen Hoanh):

(defun pos (sub st / l1 l2 index)

(setq index 1

l1 (strlen sub)

l2 (strlen st)

)

(while (and (<= (+ index l1 -1) l2) (/= sub (substr st index l1)))

(setq index (1+ index))

)

(if (= sub (substr st index l1))

index

nil

)

)

 

Nhưng nếu ở dòng một em sửa thành

(defun c:pos (sub st / l1 l2 index)

 

thì khi thực hiện trong cad :

Không thể nhập theo dạng :pos st sub

Thế là thế nào ạ? hay là trong những trường hợp thế này thì không nên dùng c:?

 

C:DEFUN là cách định nghĩa một hàm mà sau khi load được gọi như là một lệnh của AutoCAD, do vậy không thể truyền tham trị. Các tham trị hay tham biến sẽ được gọi truyền trong bản thân hàm.

DEFUN là cách định nghĩa hàm mà sau khi load sẽ được dùng bên trong một hàm khác

và cách gọi hàm giống như là một lệnh của LISP

(pos st sub)

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 muốn hỏi về sự khác nhau giữa (defun c: ) và (defun)

 

Chẳng hạn ta xem xét đoạn lisp sau:(của anh Nguyen Hoanh):

(defun pos (sub st / l1 l2 index)

(setq index 1

l1 (strlen sub)

l2 (strlen st)

)

(while (and (<= (+ index l1 -1) l2) (/= sub (substr st index l1)))

(setq index (1+ index))

)

(if (= sub (substr st index l1))

index

nil

)

)

 

Nhưng nếu ở dòng một em sửa thành

(defun c:pos (sub st / l1 l2 index)

 

thì khi thực hiện trong cad :

Không thể nhập theo dạng :pos st sub

Thế là thế nào ạ? hay là trong những trường hợp thế này thì không nên dùng c:?

Bạn tham khảo thêm ở đây:

http://www.cadviet.com/forum/index.php?showtopic=1032

Trong bài viết có phân tích tương đối cụ thể vấn đề này

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 em hỏi hàm logand làm việc thế nào ạ?

Help của Acad:

(logand [int int...])

Returns the result of the logical bitwise AND of a list of integers

Examples

Command: (logand 7 15 3)

3

 

Bạn phải có kiến thức về hệ đếm và các phép toán logic. Hàm logand làm việc như sau:

- Chuyển toàn bộ argument sang hệ nhị phân

- Thực hiện phép toán AND cho từng bit

- Trả về kết quả tổng hợp

 

Ví dụ trên:

7 = 0111

15 = 1111

3 = 0011

kQ: 0011 = 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
Cho em hỏi lệnh textbox dùng như thế nào ạ?

(textbox )???

Bạn xem ví dụ này:

(defun c:MTP ()
(defun moveone (ent p)
(setq tt (entget ent)
pt (cdr (assoc 10 tt))
gt (cdr (assoc 1 tt))
vt (vl-string-position (ascii ".") gt)
gtn (substr gt 1 (1+ vt))
ttn (subst (cons 1 gtn) (assoc 1 tt) tt)
vuong (textbox ttn)
p1 (car vuong)
p2 (cadr vuong)
dxl (- 0.0 (car p2))
dyl (- 0.0 (cadr p1))
dxt (- (car p) (car pt))
dyt (- (cadr p) (cadr pt))
dxg (+ dxt dxl)
dyg (+ dyt dyl)
xm (+ (car pt) dxg)
ym (+ (cadr pt) dyg)
pm (list xm ym (caddr pt))
tt (subst (cons 10 pm) (cons 10 pt) tt)
)
(entmod tt)
(entupd ent)
)
(princ "\nMove text point © CADViet.com")
(setq ss (ssget '((-4 . "(0 . "POINT")
(0 . "TEXT")
(-4 . "or>")
)
)
lstent (ss2ent ss)
lsttext nil
lstpoint nil
)
(foreach pp lstent
(if (= "POINT" (cdr (assoc 0 (entget pp))))
(setq
lstpoint (append lstpoint (list (cdr (assoc 10 (entget pp)))))
)
(if (vl-string-position (ascii ".") (cdr (assoc 1 (entget pp))))
(setq lsttext (append lsttext (list pp)))
)
)
)
(if (or (= (length lsttext) 0)
(= (length lstpoint) 0)
)
(princ "\nBan phai chon ca text co dau cham va point!")
(foreach ppt lsttext
(setq pmin nil
kcmin nil
)
(foreach ppp lstpoint
(if
(or (not pmin)
(> (setq tmp (distance ppp (cdr (assoc 10 (entget ppt)))))
kcmin
)
)
(setq pmin ppp
kcmin tmp
)
)
)
(moveone ppt pmin)
)
)
(princ)
)
(defun ss2ent(ss / sodt index lstent)
(setq
sodt (cond
(ss (sslength ss))
(t 0)
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)

(princ "\nMTP - free lisp from www.cadviet.com")
(vl-load-com)

Đây là đoạn mã có sử dụng hàm textbox, được viết theo yêu cầu của vbao tại: http://www.cadviet.com/forum/index.php?showtopic=1571

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
Help của Acad:

(logand [int int...])

Returns the result of the logical bitwise AND of a list of integers

Examples

Command: (logand 7 15 3)

3

 

Bạn phải có kiến thức về hệ đếm và các phép toán logic. Hàm logand làm việc như sau:

- Chuyển toàn bộ argument sang hệ nhị phân

- Thực hiện phép toán AND cho từng bit

- Trả về kết quả tổng hợp

 

Ví dụ trên:

7 = 0111

15 = 1111

3 = 0011

kQ: 0011 = 3

Xin chào cả nhà

Đọc bài viết của bác ssg, có mấy chổ mà Tue_NV chưa hiểu được về hàm logand. Xin các bác chỉ giúp

 

Command: (logand 7 15 3)

3

 

Hàm logand làm việc như sau:

1./ Chuyển toàn bộ argument sang hệ nhị phân

2./ Thực hiện phép toán AND cho từng bit

3./ Trả về kết quả tổng hợp

 

Ở bước 1 : Chuyển toàn bộ argument sang hệ nhị phân thì mình đã hiểu

Bước 2 và bước 3 thực sự là không hiểu lắm

 

Ví dụ trên:

7 = 0111

15 = 1111

3 = 0011

Đến đây mình đã hiểu. Nhưng tại sao kết quả trả về như dưới đây thì chưa hiểu lắm

kQ: 0011 = 3

Và mình ứng dụng hàm logand và logior trong những trường hợp nào? Thực sự là chưa hiểu lắm

Mong các bác chỉ giúp.

Tue_NV xin chân thành cảm ơ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
Xin chào cả nhà

Đọc bài viết của bác ssg, có mấy chổ mà Tue_NV chưa hiểu được về hàm logand. Xin các bác chỉ giúp

 

Command: (logand 7 15 3)

3

 

Hàm logand làm việc như sau:

1./ Chuyển toàn bộ argument sang hệ nhị phân

2./ Thực hiện phép toán AND cho từng bit

3./ Trả về kết quả tổng hợp

 

Ở bước 1 : Chuyển toàn bộ argument sang hệ nhị phân thì mình đã hiểu

Bước 2 và bước 3 thực sự là không hiểu lắm

 

Ví dụ trên:

7 = 0111

15 = 1111

3 = 0011

Đến đây mình đã hiểu. Nhưng tại sao kết quả trả về như dưới đây thì chưa hiểu lắm

kQ: 0011 = 3

Và mình ứng dụng hàm logand và logior trong những trường hợp nào? Thực sự là chưa hiểu lắm

Mong các bác chỉ giúp.

Tue_NV xin chân thành cảm ơn.

Chào bác Tue_NV,

Ví dụ của bác SSG là khá rõ rồi đó, bác có thể xem thêm ví dụ khác của help sẽ rõ hơn.

Mình tuy chưa hiểu rõ về ứng dụng của các hàm này, nhưng về nội dung hàm thì theo như bác SSG giải thích thì mình hiểu như sau:

Bước 1: như bác đã rõ

Bước 2: Bác thiết lập hàm and cho từng bit của các đối số. Cụ thể là:

- bit thứ nhất, bác có (and 0 1 0) trả về giá tri là 0

- bit thứ hai bác có (and 1 1 0) cũng trả về giá trị 0

- bit thứ ba bác có (and 1 1 1) trả về giá trị 1

- bit thứ tư bác có (and 1 1 1) cũng trả về giá trị 1

Bước 3: Lấy kết quả tổng hợp của cả bốn bit, bác có 0011

Chuyển sang giá trị số trong cơ số 10 bác có 0011 = 3

 

Xét tiếp ví dụ thứ hai của hàm (logand ...) trong help:

(logand 2 3 15) trả về giá trị 2 vì:

Bước 1: 2 = 0010; 3 = 0011 ; 15 = 1111

Bước 2:

- bit thư nhất: (and 0 0 1) trả về 0

- bit thứ hai : (and 0 0 1) trả về 0

- bit thứ ba: (and 1 1 1) Trả về 1

- bit thứ tư (and 0 1 1) Trả về 0

Bước 3 : Kết quả là 0010 = 2

 

Ví dụ 3: (logand 8 3 4) trả về giá trị 0. Bác kiểm lại nhé.

 

Tương tự cái hàm (logior ....) cũng được hiểu như hàm (logand ....) bác ạ, chỉ khác hàm logic lúc này là hàm OR mà thôi.

Tỷ như (logior 8 3 4) sẽ trả về giá trị 15. vì (or 1 0 0) trả về 1 chứ không phải 0.

 

Việc mình hiểu như vậy, nếu chưa đúng mong các bác chỉ dạy thêm.

Ứng dụng của nó thì thiệt tình mình thấy nó khá rậm rì rắc rối. Chỉ nguyên cái việc chuyển đổi hệ cơ số đã thấy muốn loạn đầu rồi nên chưa tìm hiểu kỹ được. Bác nào đã từng xài hãy cho một vài ví dụ ứng dụng để anh em có thêm cái hứng mà mót hỉ. Chớ mót về hổng xài e nó chiếm mất chỗ trong bộ nhớ, dễ làm chập IC lắm các bác hỉ......

Chúc bác và toàn thể anh em trên diễn đàn luôn mạnh và vui.

  • 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
Xin chào cả nhà

Đọc bài viết của bác ssg, có mấy chổ mà Tue_NV chưa hiểu được về hàm logand. Xin các bác chỉ giúp

 

Command: (logand 7 15 3)

3

 

Hàm logand làm việc như sau:

1./ Chuyển toàn bộ argument sang hệ nhị phân

2./ Thực hiện phép toán AND cho từng bit

3./ Trả về kết quả tổng hợp

 

Ở bước 1 : Chuyển toàn bộ argument sang hệ nhị phân thì mình đã hiểu

Bước 2 và bước 3 thực sự là không hiểu lắm

 

Ví dụ trên:

7 = 0111

15 = 1111

3 = 0011

Đến đây mình đã hiểu. Nhưng tại sao kết quả trả về như dưới đây thì chưa hiểu lắm

kQ: 0011 = 3

Và mình ứng dụng hàm logand và logior trong những trường hợp nào? Thực sự là chưa hiểu lắm

Mong các bác chỉ giúp.

Tue_NV xin chân thành cảm ơn.

Tue_NV tham khảo :

logand.jpg

  • 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


×