Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] viết Lisp dời text về vị trí điểm point gần nhất


  • Please log in to reply
56 replies to this topic

#41 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 24 December 2013 - 03:33 PM

Thử cái này xem sao.

http://www.cadviet.c.../127168_tmp.lsp


  • 4

#42 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 24 December 2013 - 04:09 PM

Hoan nghênh!

Thử cái này xem sao.

http://www.cadviet.c.../127168_tmp.lsp

Nhanh hơn cả 2 lisp của DVH và PTB.

Học được 2 điều:

1). Lấy list point chỉ gồm x và y chứ không có z như của tôi. Cái này tăng tốc không nhiều.

2). Dùng vl-sort nhanh hơn foreach. Cái này không ngờ lại tăng tốc đáng kể (srr, tác giả chỉ sort 10 đối tượng).

P/S: Tuy nhiên, 2 hàm sort ss1 và ss2 thì hình như thừa (?)


  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#43 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 24 December 2013 - 04:25 PM

1. Chỉ lấy x y mà không lấy z là vì trong file dwg đầu tiên tri so z của các point khác nhau, neu lay luon z thì hàm distance se cho ket qua sai, chứ viec này không nhằm tăng tốc chuong trình.

2. Phải sort cả Point va Text từ x nhỏ y nhỏ đến x lớn y lớn, sau đó so sánh 1 Text với 10 Point gần nó nhất.


  • 1

#44 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 24 December 2013 - 04:30 PM

1. Chỉ lấy x y mà không lấy z là vì trong file dwg đầu tiên tri so z của các point khác nhau, neu lay luon z thì hàm distance se cho ket qua sai, chứ viec này không nhằm tăng tốc chuong trình.

2. Phải sort cả Point va Text từ x nhỏ y nhỏ đến x lớn y lớn, sau đó so sánh 1 Text với 10 Point gần nó nhất.

Đỏ: tôi không hiểu quy tắc làm việc của hàm sort như thế nào, nhưng hình như nó phải so sánh tất cả các phần tử của list sau đó mới sắp xếp theo thứ tự. Nếu đúng như vậy thì việc sort trước không có ý nghĩa.

Bạn thử delete 2 hàm sort đó đi thì tốc độ không giảm (thậm chí tăng).


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#45 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 24 December 2013 - 07:43 PM

Tôi khọng biết nội bộ hàm vl-sort thực hiện như thế nào, chỉ biết kết quả nó trả về là 2 dãy text va point sắp theo thứ tự từ nhỏ đến lớn.

 

Khi mình quơ cả đám text+point với hàm ssget thì cả 10000 cái text và point đó nó nằm lộn xộn trong hai dãy ss1 và ss2.

 

Dĩ nhiên mình phải sort 2 cai dãy đó truoc thi khi so sánh mình chỉ cần so sanh1 text với 10 point thôi (tôi lấy 10 là cũng hơi nhiều) , chứ nếu không thì với 1 text bạn phải so sánh vị trí của nó với vị trí của 5000 point, đó là lý do tại sao nếu bỏ 2 hàm sort đó thì chuong trình sẽ chậm đi nhiều.


  • 2

#46 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 25 December 2013 - 09:35 AM

Tôi khọng biết nội bộ hàm vl-sort thực hiện như thế nào, chỉ biết kết quả nó trả về là 2 dãy text va point sắp theo thứ tự từ nhỏ đến lớn.

 

Khi mình quơ cả đám text+point với hàm ssget thì cả 10000 cái text và point đó nó nằm lộn xộn trong hai dãy ss1 và ss2.

 

Dĩ nhiên mình phải sort 2 cai dãy đó truoc thi khi so sánh mình chỉ cần so sanh1 text với 10 point thôi (tôi lấy 10 là cũng hơi nhiều) , chứ nếu không thì với 1 text bạn phải so sánh vị trí của nó với vị trí của 5000 point, đó là lý do tại sao nếu bỏ 2 hàm sort đó thì chuong trình sẽ chậm đi nhiều.

Hôm qua tôi đọc nhanh quá nên cứ tưởng con số 10 là dxf của point, ai ngờ nó là số lượng point để xét trong 1 lần.

Nói chung, giải pháp này nhanh và phù hợp khi các cặp text-point có vị trí tương đối giữa 2 đối tượng là cố định (cũng như giải pháp của bác Bình).

Khi text và point vẫn đi từng cặp với nhau, nhưng vị trí tương đối giữa 2 đối tượng có thể thay đổi thì cũng tiềm ẩn sự nhảy nhầm.

