Đến nội dung


Hình ảnh
- - - - -

Xuất dữ liệu cad sang EXCEL lần lượt


  • Please log in to reply
34 replies to this topic

#21 Trang72

Trang72

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 06 December 2010 - 08:01 PM

Chào npham.
Bạn có thể thay dòng :
(if (= sta 2) (command "zoom" (getpoint "\nSu dung nut giua chuot de zoom, pan :") nil))
thành (if (= sta 2) (ssget)) cho phép sử dụng các lệnh Zoom, Pan của CAD, trở lại hộp thoại bằng phím Enter hay chuột phải.

LISP đã đáp ứng đuợc yêu cầu của Trang72, tuy nhiên tôi xin góp ý thêm về giao diện.
Bạn nên tạo thêm 1 button ADD có chức năng thêm dòng dữ liệu hiện tại (giá trị trên các edit_box) vào biến kiểu LISP (lưu data tạm), mỗi lần click ADD thì thêm 1 dòng dữ liệu đồng thời reset các giá trị trên các edit_box.
Khi nguời dùng Click button WriteToFile, dữ liệu của biến LISP mới thực sự đổ vào file (lúc này mới gọi hàm getfiled để chọn file).


Cám ơn Bác nPham và Bác Gia Bạch đã giúp đỡ em. Chúc Các Bác Luôn Mạnh Khoẻ và hạnh Phúc.
  • 0

#22 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 06 December 2010 - 08:33 PM

Mấy chuyện lớn sẽ nhờ tới Cao thủ, việc nhỏ nhỏ mình giúp bạn thử xem sao nhé. hê hê !

Lệnh zoom dưới đây swr dụng nút giữa chuột, trái phải để exit
nếu không vừa ý chổ nào bạn cứ nói nhé.

