Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
18011985

Xử lý List_box

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

Mình dùng list_box để thể hiện toạ độ điểm.

Khi dùng list_box có 1 vấn đề mình chưa hiểu, Khi mình nhập vào vị trí nó sẽ ra toạ độ. Nhưng các điểm trước sẽ bị đẩy xuống dưới, Mình muốn các điểm trước thì ở trên các điểm tiếp theo sẽ nối tiếp xuống dưới.

Sau đây là code của mình

(defun c:aaa (/ xn yn x y dcl_id hanh)
(setvar "cmdecho" 0)
(dialog)
 (princ)
); End defun
;;;;;;---------------------------Xu ly du lieu dau vao-------------------------------

(defun dialog ()
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "mcdh.DCL"))
(if (not (new_dialog "mcdh" dcl_id))
(exit))
(test2)
(action_tile "dc" "(done_dialog 2)")
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(setq hanh (start_dialog))
(if (= hanh 2)
 (progn
  (setq dc (getpoint))
  (test1)
  )
 )
 )
(setq dcl_id (unload_dialog dcl_id))
)
(defun test1 ()
 (setq x (car dc) y (cadr dc))
 (setq x (rtos x 2 2))
 (setq y (rtos y 2 2))
 (setq xn (cons x xn))
 (setq yn (cons y yn))
 (setq ii 1)
 (setq ik (length xn))

 )
(defun test2 ()
 (start_list "dauvao")
 (mapcar 'add_list xn)
 (end_list)
 )

Và sau đây là dcl

mcdh : dialog { label = "Ch­¬ng tr×nh trî gióp vÏ mÆt c¾t";
:column {
	:boxed_column { label = "D÷ liÖu ®Çu vµo";
	fixed_height = true;
	:row { fixed_width = true;
	:text { width = 10;
		label = "X";
		}
	:text { width = 10;
		label = "Y";
		}
		}
	:list_box { height = 21;
		width = 25;
		tabs = "10 20";
		key = "dauvao";
		fixed_height = true;
		}
	}
	:row {
	:text {	label = "Chän ®iÓm c¾t"; }
	:button {
	key = "dc";
	label = "Chän ®iÓm";
	fixed_width = true;
	}
	   	}		
	:spacer {height=0.2;}
	ok_cancel;
	}
}

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 dùng list_box để thể hiện toạ độ điểm.

Khi dùng list_box có 1 vấn đề mình chưa hiểu, Khi mình nhập vào vị trí nó sẽ ra toạ độ. Nhưng các điểm trước sẽ bị đẩy xuống dưới, Mình muốn các điểm trước thì ở trên các điểm tiếp theo sẽ nối tiếp xuống dưới.

Sau đây là code của mình

(defun c:aaa (/ xn yn x y dcl_id hanh)
(setvar "cmdecho" 0)
(dialog)
 (princ)
); End defun
;;;;;;---------------------------Xu ly du lieu dau vao-------------------------------

(defun dialog ()
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "mcdh.DCL"))
(if (not (new_dialog "mcdh" dcl_id))
(exit))
(test2)
(action_tile "dc" "(done_dialog 2)")
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(setq hanh (start_dialog))
(if (= hanh 2)
 (progn
  (setq dc (getpoint))
  (test1)
  )
 )
 )
(setq dcl_id (unload_dialog dcl_id))
)
(defun test1 ()
 (setq x (car dc) y (cadr dc))
 (setq x (rtos x 2 2))
 (setq y (rtos y 2 2))
 (setq xn (cons x xn))
 (setq yn (cons y yn))
 (setq ii 1)
 (setq ik (length xn))

 )
