Đến nội dung


Hình ảnh

Hiệu Chỉnh File Lisp


  • Please log in to reply
41 replies to this topic

#21 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 21 September 2015 - 07:08 PM

thực sự người yêu cầu quá củ chuối. với y/cầu của bạn thì lệnh TCOUNT đã làm được rồi, @gia_bach đã đưa link để dùng lệnh TCOUNT nhưng bạn chẳng biết dùng

Khi @quocmanh04tt viết lisp thì không biết dùng, khi dùng được thì nói là đã đúng ý. Sau đó rồi đòi sắp xếp theo Y thì lại thêm sao nó không nhảy từ 0,1, 2, ....

Đến bây giờ "Khi chạy từ S09 thì phải chuyển sang S10(S08->S10), nhưng lsp lại chuyển từ S09 sang S010"

 

Các lisper không muốn sửa lisp đã viết theo các yêu cầu "sáng nắng, chiều mưa"


  • 0

#22 anti lazy

anti lazy

    biết lệnh erase

  • Members
  • PipPipPip
  • 107 Bài viết
Điểm đánh giá: 27 (tàm tạm)

Đã gửi 21 September 2015 - 08:16 PM

Yêu cầu củ chuối thì tôi đã thấy ngay từ đầu, nhưng đến bài #9 thì cũng đã tương đối rõ để lập trình nhưng bạn quocmanh04tt chưa có nhiều kinh nghiệm để giải quyết.

Để sửa lisp này chỉ cần học các hàm sau:

Số học: +  -  *  /  1+  1-
Số <=> chuỗi : itoa   atoi
Xử lý chuỗi: strcat   substr   strlen

Nhanh thì < 1h, chậm thì 4h là biết cách dùng, thêm < 1h thì sửa được, nếu có lỗi sẽ có người khác sửa.

Nếu không học thì suốt đời chỉ : Xin, xin nữa, xin mãi !!!!!!!

 

Ps: vì yêu cầu quá củ chuối nên chỉ trong 1 topic mà đã nhận được 10 dấu đỏ, tôi cũng không cho thêm vì đã quá đủ


  • 0

#23 Kieu Tan

Kieu Tan

    biết vẽ rectang

  • Members
  • PipPip
  • 87 Bài viết
Điểm đánh giá: -23 (kém)

Đã gửi 21 September 2015 - 08:18 PM

thực sự người yêu cầu quá củ chuối. với y/cầu của bạn thì lệnh TCOUNT đã làm được rồi, @gia_bach đã đưa link để dùng lệnh TCOUNT nhưng bạn chẳng biết dùng

Khi @quocmanh04tt viết lisp thì không biết dùng, khi dùng được thì nói là đã đúng ý. Sau đó rồi đòi sắp xếp theo Y thì lại thêm sao nó không nhảy từ 0,1, 2, ....

Đến bây giờ "Khi chạy từ S09 thì phải chuyển sang S10(S08->S10), nhưng lsp lại chuyển từ S09 sang S010"

 

Các lisper không muốn sửa lisp đã viết theo các yêu cầu "sáng nắng, chiều mưa"

"sáng nắng, chiều mưa" gì chứ? Có lẽ bạn tien2005 không hiểu vấn đề nên mới nói vậy thôi. Ý của mình là: mình có chuỗi số bất kì(1234, 2345, 3456, ...) bây giờ mình muốn nó tăng dần bắt đầu từ text đầu tiên mà mình nhập vào(vd: mình nhập chuỗi S08 thì nó phải tăng từ S08-> S10 hoặc mình nhập chuỗi S09 thì nó phải tăng từ S09-> S11) nghĩa là nó tăng lên 1 đơn vị tính từ text đầu tiên mà mình nhập vào. Có vậy thôi, còn dùng lệnh cad TCOUNT thì không chạy được theo yêu cầu này. 


  • 0

#24 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1432 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 22 September 2015 - 08:34 AM

"sáng nắng, chiều mưa" gì chứ? Có lẽ bạn tien2005 không hiểu vấn đề nên mới nói vậy thôi. Ý của mình là: mình có chuỗi số bất kì(1234, 2345, 3456, ...) bây giờ mình muốn nó tăng dần bắt đầu từ text đầu tiên mà mình nhập vào(vd: mình nhập chuỗi S08 thì nó phải tăng từ S08-> S10 hoặc mình nhập chuỗi S09 thì nó phải tăng từ S09-> S11) nghĩa là nó tăng lên 1 đơn vị tính từ text đầu tiên mà mình nhập vào. Có vậy thôi, còn dùng lệnh cad TCOUNT thì không chạy được theo yêu cầu này. 

Lisp này nếu tôi viết chắc chỉ trong vòng "ba nốt nhạc", cũng có thể là nó đã được viết đâu đó cách đây vài năm.

Nhưng tôi sẽ không viết (hay share) vì lệnh TCOUNT đã làm tốt yêu cầu này.

 

