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ị

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

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à

 

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

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

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

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

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

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

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

3.jpg

Chúc thành cô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

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!

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

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

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

(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.

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

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
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 ((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.

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

  • 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

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ì?

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

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 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.com/forum/index.php?sho...205&st=1600

Sao Bác không nhờ Bác TDVN bổ sung giúp cho chứ?

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

)

(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.

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á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!!!!!!!!!!

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á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.com/forum/index.php?sho...=371&st=200

  • 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

Các bác trên diễn đàn cho em hỏi một chút :

(setq ss (entget(car(entsel "\n Chon Block :"))))

(setq po1 (cdr(assoc 10 ss)))

 

1. Dòng đầu tiên sẽ lấy thông tin của Block khi ta chọn một Block

2. Dòng thứ 2 : kết hợp hàm assoc và cdr lấy ra tọa độ điểm chèn của Block được chọn đó.

 

Nhưng em không biết làm sao để có thể thay đổi được tọa độ điểm chèn của Block đó.

Mong các bác chỉ bảo cho em với. Em xin cảm ơn các bác rất nhiề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
Các bác trên diễn đàn cho em hỏi một chút :

(setq ss (entget(car(entsel "\n Chon Block :"))))

(setq po1 (cdr(assoc 10 ss)))

 

1. Dòng đầu tiên sẽ lấy thông tin của Block khi ta chọn một Block

2. Dòng thứ 2 : kết hợp hàm assoc và cdr lấy ra tọa độ điểm chèn của Block được chọn đó.

 

Nhưng em không biết làm sao để có thể thay đổi được tọa độ điểm chèn của Block đó.

Mong các bác chỉ bảo cho em với. Em xin cảm ơn các bác rất nhiều.

Tọa độ cho ra bởi assoc 10 là tọa độ của điểm chèn block trong bản vẽ. Bạn muốn thay đổi nó tức là thay đổi vị trí block đấy. Còn tọa độ điểm chèn của nó trong bản thân block thì lại khác. Ý bạn là thế nào trong 2 trường hợp này. Bạn có thể nói rõ hơn được 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
Tọa độ cho ra bởi assoc 10 là tọa độ của điểm chèn block trong bản vẽ. Bạn muốn thay đổi nó tức là thay đổi vị trí block đấy. Còn tọa độ điểm chèn của nó trong bản thân block thì lại khác. Ý bạn là thế nào trong 2 trường hợp này. Bạn có thể nói rõ hơn được không?

Vì cái điểm chèn Block của em nó nằm ở xa so với cái Block. Em muốn điểm chèn đó nằm gần lại cái Block đó vì cứ mỗi lần sử dụng lệnh Insert thì khi pick điểm chèn rồi mà chẳng thấy Block đâu (vì thực ra điểm chèn nằm xa Block nên phải zoom lại mới thấy được. Em muốn thay đổi điểm chèn mà khi sử dụng lệnh Insert thì điểm chèn đó nằm gần lại Block.

 

Bác Nataca có thể giải thích thêm điểm chèn block trong bản vẽ và điểm chèn của nó trong bản thân block khác nhau như thế nào được không?

Cảm ơn bá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
Vì cái điểm chèn Block của em nó nằm ở xa so với cái Block. Em muốn điểm chèn đó nằm gần lại cái Block đó vì cứ mỗi lần sử dụng lệnh Insert thì khi pick điểm chèn rồi mà chẳng thấy Block đâu (vì thực ra điểm chèn nằm xa Block nên phải zoom lại mới thấy được. Em muốn thay đổi điểm chèn mà khi sử dụng lệnh Insert thì điểm chèn đó nằm gần lại Block.

 

Bác Nataca có thể giải thích thêm điểm chèn block trong bản vẽ và điểm chèn của nó trong bản thân block khác nhau như thế nào được không?

Cảm ơn bác.

Khác chứ. Điểm chèn của block trong bản vẽ chính là điểm mà bạn chọn khi insert bản vẽ. Còn điểm "chèn" (tạm gọi thế) trong bản thân block theo mình đó là gốc tọa độ (0,0,0) khi bạn edit block. Trường hợp của bạn chỉ cần edit block và move các đối tượng trong block về gần gốc tọa độ (0,0,0) là đượ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
Vì cái điểm chèn Block của em nó nằm ở xa so với cái Block. Em muốn điểm chèn đó nằm gần lại cái Block đó vì cứ mỗi lần sử dụng lệnh Insert thì khi pick điểm chèn rồi mà chẳng thấy Block đâu (vì thực ra điểm chèn nằm xa Block nên phải zoom lại mới thấy được. Em muốn thay đổi điểm chèn mà khi sử dụng lệnh Insert thì điểm chèn đó nằm gần lại Block.

 

Bác Nataca có thể giải thích thêm điểm chèn block trong bản vẽ và điểm chèn của nó trong bản thân block khác nhau như thế nào được không?

Cảm ơn bác.

Chào bạn Tri,

Theo như bạn nói thì mình hiểu là bạn muốn thay đổi cái insert point đã được nhập vào khi bạn tạo một block bằng lệnh make block. Cái điểm đó nó đã là một thuộc tính cố định của block mất rồi và trong bảng mã DXF của một block thì mình không thấy có mã nào thể hiện cho cái điểm này. Việc bạn muốn thay đổi nó có nghĩa là bạn sẽ phải tạo một block mới và khi đó thì bạn sẽ được tùy chọn cái insert point này. Theo mình nên gọi nó là điểm gốc, hay điểm mốc của block chứ không nên gọi là đểm chèn vì dễ hiểu lầm. (Nó không hẳn đã là điểm (0.0 0.0 0.0) như bác Nacata nói đâu).Cái điểm này sẽ được dùng khi bạn cần sử dụng cái block này.

Ví dụ khi bạn insert một block vào một bản vẽ thì cái block ấy sẽ được đưa vào sao cho điểm gốc này sẽ trùng với cái điểm chèn (insert point) mà bạn sẽ nhập trong lệnh insert. Cái điểm chèn này thì nó có thể hiện trong bảng mã DXF của block mới insert vào và đó là mã tương tác số 10. Khi bạn dùng lệnh (setq pt (cdr ( assoc 10 (entget (car (entsel)))))) với đối tượng chọn là một block trên bản vẽ thì nó sẽ trả về cho bạn cái điểm mà bạn đã lựa chọn khi xài lệnh insert chứ không phải là điểm mà bạn đã lựa chọn khi tạo ra cái block này. Nếu bạn muốn thay đổi vị trí của block đó trong bản vẽ thì bạn có thể thay đổi cái tọa độ của điểm này rồi dùng hàm entmod để cập nhật tọa độ thay đổi trong bảng mả dxf và dùng hàm entup để cập nhật sự thay đổi vị trí block trên bản vẽ bạn ạ.

 

Túm lại mỗi một block có thể có hai insert point:

- một là điểm gốc được lấy khi tạo block mà cái điểm này thì không thay đổi được trừ phi bạn tạo một block mới có điểm gốc mới.

- Hai là điểm chèn khi insert block đó vào trong bản vẽ hiện hành. Điểm này có thể thay đổi được và vị trí của block trên bản vẽ sẽ thay đổi theo bằng cách sử dụng mã DXF của block.

 

Khi insert block bạn nên pick vào block chứ không nên pick điểm gốc vì dễ bị nhầm lắm. Nhất là khi trên bản vẽ có ty tỷ cái block khác nhau bạn ạ. Và như vậy bạn cũng chả cần chú ý tới cái điểm gốc này làm gì, cứ rê chuột sao cho block nằm đúng vị trí mình muốn rồi enter là OK.

 

Bác Nacata đã giải thích, nhưng sợ bạn chưa rõ nên mình mạn phép múa rìu một tí, hy vọng bạn sẽ thấy thoải mái hơn với cái thằng insert point của block này.

Chúc bạn vui và thành cô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

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

×