Đế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

#201 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 12 February 2009 - 05:53 PM

Nhờ sự giúp đỡ của anh SSG, bạn thanhbinh, bạn Tue_NV, đoạn code của anh Hoành đã viết sẵn, mình đã dùng để bổ sung thêm vài chỗ để hoàn chỉnh cái lisp giãn dòng text này. Tuy chưa hiểu sâu lắm nhưng như anh SSG nói, có thể vận dụng nó rùi từ từ hiểu sau, vì hiện tại kiến thức còn yếu quá.

(defun c:gt ( / os dc i ss dt dtt dm)
(setq
os (getvar "osmode")
dc (getpoint "\nChon diem chuan: ")
i 0
)
(setvar "osmode" 0)
(setq ss (ssget '((0 . "TEXT")))
lst (ss2ent ss)
lst (vl-sort lst
'(lambda (e1 e2)
(<
(caddr (assoc 10 (entget e1)))
(caddr (assoc 10 (entget e2)))
)
)
)
)
(foreach e lst
(setq
dt (entget e)
dtt (cdr (assoc 10 dt))
dm (list (car dc) (+ (cadr dc) (* i 500)))
)
(command ".justifytext" e "" "ml")
(command ".move" e "" dtt dm)
(setq i (1+ i))
)
(setvar "osmode" os)
(princ)
)

(defun ss2ent (ss / i Le e);;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)
(setq
e (ssname ss i)
Le (append Le (list e))
i (1+ i)
)
)
Le
)

Nếu còn chỗ nào chưa hợp lý xin mọi người góp ý tiếp nhé.
Chúc mọi người luôn vui vẻ.
:cheers:


