Đến nội dung


Hình ảnh
- - - - -

[Nhờ chỉnh sửa] sắp xếp text


  • Please log in to reply
26 replies to this topic

#21 huunhantvxdts

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 30 August 2013 - 09:14 AM

Hê hề hề, 

Chưa rõ bạn thêm thế nào nhưng mình đã chéck và tập ss1 đảm bảo là tập các text đại diện còn lại sau khi chạy lisp của mình...

Bạn xem lại chứ mình lấy lisp (lisp mới) của bạn để kiểm tra thì tập ss1 vẫn là tập ss ban đầu, Mình kiểm tra bằng cách đếm số đối tượng của tập ss1 thì thấy số đối tượng ss1 bằng ss

bạn xem lại lisp của mình viết ở bài #19 mình đã thêm vào 1 dòng sau lệnh IF thì ss1 mới đúng như yêu cầu

(

 

progn dòng thêm vào

(command "erase" e1 "")

(setq ss (ssdel e1 ss)); Xóa đối tượng trùng ra khỏi tập hợp dòng thêm vào

) dòng thêm vào

Mà lỡ nhờ rồi thì nhờ bạn thêm tí nữa là mình muốn sort theo x,y trước khi xóa. Mục đích của mình là sẽ tạo ra từng nhóm và lisp của mình làm việc trên từng nhóm đó thôi. 


  • 1

#22 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 30 August 2013 - 10:55 AM

Bạn xem lại chứ mình lấy lisp (lisp mới) của bạn để kiểm tra thì tập ss1 vẫn là tập ss ban đầu, Mình kiểm tra bằng cách đếm số đối tượng của tập ss1 thì thấy số đối tượng ss1 bằng ss

bạn xem lại lisp của mình viết ở bài #19 mình đã thêm vào 1 dòng sau lệnh IF thì ss1 mới đúng như yêu cầu

(

 

progn dòng thêm vào

(command "erase" e1 "")

(setq ss (ssdel e1 ss)); Xóa đối tượng trùng ra khỏi tập hợp dòng thêm vào

) dòng thêm vào

Mà lỡ nhờ rồi thì nhờ bạn thêm tí nữa là mình muốn sort theo x,y trước khi xóa. Mục đích của mình là sẽ tạo ra từng nhóm và lisp của mình làm việc trên từng nhóm đó thôi. 

Hề hề hề,

Cám ơn bạn đã phát hiện lỗi. Do mình không kiểm tra kỹ. 

Việc sort theo x,y không khói nhưng bạn cần cho biết quy luật sort mới được, 

Bạn đã biết kha khá về lisp thì hoàn toàn có thể tự làm điều này. Bạn sử dụng hàm (vl-sort ......) để thực hiện.

Về hàm này trong phần help developer của CAD có nói khá rõ bạn ạ. Tỷ như với tập ss của bạn, bạn cần chuyển tập này thành một list các ename bằng hàm (setq ssl (acet-ss-to-list ss))

Sau đó dùng hàm (vl-sort ....)

Nếu bạn muốn sort theo điểm đặt của text thì cần xem xét mã dxf 71, 72, 73 của nó, Nếu chúng đồng thời bằng 0 thì điểm đặt là mã DXF 10 , còn nếu có bất kỳ mã nào trong 3 mã này khác 0 thì điểm đặt là mã dxf 11. Từ đó bạn thích sort theo x hay theo y hay theo cả 2 là tùy ý bạn đưa và trong hàm so sánh.

Hy vọng bạn sẽ tự giải quyết được. nếu có khó khăn gì hãy post lên nhé.


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

#23 huunhantvxdts

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 30 August 2013 - 01:57 PM

Hề hề hề,

Cám ơn bạn đã phát hiện lỗi. Do mình không kiểm tra kỹ. 

Việc sort theo x,y không khói nhưng bạn cần cho biết quy luật sort mới được, 

Bạn đã biết kha khá về lisp thì hoàn toàn có thể tự làm điều này. Bạn sử dụng hàm (vl-sort ......) để thực hiện.

Về hàm này trong phần help developer của CAD có nói khá rõ bạn ạ. Tỷ như với tập ss của bạn, bạn cần chuyển tập này thành một list các ename bằng hàm (setq ssl (acet-ss-to-list ss))

Sau đó dùng hàm (vl-sort ....)

Nếu bạn muốn sort theo điểm đặt của text thì cần xem xét mã dxf 71, 72, 73 của nó, Nếu chúng đồng thời bằng 0 thì điểm đặt là mã DXF 10 , còn nếu có bất kỳ mã nào trong 3 mã này khác 0 thì điểm đặt là mã dxf 11. Từ đó bạn thích sort theo x hay theo y hay theo cả 2 là tùy ý bạn đưa và trong hàm so sánh.

