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

Làm sao để trừ 2 tập hợp chọn với nhau?

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

Tôi có 2 tập hợp chọn ss1 và ss2, trong đó:

- Tập hợp chọn ss1 gồm n phần tử, tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn).

- Tập hợp chọn ss2 gồm m phần tử (m>n), trong đó chứa n phần tử của ss1 và (m-n) phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ).

- Làm sao để tạo được tập hợp chọn ss3 chỉ chứa (m-n) phần tử không bị đánh dấu xóa. Ai biết xin chỉ giùm, rất cám ơn.

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ôi có 2 tập hợp chọn ss1 và ss2, trong đó:

- Tập hợp chọn ss1 gồm n phần tử, tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn).

- Tập hợp chọn ss2 gồm m phần tử (m>n), trong đó chứa n phần tử của ss1 và (m-n) phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ).

- Làm sao để tạo được tập hợp chọn ss3 chỉ chứa (m-n) phần tử không bị đánh dấu xóa. Ai biết xin chỉ giùm, rất cám ơn.

Không hiểu ý của bạn?

Thế nào là tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn)

Bạn vui lòng nói rõ hơn nhé?

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
Không hiểu ý của bạn?

Thế nào là tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn)

Bạn vui lòng nói rõ hơn nhé?

Như thế này: một đối tượng khi được chọn sẽ có 1 cái tên. Sau khi chọn xong, ta xóa đối tượng đó đi nhưng tên tuổi nó vẫn còn trong cơ sở dữ liệu, gọi là phần tử đã bị đánh dấu xóa. Còn phần tử được chọn mà vẫn còn tồn tại trên bản vẽ gọi là phần tử không bị đánh dấu xóa.

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ôi có 2 tập hợp chọn ss1 và ss2, trong đó:

- Tập hợp chọn ss1 gồm n phần tử, tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn).

- Tập hợp chọn ss2 gồm m phần tử (m>n), trong đó chứa n phần tử của ss1 và (m-n) phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ).

- Làm sao để tạo được tập hợp chọn ss3 chỉ chứa (m-n) phần tử không bị đánh dấu xóa. Ai biết xin chỉ giùm, rất cám ơn.

Bạn dùng thử mấy dòng này xem

(setq ss1 (acet-ss-to-list ss1))
(setq ss2 (acet-ss-to-list ss2))
(foreach n ss1
(setq ss3 (vl-remove n ss2))
)
(setq ss3 (acet-list-to-ss ss3))

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
Không hiểu ý của bạn?

Thế nào là tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn)

Bạn vui lòng nói rõ hơn nhé?

Theo em hiểu thì các đối tượng trong bản vẽ khi bị xóa bằng lệnh erase sẽ không bị loại khỏi cơ sở dữ liệu của bản vẽ cho đến khi ta đóng bản vẽ lại (toàn bộ liệu này được ghi ra 1 file tạm nằm trong %temp% - có lẽ để phục vụ cho lệnh undo) Điều đó có nghĩa là toàn bộ record của đối tượng được bảo toàn nguyên vẹn và không một đối tượng nào tạo mới sau đó được phép có record (cụ thể là các giá trị mô tả Handle và ename của đối tượng) trùng với record của các đối tượng đã bị xóa. các đối tượng đó được gọi là đối tượng bị đánh dấu xóa như cách gọi ở trên

@Doan van Ha: các hàm SSDEL, SSADD có lẽ thỏa mãn nhu cầu của bạn

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ôi có 2 tập hợp chọn ss1 và ss2, trong đó:

- Tập hợp chọn ss1 gồm n phần tử, tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn).

- Tập hợp chọn ss2 gồm m phần tử (m>n), trong đó chứa n phần tử của ss1 và (m-n) phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ).

- Làm sao để tạo được tập hợp chọn ss3 chỉ chứa (m-n) phần tử không bị đánh dấu xóa. Ai biết xin chỉ giùm, rất cám ơn.