Chào bạn Tuan_thietkedien,
Bạn nên lưu ý hàm (setq lst (vl-sort lst '(lambda (e1 e2) (< (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))) này vì hàm này sẽ sắp xếp các biến text ei trong tập hợp ss của bạn theo trật tự từ dưới lên trên của điểm chèn text (Nghĩa là theo tọa độ y của điểm chèn của mỗi text từ nhỏ đến lớn). Do đó nếu các text không cùng một font và không cùng size thì sẽ rất dễ xảy ra chuyện kết quả không đúng với ý bạn. Bởi vì như bạn biết các loại font khác nhau sẽ có các khoảng cách khác nhau từ điểm chèn tới text và các kích thước của font khác nhau cũng sẽ làm các khoảng cách này thay đổi tùy theo việc bạn chọn kiểu justifytext.
Mặt khác trong trường hợp các text có cùng tọa độ y của điểm chèn text thì sao nhỉ??? Bạn đọc kỹ phần hướng dẫn về hàm vl-sort sẽ thấy là nó có thể sẽ mất tiêu một vài text mà chỉ giữ lại một text duy nhất trong số các text có cùng tọa độ y của điểm chèn này. Giữ cái nào thì mình cũng chưa rõ lắm, cần tìm hiểu thêm. Song bạn hãy thử với điều kiện phân loại là <= xem sao. Hy vọng rằng nó sẽ an toàn hơn bạn ạ. Vì mình chưa có thời gian để thử cái lisp của bạn mà cũng chỉ mới chợt nghĩ ra điều này khi đọc bài của bác Giabach nên mình post lên để bạn kiểm tra lại. Bạn đừng giận nếu như suy nghĩ của mình chưa đúng.

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

#202 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 13 February 2009 - 01:28 PM

Chào bạn Tuan_thietkedien,
Bạn nên lưu ý hàm (setq lst (vl-sort lst '(lambda (e1 e2) (< (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))) này vì hàm này sẽ sắp xếp các biến text ei trong tập hợp ss của bạn theo trật tự từ dưới lên trên của điểm chèn text (Nghĩa là theo tọa độ y của điểm chèn của mỗi text từ nhỏ đến lớn). Do đó nếu các text không cùng một font và không cùng size thì sẽ rất dễ xảy ra chuyện kết quả không đúng với ý bạn. Bởi vì như bạn biết các loại font khác nhau sẽ có các khoảng cách khác nhau từ điểm chèn tới text và các kích thước của font khác nhau cũng sẽ làm các khoảng cách này thay đổi tùy theo việc bạn chọn kiểu justifytext.
Mặt khác trong trường hợp các text có cùng tọa độ y của điểm chèn text thì sao nhỉ??? Bạn đọc kỹ phần hướng dẫn về hàm vl-sort sẽ thấy là nó có thể sẽ mất tiêu một vài text mà chỉ giữ lại một text duy nhất trong số các text có cùng tọa độ y của điểm chèn này. Giữ cái nào thì mình cũng chưa rõ lắm, cần tìm hiểu thêm. Song bạn hãy thử với điều kiện phân loại là <= xem sao. Hy vọng rằng nó sẽ an toàn hơn bạn ạ. Vì mình chưa có thời gian để thử cái lisp của bạn mà cũng chỉ mới chợt nghĩ ra điều này khi đọc bài của bác Giabach nên mình post lên để bạn kiểm tra lại. Bạn đừng giận nếu như suy nghĩ của mình chưa đúng.

Rất mong bạn thành công.


Chào bạn thanhbinh
Mọi người góp ý là giúp đỡ mình, từ đó mình có thể mau tiến bộ hơn thôi mà, đúng sai đâu quan trọng đâu, bạn đừng quan trọng việc này quá nha. Mình không giận gì đâu. Mấy vấn đề bạn nêu mình đang thử xem thế nào, rồi sẽ chỉnh lại.
Chúc bạn luôn vui vẻ.
  • 0

#203 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 17 February 2009 - 01:08 PM

Các bác xem dùm em cái lisp này, em muốn kiểm tra text nào có Style không phải CADVIET thì báo và sửa lại thành Style CADVIET, mà sao nó gặp thằng text nào đúng hay sai gì cũng báo hết. :cheers:

(defun c:ktt( / ss e d dt)
(setq ss (ssget '((0 . "TEXT,MTEXT"))))
(while
(setq
e (ssname ss 0)
d (entget e)
dt (cdr (assoc 7 d))
)
(if (/= dt CADVIET)
(progn
(alert "Co doi tuong khac STYLE CADVIET")
(setq d (subst (cons 7 "CADVIET") (assoc 7 d) d))
)
)
(entmod d)
(ssdel e ss)
)
(princ)
)

  • 0

#204 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 17 February 2009 - 02:07 PM

Các bác xem dùm em cái lisp này, em muốn kiểm tra text nào có Style không phải CADVIET thì báo và sửa lại thành Style CADVIET, mà sao nó gặp thằng text nào đúng hay sai gì cũng báo hết. :cheers:
..........................................

Chào bạn Tuan_thietkedien
Vài góp ý với bạn:
- gặp thằng text nào đúng hay sai gì cũng báo hết:
tại dòng (/= dt CADVIET) CAD hiểu CADVIET là tên biến, nhưng bạn chưa gán bất kì giá trị nào cho biến CADVIET nên mặc định CADVIET=nil
do đó trị trả về của (/= dt CADVIET) luôn là TRUE ->gặp thằng text nào đúng hay sai gì cũng báo hết
- dòng (entmod d) chỉ cần khi đối tượng khác STYLE CADVIET -> đặt sau dòng (subt ....)

Gửi bạn LISP đã sửa lỗi. (Chú ý LISP xem như trong file CAD đã có TextStyle :"CADVIET", các trường hợp khác bạn phải thêm TextStyle trước khi chạy LISP hoặc bạn có thể bổ sung phần kiểm tra rồi Add TextStyle "CADVIET" trong LISP này )
(defun c:ktt (/ ss e d dt)
(setq ss (ssget '((0 . "TEXT,MTEXT")))
i 0 )
(while (setq e (ssname ss 0))
(setq d (entget e)
dt (strcase(cdr (assoc 7 d)))
)
(if (/= dt "CADVIET")
(progn
(setq i (1+ i)
d (subst (cons 7 "CADVIET") (assoc 7 d) d))
(entmod d)
)
)
(ssdel e ss)
)
(if (> i 0) (alert (strcat "Co " (itoa i) " doi tuong khac STYLE CADVIET")))
(princ)
)


  • 2

#205 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 17 February 2009 - 03:47 PM

Chào bạn Tuan_thietkedien
Vài góp ý với bạn:
- gặp thằng text nào đúng hay sai gì cũng báo hết:
tại dòng (/= dt CADVIET) CAD hiểu CADVIET là tên biến, nhưng bạn chưa gán bất kì giá trị nào cho biến CADVIET nên mặc định CADVIET=nil
do đó trị trả về của (/= dt CADVIET) luôn là TRUE ->gặp thằng text nào đúng hay sai gì cũng báo hết
- dòng (entmod d) chỉ cần khi đối tượng khác STYLE CADVIET -> đặt sau dòng (subt ....)

Gửi bạn LISP đã sửa lỗi. (Chú ý LISP xem như trong file CAD đã có TextStyle :"CADVIET", các trường hợp khác bạn phải thêm TextStyle trước khi chạy LISP hoặc bạn có thể bổ sung phần kiểm tra rồi Add TextStyle "CADVIET" trong LISP này )

(defun c:ktt (/ ss e d dt)
(setq ss (ssget '((0 . "TEXT,MTEXT")))
i 0 )
(while (setq e (ssname ss 0))
(setq d (entget e)
dt (strcase(cdr (assoc 7 d)))
)
(if (/= dt "CADVIET")
(progn
(setq i (1+ i)
d (subst (cons 7 "CADVIET") (assoc 7 d) d))
(entmod d)
)
)
(ssdel e ss)
)
(if (> i 0) (alert (strcat "Co " (itoa i) " doi tuong khac STYLE CADVIET")))
(princ)
)


Cám ơn bác gia_bach nhiều lắm.
:cheers:
  • 0

#206 nonhon

nonhon

    Chưa sử dụng CAD

  • Members
  • Pip
  • 3 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 21 February 2009 - 04:24 PM

có một vấn đề nhờ cá bro giải thích hộ cái, có một số lisp mà mình thường xuyên sử dụng nhưng ngặt nỗi mỗi khi tắt mở CAD lại phải nạp lại, do đó không biết có cách nào add nó một lần thôi không?
Mình cũng thử tìm trong 4rums rồi nhưng không thấy chỗ nào có nói đến.
tks
  • 0

#207 tucdrom

tucdrom

    — T — U — N — A —

  • Members
  • PipPipPipPipPipPip
  • 497 Bài viết
Điểm đánh giá: 642 (tốt)

Đã gửi 21 February 2009 - 04:36 PM

có một vấn đề nhờ cá bro giải thích hộ cái, có một số lisp mà mình thường xuyên sử dụng nhưng ngặt nỗi mỗi khi tắt mở CAD lại phải nạp lại, do đó không biết có cách nào add nó một lần thôi không?
Mình cũng thử tìm trong 4rums rồi nhưng không thấy chỗ nào có nói đến.
tks

Vấn đề của bạn đã bàn luận trên diễn đàn,chắc bạn chưa tìm kĩ đó thôi.Bạn làm như sau nhé :
+,Đầu tiên bạn phải Load file Lisp đó vào Cad đã,dùng lệnh AP(Applications)
+,Trên cửa sổ Load/Unload Applications bạn click vào Contents,sau đó chọn đường dẫn đến file Lisp của bạn để Add nó vào
Hình đã gửi
Chúc thành công !!
  • 0

Email : anhtu2101@gmail.com



 


#208 cuibap

cuibap

    biết zoom

  • Members
  • Pip
  • 10 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 27 February 2009 - 02:06 AM

em đúng là cùi bắp lun ne, mới vô diễn đàn nên hok pit j hết á!
Mấy sư huynh vui lòng chỉ em làm thế nào để thay đổi phím tắt theo ý mình ạ. Em mới vọc Cad nên kém lắm, mong các anh chỉ tận tình giúp.
Cảm ơn nhìu!
  • 0

#209 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

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

Đã gửi 28 February 2009 - 01:22 PM

em đúng là cùi bắp lun ne, mới vô diễn đàn nên hok pit j hết á!
Mấy sư huynh vui lòng chỉ em làm thế nào để thay đổi phím tắt theo ý mình ạ. Em mới vọc Cad nên kém lắm, mong các anh chỉ tận tình giúp.
Cảm ơn nhìu!


Bạn dùng lệnh aliasedit xem.
  • 0

#210 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 28 February 2009 - 02:04 PM

em đúng là cùi bắp lun ne, mới vô diễn đàn nên hok pit j hết á!
Mấy sư huynh vui lòng chỉ em làm thế nào để thay đổi phím tắt theo ý mình ạ. Em mới vọc Cad nên kém lắm, mong các anh chỉ tận tình giúp.
Cảm ơn nhìu!

Bạn có thể thiết lập phìm tắt trong file acad.pgp

Các bác cho em hỏi : em có tập tành viết đoạn Lisp để tính ra số lượng text chứa trong tập hợp chọn nhưng chưa biết sai ở lỗi nào? Mong các bác chỉ giúp.
(defun c:SLTEXT()
(setq ss (ssget))

(setq n (sslength ss)
i 0
text 0
)
(while (< i n)
(setq sn (entget(ssname ss i)))

(if (= (cdr(assoc 0 sn)) "Text")
(setq text (+ text 1))
)

(setq i (+ i 1))
)

(setq sl (strcat "so luong text la" (itoa text)))
(alert sl)
)
Mong các bác chỉ giúp. Em xin cảm ơn.
  • 0

#211 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 28 February 2009 - 04:28 PM

Bạn có thể thiết lập phìm tắt trong file acad.pgp

Các bác cho em hỏi : em có tập tành viết đoạn Lisp để tính ra số lượng text chứa trong tập hợp chọn nhưng chưa biết sai ở lỗi nào? Mong các bác chỉ giúp.
(defun c:SLTEXT()
(setq ss (ssget))

(setq n (sslength ss)
i 0
text 0
)
(while (< i n)
(setq sn (entget(ssname ss i)))

(if (= (cdr(assoc 0 sn)) "Text")
(setq text (+ text 1))
)

(setq i (+ i 1))
)

(setq sl (strcat "so luong text la" (itoa text)))
(alert sl)
)
Mong các bác chỉ giúp. Em xin cảm ơn.

Chào bạn Tri,
Mình chưa hiểu rõ câu hỏi của bạn. Bạn nói lisp bị lỗi nhưng nó là lỗi gì? Lisp không chạy hay chạy ra sai kết quả ? Bạn có thể upload cái file bạn đã làm và cái thông báo lỗi của cad được không?
Mình đã xem đoạn lisp của bạn, về cú pháp thì chưa thấy gì sai, tuy nhiên về logic thì mình thấy có tí ý kiến như sau:
1/- Bạn chọn tập đối tượng bằng hàm (ssget), như vậy nó yêu cầu bạn phải chọn các đối tượng trên bản vẽ và thế thì bạn đã biết rõ cái gì là text và cái gì không phải text rồi, vậy thì việc đếm số text trở nên hơi bị ngố.
2/- Bạn chỉ quan tâm tới các đối tượng là text, còn các đối tượng Mtext thì sao nhỉ? Có cần thống kê không? Có thể điều này dẫn tới lisp của bạn cho ra kết quả sai với điều bạn muốn.
3/- Hàm bằng của bạn là so sánh hai chuỗi nên nó yêu cầu hai chuỗi phải giống hệt nhau. Trong khi đó hàm (cdr (assoc 0 sn)) của bạn trả về chuỗi "TEXT" nếu đối tượng là text chứ không phải là "Text" nên kết quả của bạn sẽ luôn bằng 0.
4/- Cái thông báo kết quả của bạn trông không vừa mắt do thiếu khoảng trắng trước chuỗi giá trị của hàm (itoa text), bạn nên thêm một khoảng trắng vào chuỗi phía trước hay thêm một chuỗi chứa khoảng trắng vào giữa hai chuỗi trong hàm strcat.

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

#212 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 01 March 2009 - 10:04 AM

Chào bạn Tri,
Mình chưa hiểu rõ câu hỏi của bạn. Bạn nói lisp bị lỗi nhưng nó là lỗi gì? Lisp không chạy hay chạy ra sai kết quả ? Bạn có thể upload cái file bạn đã làm và cái thông báo lỗi của cad được không?
Mình đã xem đoạn lisp của bạn, về cú pháp thì chưa thấy gì sai, tuy nhiên về logic thì mình thấy có tí ý kiến như sau:
1/- Bạn chọn tập đối tượng bằng hàm (ssget), như vậy nó yêu cầu bạn phải chọn các đối tượng trên bản vẽ và thế thì bạn đã biết rõ cái gì là text và cái gì không phải text rồi, vậy thì việc đếm số text trở nên hơi bị ngố.
2/- Bạn chỉ quan tâm tới các đối tượng là text, còn các đối tượng Mtext thì sao nhỉ? Có cần thống kê không? Có thể điều này dẫn tới lisp của bạn cho ra kết quả sai với điều bạn muốn.
3/- Hàm bằng của bạn là so sánh hai chuỗi nên nó yêu cầu hai chuỗi phải giống hệt nhau. Trong khi đó hàm (cdr (assoc 0 sn)) của bạn trả về chuỗi "TEXT" nếu đối tượng là text chứ không phải là "Text" nên kết quả của bạn sẽ luôn bằng 0.
4/- Cái thông báo kết quả của bạn trông không vừa mắt do thiếu khoảng trắng trước chuỗi giá trị của hàm (itoa text), bạn nên thêm một khoảng trắng vào chuỗi phía trước hay thêm một chuỗi chứa khoảng trắng vào giữa hai chuỗi trong hàm strcat.
Chúc bạn vui và thành công.

1. Em chọn tập đối tượng bằng hàm (ssget) : tất nhiên có nhiều đối tượng khác nhau trong đó có Text và cần tính số lượng Text là bao nhiêu?
2. Đối tượng text và Mtext là 2 đối tượng hoàn toàn khác nhau
(0 . "TEXT") và (0 . "MTEXT")
3. Hàm bằng so sánh hai chuỗi nên nó yêu cầu hai chuỗi phải giống hệt nhau =>
hàm (cdr (assoc 0 sn)) trả về chuỗi "TEXT" so sánh với chuỗi "Text" thì kết quả phải cho ra giá trị True mới đúng chứ.
Các bác xem lại giúp em. Em cảm ơn nhiều
(defun c:SLTEXT()
(setq ss (ssget))
(setq n (sslength ss)
i 0
text 0
)
(while (< i n)
(setq sn (entget(ssname ss i)))
(if (= (cdr(assoc 0 sn)) "Text")
(setq text (+ text 1))
)
(setq i (+ i 1))
)
(setq sl (strcat "so luong text la : " (itoa text)))
(alert sl)
)

  • 0

#213 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 01 March 2009 - 10:42 AM

1. Em chọn tập đối tượng bằng hàm (ssget) : tất nhiên có nhiều đối tượng khác nhau trong đó có Text và cần tính số lượng Text là bao nhiêu?
2. Đối tượng text và Mtext là 2 đối tượng hoàn toàn khác nhau
(0 . "TEXT") và (0 . "MTEXT")
3. Hàm bằng so sánh hai chuỗi nên nó yêu cầu hai chuỗi phải giống hệt nhau =>
hàm (cdr (assoc 0 sn)) trả về chuỗi "TEXT" so sánh với chuỗi "Text" thì kết quả phải cho ra giá trị True mới đúng chứ.
Các bác xem lại giúp em. Em cảm ơn nhiều

(defun c:SLTEXT()
(setq ss (ssget))
(setq n (sslength ss)
i 0
text 0
)
(while (< i n)
(setq sn (entget(ssname ss i)))
(if (= (cdr(assoc 0 sn)) "Text")
(setq text (+ text 1))
)
(setq i (+ i 1))
)
(setq sl (strcat "so luong text la : " (itoa text)))
(alert sl)
)


Bạn nhầm rồi bạn Tri ơi,
3/- Giống hệt nhau có nghĩa là phải giống cả về kiểu chữ hoa và chữ thường bạn ạ. "TEXT" gồm bốn chữ cái in hoa cò "Text" chỉ có 1 chữ hoa và 3 chữ thường. Do vậy hàm của bạn sẽ trả về giá trị là false ( tức nil) bạn ạ. Bạn hãy kiểm tra lại xem.
2/- Có nghĩa là bạn không quan tâm đến các đối tượng Mtext mặc dù về hình thức trên bản vẽ thật khó phân biệt đâu là text và đâu là Mtext.
1/- Hàm (ssget) yêu cầu bạn pick từng đối tượng một trên bản vẽ để làm thành tập hợp. Trong quá trình pick như vậy bạn biết rõ bạn đã pick cái gì mà. Thay vì bạn phải cần lisp này, bạn chỉ cần pick các text và đếm nó là Ok mà. Vừa nhanh hơn vừa đỡ rắc rối bạn ạ.
Nếu bạn sử dụng hàm ssget với các mode chọn như "x", "w", "c", "l", "p" thì sẽ hợp lý hơn do các hàm này sẽ cho phép bạn chọn nhanh một tập hợp đối tượng tùy theo mode chọn mà không phân biệt loại đối tượng. Từ đó ta mới cần phân loại chứ phải không bạn.

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

#214 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 01 March 2009 - 11:15 AM

Bạn nhầm rồi bạn Tri ơi,
3/- Giống hệt nhau có nghĩa là phải giống cả về kiểu chữ hoa và chữ thường bạn ạ. "TEXT" gồm bốn chữ cái in hoa cò "Text" chỉ có 1 chữ hoa và 3 chữ thường. Do vậy hàm của bạn sẽ trả về giá trị là false ( tức nil) bạn ạ. Bạn hãy kiểm tra lại xem.
2/- Có nghĩa là bạn không quan tâm đến các đối tượng Mtext mặc dù về hình thức trên bản vẽ thật khó phân biệt đâu là text và đâu là Mtext.
1/- Hàm (ssget) yêu cầu bạn pick từng đối tượng một trên bản vẽ để làm thành tập hợp. Trong quá trình pick như vậy bạn biết rõ bạn đã pick cái gì mà. Thay vì bạn phải cần lisp này, bạn chỉ cần pick các text và đếm nó là Ok mà. Vừa nhanh hơn vừa đỡ rắc rối bạn ạ.
Nếu bạn sử dụng hàm ssget với các mode chọn như "x", "w", "c", "l", "p" thì sẽ hợp lý hơn do các hàm này sẽ cho phép bạn chọn nhanh một tập hợp đối tượng tùy theo mode chọn mà không phân biệt loại đối tượng. Từ đó ta mới cần phân loại chứ phải không bạn.

Chúc bạn vui và thành công.

Thanks bác PhamThanhBinh
Đúng là đoạn Lisp trên sai vì cái lỗi "TEXT" gồm bốn chữ cái in hoa cò "Text" chỉ có 1 chữ hoa và 3 chữ thường.
Cám ơn bác nhiều lắm nhé vì đã chỉ lỗi ra cho em. Loay hoay mãi mà không tìm ra lỗi.

Nhưng hình như bác nhầm 1 chổ là 1/- Hàm (ssget) yêu cầu bạn pick từng đối tượng một trên bản vẽ để làm thành tập hợp. Điều này không đúng đâu. Hàm (ssget) không đối số có thể cho ta chọn đối tượng theo cửa sổ và cũng có thể cho ta chọn theo phương pháp pick điểm chứ không như bác nói là yêu cầu bạn pick từng đối tượng một trên bản vẽ đâu. Điều này không đúng. Bác xem lại chút nhé
  • 1

#215 BigBill

BigBill

    biết vẽ circle

  • Members
  • PipPip
  • 39 Bài viết
Điểm đánh giá: 11 (tàm tạm)

Đã gửi 02 March 2009 - 12:59 AM

Em muốn hỏi các bác,lisp có thể lấy Block trong 1 bản vẽ như Design Center không?Em muốn tạo 1thư viện bằng cách cho các block vào trong 1 bản vẽ,rồi dùng như Design Center để lấy Block ra,nhung làm như Design Center thì khá mất thời gian,vì trong Design Center ko chỉ có Block mà còn có nhìu thứ khác nữa,dùng Lisp để tạo thư viện bình thwờng thì lại khá nặng và mất công vì ngaòi File cad còn có file ảnh SLD nữa,mỗi khi cập nhật thêm tv khó khăn,mong mọi ngwời giúp đỡ,e thấy cái này hình như trong Nova hay Hs có thì phải. Nhưng không bít họ làm hiểu gì?
  • 0

#216 dacvien2007

dacvien2007

    biết vẽ polygon

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

Đã gửi 02 March 2009 - 06:15 PM

Mình sưu tầm được 1 lisp nội suy cao độ giữa 2 điểm , ví dụ như : điểm 1 cao độ 1.68 ( dạng điểm và text ) điểm 2 có cao độ 5.64 khi dùng lisp lệnh NOISUY , chọn điểm 1 và 2 lisp noisuy sẻ yêu cầu chỉ điểm đươc tính và thể hiện ra cao độ của điểm đó theo phương đường thẳng qua 2 điểm đó.
Nhưng qua lisp này, nhờ các Anh giúp cho công việc nội suy cũng theo đường thẳng đó, nhưng thể hiện theo bước nhảy với số bước nhảy qui định ví như là : 0.5 , 1.0, 2,... thì lisp sẻ tính nội suy và thể hiện ra độ cao theo đường thằng đó với các điển thể hiện cao độ ví như :
Điểm 1 caođo 2.15 điểm 2 cao độ 3.67 bước nhảy là 0.5
thì xuất hiện các cao độ 2.50 , 3.0, 3.5 trên đường thẳng qua điểm 1 và 2

Rất mong được giúp đở :
Lisp sưu tầm :

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht)
(defun dxf( name n)
(cdr (assoc n (entget name)))
)
(defun gocam( goc)
(if (< goc 0.0) (+ 360.0 goc) goc)
)
(defun pvi( p1 p2)
(/ (* 180 (angle p1 p2)) pi)
)
(defun ra( g)
(/ (* g pi) 180)
)
(defun deg( so)
(/ (* 180 so) pi)
)
(defun diemvuonggoc( p1 p2 p / p0)
(setq p0 (polar p (ra (+ 90.0 (gocam (pvi p1 p2)))) 10.0))
(inters p1 p2 p p0 nil)
)
(while (and (setq n1 (entsel "text 1")) (setq n2 (entsel "text 2")))
(setq n1 (car n1) n2 (car n2))
(while (setq p (getpoint "\nDiem"))
(setq p1 (dxf n1 10) p2 (dxf n2 10) st1 (dxf n1 1) st2 (dxf n2 1))
(setq h1 (atof st1) h2 (atof st2))
(if (> h1 h2) (setq pt p2 p2 p1 p1 pt ht h2 h2 h1 h1 ht))
(setq p (diemvuonggoc p1 p2 p))
(if (and (> (distance p p2) (distance p p1)) (> (distance p p2) (distance p2 p1)))
(setq h (- h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))
(setq h (+ h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))
)
(command "_.text" "s" (dxf n1 7) p (dxf n1 40) (deg (dxf n1 50)) (rtos h 2 3))
(entmake (list (cons 0 "POINT") (cons 8 "points") (cons 10 p)))
)
)
)

Rất cám ơn
  • 0

#217 Phiphi-

Phiphi-

    biết lệnh minsert

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

Đã gửi 02 March 2009 - 07:18 PM

Mình sưu tầm được 1 lisp nội suy cao độ giữa 2 điểm , ví dụ như : điểm 1 cao độ 1.68 ( dạng điểm và text ) điểm 2 có cao độ 5.64 khi dùng lisp lệnh NOISUY , chọn điểm 1 và 2 lisp noisuy sẻ yêu cầu chỉ điểm đươc tính và thể hiện ra cao độ của điểm đó theo phương đường thẳng qua 2 điểm đó.
Nhưng qua lisp này, nhờ các Anh giúp cho công việc nội suy cũng theo đường thẳng đó, nhưng thể hiện theo bước nhảy với số bước nhảy qui định ví như là : 0.5 , 1.0, 2,... thì lisp sẻ tính nội suy và thể hiện ra độ cao theo đường thằng đó với các điển thể hiện cao độ ví như :
Điểm 1 caođo 2.15 điểm 2 cao độ 3.67 bước nhảy là 0.5
thì xuất hiện các cao độ 2.50 , 3.0, 3.5 trên đường thẳng qua điểm 1 và 2

Rất mong được giúp đở :
Lisp sưu tầm :

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht)
...
Rất cám ơn

LISP này chính do Bác TDVN viết trong bài #1616 http://www.cadviet.c...o...205&st=1600
Sao Bác không nhờ Bác TDVN bổ sung giúp cho chứ?
  • 0

#218 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 05 March 2009 - 12:27 PM

Mình sưu tầm được 1 lisp nội suy cao độ giữa 2 điểm , ví dụ như : điểm 1 cao độ 1.68 ( dạng điểm và text ) điểm 2 có cao độ 5.64 khi dùng lisp lệnh NOISUY , chọn điểm 1 và 2 lisp noisuy sẻ yêu cầu chỉ điểm đươc tính và thể hiện ra cao độ của điểm đó theo phương đường thẳng qua 2 điểm đó.
Nhưng qua lisp này, nhờ các Anh giúp cho công việc nội suy cũng theo đường thẳng đó, nhưng thể hiện theo bước nhảy với số bước nhảy qui định ví như là : 0.5 , 1.0, 2,... thì lisp sẻ tính nội suy và thể hiện ra độ cao theo đường thằng đó với các điển thể hiện cao độ ví như :
Điểm 1 caođo 2.15 điểm 2 cao độ 3.67 bước nhảy là 0.5
thì xuất hiện các cao độ 2.50 , 3.0, 3.5 trên đường thẳng qua điểm 1 và 2

Rất mong được giúp đở :
Lisp sưu tầm :

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht)
(defun dxf( name n)
(cdr (assoc n (entget name)))
)
(defun gocam( goc)
(if (< goc 0.0) (+ 360.0 goc) goc)
)
(defun pvi( p1 p2)
(/ (* 180 (angle p1 p2)) pi)
)
(defun ra( g)
(/ (* g pi) 180)
)
(defun deg( so)
(/ (* 180 so) pi)
)
(defun diemvuonggoc( p1 p2 p / p0)
(setq p0 (polar p (ra (+ 90.0 (gocam (pvi p1 p2)))) 10.0))
(inters p1 p2 p p0 nil)
)
(while (and (setq n1 (entsel "text 1")) (setq n2 (entsel "text 2")))
(setq n1 (car n1) n2 (car n2))
(while (setq p (getpoint "\nDiem"))
(setq p1 (dxf n1 10) p2 (dxf n2 10) st1 (dxf n1 1) st2 (dxf n2 1))
(setq h1 (atof st1) h2 (atof st2))
(if (> h1 h2) (setq pt p2 p2 p1 p1 pt ht h2 h2 h1 h1 ht))
(setq p (diemvuonggoc p1 p2 p))
(if (and (> (distance p p2) (distance p p1)) (> (distance p p2) (distance p2 p1)))
(setq h (- h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))
(setq h (+ h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))
)
(command "_.text" "s" (dxf n1 7) p (dxf n1 40) (deg (dxf n1 50)) (rtos h 2 3))
(entmake (list (cons 0 "POINT") (cons 8 "points") (cons 10 p)))
)
)
)

Rất cám ơn

Chào bạn dacvien2007,
Việc bạn post lisp này lên chứng tỏ ít nhiều bạn đã tìm hiểu về nó và đã ứng dụng được nó. Tuy nhiên nó chưa đáp ứng đúng yêu cầu của bạn. Vậy mình đề nghị bạn hãy tìm hiểu thêm chút nữa để hiểu rõ cách sử dụng của các hàm trong đó.
Yêu cầu của bạn khác với cái lisp này giải quyết ở chỗ bạn cần các điểm chọn có cao độ xác định trước còn lisp này lại giải quyết việc chọn điểm theo tùy ý người sử dụng.
Các nội dung yêu cầu khác là hoàn toàn như nhau.
Vậy nên nếu bạn hiểu được cặn kẽ trong đoạn lisp trên, đâu là đoạn code dùng để xác định điểm chọn và bạn thay thế đoạn code đó bằng cái cách chọn điểm theo cao độ của bạn là OK ngay thôi bạn ạ.
Bạn hãy thử suy nghĩ theo hướng này và viết thử cái code mà theo bạn là đúng rồi post cả đoạn lisp đó lên, mình sẽ chỉ cho bạn chỗ đúng chỗ sai và bạn sẽ học được cách cải tạo một cái lisp cũ theo yêu cầu của mình.
Việc viết cho bạn không khó khăn gì nhưng mình không muốn bạn cứ âm u mãi như vậy trong khi bạn còn cần nhiều lisp khác nữa trong công việc của bạn.
Bạn cũng đừng nóng vội phải giải quyết ngay vấn đề của bạn mà bạn nên giải quyết từ gốc của vấn đề là cái kiến thức về lisp của bạn. Hãy vừa học vừa ứng dụng thì sẽ tốt hơn là học chay và tốt hơn là việc phải phụ thuộc vào sự giúp đỡ của người khác. Không ai giúp được bạn bằng chính bạn tự giúp mình bằng cách cố gắng học hỏi bạn ạ.
Chúc bạn thành công trong công việc và cuộc sống.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#219 hvn8006

hvn8006

    biết vẽ arc

  • Members
  • PipPip
  • 44 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 08 March 2009 - 12:39 PM

Các anh ơi! Cho em hỏi là lisp thì dùng lệnh ap để dùng, mình có thể save lisp lại để dùng cho các lần làm việc sau không ạ. Ví dụ mình có nhiều lisp rất hay, khi mỗi lần làm việc lại ap thì sẽ rất bất tiện. Em xin cảm ơn!!!!!!!!!!
  • 0
tiền và phụ nữ là lý do cho nhiều sai lầm trong đời!!!!!!!!

#220 tucdrom

tucdrom

    — T — U — N — A —

  • Members
  • PipPipPipPipPipPip
  • 497 Bài viết
Điểm đánh giá: 642 (tốt)

Đã gửi 08 March 2009 - 01:09 PM

Các anh ơi! Cho em hỏi là lisp thì dùng lệnh ap để dùng, mình có thể save lisp lại để dùng cho các lần làm việc sau không ạ. Ví dụ mình có nhiều lisp rất hay, khi mỗi lần làm việc lại ap thì sẽ rất bất tiện. Em xin cảm ơn!!!!!!!!!!

Tham khảo:
http://www.cadviet.c...o...=371&st=200
  • 2

Email : anhtu2101@gmail.com