(defun test2 ()
 (start_list "dauvao")
 (mapcar 'add_list xn)
 (end_list)
 )

Và sau đây là dcl

mcdh : dialog { label = "Ch­¬ng tr×nh trî gióp vÏ mÆt c¾t";
:column {
	:boxed_column { label = "D÷ liÖu ®Çu vµo";
	fixed_height = true;
	:row { fixed_width = true;
	:text { width = 10;
		label = "X";
		}
	:text { width = 10;
		label = "Y";
		}
		}
	:list_box { height = 21;
		width = 25;
		tabs = "10 20";
		key = "dauvao";
		fixed_height = true;
		}
	}
	:row {
	:text {	label = "Chän ®iÓm c¾t"; }
	:button {
	key = "dc";
	label = "Chän ®iÓm";
	fixed_width = true;
	}
	   	}		
	:spacer {height=0.2;}
	ok_cancel;
	}
}

Thay dòng

(setq xn (cons x xn))

bằng dòng

(setq xn (append xn (list x)))

 

T/hợp muốn dùng CONS thì phải kết hợp với (reverse lst) khi gọi hàm (mapcar 'add_list xn).

  • 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
Thay dòng

(setq xn (cons x xn))

bằng dòng

(setq xn (append xn (list x)))

 

T/hợp muốn dùng CONS thì phải kết hợp với (reverse lst) khi gọi hàm (mapcar 'add_list xn).

Chào anh giabach,

Trước tiên cảm ơn anh giabach đã chỉ cho em chỗ chưa hiểu.

Nhưng giờ em lại vướng vào 1 cái hóc búa hơn.

Em viết thành công 2 lsp sử dụng dialog, nhưng khi sử dụng xảy ra hiện tượng như sau:

- Lần lượt load từng lisp và chạy. Load lsp đầu tiên không có chuyện gì xảy ra chạy bình thường.

Load lsp thứ 2 chạy bình thường, nhưng khi gõ lệnh của lsp 1 thì nó hiện lên dialog lsp thứ 2 mặc dù file DCL khác hẳn nhau không bị chồng chéo, vậy em không hiểu sao lại như vậy.

Em xin trích đoạn lsp của 2 lsp đó mong anh chỉ giúp.

Đây là lsp 1:

(defun dialog ()
(Value)
(Trade_value)
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "Kcd.DCL"))
(if (not (new_dialog "Kcd" dcl_id))
(exit))
(Get_value)
(mode_tile "accept" 1)
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(action_tile "tyleD" "(setq tyleD1 $value)")
(action_tile "tyleN" "(setq tyleN1 $value)")
(action_tile "Mss" "(setq Mss1 $value)")
(action_tile "diem1" "(done_dialog 2)")
(action_tile "diem2" "(done_dialog 3)")
(if (and (/= diem1 nil) (/= diem2 nil)) (mode_tile "accept" 0))
(setq hanh (start_dialog))
(if (= hanh 2) (setq diem1 (getpoint)) )
(if (= hanh 3) (setq diem2 (getpoint)) )
(Trade_value)
);while
(setq dcl_id (unload_dialog dcl_id))
)

Đây là đoạn lsp thứ 2

