Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
pbellh

Nhờ Chỉnh Sửa Lisp Nối Text Cao Độ

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

Mình có down lisp này từ diễn đàn, nội dung của nó là nối các cặp chữ số lại với nhau ngăn cách bởi dấu “.” tạo thành các text cao độ, với điều kiện xét  khoảng cách giữa 2 text ( insertion ) với tham số d do mình nhập vào, nhưng khi mình chọn = d thì thấy nó chạy không đúng, < d cũng đôi lúc chạy không đúng luôn. Mong các cao thủ sửa giúp ạ. Mình xin cảm ơn

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/topic/65194-yeu-cau-lisp-noi-text-tu-dong/
(defun c:test(/ lstObj d ans ins! tObj tam isFound lstObj lstRs)
(setq lstObj (mapcar 'vlax-ename->vla-object (acet-ss-to-list (ssget (list (cons 0 "*TEXT")))))
  d (getdist "\nKhoang cach :")
  ans (getstring "\n<=d hay =d ? [<] :")
)
(defun ins!(e)(vlax-get e 'Insertionpoint))
(while (setq tObj (car lstObj))
(setq tam (ins! tObj))
(cond 
   ((setq isFound (vl-member-if '(lambda(x)(and (setq kc (- (distance (ins! x) tam) d))
                                                (if (wcmatch ans ",<")(not (minusp kc))(zerop kc)) )
                                 ) (setq lstObj (cdr lstObj))) )
   (setq isFound (vl-sort isFound '(lambda(x y)(< (distance (ins! x) tam)(distance (ins! y) tam))))
	lstObj (vl-remove (car isFound) lstObj)
	lstRs (vl-sort (list tobj (car isFound)) '(lambda(x y)(< (car (ins! x))(car (ins! y))))))
   (vla-put-textstring (car lstRs)
	(strcat
	(vla-get-textstring (car lstRs)) "."
	(vla-get-textstring (last lstRs))
	)
   )
   (vla-delete (last lstRs))
  )
)
)
)
  • 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

 

Mình có down lisp này từ diễn đàn, nội dung của nó là nối các cặp chữ số lại với nhau ngăn cách bởi dấu “.” tạo thành các text cao độ, với điều kiện xét  khoảng cách giữa 2 text ( insertion ) với tham số d do mình nhập vào, nhưng khi mình chọn = d thì thấy nó chạy không đúng, < d cũng đôi lúc chạy không đúng luôn. Mong các cao thủ sửa giúp ạ. Mình xin cảm ơn

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/topic/65194-yeu-cau-lisp-noi-text-tu-dong/
(defun c:test(/ lstObj d ans ins! tObj tam isFound lstObj lstRs)
(setq lstObj (mapcar 'vlax-ename->vla-object (acet-ss-to-list (ssget (list (cons 0 "*TEXT")))))
  d (getdist "\nKhoang cach :")
  ans (getstring "\n<=d hay =d ? [<] :")
)
(defun ins!(e)(vlax-get e 'Insertionpoint))
(while (setq tObj (car lstObj))
(setq tam (ins! tObj))
(cond 
   ((setq isFound (vl-member-if '(lambda(x)(and (setq kc (- (distance (ins! x) tam) d))
                                                (if (wcmatch ans ",<")(not (minusp kc))(zerop kc)) )
                                 ) (setq lstObj (cdr lstObj))) )
   (setq isFound (vl-sort isFound '(lambda(x y)(< (distance (ins! x) tam)(distance (ins! y) tam))))
	lstObj (vl-remove (car isFound) lstObj)
	lstRs (vl-sort (list tobj (car isFound)) '(lambda(x y)(< (car (ins! x))(car (ins! y))))))
   (vla-put-textstring (car lstRs)
	(strcat
	(vla-get-textstring (car lstRs)) "."
	(vla-get-textstring (last lstRs))
	)
   )
   (vla-delete (last lstRs))
  )
)
)
)

Hề hề hề,

Hãy thử sửa lại :

(if (wcmatch ans ",<")(not (minusp kc))(zerop kc)) )

thành

(if (wcmatch ans "<")(not (minusp kc))(zerop kc)) )

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

Cám ơn mod đã hồi đáp,  mấy ngày nay mình bận quá nên bữa nay mới lên đọc được, đã sữa như mod nói nhưng lúc chọn khoảng cách d xong, nó hỏi " <=d hay =d ? [<] ", mình nhập vào = hay < gì nó cũng nil hết. File các đối tượng text  http://www.cadviet.com/upfiles/5/53806_new_block.dwg

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

Cám ơn mod đã hồi đáp,  mấy ngày nay mình bận quá nên bữa nay mới lên đọc được, đã sữa như mod nói nhưng lúc chọn khoảng cách d xong, nó hỏi " <=d hay =d ? [<] ", mình nhập vào = hay < gì nó cũng nil hết. File các đối tượng text  http://www.cadviet.com/upfiles/5/53806_new_block.dwg

Hề hề hề,

Thử sửa tiếp:

(not (minusp kc))

thành

 (minusp kc)

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 lỗi mod ơi. 

1/ Khi chưa xóa (not... ) phải nhập d>=1 và dấu < thì nó mới nối ( các text quá gần nhau vẫn bị nối sai )

2/ Sau khi xóa (not....) phải nhập d>=2 và dấu < thì nó mới nối ( các text quá gần nhau vẫn bị nối sai)

Nếu khó quá mình chỉ cần xác định điều kiện d= thôi cũng được, ví dụ chọn d=0.8 thì nó nối các cặp text có khoảng cách 0.8 thôi

Cám ơn mod

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

Sau gần 6 năm tham gia cv mà cũng chỉ toàn xin, mà xin cũng không đúng chỗ. Lisp down ở đâu thì hỏi ở đó thì may ra còn có nhiều người giúp.

Đối với bài này, tác giả lisp chỉ cần 10' (nhưng không rõ tác giả còn hứng thú sửa hay không), người khác thì có thể lâu hơn vì phải đọc code.

Không muốn học mà muốn nhanh hơn thì dung phần mềm USD của hai lúa

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ớt nóng bác anti ơi, tài khoản lập đã lâu, ít khi dùng, và tự thấy ko có đóng góp j cho cadviet, chỉ lên đọc bài các bác viết. Nhưng trình độ có hạn, biết đóng góp gì bây h , mong bác thông cảm. Còn bác nói không muốn học thì oan cho e, đã từng muốn học, nhưng công việc,gia đình,con cái nó xoáy vào làm e không còn tg trống nữa hix

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 lỗi mod ơi. 

1/ Khi chưa xóa (not... ) phải nhập d>=1 và dấu < thì nó mới nối ( các text quá gần nhau vẫn bị nối sai )

2/ Sau khi xóa (not....) phải nhập d>=2 và dấu < thì nó mới nối ( các text quá gần nhau vẫn bị nối sai)

Nếu khó quá mình chỉ cần xác định điều kiện d= thôi cũng được, ví dụ chọn d=0.8 thì nó nối các cặp text có khoảng cách 0.8 thôi

Cám ơn mod

Hề hề hề,

Vấn đề là bạn không hiểu code của tác giả nên bạn dùng không đúng với ý của tác giả mà thôi. Về cơ bản lisp không có gì sai trừ cái lỗi đầu tiên mình phát hiện (có thể do đánh máy sai hay lỗi của diễn đàn).

Theo tác giả của code thì chỉ phân ra hai trường hợp để xét là < và =. Hoàn toàn không đả động tới trường hợp >.

Tuy nhiên theo code thì ở trường hợp < lisp lại đặt điều kiện là (not (minusp kc)) tức là khoảng cách kc không âm hay khoảng cách giữa hai text lớn hơn d đã chọn. Vì vậy mình mới sửa là (minusp kc) để cho đúng với cái sự hiểu về < của điều kiện ban đầu.

Biến ans trong code là một chuỗi được nhập thoải mái mà theo gợi ý trước là <= hay = hay <. Chỉ cần trong chuỗi này có ký tự < thì lisp sẽ nhận điều kiện là < còn nếu chuỗi nhập không chứa ký tự < thì lisp sẽ nhận điều kiện là =.

Vậy nên trong lisp đã có sẵn theo yêu cầu của bạn. Tuy nhiên vì tác giả sử dụng hàm so sánh trong trường hợp = là hàm (zerop kc) trong khi kc là hiệu số của khoảng cách giũa các text có trên bản vẽ với một số thực d dược nhập nên chỉ khi hai giá trị này hoàn toàn đồng nhất mới được. Đây là điều khá khó trong thực tế bản vẽ nên theo thiển ý của mình, bạn nên thay hàm này bằng hàm (equal kc 0 0.00000001) sẽ tốt hơn..

Hy vọng bạn hiểu và sẽ sử dụng được lisp này cho công việc của bạn.

Mình đã thử và test lại những điều mình nói trên đây với bản vẽ bạn gửi thì nó chạy rất tốt trong cả hai trường hợp nhỏ hơn và bằng với khoảng cách cho trước.

Mình khuyên bạn nên tranh thủ thời gian tìm hiểu về lisp để có thể hiểu được code lisp và vận dụng nó vào trong công việc của bạ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

Cám ơn mod đã bỏ thời gian giải thích, giúp đầu óc mình sáng lên một chút ^^.

Dòng (setq kc (- (distance (ins! x) tam) d)có phải là đặt kc= d- khoảng cách 2 text không ạ? Nếu vậy mình đang cần kc > 0 ( để d> khoảng cách 2 text ) vậy điều kiện (not (minusp kc)) là đúng chứ ạ, sao lại bỏ not đi nhỉ?

Theo mình test thì khi nhập khoảng cách 0.8 ( đúng bằng khoảng cách giữa 2 ins point của text ) , nhập dấu = thì nó vẫn nil. Không biết mod có test thử trường hợp này chưa.

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

  Có lẻ chủ thớt thắc mắc như trên là do:

- Khoảng cách điều kiện trong lisp được tính là khoảng cách giữa 2 điểm mà hàm ins! trả về (tương đương dxf 10 thì phải) :D

 - Khoảng cách 0.8 (BV thớt) là khoảng cách giữa 2 điểm insert của 2 text căn lề khác nhau (1 R & 1 L) (tương đương trans 1dxf 10 và 1dxf 11 _UCS không phải W)

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

  Có lẻ chủ thớt thắc mắc như trên là do:

- Khoảng cách điều kiện trong lisp được tính là khoảng cách giữa 2 điểm mà hàm ins! trả về (tương đương dxf 10 thì phải) :D

 - Khoảng cách 0.8 (BV thớt) là khoảng cách giữa 2 điểm insert của 2 text căn lề khác nhau (1 R & 1 L) (tương đương trans 1dxf 10 và 1dxf 11 _UCS không phải W)

Hình như bác hiep đã phát hiện ra vấn đề ? Đúng là 2 text căn lề khác nhau. Thế có cách nào sửa ko ạ?

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

Hình như bác hiep đã phát hiện ra vấn đề ? Đúng là 2 text căn lề khác nhau. Thế có cách nào sửa ko ạ?

Sao bạn không quay về Link ban đầu của Thầy Ketxu đã có hướng dẫn sửa rồi mà :mellow:

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

Sao bạn không quay về Link ban đầu của Thầy Ketxu đã có hướng dẫn sửa rồi mà :mellow:

Thật ra là mình đã có xem qua, và sửa theo đó bác, và ở topic này bác mod cũng nêu cách sửa tương tự nhưng nó vẫn chạy không đúng.

  • 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

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  

×