Đến nội dung


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

Viết Lisp theo yêu cầu


  • Chủ đề bị khóa Chủ đề bị khóa
2780 replies to this topic

#61 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 28 July 2007 - 01:13 PM

[/b]11 AM']Anh Hoanh ơi. Em đang rất cần lisp có nội dung như sau
khi tải lisp yêu cầu nhập kí tự(string) cần tìm sau đó nhập
điểm chèn trên màn hình, hiện ra kết quả là số lượng ký tự như thế đã tìm thấy là bao nhiêu
Em có biết đến lệnh find nhưng lệnh này nó tìm (find) và thay thế (replace) chứ không
đếm được số lượng như trên.
Anh giúp em với nha. Em cám ơn nhiều


Lệnh là WCNT (viết tắt của word count):

(defun c:wcnt (/ sw ss sotu pp)
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun dem (ent / tt gt)
(setq tt (entget ent)
gt (cdr (assoc 1 tt))
)
([b][color="#0000FF"]if[/color][/b] (wcmatch gt (strcat "*" sw "*"))
(setq
sotu (1+ sotu)
[b][color="#0000FF"];;[/color][/b] gt (vl-string-subst "" sw gt)
)
)
)
(princ "\nWord Count © CADViet.com 2007")
(while (or (not sw)
(= sw "")
)
(setq sw [b][color="#0000FF"](cdr (assoc 1 (entget (car (entsel "\nPick vao doi tuong text de lay gia tri: "))))[/color][/b])
)
)
(setq
ss (ssget '((0 . "TEXT")))
sotu 0
)

(sudung dem ss)
(setq pp (strcat "\nSo tu "
sw
" xuat hien trong cac doi tuong text vua chon la: "
(itoa sotu)
)
)
(princ pp)

(entmake
(list
(cons 0 "TEXT")
(cons 10
(setq tmp (getpoint "\nVao diem chen text ket qua: "))
)
(cons 40 (getdist tmp "\nVao chieu cao chu: "))
(cons 1 pp)
)
)
(princ)
)
(vl-load-com)
(princ "\nWord Count © 2007, CADViet.com")
(princ "\nSu dung lenh WCNT de bat dau!")
(princ)

  • 0

#62 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 28 July 2007 - 04:10 PM

trước tiên xin cảm ơn bác Hoanh đã trả lời dùm em
nhưng bác ơi cái lisp này còn 1 số hạn chế như sau:
a. không gõ được ký tự cách mà chỉ gõ được các string liền nhau

b. không tìm được các ký tự bằng tiếng Việt( em đã dùng unicode, TCVN3)

Về vấn đề a thì có lẽ em còn khắc phục được ( thêm chữ T gì gì đó)

Còn về ý b thì ôi thôi , em...bó tay
Mong bác giúp em chút nữa nha. thanks bác trước!
  • 1

#63 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 28 July 2007 - 08:46 PM

nhưng bác ơi cái lisp này còn 1 số hạn chế như sau:
a. không gõ được ký tự cách mà chỉ gõ được các string liền nhau
b. không tìm được các ký tự bằng tiếng Việt( em đã dùng unicode, TCVN3)

a. Trong lisp trên, bạn thay mã lệnh (getstring "\nChuoi can tim: ") bằng (getstring T "\nChuoi can tim: ") là khắc phục được.
b. Nếu dùng mã tiếng Việt VNI hay TCVN3 (mã 1 byte) vẫn tìm được như thường.
  • 0

#64 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 28 July 2007 - 08:57 PM

các bác ơi giúp em với , em cũng chỉ là sv mới ra trường nền cung chưa có rành lắm về autolip.mong các bác chỉ giáo thêm.
nhân tiện đầy em nhờ các bác giúp cho em một cái lip mà thay đổi cỡ chữ cũng như font chữ ,gống như lệnh ma(ma ko làm dc trong mtext)
cảm ơn các bác trước nha.

Lệnh MA vẫn dùng được với MTEXT mà!
nếu file của bạn gặp trục trặc, bạn có thể upload nó lên diễn đàn được không? mọi người sẽ có cơ hội giúp bạn.
  • 0

#65 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 28 July 2007 - 09:35 PM

Khổ cái thân em quá bác ơi, em đã gõ tiếng việt nhiều rồi nhưng nó toàn ra các ký tự lằng nhằng của
cái font txt.shx của text style standard đó.(ở dòng command:) em đã chuyển sang font arial rùi
cũng không được
em dùng VietKey 2000 beta3
quá tam 3 bận bác cố gắng giúp em nha!
  • 0

#66 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 28 July 2007 - 10:11 PM

Khổ cái thân em quá bác ơi, em đã gõ tiếng việt nhiều rồi nhưng nó toàn ra các ký tự lằng nhằng của
cái font txt.shx của text style standard đó.(ở dòng command:) em đã chuyển sang font arial rùi
cũng không được
em dùng VietKey 2000 beta3
quá tam 3 bận bác cố gắng giúp em nha!