Chào bạn Doan Van Ha,

Bạn xài thử cái này coi sao. Lưu ý là không nhất thiết tập ss1 của bạn phải là tập con của SS2 nhé. Có điều khi đó chỉ có những phần tử nào có cả trong hai tập chọn mới bị loại khỏi tập ss3.

Trong lisp mình để ngược với bạn, tập ss1 là tập bị trừ (mẹ) và tập ss2 là tập trừ (con) bạn nhé.

(defun c:subss (/ ss1 ss2 lst1 lst2)
(if (= ss1 nil)
   (progn
          (alert "\n Chon tap doi tuong me")
          (setq ss1 (ssget )
                  lst1 (acet-ss-to-list ss1))
   )
)
(if (= ss2 nil)
  (progn
         (alert "\n Chon tap doi tuong con")
         (setq ss2 (ssget)
                 lst2 (acet-ss-to-list ss2))
   )
)
(foreach x lst2
      (if (member x lst1)
          (setq lst1 (vl-remove x lst1))
      )
)
(setq ss3 (acet-list-to-ss lst1))
ss3
)

 

Trong trường hợp bạn đã có tập ss1 và ss2 rồi thì sẽ không phải chọn đối tượng nữa và lisp sẽ trả cho bạn tập ss3 như bạn cần.

Chúc bạn vui.

 

@ All: Tiện tay vời yêu cầu của bạn Doan Van Ha, mình làm luôn cái lisp cho phép gộp hai tập chọn thành một tập chọn mới để may ra có bạn nào cần dùng.

Hề hề hề.

 

(defun c:addss ( / ss1 ss2  lst1 lst2)
(if (= ss1 nil)
   (progn
          (alert "\n Chon tap doi tuong me")
          (setq ss1 (ssget )
                  lst1 (acet-ss-to-list ss1))
   )
)
(if (= ss2 nil)
  (progn
         (alert "\n Chon tap doi tuong con")
         (setq ss2 (ssget)
                 lst2 (acet-ss-to-list ss2))
   )
)
(foreach x lst2
      (if (not (member x lst1))
          (setq lst1 (cons x lst1))
      )
)
(setq ss3 (acet-list-to-ss lst1))
ss3

)

.

..........................

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ào bạn Doan Van Ha,

Bạn xài thử cái này coi sao. Lưu ý là không nhất thiết tập ss1 của bạn phải là tập con của SS2 nhé. Có điều khi đó chỉ có những phần tử nào có cả trong hai tập chọn mới bị loại khỏi tập ss3.

Trong lisp mình để ngược với bạn, tập ss1 là tập bị trừ (mẹ) và tập ss2 là tập trừ (con) bạn nhé.

(defun c:subss (/ ss1 ss2 lst1 lst2)
(if (= ss1 nil)
   (progn
          (alert "\n Chon tap doi tuong me")
          (setq ss1 (ssget )
                  lst1 (acet-ss-to-list ss1))
   )
)
(if (= ss2 nil)
  (progn
         (alert "\n Chon tap doi tuong con")
         (setq ss2 (ssget)
                 lst2 (acet-ss-to-list ss2))
   )
)
(foreach x lst2
      (if (member x lst1)
          (setq lst1 (vl-remove x lst1))
      )
)
(setq ss3 (acet-list-to-ss lst1))
ss3
)

 

Trong trường hợp bạn đã có tập ss1 và ss2 rồi thì sẽ không phải chọn đối tượng nữa và lisp sẽ trả cho bạn tập ss3 như bạn cần.

Chúc bạn vui.

 

@ All: Tiện tay vời yêu cầu của bạn Doan Van Ha, mình làm luôn cái lisp cho phép gộp hai tập chọn thành một tập chọn mới để may ra có bạn nào cần dùng.

Hề hề hề.

 