Hy vọng bạn sẽ tự giải quyết được. nếu có khó khăn gì hãy post lên nhé.

Cám ơn bạn vấn đế sort thì mình có hiểu chút ít nhưng ở đây mình đang vướng vào tập ss

mình sẽ viết được lisp sort tách rời với lisp ở trên (chạy độc lập)

nhưng việc gộp lại thì bị vướng mắc do tập ss sau khi xử lý không đưa vào được đoạn lisp tiếp theo để xử lý tiếp giống bữa trước mình đã vấp phải nhờ bạn mình mới làm được để lấy tập ss1 đã loại trừ các text trung nhau.


  • 0

#24 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 30 August 2013 - 03:46 PM

Cám ơn bạn vấn đế sort thì mình có hiểu chút ít nhưng ở đây mình đang vướng vào tập ss

mình sẽ viết được lisp sort tách rời với lisp ở trên (chạy độc lập)

nhưng việc gộp lại thì bị vướng mắc do tập ss sau khi xử lý không đưa vào được đoạn lisp tiếp theo để xử lý tiếp giống bữa trước mình đã vấp phải nhờ bạn mình mới làm được để lấy tập ss1 đã loại trừ các text trung nhau.

Hề hề hề,

Bạn hãy gửi cái vướng của bạn lên nhé. Về nguyên tắc việc sort này có thể hoàn toàn độc lập với việc xóa mà. Bạn sẽ sort với tập ss trước. Sau khi sort nếu có các phần tử giống nhau hoàn toàn thì tập ss của bạn sẽ thay đổi và bạn định nghĩa lại cái tập ss của bạn thông qua hàm ngược (acet-list-to-ss .....). đối số của hàm này chính là cái list các đồi tượng vừa được sort ở trên.

Sau đó bạn có thể áp dụng lisp xóa đối tượng với tập ss mới này. 


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

#25 huunhantvxdts

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 03 September 2013 - 04:37 PM

Hề hề hề,

Bạn hãy gửi cái vướng của bạn lên nhé. Về nguyên tắc việc sort này có thể hoàn toàn độc lập với việc xóa mà. Bạn sẽ sort với tập ss trước. Sau khi sort nếu có các phần tử giống nhau hoàn toàn thì tập ss của bạn sẽ thay đổi và bạn định nghĩa lại cái tập ss của bạn thông qua hàm ngược (acet-list-to-ss .....). đối số của hàm này chính là cái list các đồi tượng vừa được sort ở trên.

Sau đó bạn có thể áp dụng lisp xóa đối tượng với tập ss mới này. 

sao khó quá mình không trả về được tập chọn ss bằng hàm ngược (acet-list-to-ss .....) để làm tiếp mà không được

lisp viết như sau:

(setq ss (ssget '((0 . "*TEXT"))))
(setq k 0.001)
(setq sslst (acet-ss-to-list ss)); tao list ename
(setq ss2 (vl-sort sslst
    '(lambda (e1 e2 / p10e1 p10e2)      ;khai bao ham chuyen dung de xu ly voi 2 doi tuong la e1 e2
(if (equal (cadr(setq p10e1 (cdr(assoc 10 (entget e1)))))
(cadr(setq p10e2 (cdr(assoc 10 (entget e2)))))
k)      ; dieu kien kiem tra neu co toa do Y1 = Y2 voi sai so k thi
        ;neu toa do Y bang nhau thi sap xep Text co X nho hon nen dau
 (< (car p10e1) (car p10e2))
        ;neu toa do Y khac nhau thi( ? ban chu noi ro) minh dat la chon Text co Y nho hon(o duoi)
 (< (cadr p10e1) (cadr p10e2))
 ))
    )
)
(setq ss (acet-list-to-ss ss2)) ; tra lai tâp chọn ss không được

nhờ bạn hướng dẫn tiếp


  • 0

#26 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 03 September 2013 - 06:41 PM

sao khó quá mình không trả về được tập chọn ss bằng hàm ngược (acet-list-to-ss .....) để làm tiếp mà không được

lisp viết như sau:

(setq ss (ssget '((0 . "*TEXT"))))
(setq k 0.001)
(setq sslst (acet-ss-to-list ss)); tao list ename
(setq ss2 (vl-sort sslst
    '(lambda (e1 e2 / p10e1 p10e2)      ;khai bao ham chuyen dung de xu ly voi 2 doi tuong la e1 e2
(if (equal (cadr(setq p10e1 (cdr(assoc 10 (entget e1)))))
(cadr(setq p10e2 (cdr(assoc 10 (entget e2)))))
k)      ; dieu kien kiem tra neu co toa do Y1 = Y2 voi sai so k thi
        ;neu toa do Y bang nhau thi sap xep Text co X nho hon nen dau
 (< (car p10e1) (car p10e2))
        ;neu toa do Y khac nhau thi( ? ban chu noi ro) minh dat la chon Text co Y nho hon(o duoi)
 (< (cadr p10e1) (cadr p10e2))
 ))
    )
)
(setq ss (acet-list-to-ss ss2)) ; tra lai tâp chọn ss không được

nhờ bạn hướng dẫn tiếp

Hề hề hề, 

Mình chưa rõ bạn sai chỗ nào song mình đã làm thử trực tiếp trên cad của mình thì ra kết quả như sau:

 Command: (setq ssl (acet-ss-to-list (ssget)))

Select objects: Specify opposite corner: 6 found

Select objects:

(<Entity name: 7ef6fab8> <Entity name: 7ef6f9e8> <Entity name: 7ef6f990> 

<Entity name: 7ef6f980> <Entity name: 7ef56e90> <Entity name: 7ef56e88>)

Command: (setq ss (acet-list-to-ss ssl))

<Selection set: 65>

Command: (setq ssl1 (vl-sort ssl '(lambda (e1 e2) (if (equal (cadr (setq p1

(cdr (assoc 10 (entget e1))))) (cadr (setq p2 (cdr (assoc 10 (entget e2)))))

0.001) (< (car p1) (car p2)) (< (cadr p1) (cadr p2))))))

