Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Mình viết hàm dùng chuyễn nhóm đối tượng thành list đối tượng chạy ok như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao list tu tap hop chon
;;;Cu phap su dung (duy:taolist<tapchon tapchon) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taolist<tapchon (tapchon / tapchon listtc stt sdt chondt)
(setq stt 0)
(setq sdt (sslength tapchon))
(while (< stt sdt)
(setq chondt (ssname tapchon stt))
(setq listtc (cons chondt listtc))
(setq stt (+ stt 1))
)
listtc)

 

Sau đó vì nhu cầu mình lại viết hàm chuyễn cái list này thành tập hợp chọn như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao tap hop chon tu list  
;;;Cu phap su dung (duy:taotapchon<list listtc) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taotapchon<list (listtc / tapchon dtc)
(foreach dtc listtc
(ssadd dtc tapchon)
)
tapchon)

 

Nhưng test thử thì hàm này ko chạy được dù mình thấy có sai chi mô.

(defun c:ctt ()
(setq tdt (ssget))
(setq ldt (duy:taolist<tapchon tdt))
(setq dtcd (duy:taotapchon<list ldt))
(command ".copy" dtcd "" (getpoint) (getpoint))
)

 

Chắc là có sai mà mình ko thấy, các bác tinh mắt ngó giúp với. 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

Mình viết hàm dùng chuyễn nhóm đối tượng thành list đối tượng chạy ok như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao list tu tap hop chon
;;;Cu phap su dung (duy:taolist<tapchon tapchon) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taolist<tapchon (tapchon / tapchon listtc stt sdt chondt)
(setq stt 0)
(setq sdt (sslength tapchon))
(while (< stt sdt)
(setq chondt (ssname tapchon stt))
(setq listtc (cons chondt listtc))
(setq stt (+ stt 1))
)
listtc)

 

Sau đó vì nhu cầu mình lại viết hàm chuyễn cái list này thành tập hợp chọn như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao tap hop chon tu list  
;;;Cu phap su dung (duy:taotapchon<list listtc) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taotapchon<list (listtc / tapchon dtc)
(foreach dtc listtc
(ssadd dtc tapchon)
)
tapchon)

 

Nhưng test thử thì hàm này ko chạy được dù mình thấy có sai chi mô.

(defun c:ctt ()
(setq tdt (ssget))
(setq ldt (duy:taolist<tapchon tdt))
(setq dtcd (duy:taotapchon<list ldt))
(command ".copy" dtcd "" (getpoint) (getpoint))
)

 

Chắc là có sai mà mình ko thấy, các bác tinh mắt ngó giúp với. Cám ơn!

Hề hề hề,

Bác thử kiểm tra lại việc khai báo biến cục bộ xem sao.....

  • 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

Mình viết hàm dùng chuyễn nhóm đối tượng thành list đối tượng chạy ok như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao list tu tap hop chon
;;;Cu phap su dung (duy:taolist<tapchon tapchon) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taolist<tapchon (tapchon / tapchon listtc stt sdt chondt)
(setq stt 0)
(setq sdt (sslength tapchon))
(while (< stt sdt)
(setq chondt (ssname tapchon stt))
(setq listtc (cons chondt listtc))
(setq stt (+ stt 1))
)
listtc)

 

Sau đó vì nhu cầu mình lại viết hàm chuyễn cái list này thành tập hợp chọn như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao tap hop chon tu list  
;;;Cu phap su dung (duy:taotapchon<list listtc) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taotapchon<list (listtc / tapchon dtc)
(foreach dtc listtc
(ssadd dtc tapchon)
)
tapchon)

 

Nhưng test thử thì hàm này ko chạy được dù mình thấy có sai chi mô.

(defun c:ctt ()
(setq tdt (ssget))
(setq ldt (duy:taolist<tapchon tdt))
(setq dtcd (duy:taotapchon<list ldt))
(command ".copy" dtcd "" (getpoint) (getpoint))
)

 

Chắc là có sai mà mình ko thấy, các bác tinh mắt ngó giúp với. Cám ơn!

 