xin lỗi, tôi chưa hiểu sự khó khăn của bạn ở đâu?
là vấn đề tiếng Viêt trong AutoCAD?
hay hiển thị sai tiếng Việt tại dòng command?
  • 0

#67 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 29 July 2007 - 03:02 PM

Đúng rồi đó bác à, chính là vấn đề hiển thị sai tiếng Việt tại dòng command
Còn gõ tiếng việt tại màn hình nền thì hổng vấn đề
bác giúp em nha , em đang rất cần! thanks
  • 0

#68 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 30 July 2007 - 10:31 AM

Đúng rồi đó bác à, chính là vấn đề hiển thị sai tiếng Việt tại dòng command
Còn gõ tiếng việt tại màn hình nền thì hổng vấn đề
bác giúp em nha , em đang rất cần! thanks

bạn đọc cái này: http://www.cadviet.com/forum/index.php?showtopic=458
  • 0

#69 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 30 July 2007 - 10:03 PM

Lại phiền bác Hoành chút rùi
Em vẫn chưa gõ được bác à
thôi thế này đi: Bác sửa dùm em cái lisp 1 chút nữa nha
Lần này không nhập string tại dòng nhắc nữa mà
khi khởi động lisp yêu cầu chọn trực tiếp
text trên màn hình acad. Em nghĩ cũng tiện đó
Bác giúp em nha!
  • 0

#70 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 30 July 2007 - 10:26 PM

Lại phiền bác Hoành chút rùi
Em vẫn chưa gõ được bác à
thôi thế này đi: Bác sửa dùm em cái lisp 1 chút nữa nha
Lần này không nhập string tại dòng nhắc nữa mà
khi khởi động lisp yêu cầu chọn trực tiếp
text trên màn hình acad. Em nghĩ cũng tiện đó
Bác giúp em nha!

bạn thay dòng lệnh
(getstring T "\nChuoi can tim: ")
bằng
(cdr (assoc 1 (entget (car (entsel "\nPick vao doi tuong text de lay gia tri: ")))))
là được.
  • 0

#71 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 31 July 2007 - 10:09 PM

Cám ơn bác, đạt 80% yêu cầu của em rùi
tuy nhiên vẫn còn chút lăn tăn bác ạ
Ví dụ: khi chọn 1 text mẫu có tên là "ghế"
trên màn hình có các text sau: ghế, bàn ghế, ghế tre, ghế mây. em chọn các text này
thì báo là : chu ghế xuat hien trong cac doi tuong text vua chon la: 4
điều này là sai vì chỉ có 1 text là ghế thôi, còn "bàn ghế, ghế tre, ghế mây" là 1 dòng text
có nghĩa lisp này đã đếm chữ ghế trong cả 1 text liền dòng
ý em hơi khác 1 chút tức là chỉ cần báo:
chu ghế xuat hien trong cac doi tuong text vua chon la: 1
Bác hiểu ý em chưa , lại phiền bác nghiên cứu giúp em tí nữa vậy!
em cám ơn
  • 0

#72 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 31 July 2007 - 10:18 PM

