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

[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ị?

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

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

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

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

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

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

  • Vote tăng 2

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ề 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:

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

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

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

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.

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

 

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

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

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à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))))))
  • Vote tăng 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

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

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

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

  • Vote tăng 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ừ 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 ạ

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

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)

  • Vote tăng 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
Vào lúc 2/4/2016 tại 11:38, Doan Van Ha đã nói:

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

 

  • cadvietlisp.lsp
    lisp help
  •  

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

Nếu hàm này mà chuyển sang sắp xếp các đối tượng TEXT thì phải sửa cú pháp như thế nào Bác #DoanVanHa nhỉ? (Em nghĩ thay acet-geom-vertex-list ent)

 

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  

×