Anh phải khởi tạo tập chọn trước cái đã. (setq tapchon (ssadd))

 

 
(defun duy:taotapchon<list (listtc / tapchon dtc)
  (setq tapchon (ssadd))
(foreach dtc listtc
(setq tapchon (ssadd dtc tapchon))
)
tapchon)
  • 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

Mình viết hàm dùng chuyễn nhóm đối tượng thành list đối tượng chạy ok như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao list tu tap hop chon
;;;Cu phap su dung (duy:taolist<tapchon tapchon) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taolist<tapchon (tapchon / tapchon listtc stt sdt chondt)
(setq stt 0)
(setq sdt (sslength tapchon))
(while (< stt sdt)
(setq chondt (ssname tapchon stt))
(setq listtc (cons chondt listtc))
(setq stt (+ stt 1))
)
listtc)

 

Sau đó vì nhu cầu mình lại viết hàm chuyễn cái list này thành tập hợp chọn như sau:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao tap hop chon tu list  
;;;Cu phap su dung (duy:taotapchon<list listtc) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taotapchon<list (listtc / tapchon dtc)
(foreach dtc listtc
(ssadd dtc tapchon)
)
tapchon)

 

Nhưng test thử thì hàm này ko chạy được dù mình thấy có sai chi mô.

(defun c:ctt ()
(setq tdt (ssget))
(setq ldt (duy:taolist<tapchon tdt))
(setq dtcd (duy:taotapchon<list ldt))
(command ".copy" dtcd "" (getpoint) (getpoint))
)

 

Chắc là có sai mà mình ko thấy, các bác tinh mắt ngó giúp với. Cám ơn!

Cần "giải phóng mặt bằng" trước khi "khởi công".

(defun duy:taotapchon<list (listtc / tapchon dtc)

  (setq tapchon (ssadd))

  (foreach dtc listtc

    (ssadd dtc tapchon))

  tapchon)

  • 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ại mình đọc tài tiệu thấy bảo nếu tập chọn tapchon là nil thì nó sẽ được tạo ra với 1 đối tượng là doituong với dòng

(ssadd doituong tapchon).

cảm ơn tất cả các bá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

Tôi có 1 dialog gồm 5 list_box. Các list trong 5 list_box có length bằng nhau và quan hệ 1-1, nghĩa là khi chọn vào thành phần thứ n của 1 trong 5 list_box thì các thành phần thứ n của 4 list_box còn lại cũng được chọn.

Hỏi: thông thường thì 5 item được chọn nằm thẳng hàng như hình 1.

67029_dung.png

Tuy nhiên, khi kéo con trượt ở 1 list_box nào đó đi 1 đoạn, sau đó chọn 1 item thì 4 list_box kia dù vẫn chọn đúng thành phần nhưng chúng thể hiện có thể không thẳng hàng như hình 2.

67029_sai.png

Làm thế nào để khi chọn thì chúng luôn trượt đến thẳng hàng nhau?

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

Việc này chỉ để làm đẹp hộp thoại chứ không tạo thêm hiệu quả sử dụng. Mình từng viết 1 ứng dụng thiết kế taluy trắc ngang cho nova có sử dụng hộp thoại song song 2 listbox thế này.

Theo mình nhớ thì: Nếu trong quá trình sử dụng, dùng chuột để pick chọn trong 1 bên list box thì các listbox còn lại sẽ tự nhảy và tự cuộn cho ngang hàng thì phải. Nếu đúng thì bác có thể lợi dụng nó găn vào action của các thanh cuộn.

trong trường hợp danh sách của bác không quá dài thì có thể làm như mình từng làm: viết hộp thoại để listbox có thể tự động thay đổi kích thước theo chiều dài của dach sách phần tử, khi đó sẽ không cần phải cuộn nữa. Cần một chút sáng tạo và khéo léo khi code để làm việc này.

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