(<Entity name: 7ef6f9e8> <Entity name: 7ef6f990> <Entity name: 7ef56e90>

<Entity name: 7ef56e88> <Entity name: 7ef6fab8> <Entity name: 7ef6f980>)

Command: (setq ss (acet-list-to-ss ssl1))

<Selection set: 6d>

 

Và như vậy chứng tỏ rằng hàm (acet-list-to-ss ....) thực tế đã trả ra một tập chọn mới khác với tập chọn ban đầu:

<Selection set: 65> là khác với <Selection set: 6d> mặc dù hai tập chọn này vẫn có số phần tử là y chang nhau.

Bạn có thể xem trên hai cái list ename của chúng để thấy , chỉ có trật tự của chúng là thay đổi.do việc sort tạo ra. Trên thực tế sau khi sort có thể các tập chọn này sẽ có số phần tử khác nhau nếu như trong tập chọn đầu tiên có các phần tử y hệt nhau (nghĩa là các point trùng nhau cả về các toạ độ x,y,z.)

 

Bạn thử kiểm tra lại cú pháp của hàm vl-sort xem có thừa thiếu chi không vì mình nhìn cũng thấy hoa cả mắt. Đồng thời check lại xem bạn đã có cài phần express tool chưa nhé. Bởi các hàm (acet- ....) này nằm trong bộ express tool bạn ạ.

 

 

 

Command: (setq ssl (acet-ss-to-list (ssget)))
 
Select objects: Specify opposite corner: 6 found
 
Select objects:
(<Entity name: 7ef6fab8> <Entity name: 7ef6f9e8> <Entity name: 7ef6f990> 
<Entity name: 7ef6f980> <Entity name: 7ef56e90> <Entity name: 7ef56e88>)
 
Command: (setq ss (acet-list-to-ss ssl))
<Selection set: 65>
 
Command: (setq ssl1 (vl-sort ssl '(lambda (e1 e2) (if (equal (cadr (setq p1 
(cdr (assoc 10 (entget e1))))) (cadr (setq p2 (cdr (assoc 10 (entget e2))))) 
0.001) (< (car p1) (car p2)) (< (cadr p1) (cadr p2))))))
(<Entity name: 7ef6f9e8> <Entity name: 7ef6f990> <Entity name: 7ef56e90> 
<Entity name: 7ef56e88> <Entity name: 7ef6fab8> <Entity name: 7ef6f980>)
 
Command: (setq ss (acet-list-to-ss ssl1))
<Selection set: 6d>
 
Command: (setq ssl (acet-ss-to-list (ssget)))
 
Select objects: Specify opposite corner: 6 found
 
Select objects:
(<Entity name: 7ef6fab8> <Entity name: 7ef6f9e8> <Entity name: 7ef6f990> 
<Entity name: 7ef6f980> <Entity name: 7ef56e90> <Entity name: 7ef56e88>)
 
Command: (setq ss (acet-list-to-ss ssl))
<Selection set: 65>
 
Command: (setq ssl1 (vl-sort ssl '(lambda (e1 e2) (if (equal (cadr (setq p1 
(cdr (assoc 10 (entget e1))))) (cadr (setq p2 (cdr (assoc 10 (entget e2))))) 
0.001) (< (car p1) (car p2)) (< (cadr p1) (cadr p2))))))
(<Entity name: 7ef6f9e8> <Entity name: 7ef6f990> <Entity name: 7ef56e90> 
<Entity name: 7ef56e88> <Entity name: 7ef6fab8> <Entity name: 7ef6f980>)
 
Command: (setq ss (acet-list-to-ss ssl1))
<Selection set: 6d>

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

