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ị

Cho hỏi có cách nào kiểm tra xem 1 thu mục đã có hay chưa vậy các bác. (tên thư mục cố định vd: c:\\tienich\\thuvien)

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
Cho hỏi có cách nào kiểm tra xem 1 thu mục đã có hay chưa vậy các bác. (tên thư mục cố định vd: c:\\tienich\\thuvien)

Mã lệnh dưới đây làm việc đó:

 

(if (vl-file-directory-p "c:\\tienich\\thuvien")

(alert "da co thu muc")

(alert "khong co thu muc")

)

 

Lưu ý: với các version ACAD đời thấp, bạn phải thêm 1 dòng lệnh (vl-load-com) trước khi sử dụng các mã lệnh vl-

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ờ các bác chỉnh giúp phần đếm % trong con lisp này với

Dùng chuyển tất cả đường kích thước về 1 layer.

Thấy có lệnh làm được nhưng đọc hông hiểu.(trong lệnh ve0)

 

 (Defun c:Ckt ( )   
(princ "\nPHAM QUOC DUY Binh Son - Quang ngai")

(Princ "\nHay chon vung :")
(setq xx (ssget '((0 . "dimension"))))

 (if (Null xx)
 (princ "\nKhong tim thay doi tuong nao")
)
  (IF (/= NIL xx) (PROGN

(command "-layer" "new" "Duongkt" "color" "9" "Duongkt" "")

(setq L 0)
(setq M (sslength XX))
(while (< L M)
  (setq DT (ssname xx L))
 (command ".chprop" dt "" "la" "Duongkt" "")
  (setq L (1+ L))

(setq nhan (* l 100))
(setq chia (/ nhan m))
(princ (strcat "\nDa chinh: <" (itoa chia) " %>"))



)
)
)

     (Princ)
)  

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ờ các bác chỉnh giúp phần đếm % trong con lisp này với

Dùng chuyển tất cả đường kích thước về 1 layer.

Thấy có lệnh làm được nhưng đọc hông hiểu.(trong lệnh ve0)

 

Phần đếm % chỉ có tác dụng thông báo với người dùng là đã có xxxx% đối tượng đã được chuyển layer.

Mã lisp viết gọn lại là (setq chia (* (/ L M) 100)).

Không hiểu lệnh ve0 ở đâu?

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ờ các bác chỉnh giúp phần đếm % trong con lisp này với

Dùng chuyển tất cả đường kích thước về 1 layer.

Thấy có lệnh làm được nhưng đọc hông hiểu.(trong lệnh ve0)

 

 (Defun c:Ckt ( )   
(princ "\nPHAM QUOC DUY Binh Son - Quang ngai")

(Princ "\nHay chon vung :")
(setq xx (ssget '((0 . "dimension"))))

 (if (Null xx)
 (princ "\nKhong tim thay doi tuong nao")
)
  (IF (/= NIL xx) (PROGN

(command "-layer" "new" "Duongkt" "color" "9" "Duongkt" "")

(setq L 0)
(setq M (sslength XX))
(while (< L M)
  (setq DT (ssname xx L))
 (command ".chprop" dt "" "la" "Duongkt" "")
  (setq L (1+ L))

(setq nhan (* l 100))
(setq chia (/ nhan m))
(princ (strcat "\nDa chinh: <" (itoa chia) " %>"))
)
)
)

     (Princ)
)  

 

 

Cách hiển thị % action là cách rất hay dùng để cho biết khối lượng công việc đã hòan tất. Tuy nhiên đối với LISP là ngôn ngữ xử lý theo danh sách do vậy không nên đưa phần này vào vì như thế sẽ hạn chế tốc độ của chương trình. Một số ngôn ngữ khác có hỗ trợ Thread thì người ta sẽ đưa vào % action nhưng thực chất là người ta tạo ra một thread khác để hiển thị tốc độ hay khối lượng đang làm việc của chương trì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
Cách hiển thị % action là cách rất hay dùng để cho biết khối lượng công việc đã hòan tất. Tuy nhiên đối với LISP là ngôn ngữ xử lý theo danh sách do vậy không nên đưa phần này vào vì như thế sẽ hạn chế tốc độ của chương trình. Một số ngôn ngữ khác có hỗ trợ Thread thì người ta sẽ đưa vào % action nhưng thực chất là người ta tạo ra một thread khác để hiển thị tốc độ hay khối lượng đang làm việc của chương trình..

 

Đúng là có lâu hơn tí . Nhưng muốn báo ra vì nếu không trong quá trình thực hiện người xử dụng không biết là đang thực hiện nên cứ bấm loạn cả lê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
Đúng là có lâu hơn tí . Nhưng muốn báo ra vì nếu không trong quá trình thực hiện người xử dụng không biết là đang thực hiện nên cứ bấm loạn cả lên.

Theo mình là không cần thiết. Với từng ấy thao tác, lisp thực hiện rất nhanh, gần như "bấm là thấy". Ngoài ra, nếu muốn tăng tốc độ, thay vì xử lý từng entity, bạn có thể cho xử lý "trọn gói" selection set bằng cách dùng command change:

(command "change" xx "" "p" "la" "duongkt" "")

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
Theo mình là không cần thiết. Với từng ấy thao tác, lisp thực hiện rất nhanh, gần như "bấm là thấy". Ngoài ra, nếu muốn tăng tốc độ, thay vì xử lý từng entity, bạn có thể cho xử lý "trọn gói" selection set bằng cách dùng command change:

(command "change" xx "" "p" "la" "duongkt" "")

 

Trước đây đã dùng như thế.

Đối với bản vẽ của dân xây dựng thì việc này không pahỉ bấm là thấy đâu thường là lâu hơn 1 phút.

Trước phải dùng cái ảnh.sld hiện lên báo cho bà con nhưng thấy vậy không bài bản

Nên tách ra để thêm cái phần % vào.

 

Lệnh ve0 không nhớ ờ chổ nào tôi gửi lại lên bác xem giup nhé.

 

(defun c:ve0 ()
(defun suadinhPl(thongtin / index doituong doituongmoi 
           toado)
(setq
doituong (assoc '38 thongtin) 
doituongmoi 
           (cons 38 0.)
)
(subst doituongmoi doituong 
           thongtin)
)
(defun suadinh (thongtin / index doituong 
           doituongmoi toado)
(setq thongtinmoi nil)
(foreach doituong 
           thongtin
(if (and (>= (car doituong) 10)
(<= (car 
           doituong) 36) 
)
(setq doituongmoi
(list (car 
           doituong)
(cadr doituong)
(caddr 
           doituong)
0.0
)
)
(setq doituongmoi 
           doituong)
)
(setq thongtinmoi (append thongtinmoi (list 
           doituongmoi)))
)
(setq thongtinmoi thongtinmoi)
)
(defun 
           tendoituong (ssdt /)
(cdr (assoc '0 (entget 
           ssdt)))
)
;;---------------------------------------------
(setq 
           tapdoituong (ssget)
sodt (sslength tapdoituong)
index 0
ta 
           (chr 8)
stxoa (strcat ta ta ta ta ta ta ta ta ta ta ta ta ta ta 
           ta ta ta ta ta ta)
stxuly "Xu ly duoc: "
ptcu 
           nil
)
(repeat sodt
(setq
ssdt (ssname tapdoituong 
           index)
pt (* (/ (* index 1.0) sodt) 100.0)
index (1+ 
           index)
)
(if (/= pt ptcu)
(progn
(princ (strcat stxoa 
           stxuly (rtos pt 2 0) "%"))
(setq ptcu pt)
)
) 
(if (or 
           (= (tendoituong ssdt) "SPLINE")
(= (tendoituong ssdt) "LINE") 

(= (tendoituong ssdt) "CIRCLE")
(= (tendoituong ssdt) 
           "ARC")
(= (tendoituong ssdt) "POLYLINE")
(= (tendoituong ssdt) 
           "ELLIPSE")
(= (tendoituong ssdt) "TEXT")
(= (tendoituong ssdt) 
           "DIMENSION")
(= (tendoituong ssdt) "ATTDEF")
(= (tendoituong 
           ssdt) "SOLID")
(= (tendoituong ssdt) "INSERT")
(= (tendoituong 
           ssdt) "ATTRIB")
(= (tendoituong ssdt) 
           "HATCH")
)
(progn
(setq thongtin (entget ssdt)
thongtin 
           (suadinh thongtin)
)
(entmod thongtin)
)
)
(if (= 
           (tendoituong ssdt) "LWPOLYLINE")
(progn
(setq thongtin (entget 
           ssdt)
thongtin (suadinhPL thongtin) 
)
(entmod 
           thongtin)
)
)
(princ)
)
)

 

 

Phần đếm này hay là số % chỉ xuất hiện 1 lần và thay đổi số chứ không viết thành nhiều dòng như của tô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
Trước đây đã dùng như thế.

Đối với bản vẽ của dân xây dựng thì việc này không pahỉ bấm là thấy đâu thường là lâu hơn 1 phút.

Trước phải dùng cái ảnh.sld hiện lên báo cho bà con nhưng thấy vậy không bài bản

Nên tách ra để thêm cái phần % vào.

 

Lệnh ve0 không nhớ ờ chổ nào tôi gửi lại lên bác xem giup nhé.

 

(defun c:ve0 ()
(defun suadinhPl(thongtin / index doituong doituongmoi 
           toado)
(setq
doituong (assoc '38 thongtin) 
doituongmoi 
           (cons 38 0.)
)
(subst doituongmoi doituong 
           thongtin)
)
(defun suadinh (thongtin / index doituong 
           doituongmoi toado)
(setq thongtinmoi nil)
(foreach doituong 
           thongtin
(if (and (>= (car doituong) 10)
(            doituong) 36) 
)
(setq doituongmoi
(list (car 
           doituong)
(cadr doituong)
(caddr 
           doituong)
0.0
)
)
(setq doituongmoi 
           doituong)
)
(setq thongtinmoi (append thongtinmoi (list 
           doituongmoi)))
)
(setq thongtinmoi thongtinmoi)
)
(defun 
           tendoituong (ssdt /)
(cdr (assoc '0 (entget 
           ssdt)))
)
;;---------------------------------------------
(setq 
           tapdoituong (ssget)
sodt (sslength tapdoituong)
index 0
ta 
           (chr 8)
stxoa (strcat ta ta ta ta ta ta ta ta ta ta ta ta ta ta 
           ta ta ta ta ta ta)
stxuly "Xu ly duoc: "
ptcu 
           nil
)
(repeat sodt
(setq
ssdt (ssname tapdoituong 
           index)
pt (* (/ (* index 1.0) sodt) 100.0)
index (1+ 
           index)
)
(if (/= pt ptcu)
(progn
(princ (strcat stxoa 
           stxuly (rtos pt 2 0) "%"))
(setq ptcu pt)
)
) 
(if (or 
           (= (tendoituong ssdt) "SPLINE")
(= (tendoituong ssdt) "LINE") 

(= (tendoituong ssdt) "CIRCLE")
(= (tendoituong ssdt) 
           "ARC")
(= (tendoituong ssdt) "POLYLINE")
(= (tendoituong ssdt) 
           "ELLIPSE")
(= (tendoituong ssdt) "TEXT")
(= (tendoituong ssdt) 
           "DIMENSION")
(= (tendoituong ssdt) "ATTDEF")
(= (tendoituong 
           ssdt) "SOLID")
(= (tendoituong ssdt) "INSERT")
(= (tendoituong 
           ssdt) "ATTRIB")
(= (tendoituong ssdt) 
           "HATCH")
)
(progn
(setq thongtin (entget ssdt)
thongtin 
           (suadinh thongtin)
)
(entmod thongtin)
)
)
(if (= 
           (tendoituong ssdt) "LWPOLYLINE")
(progn
(setq thongtin (entget 
           ssdt)
thongtin (suadinhPL thongtin) 
)
(entmod 
           thongtin)
)
)
(princ)
)
)

Phần đếm này hay là số % chỉ xuất hiện 1 lần và thay đổi số chứ không viết thành nhiều dòng như của tôi.

 

Lệnh ve0 là của tôi viết từ thời còn là sinh viên, hồi đấy rất thích việc có số % nhảy nhót. Vả lại, lisp đó xử lý lệnh cũng lâu.

 

Để làm được như vậy, bạn cần làm 2 phần việc như sau:

1. (set "CMDECHO" 0) để các dòng lệnh trung gian của lệnh (command ...) không hiển thị.

2. Bạn phải princ các ký tự xóa ngược có mã mà (chr 8) ra màn hình. Ví dụ: (princ (strcat (chr 8) (chr 8) ... (chr 8)(chr 8)(chr 8) "Xu ly duoc " phantram "%") Số lượng ký tự (chr 8) phải bằng hoặc nhiều hơn số ký tự mà bạn sẽ princ ra. VD: Khi princ ra chữ "Xu ly duoc nn%" thì bạn phải dùng tối thiểu 14 ký tự xóa ngược (chr 8) ở phía trước để xóa dòng thông báo phía trướ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
Trước đây đã dùng như thế.

Đối với bản vẽ của dân xây dựng thì việc này không pahỉ bấm là thấy đâu thường là lâu hơn 1 phút.

Trước phải dùng cái ảnh.sld hiện lên báo cho bà con nhưng thấy vậy không bài bản

Nên tách ra để thêm cái phần % vào.

Lệnh ve0 không nhớ ờ chổ nào tôi gửi lại lên bác xem giup nhé.

Hỏi thêm bạn một chút: 1 bản vẽ thông thường của "dân xây dựng" có khoảng bao nhiêu đối tượng dimensions?

Mình đã sửa trình lisp của bạn như sau:

(Defun c:Ckt2 ( / ss)   
(if (not (tblsearch "layer" "duongkt"))
(command "layer" "new" "duongkt" "color" "9" "duongkt" "")
)
(princ "\nSelect dimensions or areas that contain dimensions")
(setq ss (ssget '((0 . "dimension"))))
(if (null ss)
  (princ "\nObjects not found!")
  (command "change" ss "" "p" "la" "duongkt" "")
)
(princ)
)

 

Kết quả test như sau:

Cấu hình PC: Celeron 1.6GHz, 512 MB RAM

Acad: 2002

Số lượng dimensions: 1564

Thời gian xử lý bằng lệnh ckt (chưa sửa): 5 seconds

Thời gian xử lý bằng lệnh ckt2 (đã sửa): 1 seconds

Kết quả trên cho thấy, (command "change" ss ...) nhanh hơn (while... (command "chprop" e ... )) gấp nhiều lần. Và thời gian khoảng 1 seconds có cần phải hiển thị % action không?

Quan điểm của mình là đặt hiệu quả chạy chương trình lên hàng đầu, không thể vì bất cứ lý do gì mà dùng cách xử lý chậm thay cho cách xử lý nhanh! Với cấu hình PC trung bình hiện nay, nếu trình lisp xử lý một cái gì đó lâu hơn 3 seconds, mình sẽ xem xét lại thuật giải, có lẽ có cái gì đó chưa hay lắm? Nếu cần thì cũng chấp nhận, nhưng mình chỉ thông báo cho người dùng biết thời điểm bắt đầu và kết thúc quá trình xử lý. Ví dụ như:

(princ "Program is running. Please wait a moment...")

(processing....)

(princ "\nFinish!")

Nếu thấy princ chưa "ép phê" thì dùng alert.

Chính các phần mềm "có tên tuổi", ngay cả Microsoft cũng thường làm như vậy, không thể nói là "không bài bản" được!

Tất nhiên, mỗi người đều có quan điểm riêng. Nếu bạn thích hiển thị % action thì cứ việc. Vướng chỗ nào đã có bác Hoà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
Hỏi thêm bạn một chút: 1 bản vẽ thông thường của "dân xây dựng" có khoảng bao nhiêu đối tượng dimensions?

Mình đã sửa trình lisp của bạn như sau:

(Defun c:Ckt2 ( / ss)   
(if (not (tblsearch "layer" "duongkt"))
(command "layer" "new" "duongkt" "color" "9" "duongkt" "")
)
(princ "\nSelect dimensions or areas that contain dimensions")
(setq ss (ssget '((0 . "dimension"))))
(if (null ss)
  (princ "\nObjects not found!")
  (command "change" ss "" "p" "la" "duongkt" "")
)
(princ)
)

 

Kết quả test như sau:

Cấu hình PC: Celeron 1.6GHz, 512 MB RAM

Acad: 2002

Số lượng dimensions: 1564

Thời gian xử lý bằng lệnh ckt (chưa sửa): 5 seconds

Thời gian xử lý bằng lệnh ckt2 (đã sửa): 1 seconds

Kết quả trên cho thấy, (command "change" ss ...) nhanh hơn (while... (command "chprop" e ... )) gấp nhiều lần. Và thời gian khoảng 1 seconds có cần phải hiển thị % action không?

Quan điểm của mình là đặt hiệu quả chạy chương trình lên hàng đầu, không thể vì bất cứ lý do gì mà dùng cách xử lý chậm thay cho cách xử lý nhanh! Với cấu hình PC trung bình hiện nay, nếu trình lisp xử lý một cái gì đó lâu hơn 3 seconds, mình sẽ xem xét lại thuật giải, có lẽ có cái gì đó chưa hay lắm? Nếu cần thì cũng chấp nhận, nhưng mình chỉ cần thông báo cho người dùng biết thời điểm bắt đầu và kết thúc quá trình xử lý. Ví dụ như:

(princ "Program is running. Please wait a moment...")

(processing....)

(princ "\nFinish!")

Chính các phần mềm "có tên tuổi", ngay cả Microsoft cũng thường làm như vậy, không thể nói là "không bài bản" được!

Tất nhiên, mỗi người đều có quan điểm riêng. Nếu bạn thích hiển thị % action thì cứ việc. Vướng chỗ nào đã có bác Hoành!

 

 

Cám ơn! lúc sáng đọc chưa kỹ bài viết của bác ssg

Trước đây cũng dùng cho cà tập hợp chọn nhưng vẫn là chprop nên chậm.

Cái của bác Nguyenhoanh đang thử nhưng chưa được chắc sai chổ nào đó

 

*Bản vẻ của dân xây dựng đối tượng dim đếm không xuể.

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ỏi thêm bạn một chút: 1 bản vẽ thông thường của "dân xây dựng" có khoảng bao nhiêu đối tượng dimensions?

Mình đã sửa trình lisp của bạn như sau:

...

Chính các phần mềm "có tên tuổi", ngay cả Microsoft cũng thường làm như vậy, không thể nói là "không bài bản" được!

Tất nhiên, mỗi người đều có quan điểm riêng. Nếu bạn thích hiển thị % action thì cứ việc. Vướng chỗ nào đã có bác Hoành!

:unsure:

Cái hiển thị % này mang tính 'chơi' hơn là 'chuyên', xét về hiệu quả thì thực sự không nê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
*Bản vẻ của dân xây dựng đối tượng dim đếm không xuể.

Bạn dùng cái này để đếm:

(sslength (ssget "X" '((0 . "dimension"))))

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 dùng cái này để đếm:

(sslength (ssget "X" '((0 . "dimension"))))

 

Để đếm thì ình cũng có rồi. Ý là nói nhiều chứ không phải không có cách đếm.

 

Command: chond

 

Hay chon vung :

Select objects: Other corner: 22160 found

21087 were filtered out.

Select objects:

Tim thay: <1073> doi tuong la DIMENSION

 

Đây là bản vẽ phần kiến trúc công trình trường học 2 tầng, mỗi tầng 452,75 m2 theo bác ssg thì có cho là nhiều không

Con computer mua cách dây 5 năm. không rành lắm về cấu hình nghe nói tốc độ 800 chẳng biết là cái gì.

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ờ các bác giúp cho vòng lặp:

yêu cầu nhập vào một chuổi bằng cách gỏ bàn phím

khi nào nhập enter không (không có nội dung) thì dừng vòng lặp.

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
Nhờ các bác giúp cho vòng lặp:

yêu cầu nhập vào một chuổi bằng cách gỏ bàn phím

khi nào nhập enter không (không có nội dung) thì dừng vòng lặp.

Cám ơn

Dòng lệnh như sau:

(while (/= (setq str (getstring "\nHay nhap vao chuoi: ")) "") (alert (strcat "ban vua nhap vao chuoi: " str)))

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 lệnh như sau:

(while (/= (setq str (getstring "\nHay nhap vao chuoi: ")) "") (alert (strcat "ban vua nhap vao chuoi: " str)))

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

Cho Jin hỏi về cách lấy giá trị trả về của lệnh đo diện tích Area

Jin thử dùng (setq DT (command "area")) nhưng không đượ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
Cho Jin hỏi về cách lấy giá trị trả về của lệnh đo diện tích Area

Jin thử dùng (setq DT (command "area")) nhưng không được!

Đúng là:

(command "area")

(setq DT (getvar "area"))

 

ở đây có 2 thứ trùng tên, đó là lệnh area và biến hệ thống area.

biến hệ thống area sẽ lưu giá trị diện tích được tính bằng lệnh area ngay trướ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
Hỏi thêm bạn một chút: 1 bản vẽ thông thường của "dân xây dựng" có khoảng bao nhiêu đối tượng dimensions?

Mình đã sửa trình lisp của bạn như sau:

(Defun c:Ckt2 ( / ss)   
(if (not (tblsearch "layer" "duongkt"))
(command "layer" "new" "duongkt" "color" "9" "duongkt" "")
)
(princ "\nSelect dimensions or areas that contain dimensions")
(setq ss (ssget '((0 . "dimension"))))
(if (null ss)
  (princ "\nObjects not found!")
  (command "change" ss "" "p" "la" "duongkt" "")
)
(princ)
)

 

Kết quả test như sau:

Cấu hình PC: Celeron 1.6GHz, 512 MB RAM

Acad: 2002

Số lượng dimensions: 1564

Thời gian xử lý bằng lệnh ckt (chưa sửa): 5 seconds

Thời gian xử lý bằng lệnh ckt2 (đã sửa): 1 seconds

Kết quả trên cho thấy, (command "change" ss ...) nhanh hơn (while... (command "chprop" e ... )) gấp nhiều lần. Và thời gian khoảng 1 seconds có cần phải hiển thị % action không?

Quan điểm của mình là đặt hiệu quả chạy chương trình lên hàng đầu, không thể vì bất cứ lý do gì mà dùng cách xử lý chậm thay cho cách xử lý nhanh! Với cấu hình PC trung bình hiện nay, nếu trình lisp xử lý một cái gì đó lâu hơn 3 seconds, mình sẽ xem xét lại thuật giải, có lẽ có cái gì đó chưa hay lắm? Nếu cần thì cũng chấp nhận, nhưng mình chỉ thông báo cho người dùng biết thời điểm bắt đầu và kết thúc quá trình xử lý. Ví dụ như:

(princ "Program is running. Please wait a moment...")

(processing....)

(princ "\nFinish!")

Nếu thấy princ chưa "ép phê" thì dùng alert.

Chính các phần mềm "có tên tuổi", ngay cả Microsoft cũng thường làm như vậy, không thể nói là "không bài bản" được!

Tất nhiên, mỗi người đều có quan điểm riêng. Nếu bạn thích hiển thị % action thì cứ việc. Vướng chỗ nào đã có bác Hoành!

 

Hê hê, em dùng cái lisp CNinvis mất 55 giây mới lọc xong đối tượng với file chỉ khoảng 2 MB (quả là 1 cơn ác mộng ) , vậy thì câu "nếu trình lisp xử lý một cái gì đó lâu hơn 3 seconds, mình sẽ xem xét lại thuật giải" là điều mơ ước của em với cái lisp này, có bác nào biết cách khắc phục về time thì giúp em vớ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
Hê hê, em dùng cái lisp CNinvis mất 55 giây mới lọc xong đối tượng với file chỉ khoảng 2 MB (quả là 1 cơn ác mộng ) , vậy thì câu "nếu trình lisp xử lý một cái gì đó lâu hơn 3 seconds, mình sẽ xem xét lại thuật giải" là điều mơ ước của em với cái lisp này, có bác nào biết cách khắc phục về time thì giúp em với!!!!

 

Câu đó là của mình, đã xem xét kỹ thuật giải và... bó tay!

Cái này hơi đặc biệt, phải làm từng "chú", không gom gộp gì được. Chương trình bemove post lên lúc đầu chỉ xử lý một số lượng rất ít đối tượng được selected. Bạn yêu cầu "chơi" hàng loạt đối tượng theo màu thì phải chấp nhận. Nếu không chấp nhận được thì... đừng chơi 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

minh vua hoc ve cad,thay mọi người bàn về autolisp nhưng mình k hiểu muốn viết lisp thì viết ở đâu vậy.mọi người viết kĩ nhé . 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
Đúng là:

(command "area")

(setq DT (getvar "area"))

 

ở đây có 2 thứ trùng tên, đó là lệnh area và biến hệ thống area.

biến hệ thống area sẽ lưu giá trị diện tích được tính bằng lệnh area ngay trước đó.

 

Điều éo le là LISP không thực hiện hết lệnh Area trước khi thực hiện các lệnh còn lại.

 

(defun c:vb ()
 (command "AREA")
 (setq DIENTICH (Rtos (getvar "area")))
 (setq ENT (entget (car (entsel))))
 (setq OLDTEXT (cdr (assoc 1 ENT)))
 (setq ENT (subst (cons 1 DIENTICH) (cons 1 OLDTEXT) ENT))
 (entmod ENT)
 (ENtupd ENT)
 )

 

Như đoạn code này của Jin, mục đích là thực đo diện tích và điền giá trị vào một text được chỉ định sau đó.

Nhưng kết quả là LISP gọi lệnh area rồi để đấy, thự hiện lệnh thay text bằng giá trị area được đo trước đó, rồi mới lại tiếp tục lệnh area.

 

Có cách gì khắc phục điều này khô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
minh vua hoc ve cad,thay mọi người bàn về autolisp nhưng mình k hiểu muốn viết lisp thì viết ở đâu vậy.mọi người viết kĩ nhé . thanks

Bạn tham khảo ở đây:

 

http://www.cadviet.com/forum/index.php?showtopic=2480

 

Có gì vướng mắc thì cũng nêu ở đó luô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
Điều éo le là LISP không thực hiện hết lệnh Area trước khi thực hiện các lệnh còn lại.

 

(defun c:vb ()  
 (command "AREA")
[color="#FF0000"]  (while (setq p (getpoint "\nHay chon diem: " ))
   (command p)
 )
 (command "")
[/color]  (setq DIENTICH (Rtos (getvar "area")))
 (setq ENT (entget (car (entsel))))
 (setq OLDTEXT (cdr (assoc 1 ENT)))
 (setq ENT (subst (cons 1 DIENTICH) (cons 1 OLDTEXT) ENT))
 (entmod ENT)
 (ENtupd ENT)
 [color="#FF0000"](princ)[/color]
)

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

×