Chuyển đến nội dung
Diễn đàn CADViet
Học AutoCAD Online cùng CADViet
TrNghia.Do

[HELP] NHỜ SỬA LISP CHÈN BLOCK THEO FILE DCL

Các bài được khuyến nghị

Vừa xong, duy782006 đã nói:

ok tối mà quocmanh chưa hiểu ý bạn thì mình viết cho.

Vâng...Cám ơn sự nhiệt tình của 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ứ thử hàm đó xem! Chỉ cần 1 hàm.

Từ cái diễn giải của bạn: 

(command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu canh/name.dwg" p2 "" "" p3)

và: (command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu bang/name.dwg" p1 "" "" "")

Như vậy Hình chiếu bằng và hình chiếu cạnh nằm trong 2 thư mục khác nhau.

Hàm trên đáp ứng 2 trường hợp, gặp thằng nào thì nó tự độ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

Giữ nguyên file lisp ban đầu của bạn sửa hàm   insert_orc như sau:

(defun insert_orc  (name / path)
(cond

((= (cadr ##rat##) "0") (insert1))

((= (cadr ##rat##) "1") (insert2))

)
)

 Còn hàm insert1 và insert2 viết cái gì là việc của bạn.

*Giải thích 1 chút bạn mất gốc quá:

-##rat## là list có chứa 4 số thể hiện vị trí được chọn của 4 list.

-cadr là đọc phần tử thứ 2 của list 

-lúc này (cadr ##rat##) sẽ đọc ra vị trí được chọn của list thứ 2 là thứ bạn dùng làm điều kiện. vị trí tính từ 0 nghĩa là vị trí thứ nhất là số 0 mà vị trí thừ 2 là số 1

-hàm cond sẽ rẽ nhánh nếu vị trí là 0 thì thực hiện cái này, nếu vị trí là 1 thì thực hiện cái kia.

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ào lúc 11/1/2018 tại 16:19, quocmanh04tt đã nói:

Cứ thử hàm đó xem! Chỉ cần 1 hàm.

Từ cái diễn giải của bạn: 

(command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu canh/name.dwg" p2 "" "" p3)

và: (command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu bang/name.dwg" p1 "" "" "")

Như vậy Hình chiếu bằng và hình chiếu cạnh nằm trong 2 thư mục khác nhau.

Hàm trên đáp ứng 2 trường hợp, gặp thằng nào thì nó tự động ...

Mình đã làm như bạn bảo và quả thật nó nhận cho 2 trường hợp thật, xin lỗi bạn vì lần trc chưa hiểu ý , he he.

Tuy nhiên lisp khi chạy có vấn đề chút khi chèn block theo "hinh chieu canh" , cụ thể là block khi chèn bị xoay khoảng 90 độ. Mình có đọc về hàm angle thì nó cho kết quả là radian, ko biết có phải do thế nên góc quay hay bị lẻ ko.

Nhờ bạn xem giúp .gui manh.dwg  Orings ORP (chuan) - manh.lsp

Sorry vì hôm nay mới trả lời bác đc, thất lễ quá :p

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ào lúc 11/1/2018 tại 18:16, duy782006 đã nói:

Giữ nguyên file lisp ban đầu của bạn sửa hàm   insert_orc như sau:

(defun insert_orc  (name / path)
(cond

((= (cadr ##rat##) "0") (insert1))

((= (cadr ##rat##) "1") (insert2))

)
)

 Còn hàm insert1 và insert2 viết cái gì là việc của bạn.

*Giải thích 1 chút bạn mất gốc quá:

-##rat## là list có chứa 4 số thể hiện vị trí được chọn của 4 list.

-cadr là đọc phần tử thứ 2 của list 

-lúc này (cadr ##rat##) sẽ đọc ra vị trí được chọn của list thứ 2 là thứ bạn dùng làm điều kiện. vị trí tính từ 0 nghĩa là vị trí thứ nhất là số 0 mà vị trí thừ 2 là số 1

-hàm cond sẽ rẽ nhánh nếu vị trí là 0 thì thực hiện cái này, nếu vị trí là 1 thì thực hiện cái kia.

Mình có dựa vào code của bạn để cho vào lisp chính như sau: Orings ORP (chuan) - duy.lsp

Tuy nhiên khi sử dụng thì lisp luôn báo là :

Command: 123
Error: too many arguments

Mình ko biết là lỗi ở đâu, mong bạn xem giúp.

Sorry hôm qua mình có việc nên ko trả lời bạn ngay đc :p

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
2 giờ trước, TrNghia.Do đã nói:

Mình đã làm như bạn bảo và quả thật nó nhận cho 2 trường hợp thật, xin lỗi bạn vì lần trc chưa hiểu ý , he he.

Tuy nhiên lisp khi chạy có vấn đề chút khi chèn block theo "hinh chieu canh" , cụ thể là block khi chèn bị xoay khoảng 90 độ. Mình có đọc về hàm angle thì nó cho kết quả là radian, ko biết có phải do thế nên góc quay hay bị lẻ ko.

Nhờ bạn xem giúp .gui manh.dwg  Orings ORP (chuan) - manh.lsp

Sorry vì hôm nay mới trả lời bác đc, thất lễ quá :p

Thế này nhé!

1. Hàm command: nhận giá trị góc xoay là độ.

2. Hàm Angle: trả về kết quả là radian.

3. Trong lisp mình đã chuyển radian về độ qua hàm angtos.

Như vậy là không vấn đề gì về lisp.

Vấn đề ở chỗ: Có thể bạn chưa hiểu về quy ước góc của autocad.

Mình lấy ví dụ dưới đây để bạn hiểu và xử lý góc và cái block cho hợp lý!

Sau khi chọn điểm thứ nhất:

a. Chọn điểm thứ 2 nằm ngang ở bên phải (của điểm thứ nhất) thì ta có góc là 0 độ, bên trái thì là 180 độ.

b. Chọn điểm thứ 2 thẳng đứng ở phía trên (của điểm thứ nhất) thì ta có góc là 90 độ, phía dưới thì là 270 độ.

*** Các góc tăng dần theo vòng quay ngược chiều kim đồng hồ...

 

  • 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
15 phút trước, quocmanh04tt đã nói:

Thế này nhé!

1. Hàm command: nhận giá trị góc xoay là độ.

2. Hàm Angle: trả về kết quả là radian.

3. Trong lisp mình đã chuyển radian về độ qua hàm angtos.

Như vậy là không vấn đề gì về lisp.

Vấn đề ở chỗ: Có thể bạn chưa hiểu về quy ước góc của autocad.

Mình lấy ví dụ dưới đây để bạn hiểu và xử lý góc và cái block cho hợp lý!

Sau khi chọn điểm thứ nhất:

a. Chọn điểm thứ 2 nằm ngang ở bên phải (của điểm thứ nhất) thì ta có góc là 0 độ, bên trái thì là 180 độ.

b. Chọn điểm thứ 2 thẳng đứng ở phía trên (của điểm thứ nhất) thì ta có góc là 90 độ, phía dưới thì là 270 độ.

*** Các góc tăng dần theo vòng quay ngược chiều kim đồng hồ...

 

Mình đã chỉnh lại file block nguồn như bạn hướng dẫn và kết quả chèn rất ok với các trường hợp 2 điểm p2 và p3 nằm theo hướng vuông góc x, y .

Tuy nhiên khi chọn 2 điểm p2, p3 bất kỳ, block chèn đúng hướng, tuy nhiên luôn bị lẻ một góc rất nhỏ tầm 0,4 độ ko biết tại sao.

1.jpg.22330f5f73d653f6781f24fc78e15727.jpg

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ôm qua nhầm 0 và 1 chứ không phải "0" và "1"

;;; HAM INSERT ***
(defun insert_orc  (name / path)
(cond
((= (cadr ##rat##) 0) (insert1))
((= (cadr ##rat##) 1) (insert2))
)
)
(defun insert_1()
(princ "chieu bang")
)
(defun insert_2 ()
(princ "chieu canh")
)

Về góc thì 180 bằng pi vậy 90 độ bằng (/ pi 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
Vào lúc 13/1/2018 tại 17:10, quocmanh04tt đã nói:

Hãy nghiên cứu hàm angtos,  làm tròn đến độ phút giây ntn là tùy bạn. 

Thanks bạn nhiều...Mình sửa đc rồ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
Vào lúc 29/12/2017 tại 10:47, quocmanh04tt đã nói:

 

 Tìm kiếm với từ khóa: LM:BlockPreview

 

Đang tìm hàm LM:BlockPreview trên mạng mà không có Bác quocmanh04tt có cho mình xin 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

Dùng LM:BlockPreview có cái mệt là nếu block quá to thì nó treo miết cái hộp thoại đến khi nó đọc vẽ xong mới thôi rất ức 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

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

×