Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp sắp xếp các Text được chọn trong một vùng ra một bảng giá trị?


  • Please log in to reply
16 replies to this topic

#1 quangthanhdu

quangthanhdu

    biết vẽ rectang

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

Đã gửi 22 November 2012 - 11:40 AM

Trong bảng vẽ của em có chứa các vùng giá trị, trong mỗi vùng chứa các giá trị text, đang sắp xếp theo chiều dọc, Em muốn có 1 cái lisp:
+ Sắp xếp các text này lại vào trong một cái bảng GIÁ TRỊ, các text bây giờ sẽ nằm theo chiều ngang.
+ Chọn vùng giá trị nào thì sẽ sắp xếp vùng giá trị đó.
(Em có gởi File đính kèm)
Chân thành cảm ơn!!!http://www.cadviet.c...ap_xep_text.dwg
  • 0

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 22 November 2012 - 12:13 PM

Trong bảng vẽ của em có chứa các vùng giá trị, trong mỗi vùng chứa các giá trị text, đang sắp xếp theo chiều dọc, Em muốn có 1 cái lisp:
+ Sắp xếp các text này lại vào trong một cái bảng GIÁ TRỊ, các text bây giờ sẽ nằm theo chiều ngang.
+ Chọn vùng giá trị nào thì sẽ sắp xếp vùng giá trị đó.
(Em có gởi File đính kèm)
Chân thành cảm ơn!!!http://www.cadviet.c...ap_xep_text.dwg

Hề hề hề,
Bạn cần nói rõ hơn. Việc chọn các vùng chọn tùy ý sẽ cho ra bảng kết quả theo sự tùy ý đó hay bảng kết quả bắt buộc phải theo đúng trật tự về màu sắc như bạn đã post. Việc chọn các vùng chọn là chọn một lần nhiều vùng hay mỗi lần chọn một vùng và ghi ra một dòng kết quả. Các dòng kết quả này sắp xếp tùy ý hay nhất thiết phải thành cái bảng như bạn post????
Các text của bạn đã được format màu sẵn như trên bản vẽ bạn gửi hay là chẳng có màu sắc gì???
Hề hề hề.,...
  • 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 quangthanhdu

quangthanhdu

    biết vẽ rectang

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

Đã gửi 22 November 2012 - 12:20 PM

Hề hề hề,
Bạn cần nói rõ hơn. Việc chọn các vùng chọn tùy ý sẽ cho ra bảng kết quả theo sự tùy ý đó hay bảng kết quả bắt buộc phải theo đúng trật tự về màu sắc như bạn đã post. Việc chọn các vùng chọn là chọn một lần nhiều vùng hay mỗi lần chọn một vùng và ghi ra một dòng kết quả. Các dòng kết quả này sắp xếp tùy ý hay nhất thiết phải thành cái bảng như bạn post????
Hề hề hề.,...

Dạ, không phân biệt màu sắc, em để màu là để dễ nhìn thôi, em muốn chon 1 vùng, enter, ghi giá trị vừa chọn vào bảng, chọn vùng tiếp theo, enter. ghi giá trị vào phía dưới của lần chọn trước....và cứ như thế tới khi nào enter 2 lần thì kết thúc.
  • 0

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 22 November 2012 - 02:40 PM

Dạ, không phân biệt màu sắc, em để màu là để dễ nhìn thôi, em muốn chon 1 vùng, enter, ghi giá trị vừa chọn vào bảng, chọn vùng tiếp theo, enter. ghi giá trị vào phía dưới của lần chọn trước....và cứ như thế tới khi nào enter 2 lần thì kết thúc.

Hề hề hề,
Bạn dùng thử cái này coi sao nhé.

