![](https://www.cadviet.com/forum/uploads/set_resources_1/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://www.cadviet.com/forum/uploads/monthly_2022_07/T_member_178294.png)
tannguyen291
-
Số lượng nội dung
449 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
43
Bài đăng được đăng bởi tannguyen291
-
-
Mình thích dùng cái này hơn:
Đang vẽ pline được hơn chục điểm rồi mới nhớ ra bật thiếu loại bắt điểm lại phải thoát ra bật thêm.
Có cái này chỉ việc bấm Shift + F là tiếp tục vẽ pline tiếp lệnh pline không hề dừng lại. :)
-
4 giờ trước, ketxu đã nói:Dùng visual lisp để đọc ký tự Unicode thì khó rồi ^
Ở cad đời cao nếu chuyển LISPSYS qua 1 và chỉ dùng Clipboard không thông qua file csv thì được ạ
-
Nội dung của bạn khá sơ sài. mình k rõ đối tượng bạn muốn xử lý là gì. nhưng có lẽ bạn cần 1 lisp để hoạt động.
Có thể liên hệ với mình qua sđt, zalo 0395218999
-
Nhờ Viết LISP
trong AutoLisp
Của bạn nhé.
Lisp của mình không chạy với DIMALIGNED nhưng có thể chạy với toàn bộ bản vẽ.
Có thể liên lạc với mình trong inbox hoặc sđt 0395218999
-
37 phút trước, ketxu đã nói:Có lẽ là nên check giao nhau trước khi thực hiện các phép copy, boolean ^^
Không cần ạ. chỉ cần không xoá đối tượng đấy về sau là oke ạ.
(defun c:IRM (/ ent ss x enx) (setq ent (car (entsel "\nSelect region A")) ss (ssget (list '(0 . "REGION") '(-4 . "<NOT") (assoc 8 (entget ent)) '(-4 . "NOT>"))) ent (vlax-ename->vla-object ent) ss (mapcar 'vlax-ename->vla-object (acet-ss-to-list ss)) ) (foreach item ss (vla-boolean (setq enx (vla-copy item)) acintersection (vla-copy ent)) (if (equal 0 (vla-get-area enx) 1e-8) (setq ss (vl-remove item ss)) ) ) (initget 1 "Yes No") (setq x (getkword "Are delele region old? [Yes/No] <Yes> ")) (if (eq "Yes" x) (mapcar 'vla-delete (cons ent ss)) ) (princ) )
-
Bản full option gửi anh em nhé.
Có sử dụng thêm List Box with Filter của cụ lee.
http://www.lee-mac.com/filtlistbox.html
anh em dùng cái này nhé
(defun c:cfst (/ doc sty font lst system) (setq doc (vla-get-activedocument (vlax-get-acad-object)) sty (vla-get-textstyles doc) system (strcat (getenv "systemroot") "\\Fonts") font (vl-directory-files (vl-string-translate "/" "\\" system) nil 1) font (vl-remove-if-not '(lambda (x) (vl-string-search "TTF" (strcase x))) font) ) (vlax-for s sty (setq lst (cons (vla-get-name s) lst))) (if (and (setq lst (LM:filtlistbox "Select Style" lst t)) (setq font (car (LM:filtlistbox "Select Font" font nil))) (setq font (strcat system "\\" font)) ) (foreach item lst (vla-put-fontfile (vla-item sty item ) font) ) ) (vla-regen doc acActiveViewport) (princ) ) (defun LM:filtlistbox ( msg lst mtp / _addlist dch dcl des rtn sel tmp ) (defun _addlist ( key lst ) (start_list key) (foreach x lst (add_list x)) (end_list) lst ) (if (and (setq dcl (vl-filename-mktemp nil nil ".dcl")) (setq des (open dcl "w")) (write-line (strcat "filtlistbox : dialog { label = \"" msg "\"; spacer;" ": list_box { key = \"lst\"; width = 50; fixed_width = true; height = 15; fixed_height = true; allow_accept = true; " "multiple_select = " (if mtp "true" "false") "; }" ": edit_box { key = \"flt\"; width = 50; fixed_width = true; label = \"Filter:\"; }" "spacer; ok_cancel; }") des) (not (close des)) (< 0 (setq dch (load_dialog dcl))) (new_dialog "filtlistbox" dch) ) (progn (_addlist "lst" (setq tmp lst)) (set_tile "lst" (setq rtn "0")) (set_tile "flt" "*") (action_tile "lst" "(setq rtn $value)") (action_tile "flt" (vl-prin1-to-string '(progn (setq flt (strcat "*" (strcase $value) "*") sel (mapcar '(lambda ( n ) (nth n tmp)) (read (strcat "(" rtn ")"))) ) (_addlist "lst" (setq tmp (vl-remove-if-not '(lambda ( x ) (wcmatch (strcase x) flt)) lst))) (set_tile "lst" (setq rtn (vl-string-trim "()" (vl-princ-to-string (cond ((vl-sort (vl-remove nil (mapcar '(lambda ( x ) (vl-position x tmp)) sel)) '<))('(0))))))) ))) (setq rtn (if (= 1 (start_dialog)) (mapcar '(lambda ( x ) (nth x tmp)) (read (strcat "(" rtn ")"))))) ) ) (if (< 0 dch) (setq dch (unload_dialog dch))) (if (and (= 'str (type dcl)) (findfile dcl)) (vl-file-delete dcl)) rtn )
-
1
-
-
-
Nhờ Viết LISP
trong AutoLisp
Mình có thể sửa thêm để không cần nhập kích thước, k cần chọn phương thức trên dưới trái phải. tuy nhiên bạn cần hiểu vài việc:
1. Bạn cần gửi bản vẽ lên.
2. Toàn bộ dim của bạn có phải cùng 1 dimstyle hay không, kích thước text có giống nhau k.
3. Việc chọn toàn bộ cả bản vẽ là việc bất khả thi. Chỉ có thể chọn từng vùng nhỏ cho một loại hình nhất định.
-
Nhờ Viết LISP
trong AutoLisp
Mình viết tàm tạm được 1 cái. nhưng không tự động đâu. bạn quét chọn rồi nhập khoảng cách, chọn phương thức sắp xếp. tự động khó Vler :))
(defun c:SD (/ ss dis case lstdim i pt space enx toado ) (setq ss (acet-ss-to-list (ssget '((0 . "DIMENSION")))) dis (getdist "\nDistance") ) (initget "Right Left Up Down") (if (not (setq case (getkword "\nSelect function sort! [Right/Left/Up/Down] <Down>"))) (setq case "Down") ) (setq lstdim (sortdim_xtd ss case (/ dis 6)) i 0 pt (cdr (assoc 10 (entget (caar lstdim)))) ) (if (vl-string-search case "Down,Left") (setq dis (- dis))) (if (vl-string-search case "Down,Up") (progn (setq pt (cadr pt)) (foreach item lstdim (setq space (+ pt (* i dis))) (foreach pair item (setq enx (assoc 10 (entget pair)) toado (list 10 (cadr enx) space 0) ) (entmod (subst toado enx (entget pair))) ) (setq i (1+ i)) ) ) (progn (setq pt (car pt)) (foreach item lstdim (setq space (+ pt (* i dis))) (foreach pair item (setq enx (assoc 10 (entget pair)) toado (list 10 space (caddr enx) 0) ) (entmod (subst toado enx (entget pair))) ) (setq i (1+ i)) ) ) ) (princ ) ) (defun sortdim_xtd (lst key fuzz / lst1 lst2 p1 p2 case1 case2 ) (setq case1 (if (vl-string-search key "Down,Up") 'cadr 'car) case2 (if (vl-string-search key "Down,Left") '> '<) ) (while (car lst) (setq lst1 (list (car lst)) p1 (cdr (assoc 10 (entget (car lst)))) lst (cdr lst) ) (foreach item lst (setq p2 (cdr (assoc 10 (entget item)))) (if (equal (apply case1 (list p1)) (apply case1 (list p2)) fuzz) (setq lst1 (cons item lst1) lst (vl-remove item lst) ) ) ) (setq lst2 (cons lst1 lst2)) ) (vl-sort lst2 '(lambda (a b / c d) (setq c (cdr (assoc 10 (entget (car a)))) d (cdr (assoc 10 (entget (car b)))) ) (apply case2 (list (apply case1 (list c)) (apply case1 (list d)))) ) ) )
Lisp khó thế này mà không có Cà phê uống thì tiếc nhỉ. :))
-
Nhờ Viết LISP
trong AutoLisp
Lisp này khó vãi chấy. Có quá nhiều khả năng. đề bài của bạn thì k đầy đủ. thôi mình ngồi đây lót dép hóng. chứ ngồi viết ra cái này bở hơi tai. :__
-
1
-
-
mình có 1 lisp hay dùng để chuyển style toàn bộ bản vẽ về 1 font mong muốn.
Ví dụ mình thích dùng arial thì nhập: arial.ttf
sau đó toàn bộ bản vẽ sẽ chuyển qua arial.
các bạn có thể dựa vào đoạn mã của mình để tuỳ chỉnh. :))
(defun c:cfst (/ doc sty address) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object)) sty (vla-get-textstyles doc) address (strcat "C:\\Windows\\Fonts\\" (getstring "\nName Font:")) ) (vlax-for s sty (vla-put-fontfile s address)) (vla-regen doc acActiveViewport) (princ) )
-
1
-
1
-
-
Bạn cần chuyển 2 file về cùng 1 biến trước khi copy hatch từ file này qua file khác. đối tượng của bạn đã lỗi tại bản vẽ đó rồi thì việc chuyển MEASUREMENT vô dụng. bạn nên tạo templet chuẩn để dùng sau này.
-
Vào lúc 4/3/2023 tại 14:36, hungmining đã nói:Có lấy cad 2008 không? Mình thấy 2008 ổn định hơn 2007 nhiều.
Haha mình thấy 2023 rất ổn định. :)) chạy hơi chậm 1 chút nhưng chưa thấy lỗi phát nào. :))
-
Variable MEASUREMENT không đồng nhất thôi. 2 bản vẽ để cùng 0 hoặc 1 là được.
-
50 phút trước, Doan Van Ha đã nói:Donate cũng khó nhỉ!
:)) haha tại code cũng hơi ngắn nên em nói vậy thôi chứ k định nhận donate. Bác chủ thớt thiện chí thật :))
-
Nếu bạn muốn gửi mình ly cà phê thì có thể inbox nha. :D
Lệnh IRM: chọn region A. rồi quét chọn toàn bộ. (lisp tự bỏ qua layer của region A)
Lưu ý vì đặc tính của intersect nên nếu region X và region A không có giao nhau. region X sẽ bị xoá. Bạn không nên chọn các region không giao nhau với region A.
(defun c:IRM (/ ent ss x) (setq ent (car (entsel "\nSelect region A")) ss (ssget (list '(0 . "REGION") '(-4 . "<NOT") (assoc 8 (entget ent)) '(-4 . "NOT>"))) ent (vlax-ename->vla-object ent) ss (mapcar 'vlax-ename->vla-object (acet-ss-to-list ss)) ) (foreach item ss (vla-boolean (vla-copy item) acintersection (vla-copy ent)) ) (initget 1 "Yes No") (setq x (getkword "Are delele region old? [Yes/No] <Yes> ")) (if (eq "Yes" x) (mapcar 'vla-delete (cons ent ss)) ) (princ) )
-
Vào lúc 30/12/2022 tại 12:11, NTHAHT đã nói:Như vậy có thể dùng lọc tuỳ chỉnh. không quá khó đâu bạn
(defun BoundaryAreaPoint (pt / ent lst area ss) (setq ent (entlast) ss (ssget "All" '((0 . "............")) ;;;>>>>> đối tượng muốn lọc <<<<<;;;;;; ) (vl-cmdf "_.boundary" "A" "B" "N" ss "" "I" "Y" "O" "R" "X" pt "") (while (setq ent (entnext ent)) (setq lst (cons (vlax-ename->vla-object ent) lst)) ) (if (< 1 (length lst)) (progn (setq lst (vl-sort lst '(lambda (a b) (> (vla-get-area a) (vla-get-area b))))) (foreach item (cddr lst) (vla-boolean (cadr lst) acunion item) ) (vla-boolean (car lst) acsubtraction (cadr lst)) ) ) (setq area (vla-get-area (CAR lst))) (LIST area (CAR lst)) )
-
20 giờ trước, snowman.hms đã nói:- Nếu đường cong cần tìm là đường tròn, và nếu điểm tiếp xúc với đường thẳng là điểm cuối (A)
thì
+ tâm đường cong cần tìm nằm trên đường thẳng tại A và vuông góc với đoạn thẳng cho trước
+ khoảng cách từ tâm đường tròn cần tìm (O1) đến tâm đường tròn cho trước = khoảng cách từ điểm đó đến điểm A1 (offset theo cùng hướng một khoảng đúng bằng bán kính đường tròn cho trước)
+ tâm đường tròn cần tìm là giao điểm giữa đường trung trực của OA1 và AA1.
Vâng đây là một kết quả chính xác ạ. ngoài ra có thể dùng lisp để tính toạ độ theo phương trình đường tròn tuy nhiên khá phức tạp.
còn 1 cách khác. sử dụng parametric với các ứng dụng Constrain cũng là một lựa chọn tốt
-
Haha. bạn cứ chăm chỉ vote tăng cho mình là vui lắm rồi. :))
-
1
-
1
-
-
Bạn dùng lisp mình viết xem sao. lisp kia nhìn hơi quê. Lệnh MLE nhé
(defun c:MLE (/ ss i obj lst1 p1 p2) (setq ss (ssget '((0 . "*POLYLINE")))) (repeat (setq i (sslength ss)) (setq i (1- i) obj (vlax-ename->vla-object (ssname ss i)) lst1 (vlax-safearray->list (vlax-variant-value (vla-explode obj))) lst1 (vl-sort lst1 '(lambda (a b) (> (vlax-curve-getDistAtParam a (vlax-curve-getEndParam a)) (vlax-curve-getDistAtParam b (vlax-curve-getEndParam b))))) p1 (vlax-3d-point (vlax-curve-getstartpoint (car lst1))) p2 (vlax-3d-point (vlax-curve-getendpoint (car lst1))) ) (mapcar 'vla-delete lst1) (vla-Mirror obj p1 p2) (vla-delete obj) ) (princ) )
-
1
-
-
4 phút trước, Doan Van Ha đã nói:Bạn tannguyen291 nên edit lại đề cho rõ ràng hơn: "đường cong" là bất kỳ kiểu curve vào hay chỉ đường tròn? và điểm tiếp tuyến là bất kỳ trên line hay endpoint của line?
oke bác. :)
-
12 giờ trước, 7o7 đã nói:Chắc lâu qúa chẳng tìm được link cũ, thôi bác thớt cứ giải luôn cho xong.
Tôi cũng xin góp ý cách tìm tâm đg tròn tiếp tuyến :
- vẽ đg thẳng góc với đg thẳng từ tâm vòng tròn, đó là bk vt tiếp tuyến
- vẽ đg song song với đg thẳng từ tâm vòng tròn
từ các yếu tố trên suy ra tâm đg tròn tiếp tuyến.
đường cong của bác tuy đạt yếu tố tiếp tuyến nhưng chưa đạt yêu cầu ạ. điểm tiếp tuyến là điểm cuối trên đoạn thẳng. bác thử nghĩ thêm xem sao nhé
-
7 phút trước, Doan Van Ha đã nói:Trong chuyên mục "[Hỏi] Đố vui với lisp" đã có câu đố này
ô vậy ạ. quê quá. tại em k biết có bài này rồi. Bác có link không ạ. cho em xem mọi người giải ntn có giống em không ạ
-
Có một bài toán nhỏ vui vẻ cho các anh em. bất kể dùng hình học, toạ độ, lisp.
Làm sao để vẽ cung tròn tiếp tuyến với đoạn thẳng tại điểm cuối của đoạn thẳng đó. tiếp tuyến với đường tròn tại điểm phù hợp.
Có thêm 1 ví dụ cho anh em xem:
Em xin trợ giúp tìm lớp hatch chồng nhau
trong AutoLisp
Đã đăng · Trả lời báo cáo
Mình đã từng viết lisp cho hạng mục này nhưng với file nặng rất dễ bị treo máy. (vẫn còn lisp)
cách đơn giản nhất là bạn chọn tất cả hatch gõ
HATCHGENERATEBOUNDARY
xóa hết hatch đi. hatch lại bằng hatch selection
thủng chỗ nào biết ở đấy.
đơn giản và hiệu quả nhất. :)