(defun c:addss ( / ss1 ss2  lst1 lst2)
(if (= ss1 nil)
   (progn
          (alert "\n Chon tap doi tuong me")
          (setq ss1 (ssget )
                  lst1 (acet-ss-to-list ss1))
   )
)
(if (= ss2 nil)
  (progn
         (alert "\n Chon tap doi tuong con")
         (setq ss2 (ssget)
                 lst2 (acet-ss-to-list ss2))
   )
)
(foreach x lst2
      (if (not (member x lst1))
          (setq lst1 (cons x lst1))
      )
)
(setq ss3 (acet-list-to-ss lst1))
ss3

)

.

..........................

Cám ơn sự nhiệt tình của cả 3 bạn. Tiện thể cho hỏi thêm: Làm sao để loại ra khỏi tập SS tất cả các đối tượng đã bị đánh dấu xóa mà ta chưa biết chúng là những thằng nào?

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
Cám ơn sự nhiệt tình của cả 3 bạn. Tiện thể cho hỏi thêm: Làm sao để loại ra khỏi tập SS tất cả các đối tượng đã bị đánh dấu xóa mà ta chưa biết chúng là những thằng nào?

Duyệt qua từng ename của ss -> Kiểm tra đối tượng đã bị xoá chưa bằng hàm vlax-erased-p

Nếu hàm vlax-erased-p trả về T => chứng tỏ đối tượng này đã bị xoá (ename vẫn tồn tại) -> Remove ename ra khỏi tập ss

Làm như thế cho đến ename cuối cùng trong ss

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
Duyệt qua từng ename của ss -> Kiểm tra đối tượng đã bị xoá chưa bằng hàm vlax-erased-p

Nếu hàm vlax-erased-p trả về T => chứng tỏ đối tượng này đã bị xoá (ename vẫn tồn tại) -> Remove ename ra khỏi tập ss

Làm như thế cho đến ename cuối cùng trong ss

Sẵn nhờ TUE_NV viết luôn đoạn code đó luôn vì mình... hơi ngu mấy cái hàm VLAX, ACET... Thanks!

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ôi có 2 tập hợp chọn ss1 và ss2, trong đó:

- Tập hợp chọn ss1 gồm n phần tử, tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn).

- Tập hợp chọn ss2 gồm m phần tử (m>n), trong đó chứa n phần tử của ss1 và (m-n) phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ).

- Làm sao để tạo được tập hợp chọn ss3 chỉ chứa (m-n) phần tử không bị đánh dấu xóa. Ai biết xin chỉ giùm, rất cám ơn.

To Doan Van Ha :

Tò mò 1 chút : Không biết bạn ứng dụng các thao tác trên vào việc gì nhỉ ?

 

 

