Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
12 replies to this topic

#1 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 22 October 2015 - 04:19 PM

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

  • -1

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 23 October 2015 - 10:33 AM

 

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


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 28 October 2015 - 04:48 PM

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.c...6_new_block.dwg


  • 0

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 29 October 2015 - 11:48 AM

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.c...6_new_block.dwg

Hề hề hề,

Thử sửa tiếp:

(not (minusp kc))

thành

 (minusp kc)


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 29 October 2015 - 03:11 PM

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


  • 0

#6 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 29 October 2015 - 03:56 PM

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


  • 0

#7 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 30 October 2015 - 09:02 AM

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


  • 0

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 30 October 2015 - 11:49 AM

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.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 31 October 2015 - 09:26 AM

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.


  • 0

#10 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 31 October 2015 - 11:16 AM

  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)


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#11 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 31 October 2015 - 01:54 PM

  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 ạ?


  • 0

#12 phamhuy1

phamhuy1

    biết vẽ rectang

  • Members
  • PipPip
  • 82 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 31 October 2015 - 02:57 PM

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:


  • 0

#13 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 31 October 2015 - 03:32 PM

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.


  • -1