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

[Thảo luận] Viết lại các hàm Express

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

Coi như 1 hàm tưởng to to mà lại mần bằng 1 đoạn nhỏ nhỏ các bác nhỉ ^^

To to mà mần thành nhỏ nhỏ thì tiếc gì Like This hở Ket?

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ột họ hàm khá hay nữa là acet-ui-progress. mấy hàm này rất hữu ích khi chương trình fải xử lý 1 lượng công việc lớn. mình đang cần nhưng bận nên chưa viết lại được, tạm thời vẫn fải dùng acet. bác nào rảnh thì viết bổ sung em nó vào thư viện này đi.

À quên: ý tưởng của mình là sử dụng vector để vẽ pogress bar trực tiếp lên màn hình cad hoặc hộp thoại chứ không dùng thanh status bar của cad nữa (muốn dùng cũng chả làm được). bác nào khéo tay chút có khi còn làm được cái pogress bar đẹp hơn ấy chứ :D

Dùng hộp thoại đơn giản hơn nhìu bác ạ ^^ Lúc nào rảnh e thử viết cái. Dùng vector đã thử thấy không ổn định ở các máy khác nhau ạ ^^

Nếu muốn trên thanh status thì count kiểu %, hoặc dùng ARX, NET hoặc down luôn dos_lib ^^

To to mà mần thành nhỏ nhỏ thì tiếc gì Like This hở Ket?

Ồi, em là chuyên gia Like r mà :D

 

P/s : e vừa tìm ra cách làm progress đơn giản trên thanh Status bar với lisp, lúc nào rỗi viết chỉn chu lạ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

Dùng hộp thoại đơn giản hơn nhìu bác ạ ^^ Lúc nào rảnh e thử viết cái. Dùng vector đã thử thấy không ổn định ở các máy khác nhau ạ ^^

Không ổn định ở vấn đề gì nhỉ? mình viết rất nhiều lệnh có sử dụng vector để hiển thị thông tin mà chương trình tương tác với người dùng. thấy chạy hiển thị tốt trên máy của mình và máy của người khác, với nhiều kích thước màn hình và độ phân giải khác nhau. về bản chất thì cách thức hiển thị của vector vẽ trên màn hình cad và trên hộp thoại là giống nhau mà Ket. chúng đều có đơn vị tính tròn là pixel.

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

À, để in ra các ký tự - hình vẽ đơn giản thì không vấn đề, nhưng để fill 1 thanh trạng thái như progress bar thì sẽ có hiện tượng nháy - biến mất - nháy - nháy - nhấp nháy - nháy nháy nháy - biến mất - nháy nháy nháy .... bác ạ ^^ Hiện tượng tăng dần theo time thực hiện

Ví dụ của elpanov, làm với grvecs đây, bác chạy sẽ thấy hoạt động tốt n cũng k vui đâu ( nhất là khi mouse nằm trong vùng vẽ) ^^ Theo em nếu làm vector thì chỉ nên dùng cái chữ chạy % là đủ r ^^ Ở đây ôm cả code hiển thị string nên dài đến là dài

http://www.cadviet.com/upfiles/3/24067_progressbar.lsp

  • 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

code dài chỉ load chậm 1 chút thôi nếu ta load nó ở định dạng lisp. còn nếu bạn mã hóa nó thành fas rồi thì load vẫn nhanh như bình thường, không vấn đề gì đâu.

Đúng là để nó nháy nháy thế này cũng khó chịu thậ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

Có thêm cái này, chưa nghiên cứu kỹ, mọi người xem dùng được không?