@ KIeu Tan : thay vì lao vào tranh cãi,  hãy tập trung vào việc tìm hiểu cách sử dụng lệnh TCOUNT cho nhuần nhuyễn.

 

đề : tạo 6 text có nội dung lần lượt là : KT08, KT09, KT10, KT11, KT12, KT13

gợi ý:

 - trước tiên tạo 2 text có nội dung giống nhau là KT0 (ba kí tự)

 - tiếp theo tạo 4 text có nội dung giống nhau là KT (hai kí tự)

 - gọi lệnh TCOUNT chọn 2 text có nội dung KT0, với các tùy chọn: 

 + Sort selected objects by [X/Y/Select-order] <Select-order>:  tùy ý

 + Specify starting number and increment (Start,increment) <1,1>: 8,1

 + Placement of numbers in text [Overwrite/Prefix/Suffix/Find&replace..] < Prefix>: s

 - tương tự cho 4 text có nội dung KT, với tùy chọn: Specify starting number and increment (Start,increment) <1,1>: 10,1

 - xóa các khoảng trắng (nếu cần)
To Admin: tại sao dòng trên không hiển thị ???
ảnh chụp 
15454_tcount.png
 

Bài viết đã được chỉnh sửa nội dung bởi gia_bach: 22 September 2015 - 08:43 AM

  • 1

#25 Kieu Tan

Kieu Tan

    biết vẽ rectang

  • Members
  • PipPip
  • 87 Bài viết
Điểm đánh giá: -23 (kém)

Đã gửi 22 September 2015 - 06:25 PM

 

Lisp này nếu tôi viết chắc chỉ trong vòng "ba nốt nhạc", cũng có thể là nó đã được viết đâu đó cách đây vài năm.

Nhưng tôi sẽ không viết (hay share) vì lệnh TCOUNT đã làm tốt yêu cầu này.

 

@ KIeu Tan : thay vì lao vào tranh cãi,  hãy tập trung vào việc tìm hiểu cách sử dụng lệnh TCOUNT cho nhuần nhuyễn.

 

đề : tạo 6 text có nội dung lần lượt là : KT08, KT09, KT10, KT11, KT12, KT13

gợi ý:

 - trước tiên tạo 2 text có nội dung giống nhau là KT0 (ba kí tự)

 - tiếp theo tạo 4 text có nội dung giống nhau là KT (hai kí tự)

 - gọi lệnh TCOUNT chọn 2 text có nội dung KT0, với các tùy chọn: 

 + Sort selected objects by [X/Y/Select-order] <Select-order>:  tùy ý

 + Specify starting number and increment (Start,increment) <1,1>: 8,1

 + Placement of numbers in text [Overwrite/Prefix/Suffix/Find&replace..] < Prefix>: s

 - tương tự cho 4 text có nội dung KT, với tùy chọn: Specify starting number and increment (Start,increment) <1,1>: 10,1

 - xóa các khoảng trắng (nếu cần)
To Admin: tại sao dòng trên không hiển thị ???
ảnh chụp 
15454_tcount.png

 

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. 


  • 0

#26 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 22 September 2015 - 06:45 PM

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.


  • 1

#27 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 22 September 2015 - 08:28 PM

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?
  • 1

#28 Kieu Tan

Kieu Tan

    biết vẽ rectang

  • Members
  • PipPip
  • 87 Bài viết
Điểm đánh giá: -23 (kém)

Đã gửi 22 September 2015 - 10:03 PM

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 ....)


  • -1

#29 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 22 September 2015 - 10:23 PM

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 ? :)


  • 0

#30 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 22 September 2015 - 10:29 PM

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à.


  • 0

#31 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 22 September 2015 - 10:32 PM

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))

  • 1

#32 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 22 September 2015 - 11:38 PM

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



  • 0

#33 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 22 September 2015 - 11:47 PM

 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 đề.


  • 0

#34 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 22 September 2015 - 11:47 PM

Chắc phải lấy p1 thế này :) :

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

(setq p2 (getvar 'lastpoint))


  • 0

#35 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 22 September 2015 - 11:56 PM

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.


  • 0

#36 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 23 September 2015 - 12:09 AM

Chắc là đúng :wub: :

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

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


  • 0

#37 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 665 Bài viết
Điểm đánh giá: 312 (khá)

Đã gửi 23 September 2015 - 12:19 AM

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 à .


  • 0

#38 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 23 September 2015 - 08:39 AM

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 à .


  • 0

#39 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 23 September 2015 - 08:47 AM

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.c...5/127397_td.rar


  • 2

#40 Kieu Tan

Kieu Tan

    biết vẽ rectang

  • Members
  • PipPip
  • 87 Bài viết
Điểm đánh giá: -23 (kém)

Đã gửi 23 September 2015 - 06:36 PM

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.c...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). 


  • -2