@Các bác Tue,Tu,Thai,Binh.... : sao các pác giỏi thế.:undecided:(

To ketxu :

CadViet chỉ toàn nguời tài ! :wub:

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
Sẵn nhờ TUE_NV viết luôn đoạn code đó luôn vì mình... hơi ngu mấy cái hàm VLAX, ACET... Thanks!

Hề hề hề,

Tranh thủ lúc bác Tue_Nv còn bận, mình làm cái ni theo sự gợi ý của bác ấy, bạn coi thử nhé:

(defun c:chkss ( )
(vl-load-com)
(if (= ss nil)
  (setq ss (ssget))
) 
(setq n (sslength ss)
       i 0
       sslst (acet-ss-to-list ss)
(while (      (setq obj (vlax-ename->vla-object (ssname ss i)))
     (if (vlax-erased-p obj)
        (setq sslst (vl-remove (ssname ss i) sslst))
     )
     (setq i (1+ i))
)
(setq ss (acet-list-to-ss sslst))
ss
)

 

@ketxu:

Hề hề hề, bác chuẩn bị vòng hoa cho mình nhé, mũi sắp nổ rồi . hề hề hề

  • 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
Hề hề hề,

Tranh thủ lúc bác Tue_Nv còn bận, mình làm cái ni theo sự gợi ý của bác ấy, bạn coi thử nhé:

(defun c:chkss ( )
(vl-load-com)
(if (= ss nil)
  (setq ss (ssget))
) 
(setq n (sslength ss)
       i 0
       sslst (acet-ss-to-list ss)
(while (< i n)
     (setq obj (vlax-ename->vla-object (ssname ss i)))
     (if (vlax-erased-p obj)
        (setq sslst (vl-remove (ssname ss i) sslst))
     )
     (setq i (1+ i))
)
(setq ss (acet-list-to-ss sslst))
ss
)

 

@ketxu:

Hề hề hề, bác chuẩn bị vòng hoa cho mình nhé, mũi sắp nổ rồi . hề hề hề

Xin tỏ lòng ngưỡng mộ các siêu sao trên CADVIET, vừa giỏi, vừa nhanh, vừa tận tình. Trả lời ý của bạn GIA_BACH: lúc đầu có n đường (bất kỳ về kiểu đối tượng) được chọn, sau đó tôi nối một số đường lại với nhau, tạo thành m đường (m<=n). Các đường tham gia vào việc nối bị mất đi. Việc bây giờ là tìm cách xử lý trên m đường này, thay vì n đường ban đầu. Nếu bạn có cách gì hay hơn nữa thì tung chiêu chứ để trong bụng dạ nhiều nó... đau bụng. Thanks.

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
To Doan Van Ha :

Tò mò 1 chút : Không biết bạn ứng dụng các thao tác trên vào việc gì nhỉ ?

To ketxu :

CadViet chỉ toàn nguời tài ! :wub:

Sao e CADViet mem mà dốt mãi thế nhỉ :undecided:

 

@ketxu:

Hề hề hề, bác chuẩn bị vòng hoa cho mình nhé, mũi sắp nổ rồi . hề hề hề

hề hề..bác chuyển hết các đoạn code bác vọc sang e tiếp uản choa,r hãy thă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

Ủa ủa? Không biết có hiểu nhầm ý mấy bác không nữa. Nhưng trừ/cộng 2 tập sao không dùng ssdel, ssadd??

Còn nếu muốn kiểm tra 1 ename có tồn tại trên bản vẽ hay không ta dùng (enget ename)

Kiểm tra 1 ename có tồn tại trong ss hay không ta dùng (ssmemb ename ss)

 

Này nhé: ssme- sscon

(setq i 0)
(while (setq e (ssname sscon i))
   (setq ssme (ssdel e ssme))
   (setq i (1+ i))
)

Tất nhiên nếu không chắc cái e của con có nằm trong mẹ hay không ta đặt thêm điều kiện

(if (ssmemb e ssme) (setq ssme (ssdel e ssme)))

 

ssme+sscon

(setq i 0)
(while (setq e (ssname sscon i))
   (setq ssme (ssadd e ssme))
   (setq i (1+ i))
)

 

Không biết có đúng ý của mấy bác đang bàn hay không? sorry. Chúc cuối tuần vui vẻ

  • 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
Ủa ủa? Không biết có hiểu nhầm ý mấy bác không nữa. Nhưng trừ/cộng 2 tập sao không dùng ssdel, ssadd??

Còn nếu muốn kiểm tra 1 ename có tồn tại trên bản vẽ hay không ta dùng (enget ename)

Kiểm tra 1 ename có tồn tại trong ss hay không ta dùng (ssmemb ename ss)

 

Này nhé: ssme- sscon

(setq i 0)
(while (setq e (ssname sscon i))
   (setq ssme (ssdel e ssme))
   (setq i (1+ i))
)

 

ssme+sscon

(setq i 0)
(while (setq e (ssname sscon i))
   (setq ssme (ssadd e ssme))
   (setq i (1+ i))
)

 

Không biết có đúng ý của mấy bác đang bàn hay không? sorry. Chúc cuối tuần vui vẻ

Một ý tưởng hay, dùng các hàm "cổ điển" vẫn đủ. Các bác kia dùng các hàm "hiện đại" cũng tốt luôn. Chỉ 1 vấn đề mà có rất nhiều cách viết hay. Thanks

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ôi có 2 tập hợp chọn ss1 và ss2, trong đó:

- Tập hợp chọn ss1 gồm n phần tử, tất cả đã bị đánh dấu xóa (đã bị xóa khỏi bản vẽ nhưng tên tuổi vẫn còn).

- Tập hợp chọn ss2 gồm m phần tử (m>n), trong đó chứa n phần tử của ss1 và (m-n) phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ).

- Làm sao để tạo được tập hợp chọn ss3 chỉ chứa (m-n) phần tử không bị đánh dấu xóa. Ai biết xin chỉ giùm, rất cám ơn.

 

Xin tỏ lòng ngưỡng mộ các siêu sao trên CADVIET, vừa giỏi, vừa nhanh, vừa tận tình.

Trả lời ý của bạn GIA_BACH: lúc đầu có n đường (bất kỳ về kiểu đối tượng) được chọn, sau đó tôi nối một số đường lại với nhau, tạo thành m đường (m<=n). Các đường tham gia vào việc nối bị mất đi. Việc bây giờ là tìm cách xử lý trên m đường này, thay vì n đường ban đầu. Nếu bạn có cách gì hay hơn nữa thì tung chiêu chứ để trong bụng dạ nhiều nó... đau bụng. Thanks.

Đây là hệ quả của việc sử dụng lệnh COMMAND trong lập trình !

Vì COMMAND của Cad chỉ trả về kết quả (mà không cho biết chính xác anh nào tham gia vào việc nối, anh nào bị tam thời xóa).

 

Nếu bạn xử lí các đối tượng tuần tự thì bạn sẽ biết được chính xác "Các đối tượng tham gia vào việc nối (có database thay đổi)".

Khi đó chả cần phải "tìm các phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ)".

Chiêu này đâu có gì lạ! :undecided:

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
Đây là hệ quả của việc sử dụng lệnh COMMAND trong lập trình !

Vì COMMAND của Cad chỉ trả về kết quả (mà không cho biết chính xác anh nào tham gia vào việc nối, anh nào bị tam thời xóa).

 

Nếu bạn xử lí các đối tượng tuần tự thì bạn sẽ biết được chính xác "Các đối tượng tham gia vào việc nối (có database thay đổi)".

Khi đó chả cần phải "tìm các phần tử khác không bị đánh dấu xóa (tồn tại trên bản vẽ)".

Chiêu này đâu có gì lạ! :undecided:

Nếu cứ nối tuần tự như Bạn và biết được các đối tượng tham gia vào việc nối thì vấn đề đã đơn giản. Đằng này có hằng hà sa số đối tượng trên bản vẽ, và cũng chẳng biết thằng nào và con nào... hun nhau mới khó. Tụi nó nếu gặp nhau là hun nhau, không gặp thì làm ngơ. Vấn đề là trong vô số đứa nhóc đó, nếu có cặp (ba, bốn...) nào yêu nhau sớm thì ta phải tìm ra được chúng để đưa đi... giáo dưỡng. Hề hề hề. Chuyện vui vậy đó. Dù sao cũng rất cám ơn Bạn.

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

Mình thấy những gì các bạn đang bàn chỉ cần dùng lệnh select là đủ. Ví dụ có hai tập hợp ss1 và ss2, một vài đối tượng hay cả ss2 đã bị xóa, một vài đối tượng trong ss1 đã biến đổi như line thành pline chẳng hạn. Chỉ cần dùng select

(command "_.select" ss1 "r" ss2 "")

Sau đó lấy lại tập hợp do select trả về (setq ss3 (ssget "P")). Trong ss3 chỉ hiện hữu những đối tượng có thật mà thôi

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

×