Việc này chỉ để làm đẹp hộp thoại chứ không tạo thêm hiệu quả sử dụng. Mình từng viết 1 ứng dụng thiết kế taluy trắc ngang cho nova có sử dụng hộp thoại song song 2 listbox thế này.

Theo mình nhớ thì: Nếu trong quá trình sử dụng, dùng chuột để pick chọn trong 1 bên list box thì các listbox còn lại sẽ tự nhảy và tự cuộn cho ngang hàng thì phải. Nếu đúng thì bác có thể lợi dụng nó găn vào action của các thanh cuộn.

trong trường hợp danh sách của bác không quá dài thì có thể làm như mình từng làm: viết hộp thoại để listbox có thể tự động thay đổi kích thước theo chiều dài của dach sách phần tử, khi đó sẽ không cần phải cuộn nữa. Cần một chút sáng tạo và khéo léo khi code để làm việc này.

Đỏ: đúng thì đúng rồi nhưng đẹp thì chưa đẹp nên câu hỏi này là chỉ muốn làm đẹp thôi.

Xanh: list của tôi nó dài lắm, cái đưa lên hỏi là tương đối ngắn, chứ cái dài nhất nó tới khoảng 500 em => phải cuộn thôi. Với lại list_box thay đổi height này nhìn cứ bị "chớp chớp" hoà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

Tôi có 1 dialog gồm 5 list_box. Các list trong 5 list_box có length bằng nhau và quan hệ 1-1, nghĩa là khi chọn vào thành phần thứ n của 1 trong 5 list_box thì các thành phần thứ n của 4 list_box còn lại cũng được chọn.

Hỏi: thông thường thì 5 item được chọn nằm thẳng hàng như hình 1.

67029_dung.png

Tuy nhiên, khi kéo con trượt ở 1 list_box nào đó đi 1 đoạn, sau đó chọn 1 item thì 4 list_box kia dù vẫn chọn đúng thành phần nhưng chúng thể hiện có thể không thẳng hàng như hình 2.

67029_sai.png

Làm thế nào để khi chọn thì chúng luôn trượt đến thẳng hàng nhau?

 

Vấn đề "dung nhan" của hộp thoại chính là vấn đề  điểm yếu của DCL. Chấp nhận thế thôi bá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