Mà, nếu vị trí tương đối của tất cả cặp text-point là constant thì đâu cần phải sort tới 10, chỉ cần lấy thằng đầu tiên là chính nó (???)


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#47 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 25 December 2013 - 11:19 AM

Tôi khọng biết nội bộ hàm vl-sort thực hiện như thế nào, chỉ biết kết quả nó trả về là 2 dãy text va point sắp theo thứ tự từ nhỏ đến lớn.

 

Khi mình quơ cả đám text+point với hàm ssget thì cả 10000 cái text và point đó nó nằm lộn xộn trong hai dãy ss1 và ss2.

 

Dĩ nhiên mình phải sort 2 cai dãy đó truoc thi khi so sánh mình chỉ cần so sanh1 text với 10 point thôi (tôi lấy 10 là cũng hơi nhiều) , chứ nếu không thì với 1 text bạn phải so sánh vị trí của nó với vị trí của 5000 point, đó là lý do tại sao nếu bỏ 2 hàm sort đó thì chuong trình sẽ chậm đi nhiều.

Hề hề hề,

Thank bác tot77 về thuật toán mới.Việc Sort thành hai list texts và points với trật tự vị trí của chúng nếu trật tự của các cặp point +text là tương ứng sẽ giúp lisp chạy nhanh hơn.

Việc bác bỏ qua tọa độ Z cũng là một điều hợp lý nếu như chủ thớt chỉ yêu cầu xét khoảng cách theo mặt phẳng chiếu ..... nằm. Còn trường hợp mà chủ thớt lại yêu cầu xét theo khoảng cách không gian thực thì ..... chủ thớt phải sửa lại lisp vậy.

Tuy nhiên có một vấn đề là nếu việc quản lý bản vẽ này không thống nhất thì cũng sẽ khá oái oăm. Tỷ như text thứ n lại gần điểm thứ n+1 hơn là điểm thứ n, hoặc text thứ n gần với các điểm thứ n+1 và n+3 ... n+9  nhất và bằng nhau thì cũng gay.

Vấn đề này hoàn toàn phụ thuộc vào chủ thớt, và nếu chủ thớt hiểu được cấu trúc của lisp để tự hiệu chỉnh là tốt nhất. Còn việc bắt bệnh thì quả thật không dễ có thể biết hết các bệnh do việc quản lý bản vẽ này là của chủ thớt.

Theo quan điểm của mình thì ý kiến bác ndtnv là khá hợp lý trong trường hợp chủ thớt không thể tự mình xác định cái quy luật để quản lý bản vẽ hiệu quả.


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

#48 ANHSURVEY

ANHSURVEY

    biết zoom

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

Đã gửi 25 December 2013 - 11:01 PM

Cũng không cần phức tạp như các bác đã nêu. vì bài toán của mình là có các text của các cọc ép dự ứng lực đã được phun lên cad. và có tọa độ hoàn công các cọc thì bị lệch khỏi vị trí thiết kế, cái này không theo trật tự nào cả. khi đo bằng máy toàn đạc điện tử thì không thể gán tên cọc cùng lúc mà chỉ lấy tọa độ của nó rồi phun lên cad, cuối cùng dùng lisp dời text về point hoàn công rồi xuất ra. vậy thôi.


  • 0

#49 ANHSURVEY

ANHSURVEY

    biết zoom

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

Đã gửi 25 December 2013 - 11:21 PM

Lisp của Tot77 chạy rất nhanh, OK , Thank all!


  • 0

#50 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 04 May 2014 - 04:51 PM

Lisp của bác Tot77 không thể download được. Server đang update ư? 

Bác nào có rồi thì up lại cho em tham khảo với được không?


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#51 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 04 May 2014 - 04:58 PM

Tôi còn giữ cái lisp đó, nhưng file dwg để test thì không còn.

 