bạn bỏ chữ while thay bằng chữ if trong dòng mã: (while (wcmatch gt (strcat "*" sw "*"))
Như vậy, dòng mã mới là: (if (wcmatch gt (strcat "*" sw "*"))
  • 0

#73 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 31 July 2007 - 10:44 PM

Vẫn chưa được bác à, bác xem lại cho em chút nữa nha!
em còn thay cả (while (or (not sw)...
thành (if (or (not sw)...
cũng vẫn vậy bác à, không suy suyển chi cả??!
  • 0

#74 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 31 July 2007 - 10:55 PM

Vẫn chưa được bác à, bác xem lại cho em chút nữa nha!
em còn thay cả (while (or (not sw)...
thành (if (or (not sw)...
cũng vẫn vậy bác à, không suy suyển chi cả??!

Bạn hăng hái quá.
Chỉ cần thay 1 chỗ như tôi chỉ thôi, thay cả 2 thì vô nghĩa.
Sau đây là đoạn lisp sau 2 lần nâng cấp theo ý của bạn:

(defun c:wcnt (/ sw ss sotu pp)
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun dem (ent / tt gt)
(setq tt (entget ent)
gt (cdr (assoc 1 tt))
)
([color="#FF0000"]if[/color] (wcmatch gt (strcat "*" sw "*"))
(setq
sotu (1+ sotu)
[color="#FF0000"];;;[/color] gt (vl-string-subst "" sw gt)
)
)
)
(princ "\nWord Count © CADViet.com 2007")
(while (or (not sw)
(= sw "")
)
(setq sw [color="#FF0000"](cdr (assoc 1 (entget (car (entsel "\nPick vao doi tuong text de lay gia tri: ")))))[/color])
)
(setq
ss (ssget '((0 . "TEXT")))
sotu 0
)

(sudung dem ss)
(setq pp (strcat "\nSo tu "
sw
" xuat hien trong cac doi tuong text vua chon la: "
(itoa sotu)
)
)
(princ pp)

(entmake
(list
(cons 0 "TEXT")
(cons 10
(setq tmp (getpoint "\nVao diem chen text ket qua: "))
)
(cons 40 (getdist tmp "\nVao chieu cao chu: "))
(cons 1 pp)
)
)
(princ)
)
(vl-load-com)
(princ "\nWord Count © 2007, CADViet.com")
(princ "\nSu dung lenh WCNT de bat dau!")
(princ)

  • 1

#75 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 31 July 2007 - 11:36 PM

Vẫn không được bác à, khắc phục được 90% rùi
Tức là nhiều chữ trùng nhau trong 1 dòng thì nó đếm là 1 đơn vị
(khá hơn 1 chút so với khi chưa thay IF)
nhưng 100% thì phải là
nhiều chữ trùng nhau trong 1 dòng thì đếm là 0
(Vì chỉ đếm những text giống y sỳ text được chọn thôi)
Em đang dùng cad 2005 - hay nó bị lỗi gì hả bác?
  • 0

#76 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 31 July 2007 - 11:43 PM

Vẫn không được bác à, khắc phục được 90% rùi
Tức là nhiều chữ trùng nhau trong 1 dòng thì nó đếm là 1 đơn vị
(khá hơn 1 chút so với khi chưa thay IF)
nhưng 100% thì phải là
nhiều chữ trùng nhau trong 1 dòng thì đếm là 0
(Vì chỉ đếm những text giống y sỳ text được chọn thôi)
Em đang dùng cad 2005 - hay nó bị lỗi gì hả bác?

tức là phải y chang?

ví dụ chuỗi nhập vào là 'thịt chó Anh Tú' thì chỉ có chuỗi nào giống y chang mới được tính, còn các chuỗi 'thịt chó Anh Tú xịn', 'thịt chó Anh Tú thật', 'thịt chó Anh Tú gốc', 'quán thịt chó Anh Tú'... sẽ không được tính?
  • 0

#77 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 - 09:14 PM

Đúng thế đó bác à!
  • 0

#78 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

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

Đúng thế đó bác à!



bạn thay dòng lệnh
(if (wcmatch gt (strcat "*" sw "*"))
bằng
(if (= gt sw)
là được.
Và lisp mới sẽ là:

(defun c:wcnt (/ sw ss sotu pp)
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun dem (ent / tt gt)
(setq tt (entget ent)
gt (cdr (assoc 1 tt))
)
(if (= gt sw)
(setq
sotu (1+ sotu)
;;; gt (vl-string-subst "" sw gt)
)
)
)
(princ "\nWord Count © CADViet.com 2007")
(while (or (not sw)
(= sw "")
)
(setq sw (cdr (assoc 1 (entget (car (entsel "\nPick vao doi tuong text de lay gia tri: "))))))
)
(setq
ss (ssget '((0 . "TEXT")))
sotu 0
)

(sudung dem ss)
(setq pp (strcat "\nSo tu "
sw
" xuat hien trong cac doi tuong text vua chon la: "
(itoa sotu)
)
)
(princ pp)

(entmake
(list
(cons 0 "TEXT")
(cons 10
(setq tmp (getpoint "\nVao diem chen text ket qua: "))
)
(cons 40 (getdist tmp "\nVao chieu cao chu: "))
(cons 1 pp)
)
)
(princ)
)
(vl-load-com)
(princ "\nWord Count © 2007, CADViet.com")
(princ "\nSu dung lenh WCNT de bat dau!")
(princ)

  • 0

#79 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:34 PM

OK! 100% rùi
Cám ơn bác nhiều lắm
Bác có thể nhận em làm "đệ" được không?!
  • 0

#80 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 02 August 2007 - 01:58 AM

[/b]11 AM']Anh Hoanh ơi. Em đang rất cần lisp có nội dung như sau
khi tải lisp yêu cầu nhập kí tự(string) cần tìm sau đó nhập
điểm chèn trên màn hình, hiện ra kết quả là số lượng ký tự như thế đã tìm thấy là bao nhiêu
Em có biết đến lệnh find nhưng lệnh này nó tìm (find) và thay thế (replace) chứ không
đếm được số lượng như trên.
Anh giúp em với nha. Em cám ơn nhiều


Có một mẹo nhỏ đơn giản để có thể đếm được các ký tự nhập vào đó là khi bạn search bằng find xong, ấn ctrl+c ---> sẽ xuất hiện ngay số lượng các đối tượng được chọn bằng find :s_dead:

@Nguyen Hoang bạn là giúp mình cái này với

Mình đã phải ngồi căn lại khoảng cách giữa các dòng dim cho nó bằng nhau và cảm thấy hơi vất.

Mình muốn các bạn giúp cho 1 lisp có thể tự động căn chỉnh khoảng cách các dòng dim bằng nhau.
ví dụ:- có 3 hàng dim (dim mặt bằng, có khoảng cách không bằng nhau ). Khi dùng lisp sẽ tự động căn chỉnh khoảng khoảng cách giũa các hàng dim bằng 1 giá trị nhập vào từ bàn phím.


Thanks!
  • 0