Vấn đề "dung nhan" của hộp thoại chính là vấn đề  điểm yếu của DCL. Chấp nhận thế thôi bác  :( 

DCL xấu xí thì đành chịu, nhưng tôi nghĩ câu hỏi này có thể giải được. Bởi tôi có thể đưa chúng lên thẳng hàng được nhưng phải kèm điều kiện là chúng cùng trượt lên đầu hoặc cuối list_box, còn khi item nằm lưng chừng thì đang bí. Có cách gì để xác định item được chọn đang nằm ở hàng thứ mấy (từ trên xuống) trong list_box không ta?

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

Ô! Gettile.

hay tôi đang hiểu nhầm? Ý bác là hàng thứ mấy trên giao diện hộp thoại chăng?

Mấy trăm thì nếu là tôi, tôi sẽ chọn giải pháp phân trang. Mỗi trang khoảng 25 đến 50 phần tử. Chứ với 500 phần tử mà bác cuộn để tìm thì hơi mệt mỏi đấy.

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âng! Hàng ở đây là thứ mấy trong cái list_box ấy mà. VD list có 100 item, nhưng thể hiện trong list_box chỉ là 10 item, tương ứng 10 hàng (do height quy định). Chọn hàng thứ 2 trong list_box thì làm sao biết nó là hàng thứ 2? (Như trong hình 1 tôi post lên là hàng thứ 5).

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

Ngoài ra nếu bác không tiếc công sức đã bỏ ra để viết hộp thoại trên thì có thể viết lại theo hướng khác, đảm bảo đẹp hơn, chạy nhanh hơn (tôi có thể chắc chắn rằng hộp thoại trên của bác khi chạy luôn có độ trễ) và không cần phải giải quyết vấn đề mà bác đang đề cập.

Tổ chức dữ liệu của bác khá đơn giản. Có thể dùng dấu tab để phân cách dữ liệu trên 1 dòng listbox. Qua đó tạo các hàng và cột như trên chỉ với một listbox duy nhất.

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

Thanks! Lúc đầu tôi đã đi theo hướng dùng tab để chỉ còn 1 list_box rồi, nhưng chương trình của tôi có 3 cái dialog như vậy. Mà trong mỗi cái, vì các string này chưa xác định được nên strlen của nó dài ngắn bất thường => khi đó dùng tab đôi lúc các column nó nhảy sole coi chướng mắt, sau đó mới chuyển qua nhiều list_box như trên dù biết rằng nó chậm là cái chắ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

Nhảy thì sửa. Chỉ cần thêm 1 hàm con justify cho text trong cột. Mách có chứng, đây là chương trình tôi viết bằng Lisp và DCL.

22980_tktroot_1.png

Thêm 1 ví dụ về việc phân trang để nhóm dữ lieu

22980_tkttral.png

  • 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

DCL xấu xí thì đành chịu, nhưng tôi nghĩ câu hỏi này có thể giải được. Bởi tôi có thể đưa chúng lên thẳng hàng được nhưng phải kèm điều kiện là chúng cùng trượt lên đầu hoặc cuối list_box, còn khi item nằm lưng chừng thì đang bí. Có cách gì để xác định item được chọn đang nằm ở hàng thứ mấy (từ trên xuống) trong list_box không ta?

 

Tue_NV hiểu ý bác vì trường hợp này Tue_NV đã từng gặp rồi, chắc không có cách giải khi đang ở listbox này điều khiển thanh trượt của List box kia. Khi các thanh trượt bằng nhau (phần đầu và phần cuối bằng nhau) thì bác mới đưa về thẳng hàng được. Khi nó nằm ở lưng chừng giữa nhưng nếu các thanh trượt có phần đầu và phần cuối bằng nhau thì có thể đưa chúng thẳng hàng được. Bác đẩy các thanh trượt cùng về đầu hay cùng về cuối chính là làm cho phần đầu và phần cuối của các thanh trượt bằng nhau rồi đấy thôi

Một khi giữa các thanh trượt đã bị lệch dù chỉ 1 hàng thôi cũng sẽ làm cho chúng mất "cân đối" rồi

 

Thật đáng tiếc trong DCL chẳng có cái nào để điều khiển thanh trượt cả.

  • 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

@Tue_NV: Thôi kệ! Chắc DCL chỉ thế.

@Thaistreetz:Dù sao cũng cám ơn vì đã nhận được những chia sẻ. Xin dừng câu hỏi tại đây.

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

Nhảy thì sửa. Chỉ cần thêm 1 hàm con justify cho text trong cột. Mách có chứng, đây là chương trình tôi viết bằng Lisp và DCL.

22980_tktroot_1.png

Thêm 1 ví dụ về việc phân trang để nhóm dữ lieu

22980_tkttral.png

@Thaistreetz có thể cho mình xin code DCL 1 trong 2 hộp thoại này được không? Cả hàm con Justify nữ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

Bác Thái làm sao mà cái nút ok nó lại có chiều cao nút vượt mặt mấy thèn nút kia thế? Mình làm nó toàn có độ cao bằng nhau.

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

Bác Thái làm sao mà cái nút ok nó lại có chiều cao nút vượt mặt mấy thèn nút kia thế? Mình làm nó toàn có độ cao bằng nhau.

 

Dùng Tile Height thôi anh ạ

  • 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

Có ai biết vì sao button với label chỉ 1 ký tự và đã dùng width rất nhỏ nhưng nó vẫn dài lòng thòng không ? (win8;cad2007)

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ó ai biết vì sao button với label chỉ 1 ký tự và đã dùng width rất nhỏ nhưng nó vẫn dài lòng thòng không ? (win8;cad2007)

 

Bác gửi DCL lên xem thử. 

 

@Thaistreetz : Bạn cho chiêm ngưỡng chương trình Thống kê thép của bạn với (bằng video cũng được). Có gì mình góp ý cho.  :)

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


×