(defun c:test(/ os ss ss1 ss2 cd) 
  (defun layxy(a) (list (car a) (cadr a)))
  (defun leftL(L n / l1 i) (setq l1 nil i -1) (while (and (< (setq i (1+ i)) n) (nth i L)) (setq l1 (append l1 (list (nth i L))))))
  (defun doi (id tri v)   (entmod (subst (cons id tri) (assoc id (entget v)) (entget v))))
  
  ;;;chuong trinh chinh
  (setq ss (ssget '((0 . "TEXT,POINT")))
ss1 (vl-remove nil (mapcar '(lambda(x) (if (= (acet-dxf 0 (entget x)) "TEXT") (cons (layxy (acet-dxf 11 (entget x))) x) nil)) (acet-ss-to-list ss)))
ss1 (vl-sort (vl-sort ss1 '(lambda(x y) (< (cadar x) (cadar y)))) '(lambda(x y) (< (caar x) (caar y))))
ss2 (vl-remove nil (mapcar '(lambda(x) (if (= (acet-dxf 0 (entget x)) "POINT") (layxy (acet-dxf 10 (entget x))) nil)) (acet-ss-to-list ss)))
ss2 (vl-sort (vl-sort ss2 '(lambda(x y) (< (cadr x) (cadr y)))) '(lambda(x y) (< (car x) (car y))))
  )
  (foreach v ss1    
    (doi 11 (setq cd (car (vl-sort (leftL ss2 10) '(lambda(x y) (< (distance x (car v)) (distance y (car v))))))) (cdr v))
    (setq ss2 (vl-remove cd  ss2))
  )
)


  • 1

#52 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 04 May 2014 - 05:06 PM

Tôi còn giữ cái lisp đó, nhưng file dwg để test thì không còn.

 

(defun c:test(/ os ss ss1 ss2 cd) 
  (defun layxy(a) (list (car a) (cadr a)))
  (defun leftL(L n / l1 i) (setq l1 nil i -1) (while (and (< (setq i (1+ i)) n) (nth i L)) (setq l1 (append l1 (list (nth i L))))))
  (defun doi (id tri v)   (entmod (subst (cons id tri) (assoc id (entget v)) (entget v))))
  
  ;;;chuong trinh chinh
  (setq ss (ssget '((0 . "TEXT,POINT")))
ss1 (vl-remove nil (mapcar '(lambda(x) (if (= (acet-dxf 0 (entget x)) "TEXT") (cons (layxy (acet-dxf 11 (entget x))) x) nil)) (acet-ss-to-list ss)))
ss1 (vl-sort (vl-sort ss1 '(lambda(x y) (< (cadar x) (cadar y)))) '(lambda(x y) (< (caar x) (caar y))))
ss2 (vl-remove nil (mapcar '(lambda(x) (if (= (acet-dxf 0 (entget x)) "POINT") (layxy (acet-dxf 10 (entget x))) nil)) (acet-ss-to-list ss)))
ss2 (vl-sort (vl-sort ss2 '(lambda(x y) (< (cadr x) (cadr y)))) '(lambda(x y) (< (car x) (car y))))
  )
  (foreach v ss1    
    (doi 11 (setq cd (car (vl-sort (leftL ss2 10) '(lambda(x y) (< (distance x (car v)) (distance y (car v))))))) (cdr v))
    (setq ss2 (vl-remove cd  ss2))
  )
)

Dạ vâng. Em cảm ơn anh. Em xem thuật toán thôi.  :D

Thanks anh nhiều


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#53 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 04 May 2014 - 05:09 PM

Server có vấn đề sao ấy bác ạ. Khó theo ý mình quá. Chắc anh Hoành đang nâng cấp


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#54 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 04 May 2014 - 05:10 PM

Em cũng đang thắc mắc là tại sao chỉ với file đó test dc mà các file khác thì không? Lạ thế?


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#55 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 04 May 2014 - 05:18 PM

Khi viết lisp thì chỉ có thể test trên file chủ thớt đưa, do đó nếu thấy ok thì chỉ ok cho mỗi trường hợp file đó.

Người viết không thể lường hết mọi tình huống xảy ra. Do đó muốn lisp hoàn chỉnh thì phải test trên nhiều file khác nhau thôi bạn ơi. Vì mỗi ngành nghề mổi công ty lại có cách vẽ khác nhau không ai giống ai.

 

Em cũng đang thắc mắc là tại sao chỉ với file đó test dc mà các file khác thì không? Lạ thế?


  • 0

#56 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 04 May 2014 - 05:28 PM

Dạ vâng. Em sẽ tìm cách viết lại vậy. Cảm ơn bác về thuật toán. :)


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#57 DanKhaosat

DanKhaosat

    biết lệnh scale

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

Đã gửi 13 July 2014 - 08:14 PM

Hoan nghênh!

Thử cái này xem sao.

http://www.cadviet.c.../127168_tmp.lsp

Nhanh hơn cả 2 lisp của DVH và PTB.

Học được 2 điều:

1). Lấy list point chỉ gồm x và y chứ không có z như của tôi. Cái này tăng tốc không nhiều.

2). Dùng vl-sort nhanh hơn foreach. Cái này không ngờ lại tăng tốc đáng kể (srr, tác giả chỉ sort 10 đối tượng).

P/S: Tuy nhiên, 2 hàm sort ss1 và ss2 thì hình như thừa (?)

Bạn Hà có thể post lại lisp này k mình doawnd không được cảm ơn bạn!


  • 0