input:dialog {
label="Write to file";
: text {key="filename";}
: boxed_row {
label="Row data";
: column {: text {label="Number";} : edit_box {key="number";edit_width=5;}}
: column {: text {label="Code";} : edit_box {key="code";edit_width=8;}}
: column {: text {label="Distance";} : edit_box {key="distance";edit_width=8;}}
: column {: text {label="Notes";} : edit_box {key="note";edit_width=20;}}
}
: row { : spacer {width=22;}
: button {
label="Zoom";
fixed_width=true;
key="zoom";
}
: button {
label="Close";
fixed_width=true;
is_cancel=true;
key="cancel";
is_default=true;
alignment=right;
}
}
}
(defun c:input (/ filename f number sta)
(setq filename (getfiled "Select a File" "" "xls" 1))
(if filename
(progn
(setq f (open filename "w"))
(setq id (load_dialog "C:/input.dcl"))

(setq sta 2)
(while (> sta 1)
(new_dialog "input" id)
(set_tile "filename" (strcat "File name:" filename))
(mode_tile "number" 2)
(action_tile "note" "(PROGN
(write-line (strcat
(setq number (get_tile \"number\")) \"\t\"
(get_tile \"code\") \"\t\"
(get_tile \"distance\") \"\t\"
(get_tile \"note\") \"\t\") f)
(set_tile \"number\" (itoa (1+ (atoi number))))
(mode_tile \"code\" 2)
)")
(action_tile "zoom" "(done_dialog 2)")
(setq sta (start_dialog))
(if (= sta 2) (command "zoom" (getpoint "\nSu dung nut giua chuot de zoom, pan :") nil))


)
(done_dialog)
(unload_dialog id)
(close f)

))

)

Chào bác npham,
Đọc code của bác mình thấy một vài thắc mắc sau:
1/- Hàm (mode_tile "key" Value) chỉ nhận hai giá trị là 0 và 1 tức là chỉ có tác dụng tắt hay mở cái nút mang key đó mà thôi. Vậy sao ở đây bác dùng (mode_tile "number" 2). Như vậy nó có ý nghĩa gì???
2/- Key bác đặt là "code" , vậy tại sao trong hàm bác dùng (mode_tile \"code\" 2) ??? Nó có ý nghĩa ra sao???
3/- Bác đặt (setq sta (start_dialog))
Vậy làm sao có (if (= sta 2) ........
4/- Bác dùng :
(action_tile "note" "(PROGN
(write-line (strcat
(setq number (get_tile \"number\")) \"\t\"
(get_tile \"code\") \"\t\"
(get_tile \"distance\") \"\t\"
(get_tile \"note\") \"\t\") f)
(set_tile \"number\" (itoa (1+ (atoi number))))
(mode_tile \"code\" 2)
)")
Như vậy nếu cái key "note" không được kich hoạt (nhập số liệu) thì cái dòng dũ liệu đó có được nhập vào Excel hay không??? Vì thực tế có thể sẽ có những dòng dữ liệu không cần phải nhập ghi chú bác ạ...
5/- Theo mình hiểu thì cái (done_dialog) là hàm đóng hộp thoại lại. Vậy (done_dialog 2) phải chăng là vừa đóng hộp thoại vừa gán cho cái biến sta giá trị là 2 phải không bác????

Vài câu hỏi làm phiền bác, mong bác chớ giận và giải đáp giùm, thực tình cái dialog này mình chưa rõ lắm, nhất là việc sử dụng nó cho vòng lặp bác ạ.
Chúc bác khỏe và vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#23 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 06 December 2010 - 10:21 PM

Chào bác npham,
Đọc code của bác mình thấy một vài thắc mắc sau:
1/- Hàm (mode_tile "key" Value) chỉ nhận hai giá trị là 0 và 1 tức là chỉ có tác dụng tắt hay mở cái nút mang key đó mà thôi. Vậy sao ở đây bác dùng (mode_tile "number" 2). Như vậy nó có ý nghĩa gì???
2/- Key bác đặt là "code" , vậy tại sao trong hàm bác dùng (mode_tile \"code\" 2) ??? Nó có ý nghĩa ra sao???
3/- Bác đặt (setq sta (start_dialog))
Vậy làm sao có (if (= sta 2) ........
4/- Bác dùng :
(action_tile "note" "(PROGN
(write-line (strcat
(setq number (get_tile \"number\")) \"\t\"
(get_tile \"code\") \"\t\"
(get_tile \"distance\") \"\t\"
(get_tile \"note\") \"\t\") f)
(set_tile \"number\" (itoa (1+ (atoi number))))
(mode_tile \"code\" 2)
)")
Như vậy nếu cái key "note" không được kich hoạt (nhập số liệu) thì cái dòng dũ liệu đó có được nhập vào Excel hay không??? Vì thực tế có thể sẽ có những dòng dữ liệu không cần phải nhập ghi chú bác ạ...
5/- Theo mình hiểu thì cái (done_dialog) là hàm đóng hộp thoại lại. Vậy (done_dialog 2) phải chăng là vừa đóng hộp thoại vừa gán cho cái biến sta giá trị là 2 phải không bác????

Vài câu hỏi làm phiền bác, mong bác chớ giận và giải đáp giùm, thực tình cái dialog này mình chưa rõ lắm, nhất là việc sử dụng nó cho vòng lặp bác ạ.
Chúc bác khỏe và vui.


Mỗi người có mỗi thuật toán khác nhau và cách viết cũng khác nhau. Chắc mình là dân a-ma-tơ , không phải programmer chuyên nghiệp nên viết hơi khó hiểu xí. Mình xin giải thích mấy cái thắc mắc của bác như sau:
1. hàm mode_tile gán trạng thái cho nút điều khiển. 0: mở 1: đóng 2: Hiện hành (Tức là con trỏ nhảy vào nó nếu =2)
2. Tương tựu như 1, ở đây cái number tự gia tăng số liệu nên mình cho con trỏ nhảy vào code luôn (mode_tile "code" 2)
3. Đúng là nếu note không được kích hoạt thì dữ liệu không được ghi. Ở đây mình không tạo 1 button ghi dữ liệu nên dùng cái note này thay thế
nếu bỏ qua ghi chú thì từ distance mình TAB- TAB qua (để trống nhưng phải cho con trỏ nhảy qua nó)
4. hàm (done_dialog 2) là đóng hộp thoại và trả về giá trị 2. Mặc định nút ok trả ra 1, cancel trả ra 0
Thường dùng kiểu này nhận biết ngừoi dùng đã bấm cái gì để thoát hộp thoại-lưu vào sta (không nhất thiết phải ok, cancel mới thoát)
sau đó dùng sta để xử lý. Trong trường hợp muốn đóng tạm thời thì dùng vòng lặp (ví dụ sta < 2 (ok, cancel) mới thoat khỏi vòng lặp)

(setq sta 2)
(while (> sta 1)
...
(action_tile "button1" "(done_ dialog 3)")
(action_tile "button2" "(done_ dialog 31)")
(action_tile "button3" "(done_ dialog 9)")
...
(setq sta (start_dialog))

(cond
((= sta 0) (alert "ban da bam nut cancel"))

((= sta 3) (alert "ban da bam nut 1"))
((= sta 31) (alert "ban da bam nut 2"))
.....

)
(đone_ dialog)
(unload_dialog id) <--- mấy cái này là ví dụ cho dễ hiểu thôi nghe.

Hy vọng là mình nói không trật chổ nào, mấy bác khác có j chỉ giáo thêm. Thanks
  • 1

#24 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 07 December 2010 - 02:56 PM

Mỗi người có mỗi thuật toán khác nhau và cách viết cũng khác nhau. Chắc mình là dân a-ma-tơ , không phải programmer chuyên nghiệp nên viết hơi khó hiểu xí. Mình xin giải thích mấy cái thắc mắc của bác như sau:
1. hàm mode_tile gán trạng thái cho nút điều khiển. 0: mở 1: đóng 2: Hiện hành (Tức là con trỏ nhảy vào nó nếu =2)
2. Tương tựu như 1, ở đây cái number tự gia tăng số liệu nên mình cho con trỏ nhảy vào code luôn (mode_tile "code" 2)
3. Đúng là nếu note không được kích hoạt thì dữ liệu không được ghi. Ở đây mình không tạo 1 button ghi dữ liệu nên dùng cái note này thay thế
nếu bỏ qua ghi chú thì từ distance mình TAB- TAB qua (để trống nhưng phải cho con trỏ nhảy qua nó)
4. hàm (done_dialog 2) là đóng hộp thoại và trả về giá trị 2. Mặc định nút ok trả ra 1, cancel trả ra 0
Thường dùng kiểu này nhận biết ngừoi dùng đã bấm cái gì để thoát hộp thoại-lưu vào sta (không nhất thiết phải ok, cancel mới thoát)
sau đó dùng sta để xử lý. Trong trường hợp muốn đóng tạm thời thì dùng vòng lặp (ví dụ sta < 2 (ok, cancel) mới thoat khỏi vòng lặp)

(setq sta 2)
(while (> sta 1)
...
(action_tile "button1" "(done_ dialog 3)")
(action_tile "button2" "(done_ dialog 31)")
(action_tile "button3" "(done_ dialog 9)")
...
(setq sta (start_dialog))

(cond
((= sta 0) (alert "ban da bam nut cancel"))

((= sta 3) (alert "ban da bam nut 1"))
((= sta 31) (alert "ban da bam nut 2"))
.....

)
(đone_ dialog)
(unload_dialog id) <--- mấy cái này là ví dụ cho dễ hiểu thôi nghe.

Hy vọng là mình nói không trật chổ nào, mấy bác khác có j chỉ giáo thêm. Thanks

Chào bác npham,
Nhờ bác chỉ dạy và tham khảo thêm các bác khác, mình làm thử cái này hơi thừa vì chưa chắc có ai cần dùng. Song mình gửi lên để mong các bác góp ý thêm xem còn chỗ nào bất hợp lý. Đề bài vẫn là của bạn Trang72 thôi, còn đáp án thì có khác chút đỉnh với của bác. Tuy cũng ra được cái hộp thoại nhưng chưa được như mong muốn nên nhờ các bác chỉ thêm.
1/- file lisp

(defun c:cvs ( )
(defun saveVars()
(setq STT (get_tile "ebox1")
Ma (get_tile "ebox2")
KC (get_tile "ebox3")
GC (get_tile "ebox4")
)
)

(setq filename (getfiled "Select a File" "" "xls" 1))
(setq f (open filename "w"))
(setq sta 1)
(while (> sta 0)

(setq dcl_id (load_dialog "NHAPLIEU.dcl"))
(if (not (new_dialog "NHAPLIEU" dcl_id) ) (exit))

(action_tile "cancel" "(setq ddiag 1) (done_dialog 0)")
(action_tile "accept" "(setq ddiag 2) (saveVars) (done_dialog 1)")
(action_tile "zoom" "(setq ddiag 3) (done_dialog 2)")
(setq sta (start_dialog))

(if (= ddiag 1)
(progn
(princ "\n \n ...EXAMPLE Cancelled. \n ")
)
)
(if (= ddiag 2)
(progn
(setq retlist (strcat stt "\t" ma "\t" kc "\t" gc "\t"))
(princ "\n")
(princ retlist)
(write-line retlist f )
)
)
(if (= ddiag 3)
(progn
(command "zoom" "e")
(alert "\n Khoa zoom bi nhan")
(SSGET)
)
)

)
(close f )
(done_dialog)
(unload_dialog dcl_id)
(princ)

)



2/- File dcl:


NHAPLIEU : dialog {
label = "Nhap so lieu sang Excel";
: column {
: boxed_row {
label = "Data input";
: edit_box { label = "STT"; key = "ebox1"; }
: edit_box { label = "Ma so"; key = "ebox2"; }
: edit_box { label = "Khoang cach"; key = "ebox3"; }
: edit_box { label = "Ghi chu"; key = "ebox4"; }
}
: row {
label = "Function";
ok_cancel;
: button {key = "zoom"; label = "Zoom realtime"; is_default = false; is_zoom = true; }
}
}
}

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

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 07 December 2010 - 04:28 PM

Chưa coi kỹ lắm nhưng có mấy ý theo thiển ý của mình:
1. Biến gc trùng tên hàm autolisp
2. dùng biến sta thì không cần biến ddiag nữa.
3. key cancel và accept là mặc định nên không cần gán (done_ dialog ...)
4. Về bố cục thì đưa lệnh gọi hàm (savevar) từ chổ action... xuống chung với if (= ddiag 2) hoặc gộp chung savevar và write làm 1.
  • 1

#26 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 07 December 2010 - 04:36 PM

có thể là như thế này chẳng hạn

;; free lisp from cadviet.com

(defun c:cvs ( )
(defun saveVars()
(setq STT (get_tile "ebox1")
Ma (get_tile "ebox2")
KC (get_tile "ebox3")
LGC (get_tile "ebox4")
)
)

(setq filename (getfiled "Select a File" "" "xls" 1))
(setq f (open filename "w"))
(setq sta 2)
(while (> sta 0)

(setq dcl_id (load_dialog "c:/1.DCL"))
(if (not (new_dialog "NHAPLIEU" dcl_id) ) (exit))
(action_tile "zoom" "(done_dialog 2)")
(setq sta (start_dialog))

(if (= sta 0)
(progn
(princ "\n \n ...EXAMPLE Cancelled. \n ")
)
)
(if (= sta 1)
(progn
(saveVars)
(setq retlist (strcat stt "\t" ma "\t" kc "\t" Lgc "\t"))
(princ "\n")
(princ retlist)
(write-line retlist f )
)
)
(if (= sta 2)
(progn
(command "zoom" "e")
(alert "\n Khoa zoom bi nhan")
(SSGET)
)
)

)
(close f )
(done_dialog)
(unload_dialog dcl_id)
(princ)

)

  • 1

#27 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 07 December 2010 - 08:11 PM

có thể là như thế này chẳng hạn

;; free lisp from cadviet.com

(defun c:cvs ( )
(defun saveVars()
(setq STT (get_tile "ebox1")
Ma (get_tile "ebox2")
KC (get_tile "ebox3")
LGC (get_tile "ebox4")
)
)

(setq filename (getfiled "Select a File" "" "xls" 1))
(setq f (open filename "w"))
(setq sta 2)
(while (> sta 0)

(setq dcl_id (load_dialog "c:/1.DCL"))
(if (not (new_dialog "NHAPLIEU" dcl_id) ) (exit))
(action_tile "zoom" "(done_dialog 2)")
(setq sta (start_dialog))

(if (= sta 0)
(progn
(princ "\n \n ...EXAMPLE Cancelled. \n ")
)
)
(if (= sta 1)
(progn
(saveVars)
(setq retlist (strcat stt "\t" ma "\t" kc "\t" Lgc "\t"))
(princ "\n")
(princ retlist)
(write-line retlist f )
)
)
(if (= sta 2)
(progn
(command "zoom" "e")
(alert "\n Khoa zoom bi nhan")
(SSGET)
)
)

)
(close f )
(done_dialog)
(unload_dialog dcl_id)
(princ)

)

Chào bác npham,
Mình không rõ vì lý do gì, có thể do mình xài cad2004 chăng, nhưng khi load cái lisp của bác đã sửa này về chạy thử thì thấy:
1/- Hộp thoại xuất hiện , nhưng chỉ nhập được một dòng dữ liệu rồi thoát mà không in kết quả sang Excel được với thông báo lỗi là
; error: bad argument type: stringp nil

2/- Lúc này do chương trình thoát ra mà chưa chạy hàm (close f) nên file Excel không thể mở được mà chỉ có thể mở ở dạng read only. Nội dung thì trống rỗng như đã nói trên bác ạ.

Cứ theo logic như bác giải thích thì thấy OK, nhưng thực tế mình chưa rõ vì sao lại bị như vậy. Bác có thể bớt chút thời gian xem lại hộ mình với..
Cám ơn bác.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#28 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 07 December 2010 - 09:00 PM

Chào bác npham,
Mình không rõ vì lý do gì, có thể do mình xài cad2004 chăng, nhưng khi load cái lisp của bác đã sửa này về chạy thử thì thấy:
1/- Hộp thoại xuất hiện , nhưng chỉ nhập được một dòng dữ liệu rồi thoát mà không in kết quả sang Excel được với thông báo lỗi là
; error: bad argument type: stringp nil

2/- Lúc này do chương trình thoát ra mà chưa chạy hàm (close f) nên file Excel không thể mở được mà chỉ có thể mở ở dạng read only. Nội dung thì trống rỗng như đã nói trên bác ạ.

Cứ theo logic như bác giải thích thì thấy OK, nhưng thực tế mình chưa rõ vì sao lại bị như vậy. Bác có thể bớt chút thời gian xem lại hộ mình với..
Cám ơn bác.


Heee. Gỡ lỗi là công việc rất thú vị của programmer. Mình ví dụ mà chưa kịp chạy thử nó nữa

Hàm savevars được gọi sau khi done_ dialog nên nó không đọc được (get_tile "key"). bạn bỏ lại ở vị trí thích hợp nhé.

Có nghĩa trong trường hợp này bạn phải thêm: (action_tile "accept" "(savevars)(done_dialog 1)") và bỏ cái savevars ở dưới

mà mình góp ý xí. Chỉ đóng tạm thời hộp thoại khi rất cần thiết . Ví dụ cần thực hiện những lệnh mà nếu họp thoại hiẹn hành thì không thể làm được.
Nếu không mỗi lần tắt/mở HT sẽ nháy 1 cái nhìn k0 " chuyên nghiệp"
  • 1

#29 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1433 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 08 December 2010 - 09:28 AM

Chào bác npham,
Nhờ bác chỉ dạy và tham khảo thêm các bác khác, mình làm thử cái này hơi thừa vì chưa chắc có ai cần dùng. Song mình gửi lên để mong các bác góp ý thêm xem còn chỗ nào bất hợp lý. Đề bài vẫn là của bạn Trang72 thôi, còn đáp án thì có khác chút đỉnh với của bác. Tuy cũng ra được cái hộp thoại nhưng chưa được như mong muốn nên nhờ các bác chỉ thêm.
1/- file lisp

2/- File dcl:


NHAPLIEU : dialog {
label = "Nhap so lieu sang Excel";
: column {
: boxed_row {
label = "Data input";
: edit_box { label = "STT"; key = "ebox1"; }
: edit_box { label = "Ma so"; key = "ebox2"; }
: edit_box { label = "Khoang cach"; key = "ebox3"; }
: edit_box { label = "Ghi chu"; key = "ebox4"; }
}
: row {
label = "Function";
ok_cancel;
: button {key = "zoom"; label = "Zoom realtime"; is_default = false; is_zoom = true; }
}
}
}

Chào các bác.
Tiếp sức cùng bác Bình, "mình làm thử cái này hơi thừa vì chưa chắc có ai cần dùng ?"
Đề bài vẫn là của bạn Trang72 và ý tuởng từ LISP của bác Bình, đáp án thì có khác chút đỉnh với nguyên bản ..

Sử dụng file "NHAPLIEU.dcl" của bác Bình.
Môt số cải tiến :
- gán giá trị mặc định cho hộp thoại
- STT tự động tăng lên 1 sau mỗi lần nhấn OK
- chức năng của button ZOOM đuợc đổi thành GET_Distance (đo khoảng cách 2 điểm trên CAD)
(defun c:cvs (/ dcflag dcl_id f filename kc ma note retlist stt)
(defun saveVars ();save data
(setq STT (get_tile "ebox1")
Ma (get_tile "ebox2")
KC (get_tile "ebox3")
note (get_tile "ebox4") ) )

(setq dcl_id (load_dialog "temp"));(load_dialog "NHAPLIEU.dcl")(load_dialog "temp")
(setq filename (getfiled "Select a File" "" "csv" 1))
(setq f (open filename "a"))

;init data
(setq STT 1
Ma "CadViet"
KC 1000
note "AutoLisp")

(while (/= dcflag 0)
(if (not (new_dialog "NHAPLIEU" dcl_id))
(exit) )

;set data
(set_tile "ebox1" (itoa stt))
(set_tile "ebox2" Ma)
(set_tile "ebox3" (rtos kc))
(set_tile "ebox4" note)

(action_tile "accept" "(saveVars)(done_dialog 1)")
(action_tile "zoom" "(done_dialog 2)")

(setq dcFlag (start_dialog))
(cond

((= dcflag 1);add data to file
(progn
(setq retlist (strcat stt "\t" ma "\t" kc "\t" note "\t"))
(princ "\n") (princ retlist)
(write-line retlist f)
(setq stt (1+ (atoi stt)))
(setq kc (atof kc)) ))

((= dcflag 2);Get distance
(if (setq tmp (getdist "\nPick 2 diem de do khoang cach :"))
(setq kc tmp) ))
);cond

)
(princ "\n \n ...EXAMPLE Cancelled. \n ")
(close f)
(unload_dialog dcl_id)
(princ))

  • 1

#30 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 08 December 2010 - 11:27 AM

Chào các bác.
Tiếp sức cùng bác Bình, "mình làm thử cái này hơi thừa vì chưa chắc có ai cần dùng ?"
Đề bài vẫn là của bạn Trang72 và ý tuởng từ LISP của bác Bình, đáp án thì có khác chút đỉnh với nguyên bản ..

Sử dụng file "NHAPLIEU.dcl" của bác Bình.
Môt số cải tiến :
- gán giá trị mặc định cho hộp thoại
- STT tự động tăng lên 1 sau mỗi lần nhấn OK
- chức năng của button ZOOM đuợc đổi thành GET_Distance (đo khoảng cách 2 điểm trên CAD)

(defun c:cvs (/ dcflag dcl_id f filename kc ma note retlist stt)
(defun saveVars ();save data
(setq STT (get_tile "ebox1")
Ma (get_tile "ebox2")
KC (get_tile "ebox3")
note (get_tile "ebox4") ) )

(setq dcl_id (load_dialog "NHAPLIEU.dcl"))
(setq filename (getfiled "Select a File" "" "csv" 1))
(setq f (open filename "a"))

;init data
(setq STT 1
Ma "CadViet"
KC 1000
note "AutoLisp")

(while (/= dcflag 0)
(if (not (new_dialog "NHAPLIEU" dcl_id))
(exit) )

;set data
(set_tile "ebox1" (itoa stt))
(set_tile "ebox2" Ma)
(set_tile "ebox3" (rtos kc))
(set_tile "ebox4" note)

(action_tile "accept" "(saveVars)(done_dialog 1)")
(action_tile "zoom" "(done_dialog 2)")

(setq dcFlag (start_dialog))
(cond

((= dcflag 1);add data to file
(setq retlist (strcat stt "\t" ma "\t" kc "\t" note "\t"))
(princ "\n")
(princ retlist)
(write-line retlist f)
(setq stt (1+ (atoi stt)))
(setq kc (atof kc)) )

((= dcflag 2);Get distance
(if (setq tmp (getdist "\nPick 2 diem de do khoang cach :")) ))
);cond
)
(princ "\n \n ...EXAMPLE Cancelled. \n ")
(close f)
(unload_dialog dcl_id)
(princ))

Chào bác Giabach,
Sau khi test cái lisp của bác, mình thấy có vài ý như sau:
1/- Có nhẽ do mình xài Cad2004 nên nó không hiểu cái lisp của bác và cứ báo là ; error: syntax error
Sau khi đọc lại cái lisp thì mình thấy cái hàm (cond ....................) của bác có nhẽ là viết theo đời mới nên mình bổ sung thêm như sau thì lisp chạy ngon lành:
(cond
( (= dcflag 1);add data to file
(progn
(setq retlist (strcat stt "\t" ma "\t" kc "\t" note "\t"))
(princ "\n")
(princ retlist)
(write-line retlist f)
(setq stt (1+ (atoi stt)))
(setq kc (atof kc))
)
)

( (= dcflag 2);Get distance
(setq tmp (getdist "\nPick 2 diem de do khoang cach :"))
)
);cond

2/- Việc bác cho các giá trị mặc định sẽ thuận tiện cho người dùng không phải nhập lại các giá trị nếu các giá trị này ở record sau giống như record trưởc. Tuy nhiên cũng có bất lợi là dễ làm cho người sử dụng nhầm lẫn khi có những giá trị cần bỏ qua. Lúc này người sử dụng sẽ phải xóa cái giá trị đó đi trong hộp thoại.
3/- Việc bác sử dụng hàm getdist trong trường hợp này là khá hay thay vì các thao tác phải zoom pan màn hình khác.
4/- Việc bác sử dụng tham số a cho hàm open cũng là một ý rất hay.

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

#31 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1433 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 08 December 2010 - 01:28 PM

Chào bác Giabach,
Sau khi test cái lisp của bác, mình thấy có vài ý như sau:
1/- Có nhẽ do mình xài Cad2004 nên nó không hiểu cái lisp của bác và cứ báo là ; error: syntax error
Sau khi đọc lại cái lisp thì mình thấy cái hàm (cond ....................) của bác có nhẽ là viết theo đời mới nên mình bổ sung thêm như sau thì lisp chạy ngon lành:
(cond
( (= dcflag 1);add data to file
(progn
(setq retlist (strcat stt "\t" ma "\t" kc "\t" note "\t"))
(princ "\n")
(princ retlist)
(write-line retlist f)
(setq stt (1+ (atoi stt)))
(setq kc (atof kc))
)
)

( (= dcflag 2);Get distance
(setq tmp (getdist "\nPick 2 diem de do khoang cach :"))
)
);cond

2/- Việc bác cho các giá trị mặc định sẽ thuận tiện cho người dùng không phải nhập lại các giá trị nếu các giá trị này ở record sau giống như record trưởc. Tuy nhiên cũng có bất lợi là dễ làm cho người sử dụng nhầm lẫn khi có những giá trị cần bỏ qua. Lúc này người sử dụng sẽ phải xóa cái giá trị đó đi trong hộp thoại.
3/- Việc bác sử dụng hàm getdist trong trường hợp này là khá hay thay vì các thao tác phải zoom pan màn hình khác.
4/- Việc bác sử dụng tham số a cho hàm open cũng là một ý rất hay.

Chúc bác khỏe và vui.

Cám ơn bác đã góp ý.
Xin lỗi bác vì Post bài thế nào mà code trong hàm cond bị mất 1 đọan. (đã fix ở bài viết trên)
Tui chạy với Cad2010 thì ok.
Vậy là với Cad2004 phải cho code vào trong hàm (progn ...).
Chúc bác mạnh khỏe .
  • 0

#32 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 09 December 2010 - 09:02 AM

Chào cả nhà !
Thấy mấy bác cũng có hứng thú với đề tài này nên mình " chế " lại 1 chút cho vui. Chủ yếu là để tham khảo học hỏi lẫn nhau.
Code dưới đây thực hiện công việc ghi dwx liệu nhập ra file, nhưng trước khi ra file nó được ghi vào list_box để quan sát trước.
Ưu điểm:
- Số TT twj gia tăng
- nhập liệu bằng TAB-ENter, sau khi enter con trỏ quay về code, thuận tiện cho người nhập, đồng thời reset các ô nhập liệu (trừ stt)
- Nút getdistance (theo ý tưỏng của bác gì đó)
- Quan sát được toàn bộ du liêu trươc khi ghi
Tồn tại: (cần bổ sung)
- Kiểm tra tính hợp lệ dwx liệu, loại bỏ dữ liệu rỗng
- Nút thêm, xoá, swả dw liệu trên list_box
- Cần phải hỏi lại trước khi đóng mà không ghi

Mấy bác có hứng thú thì phát triển tiếp nhé . Để chơi thôi chứ không biết có cần để làm gì không nwã. Hehe

minh hoạ:
Hình đã gửi

Code:
;;; www.cadviet.com
(defun DCLmaker ( / f fn )
(setq fn (strcat (vl-filename-mktemp) ".dcl"))
(setq f (open fn "w"))
(write-line (strcat
"input:dialog {
label=\"Write to file\";
: boxed_row {
label=\"Row data\";
: column {: text {label=\"Number\";} : edit_box {key=\"number\";edit_width=5;}}
: column {: text {label=\"Code\";} : edit_box {key=\"code\";edit_width=8;}}
: column {: text {label=\"Distance\";} : edit_box {key=\"distance\";edit_width=8;}}
: column {: text {label=\"Notes\";} : edit_box {key=\"note\";edit_width=20;}}
: column {spacer; : button {key=\"add\";label=\"Add\";edit_width=20;}}
}
: list_box {
key=\"data\";
label=\"Data\";
}
: row {
: button {
label=\"Distance\";
fixed_width=true;
key=\"zoom\";
}
: button {
label=\"Close without write\";
fixed_width=true;
is_cancel=true;
key=\"cancel\";
alignment=right;
}
: button {
label=\"Close and write\";
fixed_width=true;
key=\"accept\";
is_default=true;
alignment=right;
}
}
}"
) f)
(close f)
fn
)
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
(defun add&view (key ss /)
(start_list key)
(foreach x ss (add_list x))
(end_list)
)
;---------------------------------------------------------------------------
(defun savevars ( / vars)
(setq vars (strcat
(setq number (get_tile "number")) ", "
(get_tile "code") ", "
(rtos (distof (get_tile "distance")) 2 2) ", "
(get_tile "note")))

(set_tile "code" "")
(set_tile "distance" "")
(set_tile "note" "")
vars
)
;---------------------------------------------------------------------------
(defun c:input (/ fn f number sta id data dis)


(setq id (load_dialog (dclmaker)))

(setq sta 2)
(while (> sta 1)
(new_dialog "input" id)
(if dis (set_tile "distance" (rtos dis 2 2)))
(add&view "data" data)

(mode_tile "number" 2)
(action_tile "add" "(PROGN
(setq data (append data (list (savevars))))
(add&view \"data\" data)
(set_tile \"number\" (itoa (1+ (atoi number))))
(mode_tile \"code\" 2)
)")
(action_tile "zoom" "(done_dialog 2)")
(setq sta (start_dialog))

(cond
((= sta 2) (setq dis (getdist "\nNhap khoang cach:")))
((= sta 1) (progn
(if (setq fn (getfiled "Select a File" "" "cvs" 1))
(progn
(setq f (open fn "w"))
(foreach x data (write-line x f))
(close f)
))))
)




)
(done_dialog)
(unload_dialog id)

)

  • 2

#33 Trang72

Trang72

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 09 December 2010 - 01:36 PM

Chào cả nhà !
Thấy mấy bác cũng có hứng thú với đề tài này nên mình " chế " lại 1 chút cho vui. Chủ yếu là để tham khảo học hỏi lẫn nhau.
Code dưới đây thực hiện công việc ghi dwx liệu nhập ra file, nhưng trước khi ra file nó được ghi vào list_box để quan sát trước.
Ưu điểm:
- Số TT twj gia tăng
- nhập liệu bằng TAB-ENter, sau khi enter con trỏ quay về code, thuận tiện cho người nhập, đồng thời reset các ô nhập liệu (trừ stt)
- Nút getdistance (theo ý tưỏng của bác gì đó)
- Quan sát được toàn bộ du liêu trươc khi ghi
Tồn tại: (cần bổ sung)
- Kiểm tra tính hợp lệ dwx liệu, loại bỏ dữ liệu rỗng
- Nút thêm, xoá, swả dw liệu trên list_box
- Cần phải hỏi lại trước khi đóng mà không ghi

Mấy bác có hứng thú thì phát triển tiếp nhé . Để chơi thôi chứ không biết có cần để làm gì không nwã. Hehe

minh hoạ:
Hình đã gửi

Code:

;;; www.cadviet.com
(defun DCLmaker ( / f fn )
(setq fn (strcat (vl-filename-mktemp) ".dcl"))
(setq f (open fn "w"))
(write-line (strcat
"input:dialog {
label=\"Write to file\";
: boxed_row {
label=\"Row data\";
: column {: text {label=\"Number\";} : edit_box {key=\"number\";edit_width=5;}}
: column {: text {label=\"Code\";} : edit_box {key=\"code\";edit_width=8;}}
: column {: text {label=\"Distance\";} : edit_box {key=\"distance\";edit_width=8;}}
: column {: text {label=\"Notes\";} : edit_box {key=\"note\";edit_width=20;}}
: column {spacer; : button {key=\"add\";label=\"Add\";edit_width=20;}}
}
: list_box {
key=\"data\";
label=\"Data\";
}
: row {
: button {
label=\"Distance\";
fixed_width=true;
key=\"zoom\";
}
: button {
label=\"Close without write\";
fixed_width=true;
is_cancel=true;
key=\"cancel\";
alignment=right;
}
: button {
label=\"Close and write\";
fixed_width=true;
key=\"accept\";
is_default=true;
alignment=right;
}
}
}"
) f)
(close f)
fn
)
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
(defun add&view (key ss /)
(start_list key)
(foreach x ss (add_list x))
(end_list)
)
;---------------------------------------------------------------------------
(defun savevars ( / vars)
(setq vars (strcat
(setq number (get_tile "number")) ", "
(get_tile "code") ", "
(rtos (distof (get_tile "distance")) 2 2) ", "
(get_tile "note")))

(set_tile "code" "")
(set_tile "distance" "")
(set_tile "note" "")
vars
)
;---------------------------------------------------------------------------
(defun c:input (/ fn f number sta id data dis)


(setq id (load_dialog (dclmaker)))

(setq sta 2)
(while (> sta 1)
(new_dialog "input" id)
(if dis (set_tile "distance" (rtos dis 2 2)))
(add&view "data" data)

(mode_tile "number" 2)
(action_tile "add" "(PROGN
(setq data (append data (list (savevars))))
(add&view \"data\" data)
(set_tile \"number\" (itoa (1+ (atoi number))))
(mode_tile \"code\" 2)
)")
(action_tile "zoom" "(done_dialog 2)")
(setq sta (start_dialog))

(cond
((= sta 2) (setq dis (getdist "\nNhap khoang cach:")))
((= sta 1) (progn
(if (setq fn (getfiled "Select a File" "" "cvs" 1))
(progn
(setq f (open fn "w"))
(foreach x data (write-line x f))
(close f)
))))
)




)
(done_dialog)
(unload_dialog id)

)

Code của bác rất hay nhưng dữ liệu 4 cột chỉ vào trong 1 cel.Nếu tách dữ liệu sang mỗi 1 dữ liệu sang 1 cel thì quả là hay.
  • 0

#34 npham

npham

    biết lệnh rotate

  • Members
  • PipPipPip
  • 136 Bài viết
Điểm đánh giá: 75 (tàm tạm)

Đã gửi 09 December 2010 - 02:24 PM

Code của bác rất hay nhưng dữ liệu 4 cột chỉ vào trong 1 cel.Nếu tách dữ liệu sang mỗi 1 dữ liệu sang 1 cel thì quả là hay.


Úi trời. bác sửa cái đuôi *.cvs thành *.csv dùm cái
  • 0

#35 tinya1225

tinya1225

    biết lệnh copy

  • Members
  • PipPipPip
  • 114 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 27 December 2011 - 03:02 PM

Chào cả nhà !
Thấy mấy bác cũng có hứng thú với đề tài này nên mình " chế " lại 1 chút cho vui. Chủ yếu là để tham khảo học hỏi lẫn nhau.
Code dưới đây thực hiện công việc ghi dwx liệu nhập ra file, nhưng trước khi ra file nó được ghi vào list_box để quan sát trước.
Ưu điểm:
- Số TT twj gia tăng
- nhập liệu bằng TAB-ENter, sau khi enter con trỏ quay về code, thuận tiện cho người nhập, đồng thời reset các ô nhập liệu (trừ stt)
- Nút getdistance (theo ý tưỏng của bác gì đó)
- Quan sát được toàn bộ du liêu trươc khi ghi
Tồn tại: (cần bổ sung)
- Kiểm tra tính hợp lệ dwx liệu, loại bỏ dữ liệu rỗng
- Nút thêm, xoá, swả dw liệu trên list_box
- Cần phải hỏi lại trước khi đóng mà không ghi

Mấy bác có hứng thú thì phát triển tiếp nhé . Để chơi thôi chứ không biết có cần để làm gì không nwã. Hehe

minh hoạ:
Hình đã gửi


Các bác cho e hỏi dùng font gì để không bị lỗi vậy ạ. E làm thì nó bị lỗi font từ lúc add, xuất hiện toàn hình vuông đằng trước rùi mới đến những thông số mình nhập vào (hình), và khi em nhập thông số stt, code rùi bấm nút distance thì những thông số ở stt, code bị xóa mất nhờ các bác sửa giúp.

http://www.cadviet.c.../3/86711_ck.jpg

E xin phép đưa ra 1 số ý kiến thêm vào cho chương trình theo nhu cầu của e nhờ các bác júp đỡ ạ:
-Thêm vào 1 cột distance2
-Cạnh mỗi cột có 1 nút pick để chọn text có sẵn trong bản vẽ (giống nút distance)
Em xin cám ơn các bác v chúc các bác sức khỏe.
  • 0
Thấy bài có ích thì ấn thật nhiều Thank + các bác nhé^^