Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
Kieu Tan

Hiệu Chỉnh File Lisp

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

Thanks bạn gia_bach lệnh nhưng TCOUNT hạn chế là nó không tăng dần theo chiều ta muốn(từ trên xuống hay từ dưới lên), với lại khi ta muốn nó tăng từ KT08->KT11 thì ta phải nhập kí tự đầu là KT

Vd mình có hàng loạt kí tự bất kì( 0135, bicf, 2578, ABCD) bây giờ mình muốn nó tăng từ KT08->KT11 thì thủ công lắm

Bạn gia_bach hỗ trợ mình "ba nốt nhạc" đi. 

Khi nào rãnh tôi sẽ 4 giải quyết cái củ chuối này cho bạn cho hoàn chỉnh :) . Trong khi chờ đợi thì Bạn hãy tìm bài hát "Đợi chờ là hạnh phúc"

để thư giãn đi nha :D.

  • 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 Kieu Tan sử dung cái này xem sao:


(defun c:td  (/ ss str n pt1 pt2 i k)

  (prompt "\Chon Text!")

  (if (and (setq pt1 (getpoint "\nDiem thu nhat: "))

           (setq pt2 (getcorner "\nDiem thu hai: " pt1))

           (setq ss (ssget "_W" pt1 pt2 '((0 . "*TEXT")))))

    (progn ((lambda (i) (while (/= nil (setq e (ssname ss (setq i (1+ i))))) (redraw e 3))) -1)

           (setq str (getstring "\nNhap chuoi: "))

           (initget 4)

           (or (setq n (getint "\nSo KH dau <1>: ")) (setq n 1))

           (initget 6)

           (or (setq k (getint "\nBuoc nhay <1>: ")) (setq k 1))

           (setq ss (vl-sort (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))

                             '(lambda (x y) (> (cadr (cdr (assoc 10 (entget x)))) (cadr (cdr (assoc 10 (entget y))))))))

           (if (< (cadr pt1) (cadr pt2))

             (setq ss (reverse ss)))

           (foreach e  (mapcar 'vlax-ename->vla-object ss)

             (vla-put-textstring e

                                 (strcat str

                                         (if (< n 10)

                                           "0"

                                           "")

                                         (itoa n)))

             (setq n (+ n k)))))

  (princ))​

Sử dung:

+ Nhập chuỗi phần đầu, phần đuôi lisp tự thêm vào 01; 02 ; 03 ....

+ Quét chọn text từ trên xuống thì thứ tự từ trên xuống và ngược lại.

+ So KH dau: nhập là 2 thì phần đuôi có ký tự bắt đầu là 02... ( Nếu giá trị < 10 thì thêm số 0)

+ Buoc nhay: giá trị cộng thêm của các text tiếp theo...

P/s: Qua đây bác nào có ghé qua cho em hỏi: Có cách nào lấy được tọa độ 2 điểm góc vùng chọn của hàm ssget mà không phải dùng pt1, pt2 và ssget "_W" như ở trên không?

  • 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 Kieu Tan sử dung cái này xem sao:


(defun c:td  (/ ss str n pt1 pt2 i k)

  (prompt "\Chon Text!")

  (if (and (setq pt1 (getpoint "\nDiem thu nhat: "))

           (setq pt2 (getcorner "\nDiem thu hai: " pt1))

           (setq ss (ssget "_W" pt1 pt2 '((0 . "*TEXT")))))

    (progn ((lambda (i) (while (/= nil (setq e (ssname ss (setq i (1+ i))))) (redraw e 3))) -1)

           (setq str (getstring "\nNhap chuoi: "))

           (initget 4)

           (or (setq n (getint "\nSo KH dau <1>: ")) (setq n 1))

           (initget 6)

           (or (setq k (getint "\nBuoc nhay <1>: ")) (setq k 1))

           (setq ss (vl-sort (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))

                             '(lambda (x y) (> (cadr (cdr (assoc 10 (entget x)))) (cadr (cdr (assoc 10 (entget y))))))))

           (if (< (cadr pt1) (cadr pt2))

             (setq ss (reverse ss)))

           (foreach e  (mapcar 'vlax-ename->vla-object ss)

             (vla-put-textstring e

                                 (strcat str

                                         (if (< n 10)

                                           "0"

                                           "")

                                         (itoa n)))

             (setq n (+ n k)))))

  (princ))​

Sử dung:

+ Nhập chuỗi phần đầu, phần đuôi lisp tự thêm vào 01; 02 ; 03 ....

+ Quét chọn text từ trên xuống thì thứ tự từ trên xuống và ngược lại.

+ So KH dau: nhập là 2 thì phần đuôi có ký tự bắt đầu là 02... ( Nếu giá trị < 10 thì thêm số 0)

+ Buoc nhay: giá trị cộng thêm của các text tiếp theo...

P/s: Qua đây bác nào có ghé qua cho em hỏi: Có cách nào lấy được tọa độ 2 điểm góc vùng chọn của hàm ssget mà không phải dùng pt1, pt2 và ssget "_W" như ở trên không?

Thanks bạn quocmanh04tt nhiều lắm! Bạn là người rất nhiệt tình, tuy nhiên:

1/ Nếu lsp này cải thiện được ở chỗ(nếu ta nhập đầu vào là text bất kì thì lsp sẽ cho chuỗi text ta quét chuột qua sẽ tăng lên tính từ text đó) thì quá là ok. 

Vd: ta có dãy số 123, s01, 08200, ... sau đó gõ lệnh td rồi quét chuột qua tất cả các text này và nhập vào là S04 thì ta có S04->S06 hoặc ta nhập vào là S4 thì ta có S4->S6

2/ Nếu sửa được chỗ này thì ta có thể cho tăng từ S04->S06 hoặc từ S4->S6(chứ không phải lúc nào cũng là S04->S06). Các số mặc định là 01, 02, 03, .. ở cuối mỗi text cũng hơi bất tiện( phần đuôi lisp tự thêm vào 01; 02 ; 03 ....)

  • Vote giảm 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 Kieu Tan sử dung cái này xem sao:


(defun c:td  (/ ss str n pt1 pt2 i k)

  (prompt "\Chon Text!")

  (if (and (setq pt1 (getpoint "\nDiem thu nhat: "))

           (setq pt2 (getcorner "\nDiem thu hai: " pt1))

           (setq ss (ssget "_W" pt1 pt2 '((0 . "*TEXT")))))

    (progn ((lambda (i) (while (/= nil (setq e (ssname ss (setq i (1+ i))))) (redraw e 3))) -1)

           (setq str (getstring "\nNhap chuoi: "))

           (initget 4)

           (or (setq n (getint "\nSo KH dau <1>: ")) (setq n 1))

           (initget 6)

           (or (setq k (getint "\nBuoc nhay <1>: ")) (setq k 1))

           (setq ss (vl-sort (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))

                             '(lambda (x y) (> (cadr (cdr (assoc 10 (entget x)))) (cadr (cdr (assoc 10 (entget y))))))))

           (if (< (cadr pt1) (cadr pt2))

             (setq ss (reverse ss)))

           (foreach e  (mapcar 'vlax-ename->vla-object ss)

             (vla-put-textstring e

                                 (strcat str

                                         (if (< n 10)

                                           "0"

                                           "")

                                         (itoa n)))

             (setq n (+ n k)))))

  (princ))​

Sử dung:

+ Nhập chuỗi phần đầu, phần đuôi lisp tự thêm vào 01; 02 ; 03 ....

+ Quét chọn text từ trên xuống thì thứ tự từ trên xuống và ngược lại.

+ So KH dau: nhập là 2 thì phần đuôi có ký tự bắt đầu là 02... ( Nếu giá trị < 10 thì thêm số 0)

+ Buoc nhay: giá trị cộng thêm của các text tiếp theo...

P/s: Qua đây bác nào có ghé qua cho em hỏi: Có cách nào lấy được tọa độ 2 điểm góc vùng chọn của hàm ssget mà không phải dùng pt1, pt2 và ssget "_W" như ở trên không?

Có phải ý bạn muốn nói dùng hàm (ssget) quét chọn các objs thì làm sao xác định điểm p1 p2 khi pick quét ? :)

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 tham khảo :) :

(setq lst (mapcar 'cadr (ssnamex (ssget))) ss (vl-remove-if 'listp lst))

(setq p1 (car (cdr (last lst)))) (setq p2 (getvar 'lastpoint))
  • 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

Vâng, đúng như vậy bác pphung183 ạ. Mục đích để so sánh tọa độ 2 điểm khi quét chọn từ dưới lên hay trên xuống mà.

Dường như p1 chưa đúng lắm :D ,

Lấy

(setq lst (ssnamex (ssget)))  thì lấy p1 nó trong đó :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

 Em thử mãi,nghiên cứu mãi mà chưa ra, ở cái trước p1 luôn có Ymax mặc dù chọn từ trên xuống hay dưới lên. Còn P2 nó là biến lastpoint, nên nó phụ thuộc nhiều vấ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

Vẫn không được bác ạ . P2 nó phụ thuộc vào lần pick cuối cùng ( nếu vẽ 1 đối tượng nào đó trước khi quét chọn ngoài vùng chọn ???), còn P1 nó không phụ thuộc vào pick trước hay sau (thứ tự 2 điểm pick vùng chọn).

*** ý của em là pick lần 1 phải là P1, pick lần 2 phải là P2.

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ắc là đúng :wub: :

(setq lst (ssnamex (ssget)))   (setq p1 (cadr (last (cdr (last lst)))))

(setq p2 (cadr (cadr (cdr (last lst)))))

Xác định được 2 điểm, nhưng mà 2 điểm này không xác định được quét từ trên xuống hay dưới lên, nó chỉ xác định được vùng chọn thôi bá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

Ek :unsure: ... Xem như đã xác định 4 điểm a; b; c; d của vùng chọn. Lúc này là tư duy rồi -_- .

Quét từ trái qua thì (= 2 (car (car lst)))     (chưa xét điểm pick quét từ trên xuống hay từ dưới lên)

Quét từ phải qua thì  (= 3 (car (car lst)))     (chưa xét điểm pick quét từ trên xuống hay từ dưới lên)

Dùng hàm cond cho 4 trường hợp là xong :)

 

Xác định được 2 điểm, nhưng mà 2 điểm này không xác định được quét từ trên xuống hay dưới lên, nó chỉ xác định được vùng chọn thôi bá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

To Kieu Tan :

Giải quyết củ chuối của bạn đây! Lisp chỉ thay đổi 2 kí tự cuối cùng của chuỗi khi nhập; bắt nó thay đổi kí tự thứ 3 thì tự động nó la làng  :D 

http://www.cadviet.com/upfiles/5/127397_td.rar

  • 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

To Kieu Tan :

Giải quyết củ chuối của bạn đây! Lisp chỉ thay đổi 2 kí tự cuối cùng của chuỗi khi nhập; bắt nó thay đổi kí tự thứ 3 thì tự động nó la làng  :D

http://www.cadviet.com/upfiles/5/127397_td.rar

1/ Nói chung lsp này cũng đã giải quyết 80% công việc của mình(20% phải sửa lại bằng tay nếu như ta muốn tăng từ S3->S6 (nếu như ta có các dãy số 123, 234, s1, ...))->80% tự động + 20% thủ công = giống như thủ công.

2/ Lsp cũng hơi bất tiện khi phải apload file*fas vì có nhiều file lsp trong thư mục AUTOLISP(nếu coppy qua máy khác thì phải coppy nhiều file đi-> khởi động cad chậm). 

3/ Mình thì không biết viết lsp mà chỉ biết sử sụng thôi, mình lập tiêu đề này thấy cũng có nhiều người quan tâm vấn đề này(chắc có lẽ để tham khảo, học hỏi). Thấy bạn cũng chia sẽ để mọi người cùng biết vấn đề này, nhưng lại xuất hiện file *fas ở đây cũng hơi bất ngờ về bạn đó(lại là vấn đề bản quyền). 

  • Vote giảm 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

Ek :unsure: ... Xem như đã xác định 4 điểm a; b; c; d của vùng chọn. Lúc này là tư duy rồi -_- .

Quét từ trái qua thì (= 2 (car (car lst)))     (chưa xét điểm pick quét từ trên xuống hay từ dưới lên)

Quét từ phải qua thì  (= 3 (car (car lst)))     (chưa xét điểm pick quét từ trên xuống hay từ dưới lên)

Dùng hàm cond cho 4 trường hợp là xong :)

Danh sách điểm trả về là 4 điểm của vùng chọn.

Tuy nhiên:

+ Thứ tự của 4 điểm này bắt đầu là điểm TopLeft, TopRight, BottomRight cuối cùng là BottomLeft (quay theo chiều kim đồng hồ). <=>(Luôn là như vậy không phục thuộc kiểu quét).

+ (car (car lst)) bằng  2 hoặc 3 (ở đây chỉ ra kiểu chọn là cross hay window - Hay là từ trái hoặc phải) - Theo em hiểu là vậy.

 *** => Như vậy dùng hàm cond bằng cách nào (nghĩ không ra). Không biết bác có cách nào không ???

*** Cách giải quyết của em là dùng thêm Grread. Code để test:


(defun c:tt  (/ lst Pe p1 p2 M-Text)

  (defun M-Text  (pt str)

    (entmakex

      (list (cons 0 "MTEXT") (cons 100 "AcDbEntity") (cons 100 "AcDbMText") (cons 10 pt) (cons 1 str))))

  (if (and (setq lst (cdr (last (ssnamex (ssget)))))

           (setq Pe (cadr (grread T 15 0)))

           (setq lst (vl-sort lst '(lambda (x y) (< (distance (cadr x) pe) (distance (cadr y) pe))))))

    (progn (setq P1 (cadr (last lst))

                 P2 (cadr (car lst)))

           (M-Text p1 "P1")

           (M-Text p2 "P2")))

  (princ))

P/s: Tuy nhiên với kiểu chọn Polygon thì không chuẩ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

Mình chỉ gợi ý thôi ...

(car (car lst)) bằng 2 thì chắc chắn là quét chọn từ trái qua phải. 4 điểm a, b, c, d trong lst thì lúc này chì đặt vấn đề

là làm sao biết trong b và c điểm nào là p2? Rõ ràng là ko có cơ sở nào để xác định nó nếu ko có một điểm trung gian nhằm xác định

p2 khi pick góc chọn thứ 2. Từ đó thì suy ra chì cần xác đinh p2 từ 1 điểm trung gian là mấu chốt. Bạn đã giải quyết tốt bài toán

thông qua điểm trung gian pe. Tuy nhiên chú ý pe là điểm theo con trỏ chuột, do đó nếu chọn góc pick p2 xong mà kéo nó đi chỗ khác rồi Enter thì KQ cũng chuối luôn.

kiêu Polygon (ssget "_WP" pt_list) làm sao giống với (ssget "_W" p1 p2) mà đòi chuẩn hả bạn???

Ps : Mạng bị gì mà vào Cadviet Lag quá !!!

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  

×