;ProgressBar contains a set of functions that can be used in loops while processing information.
;The main functions are ProgressBar, Progress, and EndProgressBar.
;There are a few example functions to demonstrate the syntax and method of using ProgressBar.
;PB-Demo is an example for an information message only. PB-Demo1 is an example for a foreach loop.
;PB-Demo2 is an example for a repeat loop. And PB-Demo3 is an example for a while loop.
;-------------------------------------------------------------------------------
; Program Name: ProgressBar.lsp [Progress Bar R3]
; Created By:   Terry Miller (Email: terrycadd@yahoo.com)
;           	(URL: http://web2.airmail.net/terrycad)
; Date Created: 6-20-04
; Function: 	Progress Bar functions to be used in loops
;-------------------------------------------------------------------------------
; Revision History
; Rev  By 	Date	Description
;-------------------------------------------------------------------------------
; 1	TM	6-20-04  Initial version
; 2	TM	2-20-05  Divided initial function into three functions, ProgressBar,
;                 	Progress, and EndProgressBar to be used in loops.
; 3	TM	1-20-07  Updated progress bar dialog design.
;-------------------------------------------------------------------------------
; c:PB-Demo - ProgressBar demo functions for an information message only
;-------------------------------------------------------------------------------
(defun c:PB-Demo ( / List@ Reps~)
 (ProgressBar "" "Processing calculations..." 0.5);Title$, Message$, Percent of *Speed# variable
 (repeat 100 (Progress))
 (EndProgressBar)
 (princ)
);defun c:PB-Demo
;-------------------------------------------------------------------------------
; c:PB-Demo1 - ProgressBar demo functions with a foreach loop example
;-------------------------------------------------------------------------------
(defun c:PB-Demo1 ( / List@ Reps~)
 (repeat 500 (setq List@ (append List@ (list ""))));Create a long list
 (ProgressBar "" "" 0.5);Title$, Message$, Percent of *Speed# variable
 (setq Reps~ 1)
 ;The following may be a repeat, a foreach or a while loop
 (foreach Item List@ ;This is a redundant example
;Process something here
(setq Reps~ (+ Reps~ (/ 100.0 (length List@))))
(repeat (fix Reps~) (Progress));Move the Progress Bar
(setq Reps~ (- Reps~ (fix Reps~)))
 );foreach
 (EndProgressBar);Close the Progress Bar
);defun c:PB-Demo1
;-------------------------------------------------------------------------------
; c:PB-Demo2 - ProgressBar demo functions with a repeat loop example
;-------------------------------------------------------------------------------
(defun c:PB-Demo2 ( / List@ Reps~ SS&)
 (princ "\nSelect objects for demo selection set.")
 (if (setq SS& (ssget))
(progn
 	(ProgressBar "" (strcat "Processing " (itoa (sslength SS&)) " objects...") 0.25)
 	(setq Reps~ 1)
 	;The following may be a repeat, a foreach or a while loop
 	(repeat (sslength SS&);This is a redundant example
   	;Process something here
   	(setq Reps~ (+ Reps~ (/ 100.0 (sslength SS&))))
   	(repeat (fix Reps~) (Progress));Move the Progress Bar
   	(setq Reps~ (- Reps~ (fix Reps~)))
 	);repeat
 	(EndProgressBar);Close the Progress Bar
);progn
 );if
);defun c:PB-Demo2
;-------------------------------------------------------------------------------
; c:PB-Demo3 - ProgressBar demo functions with a while loop example
;-------------------------------------------------------------------------------
(defun c:PB-Demo3 ( / FileName% PathFilename$ Reps# Text$)
 (if (setq PathFilename$ (findfile "ACAD.pgp"))
(progn
 	(setq FileName% (open PathFilename$ "r"))
 	(ProgressBar "" "Reading in the Acad.pgp file..." 0.5)
 	(setq Reps# 1)
 	;The following may be a repeat, a foreach or a while loop
 	(while (setq Text$ (read-line FileName%))
   	;Process something here
   	(if (= (rem Reps# 4) 0);Every fourth time
     	(Progress);Move the Progress Bar
   	);if
   	(setq Reps# (1+ Reps#))
 	);while
 	(close FileName%)
 	(EndProgressBar);Close the Progress Bar
);progn
 );if
);defun c:PB-Demo3
;-------------------------------------------------------------------------------
; ProgressBar - Progress Bar
; Arguments: 3
;   Title$ = Dialog title
;   Message$ = Message to display
;   Delay~ - Percentage of *Speed# variable
; Example: (ProgressBar "Program Message" "Processing information..." 0.5)
;-------------------------------------------------------------------------------
(defun ProgressBar (Title$ Message$ Delay~)
 (setq *Delay~ Delay~)
 (if (not *Speed#) (Speed))
 (setq *Dcl_Id% (load_dialog "ProgressBar.dcl"))
 (new_dialog "ProgressBar" *Dcl_Id%)
 (if (= Title$ "")(setq Title$ "AutoCAD Message"))
 (if (= Message$ "")(setq Message$ "Processing information..."))
 (set_tile "Title" (strcat " " Title$))
 (set_tile "Message" Message$)
 (setq *X# (1- (dimx_tile "ProgressBar")))
 (setq *Y# (1- (dimy_tile "ProgressBar")))
 (start_image "ProgressBar")
 (vector_image 0 2 2 0 8)
 (vector_image 2 0 (- *X# 2) 0 8)
 (vector_image (- *X# 2) 0 *X# 2 8)
 (vector_image *X# 2 *X# (- *Y# 2) 8)
 (vector_image (- *X# 2) *Y# *X# (- *Y# 2) 8)
 (vector_image (- *X# 2) *Y# 2 *Y# 8)
 (vector_image 2 *Y# 0 (- *Y# 2) 8)
 (vector_image 0 (- *Y# 2) 0 2 8)
 (end_image)
 (setq *Inc# 0 *Xpt# -4)
 (princ)
);defun ProgressBar
;-------------------------------------------------------------------------------
; Progress - Move the Progress Bar
;-------------------------------------------------------------------------------
(defun Progress (/ Complete$)
 (setq *Inc# (1+ *Inc#))
 (if (= (rem *Inc# 2) 1)
(setq *Xpt# (+ *Xpt# 7))
 );if
 (start_image "ProgressBar")
 (if (> *Inc# 100)
(progn
 	(setq *Inc# 0 *Xpt# -4)
 	(start_image "ProgressBar")
 	(fill_image 3 3 (- *X# 5) (- *Y# 5) -15)
);progn
(progn
 	(vector_image *Xpt#  3 (+ *Xpt# 4)  3 120)
 	(vector_image *Xpt#  4 (+ *Xpt# 4)  4 110)
 	(vector_image *Xpt#  5 (+ *Xpt# 4)  5 110)
 	(vector_image *Xpt#  6 (+ *Xpt# 4)  6 100)
 	(vector_image *Xpt#  7 (+ *Xpt# 4)  7 100)
 	(vector_image *Xpt#  8 (+ *Xpt# 4)  8  90)
 	(vector_image *Xpt#  9 (+ *Xpt# 4)  9  90)
 	(vector_image *Xpt# 10 (+ *Xpt# 4) 10  90)
 	(vector_image *Xpt# 11 (+ *Xpt# 4) 11  90)
 	(vector_image *Xpt# 12 (+ *Xpt# 4) 12 100)
 	(vector_image *Xpt# 13 (+ *Xpt# 4) 13 100)
 	(vector_image *Xpt# 14 (+ *Xpt# 4) 14 110)
 	(vector_image *Xpt# 15 (+ *Xpt# 4) 15 110)
 	(vector_image *Xpt# 16 (+ *Xpt# 4) 16 120)
);progn
 );if
 (end_image)
 (setq Complete$ (strcat (itoa (fix (+ *Inc# 0.5))) "% Complete..."))
 (set_tile "Complete" Complete$)
 (delay *Delay~)
 (action_tile "cancel" "(done_dialog)(exit)")
 (if (= *Inc# 100)(delay 10));Delay to show complete
 (princ)
);defun Progress
;-------------------------------------------------------------------------------
; EndProgressBar - Close Progress Bar dialog and clear variables
;-------------------------------------------------------------------------------
(defun EndProgressBar ( )
 (setq *Delay~ (* *Delay~ 0.5));Speed up bars remaining
 (if (and (> *Inc# 0)(< *Inc# 100))
(repeat (- 100 *Inc#) (Progress))
 );if
 (done_dialog)
 (start_dialog)
 (unload_dialog *Dcl_Id%)
 (setq *Dcl_Id% nil *Delay~ nil *Inc# nil *X# nil *Xpt# nil *Y# nil)
 (princ)
);defun EndProgressBar
;-------------------------------------------------------------------------------
; Speed - Determines the approximate computer processing speed and sets the
; global variable *speed# which may be used in delay loops while in dialogs.
;-------------------------------------------------------------------------------
(defun Speed (/ Cdate~ Cnt# NewSecond# OldSecond#)
 (setq Cdate~ (getvar "CDATE"))
 (setq NewSecond# (fix (* (- (* (- Cdate~ (fix Cdate~)) 100000)(fix (* (- Cdate~ (fix Cdate~)) 100000))) 10)))
 (repeat 2
(setq Cnt# 0)
(setq OldSecond# NewSecond#)
(while (= NewSecond# OldSecond#)
 	(setq Cdate~ (getvar "CDATE"))
 	(setq NewSecond# (fix (* (- (* (- Cdate~ (fix Cdate~)) 100000)(fix (* (- Cdate~ (fix Cdate~)) 100000))) 10)))
 	(setq Cnt# (1+ Cnt#))
);while
 );repeat
 (setq *Speed# Cnt#)
 (princ)
);defun Speed
;-------------------------------------------------------------------------------
; delay - time delay function
; Arguments: 1
;   Percent~ - Percentage of *Speed# variable
; Returns: time delay
;-------------------------------------------------------------------------------
(defun delay (Percent~ / Number~)
 (if (not *Speed#) (Speed))
 (repeat (fix (* *Speed# Percent~)) (setq Number~ pi))
 (princ)
);defun delay
;-------------------------------------------------------------------------------
(princ);End of ProgressBar.lsp

dcl_settings : default_dcl_settings { audit_level = 3; }
//------------------------------------------------------------------------------
// Program Name: ProgressBar.dcl [Progress Bar R3]
// Created By:   Terry Miller (Email: terrycadd@yahoo.com)
//           	(URL: http://web2.airmail.net/terrycad)
// Date Created: 6-20-04
// Function: 	Progress Bar dialog
//------------------------------------------------------------------------------
// Revision History
// Rev  By 	Date	Description
//------------------------------------------------------------------------------
// 1	TM	6-20-04  Initial version
// 2	TM	2-20-05  Divided initial function into three functions, ProgressBar,
//                 	Progress, and EndProgressBar to be used in loops.
// 3	TM	1-20-07  Updated progress bar dialog design.
//------------------------------------------------------------------------------
// ProgressBar - Progress Bar dialog
//------------------------------------------------------------------------------
ProgressBar : dialog {
 key = "Title";
 label = "";
 spacer;
 : text {
key = "Message";
label = "";
 }
 : row {
: column {
 	: spacer { height = 0.12; fixed_height = true;}
 	: image {
   	key = "ProgressBar";
   	width = 58.92; fixed_width = true;
   	height = 1.51; fixed_height = true;
   	aspect_ratio = 1;
   	color = -15;
   	vertical_margin = none;
 	}
 	spacer;
}
cancel_button;
 }
 : text {
key = "Complete";
label = "";
 }
}// ProgressBar
//------------------------------------------------------------------------------

  • 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ái của Terry đẹp và hiện đại, ngoài ra có rất nhiều lựa chọn khác cho 1 Dialog Progress ^^

Preview :

Terry : (DCL)

Untitled-5.gif

 

Elpanov : (Grvecs)

Untitled-8.gif

 

Em edit 1 : (DCL)

Untitled-6.gif

 

Em cày 2: (Status), cái này là cheat dành cho bác Thái ^^

không dùng thanh status bar của cad nữa (muốn dùng cũng chả làm được)

Untitled-7.gif

  • 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

Ái chà chà. đặt gạch hóng cái status bar của ketxu :D

Edit: Hiểu roài =]]. hình như ketxu khôn lỏi, dùng 1 ký tự đặc biệt phủ kín khuôn chữ (gõ 2 ký tự đó liền nhau sẽ không thấy có khoảng trắng) trong bảng mã unicode. mỗi lần lặp thì đưa vào chuỗi progress thêm 1 ký 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

Sao dạo này các bác CV hay tặng ketxu từ "khôn lỏi" vậy ta :|

@bác Thái : Nhiều thứ nghĩ xa xôi, mình tìm cách thì nó ngắn lại xài cũng vui.

Game còn thế huống chi nghề :D

Code status dùng 8 ký tự để nhìn nó chạy liền mạch. 1 ký tự cũng được nhưng bước tăng k nhỏ lắm.

Bác Thái thử mần xem sao ^^ h ra công trường, tối về e trau chuốt lại chút r up

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

Update Progress Status dạng đơn giản. Ở mức độ sử dụng thì e thấy tạm thời chỉ cần thế này thôi, không nhất thiết phải chia ra làm mấy hàm như ACET (do đó không dùng biến đếm Global mà sử dụng chung với biến tăng của vòng lặp)

;| Status Bar Progress
Show Percent in Status Bar
@Ketxu 03-01-12
Var : bien tang (nam trong ham loop)
Total : tong so lan lap (biet truoc)
InProMsg : Message luc dang chay
DoneMsg : Message luc chay xong
|;
(defun CV:Ui-Progress (var Total InProMsg DoneMsg / tmp)
(if (>= Var (1- Total))(grtext -1 DoneMsg)(grtext -1 InProMsg))
(setq    tmp "")
 (repeat  (fix (* 15 (/ var Total 1.0)))
(setq tmp (strcat tmp "\U+2588"))
 )
; Doan nay lam min
(setq    tmp     (strcat tmp
  			 (nth (rem (fix (/ var (/ (/ Total 15.0) 8.0))) 8)
  				 (list "\U+258F" "\U+258E" "\U+258D" "\U+258C" "\U+258B" "\U+258A" "\U+2589" "\U+2588" )
  			 )
  		 )
) ; Ket thuc
(grtext -2 (strcat    tmp "..."    (rtos (/ (* 100.0 Var) Total) 2 0)   "%..." ))
)

Ví dụ sử dụng :

(defun C:mine2 (/ K L)
 (setq K 0 L 10000)
 (while (< k 10000)
(CV:Ui-Progress K L "Vui l\U+00F2ng ch\U+1EDD trong l\U+00FAc CAD \U+0111ang c\U+00E0y ^^" "CAD c\U+00E0y xong r\U+1ED3i, gi\U+1EDD \U+0111\U+1EBFn b\U+1EA1n c\U+00E0y ^^")
(setq k (1+ k) )
 )
 (princ)
)

  • Vote tăng 4

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

Nếu bỏ cái phần làm gọn đi thì cũng chỉ có đến 3,4 dòng code, xài tạm cũng đỡ ^^

Srr vừa nãy em để K L luôn trong hàm con, phải sửa lại

Chẹp, vậy là cũng xơi được ôi ối ACET rồi hén. Đâu phải là topic vô bổ ^^

Tình hình nếu nhiều nhiều 1 chút nữa thì tổng hợp thành THư viện hàm được rồ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

mình thấy như vậy là cũng gần là đủ các hàm hay dùng rồi. các hàm còn lại hoặc không có nhu cầu dùng hoặc đã có giải pháp thay thế bằng các hàm visual lisp cùng chức năng. thấy mọi người cũng không còn nhiều hứng thú với topic này, giờ có lẽ chỉ chờ xem bạn nào có yêu cầu thì viế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

Ví dụ sử dụng :

(defun C:mine2 (/ K L)
 (setq K 0 L 10000)
 (while (< k 10000)
(CV:Ui-Progress K L "Vui l\U+00F2ng ch\U+1EDD trong l\U+00FAc CAD \U+0111ang c\U+00E0y ^^" "CAD c\U+00E0y xong r\U+1ED3i, gi\U+1EDD \U+0111\U+1EBFn b\U+1EA1n c\U+00E0y ^^")
(setq k (1+ k) )
 )
 (princ)
)

- Khi sử dụng hàm này, chương trình chạy xong sẽ có thông báo công việc đã hoàn thành, tỉ dụ như: "cad cày xong rồi, giờ đến lượt bạn cày"

OK, giờ muốn chương trình tự động tắt dòng thông báo trên, trả lại đất cho status bar khi bạn tiếp tục cày ta thêm code này ngay trước khi kết thúc chương trình - đặt trước hàm (princ):

....

(grread 1)(grread 1)(setvar "modemacro" ".")

(princ)); end

 

- Ketxu thử post cái hình nó chạy bên máy của bạn mình dòm thử fát. một số ký tự trong list như "\U+258B" "\U+258A" "\U+2589".. mình cũng không thể tìm thấy trong bảng mã unicode, bên máy mình đoạn này không thấy có tác dụng gì nên chưa rõ chức năng của nó.

(setq tmp1 (strcat tmp1 (nth (rem (fix (/ var (/ (/ Total 15.0) 8.0))) 8) (list "\U+258F" "\U+258E" "\U+258D" "\U+258C" "\U+258B" "\U+258A" "\U+2589" "\U+2588" ))))

  • 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

Như em đã ghi chú, đoạn đó nhằm chuyển giao giữa các ký tự, bác có thể bỏ đi (vì k thực sự cần), khi đó mỗi lần tăng % nó sẽ thêm 1 lần U+2588, nhìn k mượt như có thêm đoạn này. Code e chụp ảnh là có đoạn này.

 

Nhân tiện sau khi bác xơi xong hàm progress này có thể làm nốt đoạn ss Drag move k ^^ ACET cho phép xơi cả thằng thuộc layer đã khóa đó, k đơn giản đâu ^^

  • 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

ACET-LIST-REMOVE-DUPLICATES. nguyên bản thì cú pháp của nó được viết như sau: (ACET-LIST-REMOVE-DUPLICATES list flag)

trong đó thì tham số flag của nó là nil hoặc 0 hoặc 1 (nil và 0 là giống nhau)

- flag = 0 hoặc nil: hàmchâp nhận mọi định dạng của các phần tử trong list kiêm tra : real, integer, list, string, variable...

- flag = 1: nó chỉ chấp nhận list kiểm tra chứa các phần tử là real và integer. tuy nhiên khi kiểm tra với real nó trả về kết quả lung tung beng. không thể chấp nhận được.

vì thế mình bỏ cái tham số flag vô nghĩa kia đi.

 

(defun CV:list-remove-duplicates (lst / lst1)

(foreach x lst (if (not (member x lst1)) (setq lst1 (append lst1 (list x))))) lst1)

 

ps: à quên, hàm này loại bỏ sự trùng (bằng hoặc giống) nhau của các phần tử trong list

Tue_NV nghĩ chúng ta nên thêm vào tính năng : hàm này loại bỏ sự trùng (bằng hoặc giống hoặc gần bằng) nhau của các phần tử trong list (Nếu phần tử x duyệt trong Lst thuộc kiểu LIST).

Ví dụ :

(setq Lst '((1 2.99999999999) (1 3) 1 2 3 6 8 1))

-> ((1 3.0) (1 3) 1 2 3 6 8 1)

-> Hàm (CV:list-remove-duplicates lst) -> ((1 3.0) (1 3) 1 2 3 6 8 1)

Nhưng Kết quả mong muốn là thế này : ((1 3.0) 1 2 3 6 8 1)

 

Ví dụ như khi loại bỏ các toạ độ điểm trùng hoặc gần trùng (trong khoảng sai số) trong 1 List vậy.

 

PS: Tuần trước Tue_NV lại phát hiện ra rằng : CAD phiên bản đời cao không thể LOAD các hàm trong ARX của CAD đời thấp (CAD đời thấp có thể LOAD các hàm trong ARX của CAD đời cao) mà CAD lại thay đổi phiên bản liên tục nên đây cũng là 1 lý do rất thuyết phục để viết lại các hàm Express.

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

Tuần trước Tue_NV lại phát hiện ra rằng : CAD phiên bản đời cao không thể LOAD các hàm trong ARX của CAD đời thấp (CAD đời thấp có thể LOAD các hàm trong ARX của CAD đời cao) mà CAD lại thay đổi phiên bản liên tục nên đây cũng là 1 lý do rất thuyết phục để viết lại các hàm Express.

Theo mình đây là kết luận rất .... khó hiểu :huh:

Nó giống như người ở quá khứ biết tất cả những gì sẽ diễn ra trong khi người hiện tại ko ai biết tí gì về quá khứ :D

Express Tools của CAD đời nào thì đời đó hiểu. Tuy nhiên mỗi version CAD AU ko thay đổi toàn bộ các thư viện mà chỉ một số thôi có thể là đổi tên, kế thừa lớp mới, ... Do đó một số hàm CAD đời cũ đọc dc và có hàm CAD đời mới đọc dc đời cũ.

Mời các bạn bổ sung thêm.

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

Update Progress Status dạng đơn giản. Ở mức độ sử dụng thì e thấy tạm thời chỉ cần thế này thôi, không nhất thiết phải chia ra làm mấy hàm như ACET (do đó không dùng biến đếm Global mà sử dụng chung với biến tăng của vòng lặp)

;| Status Bar Progress
Show Percent in Status Bar
@Ketxu 03-01-12
Var : bien tang (nam trong ham loop)
Total : tong so lan lap (biet truoc)
InProMsg : Message luc dang chay
DoneMsg : Message luc chay xong
|;
(defun CV:Ui-Progress (var Total InProMsg DoneMsg / tmp)
(if (>= Var (1- Total))(grtext -1 DoneMsg)(grtext -1 InProMsg))
(setq    tmp "")
 (repeat  (fix (* 15 (/ var Total 1.0)))
(setq tmp (strcat tmp "\U+2588"))
 )
; Doan nay lam min
(setq    tmp 	(strcat tmp
  		     (nth (rem (fix (/ var (/ (/ Total 15.0) 8.0))) 8)
  			     (list "\U+258F" "\U+258E" "\U+258D" "\U+258C" "\U+258B" "\U+258A" "\U+2589" "\U+2588" )
  		     )
  	     )
) ; Ket thuc
(grtext -2 (strcat    tmp "..."    (rtos (/ (* 100.0 Var) Total) 2 0)   "%..." ))
)

Ví dụ sử dụng :

(defun C:mine2 (/ K L)
 (setq K 0 L 10000)
 (while (< k 10000)
(CV:Ui-Progress K L "Vui l\U+00F2ng ch\U+1EDD trong l\U+00FAc CAD \U+0111ang c\U+00E0y ^^" "CAD c\U+00E0y xong r\U+1ED3i, gi\U+1EDD \U+0111\U+1EBFn b\U+1EA1n c\U+00E0y ^^")
(setq k (1+ k) )
 )
 (princ)
)

Hình như cái này chỉ dùng được với repeat, không dùng được với foreach+while? Cái của Terry Miller (dialoge) hình như dùng được cả repeat/foreach/while?

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 quote lại ngay cái VD dùng while ^^

 

Ghi chú ở dòng đầu tiên :

Total : tong so lan lap (biet truoc)

 

Không biết trước thì sửa code cũng được, nhưng lúc đó không có cái gọi là %

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 quote lại ngay cái VD dùng while ^^

 

Ghi chú ở dòng đầu tiên :

 

 

Không biết trước thì sửa code cũng được, nhưng lúc đó không có cái gọi là %

Cái này đã post cho Ket rồi mà (#156), ở các ví dụ Demo1 và Demo3

http://www.cadviet.com/forum/index.php?showtopic=59727&st=140

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ái này đã post cho Ket rồi mà (#156), ở các ví dụ Demo1 và Demo3

http://www.cadviet.c...ic=59727&st=140

Bác k hiểu ý e rồi :) Ý e ở bài #169 là bác nói hàm k dùng được cho while, n quote ngay lại cái ví dụ e viết bằng while. Tất nhiên về bản chất vẫn là biết trước tổng số lần thao tác như e nói ở bài trước. Các chương trình Diệt virus cũng vậy, để biết được % thì nó phải xác định số file cần quét trước đã. Nếu không có total, thì cái gọi là % công việc chỉ là hú họa, không có nghĩa lý ước lượng cho người dùng. Lúc đó thì ta cứ bắt thanh progress chạy đến full rồi lại chạy lại thô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

Bác k hiểu ý e rồi :) Ý e ở bài #169 là bác nói hàm k dùng được cho while, n quote ngay lại cái ví dụ e viết bằng while. Tất nhiên về bản chất vẫn là biết trước tổng số lần thao tác như e nói ở bài trước. Các chương trình Diệt virus cũng vậy, để biết được % thì nó phải xác định số file cần quét trước đã. Nếu không có total, thì cái gọi là % công việc chỉ là hú họa, không có nghĩa lý ước lượng cho người dùng. Lúc đó thì ta cứ bắt thanh progress chạy đến full rồi lại chạy lại thôi

 

Ví dụ của Ket chỉ nằm ở trong file ấy thôi, vì while trong ví dụ của Ket cũng như là repeat. Tôi thử áp dụng cho chương trình của tôi, dùng while không biết số vòng lặp, thấy nó chạy khớp, tưởng ngon ăn, hoá ra bây giờ test thêm mấy trường hợp nữa thì đúng là hú hoạ thiệt. Srr Ket!

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

ACET-LIST-REMOVE-DUPLICATES. nguyên bản thì cú pháp của nó được viết như sau: (ACET-LIST-REMOVE-DUPLICATES list flag)

trong đó thì tham số flag của nó là nil hoặc 0 hoặc 1 (nil và 0 là giống nhau)

- flag = 0 hoặc nil: hàmchâp nhận mọi định dạng của các phần tử trong list kiêm tra : real, integer, list, string, variable...

- flag = 1: nó chỉ chấp nhận list kiểm tra chứa các phần tử là real và integer. tuy nhiên khi kiểm tra với real nó trả về kết quả lung tung beng. không thể chấp nhận được.

vì thế mình bỏ cái tham số flag vô nghĩa kia đi.

 

(defun CV:list-remove-duplicates (lst / lst1)

(foreach x lst (if (not (member x lst1)) (setq lst1 (append lst1 (list x))))) lst1)

 

ps: à quên, hàm này loại bỏ sự trùng (bằng hoặc giống) nhau của các phần tử trong list

Tue_NV nghĩ chúng ta nên thêm vào tính năng : hàm này loại bỏ sự trùng (bằng hoặc giống hoặc gần bằng) nhau của các phần tử trong list

.......

Hàm CV:list-remove-duplicates được viết lại : hàm này loại bỏ sự trùng (bằng hoặc giống hoặc gần bằng) nhau của các phần tử trong list

(defun CV:list-remove-duplicates (lst / lst1)
;;;writen by Tue_NV
 (foreach x lst
 	(if (not (member x lst1)) (setq lst1 (append lst1 (list x))))
 	(Progn
  (foreach y lst1
 	(if (equal y x 1.0e-8)
		(setq lst1 (vl-remove y lst1))
 	)
)
  (setq lst1 (append lst1 (list x)) )
  	)
)
 lst1
)

  • 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

E thấy cái này dùng đệ quy như cách của LM cũng hay

 

 

(defun CV:List-remove-duplicates(l fz)

   (if l
       (cons (car l)
           (CV:List-remove-duplicates
               (vl-remove-if '(lambda ( x ) (equal x (car l) fz)) (cdr l)) fz
           )
       )
   )
)

  • Vote tăng 3

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

Tiếp tục mấy hàm sử lý list nhé. mình cũng hay fải sử dụng mấy hàm này.

(ACET-LIST-PUT-NTH val list nth) : dùng để thay thế 1 phần tử val cho phần tử thứ nth của list.

Cái này mình cũng chơi đệ quy luôn

(defun Cv:list-put-nth (val lst id)
(if (<= id 0)
(cons val (cdr lst))
(if lst (cons (car lst) (Cv:list-put-nth val (cdr lst) (1- id))))))

  • 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  

×