Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2854 replies to this topic

#41 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 11 July 2007 - 11:04 PM

các bác ơi , cho em hỏi 1 chút
em rất thích lệnh arctext trong bonus của cad R14
nhưng khi cài lại không cài thêm thanh công cụ là Bonus
em tìm trong đường dẫn cadR14 có file lisp là arctext.lsp
appload dùng không được
có bác nào biết không chỉ cho em với, thanks trước
  • 0

#42 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 11 July 2007 - 11:39 PM

các bác ơi , cho em hỏi 1 chút
em rất thích lệnh arctext trong bonus của cad R14
nhưng khi cài lại không cài thêm thanh công cụ là Bonus
em tìm trong đường dẫn cadR14 có file lisp là arctext.lsp
appload dùng không được
có bác nào biết không chỉ cho em với, thanks trước


Trong ACAD đời sau, vẫn còn arctext mà bạn. Nó nằm trong bộ Express của AutoCAD (Tôi đang dùng ACAD2007 thấy lệnh arctext vẫn ngon lành).
  • 0

#43 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 12 July 2007 - 10:27 PM

cám ơn anh, nhưng bác ơi sao em tìm mãi không thấy folder express trong thư mục
progam\autocad 200x anh à, bác có thể chỉ giúp em được không??
  • 0

#44 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 12 July 2007 - 11:26 PM

Express bạn phải cài đặt cùng với AutoCAD thì mới có.

Trong lúc cài ACAD, bạn chọn full là được.
  • 0

#45 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 01 August 2007 - 11:30 PM

Có bác nào có lisp có nội dung như sau:
trên màn hình có text như sau 2*2=6
đây là kết quả sai
khi chạy lisp yêu cầu chọn text cần tính toán
Sau khi chọn text trên thì sẽ cho kết quả là
2*2=4 tại đúng vị trí đó (tức là thay thế text cũ)
tất nhiên màu và font chữ như cũ thì càng tốt
thanks các bác trước!
  • 0

#46 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 02 August 2007 - 11:10 AM

Có bác nào có lisp có nội dung như sau:
trên màn hình có text như sau 2*2=6
đây là kết quả sai
khi chạy lisp yêu cầu chọn text cần tính toán
Sau khi chọn text trên thì sẽ cho kết quả là
2*2=4 tại đúng vị trí đó (tức là thay thế text cũ)
tất nhiên màu và font chữ như cũ thì càng tốt
thanks các bác trước!

Lệnh là CALTEXT.

(defun c:caltext (/ ent tt old gt vt gtmoi)
(if (not c:cal)
(load "geomcal.arx")
)
(setq
ent (car (entsel "\nHay pick vao doi tuong text: "))
tt (entget ent)
old (assoc 1 tt)
gt (cdr old)
vt (vl-string-position (ascii "=") gt)
gtmoi (substr gt 1 vt)
kq (rtos (c:cal gtmoi))
kq (vl-string-right-trim "0" kq)
kq (vl-string-right-trim "." kq)
gtmoi (strcat gtmoi "=" kq)
tt (subst (cons 1 gtmoi) old tt)
)
(entmod tt)
(entupd ent)
(princ)
)

  • 0

#47 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 03 August 2007 - 11:10 PM

Bác Hoanh ơi, lisp này đúng ý em rồi
nhưng em muốn "nâng cấp" 1 chút như sau:
không phải chỉ chọn 1 text , mà có thể chọn nhiều text
khác nhau cùng 1 lúc được không bác?!
  • 0

#48 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 12 September 2007 - 07:43 AM

Ngày xưa dùng menuimage của menu có dòng như thế này mục đích là chọn hatchname là duy-05 sau đó gọi lệnh hatch của ACAD lên.
[duy-05]^C^C_setvar hpname "duy-05" _.bhatch
Bây giờ muốn chuyển qua sử dụng hộp thoại chuyển thành đoạn lisp như sau:
(setvar hpname "duy-05")
(command ".bhatch")

Nhưng sao nó không chọn được hatchname cũng như không hiển thị được hộp thoại của lệnh bhatch. bác nào biết xin chỉ giúp.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#49 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 12 September 2007 - 09:54 AM

Ngày xưa dùng menuimage của menu có dòng như thế này mục đích là chọn hatchname là duy-05 sau đó gọi lệnh hatch của ACAD lên.
[duy-05]^C^C_setvar hpname "duy-05" _.bhatch
Bây giờ muốn chuyển qua sử dụng hộp thoại chuyển thành đoạn lisp như sau:
(setvar hpname "duy-05")
(command ".bhatch")

Nhưng sao nó không chọn được hatchname cũng như không hiển thị được hộp thoại của lệnh bhatch. bác nào biết xin chỉ giúp.

2 dòng lệnh của bạn, dòng trên sai cú pháp, dòng dưới không tương đương với mã lệnh của menu.

Dòng trên cần sửa lại thành: (setvar "hpname" "duy-05"). Dòng dưới bó tay, vì không có mã lệnh lisp tương đương (do cấu trúc của lisp).
  • 0

#50 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 12 September 2007 - 10:08 AM

2 dòng lệnh của bạn, dòng trên sai cú pháp, dòng dưới không tương đương với mã lệnh của menu.

Dòng trên cần sửa lại thành: (setvar "hpname" "duy-05"). Dòng dưới bó tay, vì không có mã lệnh lisp tương đương (do cấu trúc của lisp).


Cám ơn! Vậy là không có cách nào gọi lệnh bhatch từ mã lisp sao?
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#51 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 22 September 2007 - 11:16 AM

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)
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#52 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 22 September 2007 - 11:50 AM

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

#53 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 27 October 2007 - 09:34 AM

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)
)

  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#54 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 27 October 2007 - 11:59 AM

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?
  • 0

#55 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 27 October 2007 - 02:34 PM

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..
  • 0

#56 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 29 October 2007 - 07:17 AM

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.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#57 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 29 October 2007 - 08:03 AM

Đú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" "")
  • 0

#58 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 29 October 2007 - 08:52 AM

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.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#59 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 29 October 2007 - 09:04 AM

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.


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.
  • 0

#60 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 29 October 2007 - 03:11 PM

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!
  • 0