(defun c:ghb (/ p1 p0 ssl h i)
(vl-load-com)
(command "undo" "be")
(setq p1 (getpoint "\n Chon diem dat bang"))
(command "text" "j" "mc" (list (+ (car p1) 18) (+ (cadr p1) 4)) 2 0 "BANG GIA TRI")
(while (setq ssl (acet-ss-to-list (ssget (list (cons 0 "text")))))
(setq ssl (vl-sort ssl '(lambda (x y) ( > (caddr (assoc 11 (entget x))) (caddr (assoc 11 (entget y))))))
h (cdr(assoc 40 (entget (car ssl)))) i 1 p0 p1 )
(foreach dt ssl
(command "text" "j" "mc" (list (+ (car p0) (* 3 h)) (- (cadr p0) h)) h 0 (cdr (assoc 1 (entget dt))))
(command "rectangle" p0 (list (+ (car p0) (* 6 h)) (- (cadr p0) (* 2 h))))
(setq p0 (list (+ (car p0) (* 6 h)) (cadr p0)))
)
(setq p1 (list (car p1) (- (cadr p1) (* 2 h))))
)
(command "undo" "e")
(princ)
)
Lưu ý mình lấy text trong bảng có chiều cao của text bạn chọn.và các kích thước của bảng phụ thuộc vào chiều cao này. Nếu bạn muốn hãy tự thay đổi các kích thước này nhé.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 quangthanhdu

quangthanhdu

    biết vẽ rectang

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

Đã gửi 22 November 2012 - 02:47 PM

Hề hề hề,
Bạn dùng thử cái này coi sao nhé.


(defun c:ghb (/ p1 p0 ssl h i)
(vl-load-com)
(command "undo" "be")
(setq p1 (getpoint "\n Chon diem dat bang"))
(command "text" "j" "mc" (list (+ (car p1) 18) (+ (cadr p1) 4)) 2 0 "BANG GIA TRI")
(while (setq ssl (acet-ss-to-list (ssget (list (cons 0 "text")))))
(setq ssl (vl-sort ssl '(lambda (x y) ( > (caddr (assoc 11 (entget x))) (caddr (assoc 11 (entget y))))))
h (cdr(assoc 40 (entget (car ssl)))) i 1 p0 p1 )
(foreach dt ssl
(command "text" "j" "mc" (list (+ (car p0) (* 3 h)) (- (cadr p0) h)) h 0 (cdr (assoc 1 (entget dt))))
(command "rectangle" p0 (list (+ (car p0) (* 6 h)) (- (cadr p0) (* 2 h))))
(setq p0 (list (+ (car p0) (* 6 h)) (cadr p0)))
)
(setq p1 (list (car p1) (- (cadr p1) (* 2 h))))
)
(command "undo" "e")
(princ)
)
Lưu ý mình lấy text trong bảng có chiều cao của text bạn chọn.và các kích thước của bảng phụ thuộc vào chiều cao này. Nếu bạn muốn hãy tự thay đổi các kích thước này nhé.

Đúng theo ý em rồi! Chân thành cảm ơn Anh, chúc Anh sức khỏe!!! :mellow:
  • 0

#6 tanbqtb03

tanbqtb03

    biết vẽ ellipse

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

Đã gửi 17 December 2012 - 02:44 PM

Ah cho e hỏi mình chỉnh chỗ nào để thay vì sắp xếp theo hàng ta có thể săp xếp theo cột (nếu dữ liệu đầu vào sắp xếp theo hàng) hoặc tuy theo option của người dùng.
P/s: Nếu anh có thời gian thì viết hộ e, thanks a nhiều
  • 0

#7 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 December 2012 - 12:04 PM

Ah cho e hỏi mình chỉnh chỗ nào để thay vì sắp xếp theo hàng ta có thể săp xếp theo cột (nếu dữ liệu đầu vào sắp xếp theo hàng) hoặc tuy theo option của người dùng.
P/s: Nếu anh có thời gian thì viết hộ e, thanks a nhiều

Hề hề hề,
Việc bạn hỏi do không có file bản vẽ trước và sau khi chạy lisp nên mình chỉ đoán mò dựa trên yêu cầu của bạn chủ thớt,
Nếu mình đoán đúng thì bạn có các text được sắp xếp theo hàng ngang và bây giờ bạn muốn các text này được sắp xếp lại theo cột.
Như vậy dựa vào lisp trên bạn có thể thay đổi như sau:
1/- Sắp xếp lại các text trong bộ chọn ss1 theo trật tự của tọa đô x chứ không phải tọa độ y:
Muốn vậy bạn thay thế các hàm (caddr x) và (caddr y) trong hàm vl-sort thành (cadr x) và (cadr y)
2/- Trật tự ghi text ra bản vẽ theo cột chứ không phải theo hàng. Do vậy sau mỗi lần ghi text phải thay đổii tọa độ y chứ không phải tọa độ x. Vì thế trong vòng lặp (foreach dt ss1 .....
bạn cần thay: (setq p0 (list (+ (car p0) (* 6 h)) (cadr p0)))
bằng: (setq p0 (list (car p0) (- (cadr p0) (* 2 h))))
và thay: (setq p1 (list (car p1) (- (cadr p1) (* 2 h))))
bằng: (setq p1 (list (+ (car p1) (* 6 h)) (cadr p1) ))
3/- Nếu bạn muốn có tùy chọn theo người dùng thì cần phải đưa thêm biến điều kiện vào. Có thể dùng hàm if hay cond tùy theo các điều kiện của bạn cần.

Nếu bạn không thể tự làm được những điều trên thì bạn phải post bản vẽ đã có trước khi dùng lisp và bản vẽ kết quả sau khi dùng lisp lên thì mới có thể hiểu và làm đúng theo yêu cầu của bạn được.

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

#8 tanbqtb03

tanbqtb03

    biết vẽ ellipse

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

Đã gửi 18 December 2012 - 02:16 PM

Hề hề hề,
Việc bạn hỏi do không có file bản vẽ trước và sau khi chạy lisp nên mình chỉ đoán mò dựa trên yêu cầu của bạn chủ thớt,
Nếu mình đoán đúng thì bạn có các text được sắp xếp theo hàng ngang và bây giờ bạn muốn các text này được sắp xếp lại theo cột.
Như vậy dựa vào lisp trên bạn có thể thay đổi như sau:
1/- Sắp xếp lại các text trong bộ chọn ss1 theo trật tự của tọa đô x chứ không phải tọa độ y:
Muốn vậy bạn thay thế các hàm (caddr x) và (caddr y) trong hàm vl-sort thành (cadr x) và (cadr y)
2/- Trật tự ghi text ra bản vẽ theo cột chứ không phải theo hàng. Do vậy sau mỗi lần ghi text phải thay đổii tọa độ y chứ không phải tọa độ x. Vì thế trong vòng lặp (foreach dt ss1 .....
bạn cần thay: (setq p0 (list (+ (car p0) (* 6 h)) (cadr p0)))
bằng: (setq p0 (list (car p0) (- (cadr p0) (* 2 h))))
và thay: (setq p1 (list (car p1) (- (cadr p1) (* 2 h))))
bằng: (setq p1 (list (+ (car p1) (* 6 h)) (cadr p1) ))
3/- Nếu bạn muốn có tùy chọn theo người dùng thì cần phải đưa thêm biến điều kiện vào. Có thể dùng hàm if hay cond tùy theo các điều kiện của bạn cần.

Nếu bạn không thể tự làm được những điều trên thì bạn phải post bản vẽ đã có trước khi dùng lisp và bản vẽ kết quả sau khi dùng lisp lên thì mới có thể hiểu và làm đúng theo yêu cầu của bạn được.

Chúc bạn vui.

Thanks a đã phản hồi, ý e đúng như vậy đó a.
Để e sửa thử lisp có lỗi gì không e báo lại.

  • 0

#9 Superlong

Superlong

    biết vẽ arc

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

Đã gửi 02 April 2016 - 08:30 AM

cho mình hỏi cách dùng hàm vl-sort để sắp xếp thứ tự các polyline được chọn theo tung độ của các polyline như nào
vd bước đầu là (setq dt (ssget '((0 . "LWPOLYLINE")))) rồi thì làm sao sort các polyline này . điển hình ở đây các polyline đều có 3 đỉnh mình muốn sort theo tung độ của đỉnh thứ 1 , các bạn hướng dẫn mình sao cho sort ra 1 list mới theo yêu cầu như trên là được rồi


  • 0

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 April 2016 - 11:38 AM

Hàm này hơi khó với bạn nên viết giúp bạn. Tự nghiên cứu nhé.

(defun SortByY(lst_ent / lst)
 (setq lst (mapcar '(lambda(ent) (list (cadar (acet-geom-vertex-list ent)) ent)) lst_ent))
 (mapcar 'cadr (vl-sort lst '(lambda(x y) (< (car x) (car y))))))

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


#11 Superlong

Superlong

    biết vẽ arc

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

Đã gửi 02 April 2016 - 01:43 PM

bác cho em hỏi nhiệm vụ của biến ent và lst_ent được không hoặc có tài liệu tiếng việt của hàm mapcar và lambda cũng được


  • 0

#12 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 April 2016 - 03:13 PM

Kết thúc!


  • 0

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


#13 Superlong

Superlong

    biết vẽ arc

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

Đã gửi 02 April 2016 - 03:23 PM

em chịu thôi hàm này khó em nhờ quá bác ráp zô lisp này giùm em với sort chỗ các polyline được chọn  biến (dt) ấy

(defun c:yeah ( / dt dt1 dt2 rec1 rec2 pt ss)

(if (not sc3) (setq sc3 2))
(setq sc1 (getreal (strcat "\nChi\U+1EC1u cao Text <")))
(if (not sc1) (setq sc1 sc3) (setq sc3 sc1))
(setq sc9 (cdr (assoc 1 (entget (car (entsel "\nChon Text Ly Trinh : "))))))
(setq dt (ssget '((0 . "LWPOLYLINE"))))

(setq sdt (sslength dt)
K SDT
i 0)
(while
(setq dt1 (ssname dt i)


dt2 (ssname dt (1+ i))
i (1+ i)
K (- K 1)

rec1 (acet-geom-vertex-list dt1)




rec2 (acet-geom-vertex-list dt2)

pt (nth 0 rec1)

)

(if (and (< (car (nth 0 rec1)) (car (nth 2 rec1))) (< (car (nth 0 rec2)) (car (nth 2 rec2))))
(setq ss (append rec1 (reverse rec2) (list pt))))
(if (and (> (car (nth 0 rec1)) (car (nth 2 rec1))) (> (car (nth 0 rec2)) (car (nth 2 rec2))))
(setq ss (append rec1 (reverse rec2) (list pt))))
(if (and (< (car (nth 0 rec1)) (car (nth 2 rec1))) (> (car (nth 0 rec2)) (car (nth 2 rec2))))
(setq ss (append rec1 rec2 (list pt))))
(if (and (> (car (nth 0 rec1)) (car (nth 2 rec1))) (< (car (nth 0 rec2)) (car (nth 2 rec2))))
(setq ss (append rec1 rec2 (list pt))))



(acet-pline-make (list ss))
(command "area" "o" (entlast))
(setq dientich (getvar "area"))

(setq s (strcat (rtos dientich 2 2)))
(command "INSERT" "DIENTICHL" (nth 1 rec2) SC1 SC1 0 sc9 K S)
)

(princ "\nThanks for Using - Ho\U+00E0ng Long Auto Lisp
Phone:0933118500
Mail:longnguyen4563@gmail.com")
(PRINC))


  • 0

#14 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 April 2016 - 04:23 PM

Trong hàm trên bạn chỉ cần biết lst_ent là: (setq lst_ent (acet-ss-to-list dt)). Những vấn đề khác (tài liệu) chịu khó google nhé.


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


#15 Superlong

Superlong

    biết vẽ arc

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

Đã gửi 02 April 2016 - 05:18 PM

từ list thứ tự ename ban đầu (10.9715 <Entity name:
7ef03498>) (6.43388 <Entity name: 7ef03490>) (8.86799 <Entity name: 7ef03488>)

code của bác đã sắp xếp ra list đúng yêu cầu rồi (<Entity name: 7ef03490>
<Entity name: 7ef03488> <Entity name: 7ef03498>)
giờ dùng hàm gì để chuyển các ename đó thành 1 tập đối tượng được
hiện tại em phải thay hàm (ssname) bằng (nth) thì mới chạy tiếp các bước tiếp theo của lisp bác thông vấn đề này giúp em được không ạ em đoán mò là hiện tại cad chỉ hiểu (<Entity name: 7ef03490>
<Entity name: 7ef03488> <Entity name: 7ef03498>) như là 1 chuỗi thôi không còn là tập đối tượng nửa phải không ạ


  • 0

#16 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 April 2016 - 05:34 PM

Chán bạn nhất rồi đó! Không chịu HỌC, chỉ chịu HỎI.

Biến 1 list các ename đối tượng thành 1 tập hợp chọn:

(acet-list-to-ss lst_ent)


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


#17 Superlong

Superlong

    biết vẽ arc

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

Đã gửi 02 April 2016 - 06:15 PM

hihi cám ơn bác em sẽ chịu khó dùng chức năng search hơn


  • 0