#27 huunhantvxdts

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 03 September 2013 - 10:23 PM

Hề hề hề, 

Mình chưa rõ bạn sai chỗ nào song mình đã làm thử trực tiếp trên cad của mình thì ra kết quả như sau:

 Command: (setq ssl (acet-ss-to-list (ssget)))

Select objects: Specify opposite corner: 6 found

Select objects:

(<Entity name: 7ef6fab8> <Entity name: 7ef6f9e8> <Entity name: 7ef6f990> 

<Entity name: 7ef6f980> <Entity name: 7ef56e90> <Entity name: 7ef56e88>)

Command: (setq ss (acet-list-to-ss ssl))

<Selection set: 65>

Command: (setq ssl1 (vl-sort ssl '(lambda (e1 e2) (if (equal (cadr (setq p1

(cdr (assoc 10 (entget e1))))) (cadr (setq p2 (cdr (assoc 10 (entget e2)))))

0.001) (< (car p1) (car p2)) (< (cadr p1) (cadr p2))))))

(<Entity name: 7ef6f9e8> <Entity name: 7ef6f990> <Entity name: 7ef56e90>

<Entity name: 7ef56e88> <Entity name: 7ef6fab8> <Entity name: 7ef6f980>)

Command: (setq ss (acet-list-to-ss ssl1))

<Selection set: 6d>

 

Và như vậy chứng tỏ rằng hàm (acet-list-to-ss ....) thực tế đã trả ra một tập chọn mới khác với tập chọn ban đầu:

<Selection set: 65> là khác với <Selection set: 6d> mặc dù hai tập chọn này vẫn có số phần tử là y chang nhau.

Bạn có thể xem trên hai cái list ename của chúng để thấy , chỉ có trật tự của chúng là thay đổi.do việc sort tạo ra. Trên thực tế sau khi sort có thể các tập chọn này sẽ có số phần tử khác nhau nếu như trong tập chọn đầu tiên có các phần tử y hệt nhau (nghĩa là các point trùng nhau cả về các toạ độ x,y,z.)

 

Bạn thử kiểm tra lại cú pháp của hàm vl-sort xem có thừa thiếu chi không vì mình nhìn cũng thấy hoa cả mắt. Đồng thời check lại xem bạn đã có cài phần express tool chưa nhé. Bởi các hàm (acet- ....) này nằm trong bộ express tool bạn ạ.

 

 

 

Command: (setq ssl (acet-ss-to-list (ssget)))
 
Select objects: Specify opposite corner: 6 found
 
Select objects:
(<Entity name: 7ef6fab8> <Entity name: 7ef6f9e8> <Entity name: 7ef6f990> 
<Entity name: 7ef6f980> <Entity name: 7ef56e90> <Entity name: 7ef56e88>)
 
Command: (setq ss (acet-list-to-ss ssl))
<Selection set: 65>
 
Command: (setq ssl1 (vl-sort ssl '(lambda (e1 e2) (if (equal (cadr (setq p1 
(cdr (assoc 10 (entget e1))))) (cadr (setq p2 (cdr (assoc 10 (entget e2))))) 
0.001) (< (car p1) (car p2)) (< (cadr p1) (cadr p2))))))
(<Entity name: 7ef6f9e8> <Entity name: 7ef6f990> <Entity name: 7ef56e90> 
<Entity name: 7ef56e88> <Entity name: 7ef6fab8> <Entity name: 7ef6f980>)
 
Command: (setq ss (acet-list-to-ss ssl1))
<Selection set: 6d>
 
Command: (setq ssl (acet-ss-to-list (ssget)))
 
Select objects: Specify opposite corner: 6 found
 
Select objects:
(<Entity name: 7ef6fab8> <Entity name: 7ef6f9e8> <Entity name: 7ef6f990> 
<Entity name: 7ef6f980> <Entity name: 7ef56e90> <Entity name: 7ef56e88>)
 
Command: (setq ss (acet-list-to-ss ssl))
<Selection set: 65>
 
Command: (setq ssl1 (vl-sort ssl '(lambda (e1 e2) (if (equal (cadr (setq p1 
(cdr (assoc 10 (entget e1))))) (cadr (setq p2 (cdr (assoc 10 (entget e2))))) 
0.001) (< (car p1) (car p2)) (< (cadr p1) (cadr p2))))))
(<Entity name: 7ef6f9e8> <Entity name: 7ef6f990> <Entity name: 7ef56e90> 
<Entity name: 7ef56e88> <Entity name: 7ef6fab8> <Entity name: 7ef6f980>)
 
Command: (setq ss (acet-list-to-ss ssl1))
<Selection set: 6d>

Hồi chiều làm cả buổi nó không trả về được, không biết sao giờ nó trả về được rồi

cám ơn bạn rất nhiều


  • 0