(defun dialog ()
(Value)
(Trade_value)
(while (not (vl-position hanh '(1 0)))
(setq dcl_id (load_dialog "Kbv.DCL"))
(if (not (new_dialog "Kbv" dcl_id))
(exit))
(Get_value)
(mode_tile "accept" 1)
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(loading)(done_dialog 1)")
(action_tile "khbv" "(savesvar)")
(action_tile "bd" "(setq bd1 $value)")
(action_tile "cd" "(setq cd1 $value)")
(action_tile "PT1" "(done_dialog 2)")
(action_tile "PT2" "(done_dialog 3)")
(if (and (/= PT1 nil) (/= PT2 nil)) (mode_tile "accept" 0))
(setq hanh (start_dialog))
(if (= hanh 2) (setq PT1 (getpoint)) )
(if (= hanh 3) (setq PT2 (getpoint)) )
(Trade_value)
);while
(setq dcl_id (unload_dialog dcl_id))
)

Rất mong nhận được sự giúp đỡ của anh và mọi ngườ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
Chào anh giabach,

Trước tiên cảm ơn anh giabach đã chỉ cho em chỗ chưa hiểu.

Nhưng giờ em lại vướng vào 1 cái hóc búa hơn.

Em viết thành công 2 lsp sử dụng dialog, nhưng khi sử dụng xảy ra hiện tượng như sau:

- Lần lượt load từng lisp và chạy. Load lsp đầu tiên không có chuyện gì xảy ra chạy bình thường.

Load lsp thứ 2 chạy bình thường, nhưng khi gõ lệnh của lsp 1 thì nó hiện lên dialog lsp thứ 2 mặc dù file DCL khác hẳn nhau không bị chồng chéo, vậy em không hiểu sao lại như vậy.

Em xin trích đoạn lsp của 2 lsp đó mong anh chỉ giúp.

Đây là lsp 1:

(defun dialog ()
.............................
)

Đây là đoạn lsp thứ 2

(defun dialog ()
..............................
)

Rất mong nhận được sự giúp đỡ của anh và mọi người.

Do bạn đặt tên hàm trùng nhau, nên khi load lsp thứ 2 thì hàm dialog sẽ đè lên hàm dialog của lsp thứ 1. kết quả thì như bạn đã thấy.

T/hợp tuơng tự cũng xảy ra khi đặt các tên biến trùng nhau nhưng không giải phóng khi kết thúc lệnh.

 

Cách giải quyết đơn giản là đặt tên hàm (tên biến) khác nhau, tuy nhiên nó không giải quyết triệt để.

 

Cách giải quyết triệt để là giải phóng các hàm (biến) khi kết thúc lệnh bằng cách khai báo các hàm (biến) này là cục bộ (local variables).

VD :

(defun C:lst1 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.

(defun dialog ()

; load file DCL của lst 1

)

(setq a 1)

(dialog)

)

 

(defun C:lst2 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.

(defun dialog ()

; load file DCL của lst 2

)

(setq a 1)

(dialog)

)

  • 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
Do bạn đặt tên hàm trùng nhau, nên khi load lsp thứ 2 thì hàm dialog sẽ đè lên hàm dialog của lsp thứ 1. kết quả thì như bạn đã thấy.

T/hợp tuơng tự cũng xảy ra khi đặt các tên biến trùng nhau nhưng không giải phóng khi kết thúc lệnh.

 

Cách giải quyết đơn giản là đặt tên hàm (tên biến) khác nhau, tuy nhiên nó không giải quyết triệt để.

 

Cách giải quyết triệt để là giải phóng các hàm (biến) khi kết thúc lệnh bằng cách khai báo các hàm (biến) này là cục bộ (local variables).

VD :

(defun C:lst1 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.

(defun dialog ()

; load file DCL của lst 1

)

(setq a 1)

(dialog)

)

 

(defun C:lst2 (/ dialog a);khai báo hàm dialog và biến a là cục bộ.

(defun dialog ()

; load file DCL của lst 2

)

(setq a 1)

(dialog)

)

Chào anh gia bạch,

Anh cho em hỏi luôn về vấn đề loại bỏ biến khi kết thúc lsp. Mặc dù đã loại bỏ biến rồi, nhưng rất có thể còn xót lại 1 vài biến em chưa cho vào phần loại bỏ, vậy có các nào biết biến nào vẫn tồn tại sau câu lệnh của mình trong Cad để mình loại bỏ không? Mong anh chỉ giúp.

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 anh gia bạch,

Anh cho em hỏi luôn về vấn đề loại bỏ biến khi kết thúc lsp. Mặc dù đã loại bỏ biến rồi, nhưng rất có thể còn xót lại 1 vài biến em chưa cho vào phần loại bỏ, vậy có các nào biết biến nào vẫn tồn tại sau câu lệnh của mình trong Cad để mình loại bỏ không? Mong anh chỉ giúp.

Cách 1. Phuơng pháp thủ công : Bạn dò từ trên xuống dưới, ở những chỗ có (setq ...), bạn copy tên biến vào phần khai báo tên hàm (đưa vào trong dấu ngoặc, phía sau dấu ngã truớc)

Dùng cách này đôi khi có thể còn xót lại 1 vài biến.

 

Cách 2. cho t/hợp dùng Visual Lisp Editor

- vào Tools - Environment Options - General Options - Diagnostic, chọn "Report statistics during syntax checking".

syntaxcheck_1.jpg

Khi check code: Tools - Check text in editor :

checktools_1.png

trong cửa sổ Built Output sẽ có thống kê đầy đủ Global Variables của tất cả các functions trong file lsp.

 

Đây là kết quả khi Check với hàm :

(defun test1 ()
 (setq x (car dc) y (cadr dc))
 (setq x (rtos x 2 2))
 (setq y (rtos y 2 2))
 (setq xn (cons x xn))
 (setq yn (cons y yn))
 (setq ii 1)
 (setq ik (length xn))  
 )

checkresult.jpg

Tại dòng Global variables: (DC II IK X XN Y YN)

Bạn muốn giữ cái nào là global tuỳ ý, còn lại chuyển chúng thành local (copy vào trong dấu ngoặc, phía sau dấu ngã truớc)

 

VD : (defun test1 (/ dc ii ik x xn y yn) .... )

 

PS : tui là Gia Bách (không có dấu nặng 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

Mình có 1 thắc mắc chưa tìm được câu trả lời. Có cách nào để list_box có thể nhận biết được 1 cú double-click không? Với 1 danh sách như list_box thì người dùng có thói quen chọn 1 phần tử bằng cách nhấp đúp chuột vào fần tử đó thay vị chọn phần tử rồi nhấn OK. thực tế rất nhiều phần mềm được viết để tương tác với người dùng theo cách 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
Mình có 1 thắc mắc chưa tìm được câu trả lời. Có cách nào để list_box có thể nhận biết được 1 cú double-click không? Với 1 danh sách như list_box thì người dùng có thói quen chọn 1 phần tử bằng cách nhấp đúp chuột vào fần tử đó thay vị chọn phần tử rồi nhấn OK. thực tế rất nhiều phần mềm được viết để tương tác với người dùng theo cách này

Bạn đặt thuộc tính allow_accept=true

vd : list_box { key = "dwgs"; allow_accept=true; height = 10;}

  • 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
Bạn đặt thuộc tính allow_accept=true

vd : list_box { key = "dwgs"; allow_accept=true; height = 10;}

Như vậy là bản thân hệ thống đã coi 1 cú double-click = Enter rồi phải không ạ. em hỏi thêm điều này vì nếu đúng như thế thì ta có thể áp dụng nó trong một số truờng hợp khá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ư vậy là bản thân hệ thống đã coi 1 cú double-click = Enter rồi phải không ạ. em hỏi thêm điều này vì nếu đúng như thế thì ta có thể áp dụng nó trong một số truờng hợp khác

Theo Tue_NV hiểu thì thuộc tính allow_accept=true thì 1 double Click tương đương như khi nhấn phím Enter

 

allow_accept = flag;

 

Activate the default button.

This attribute accepts the input when the user presses [Enter] or double-clicks a given tile.

flag: true or false (default).

  • 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


×