Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
bachngoctung

[ Yêu cầu] Ghép nhiều lệnh trong 1 lisp

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

bachngoctung    11

-Chào anh e. chào ketxu, đêm qua mình dã viết bài và sai nội quy nên bị ketxu cho vào di vãng. Ðùa vậy thôi mình xin trình bày yêu cầu của mình như sau:

- Mình cần có một lisp có chức năng ghép các lệnh sau chỉ bằng một lệnh duy nhất ví du là cadviet

+ Ðối tượng: là một pline có độ dày là 2 và được đóng lại thành block có tên là dt

+ MÌnh sử dùng block dt này chèn vào bản vẽ khác và trong bản vẽ vừa chèn này mình sé dùng lisp cadviet để xử lý cái block dt kia kết quả nó cho ra nhu sau(theo thứ tự gạch đầu dòng nhé):

- Block bị phá vỡ (explode)

- Layer tự chuyển về layer của đường pline có độ dày là 2 (laymcur)

- Khi dánh lệnh pline thì nó tự có bề dày bằng 2, bằng theo bề dày của pline vừa phá từ block ra

> MOng cả nhà giúp đỡ. Chân thành cám on!

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

Quick code cho bạn đây :

(defun c:1 (/ blk pl plw elast)
(setq blk (car(entsel "\nCh\U+1ECDn Block : ")) elast (entlast))
(command "explode" blk)
(setq pl (entget(entnext elast)))
(if (setq plw (assoc 370 pl))(setvar "PLINEWID" (/(cdr plw) 100.0)))
(setvar "clayer" (cdr (assoc  8 pl)))
)

  • 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
bachngoctung    11

-Cám ơn ketxu nhiều, mình đã test thử và thấy giải quyết được 2 vấn đề đầu tiên là phá vỡ block và chuyển layer hiện hành về layer của đuờng pline vừa phá block. Tuy nhiên vấn đề thứ 3 là mình thực hiện lệnh vẽ plne ngay sau đó thì bề dày của đường pline mới không bằng bề dày của đường pline trong block mà mình vừa phá ra. Tóm lại là khi đánh lệnh pline mới thì nó sẽ được MATCHPROP bề dày theo bề dày của pline trong block vừa được phá ra lúc trước. Nhờ ketxu ngâm cứu thêm dc ko?. 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
ketxu    2.653

-Cám ơn ketxu nhiều, mình đã test thử và thấy giải quyết được 2 vấn đề đầu tiên là phá vỡ block và chuyển layer hiện hành về layer của đuờng pline vừa phá block. Tuy nhiên vấn đề thứ 3 là mình thực hiện lệnh vẽ plne ngay sau đó thì bề dày của đường pline mới không bằng bề dày của đường pline trong block mà mình vừa phá ra. Tóm lại là khi đánh lệnh pline mới thì nó sẽ được MATCHPROP bề dày theo bề dày của pline trong block vừa được phá ra lúc trước. Nhờ ketxu ngâm cứu thêm dc ko?. Cám ơn!

THực chất biến Plinewid đã làm thay đổi bề rộng của Pline (mặc dù trong Properties báo ByLayer). Bạn có thể nhìn thấy thay đổi khi bật LWT lên, hoặc nhìn vào phần Global width của Pline

  • 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
Doan Van Ha    2.678

-Cám ơn ketxu nhiều, mình đã test thử và thấy giải quyết được 2 vấn đề đầu tiên là phá vỡ block và chuyển layer hiện hành về layer của đuờng pline vừa phá block. Tuy nhiên vấn đề thứ 3 là mình thực hiện lệnh vẽ plne ngay sau đó thì bề dày của đường pline mới không bằng bề dày của đường pline trong block mà mình vừa phá ra. Tóm lại là khi đánh lệnh pline mới thì nó sẽ được MATCHPROP bề dày theo bề dày của pline trong block vừa được phá ra lúc trước. Nhờ ketxu ngâm cứu thêm dc ko?. Cám ơn!

Ketxu đi vắng, bạn thay dòng dưới đây xem sao hè, nếu không được thì đợi Ketxu về sửa!

Thay dòng:

(if (setq plw (assoc 370 pl)) (setvar "PLINEWID" (/ (cdr plw) 100.0)))

Bởi dòng:

(setvar "PLINEWID" (cdr (assoc 40 pl)))

P/S: sorry Ketxu, bạn đã về! 3h03'

  • 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
bachngoctung    11

-Tuyệt vời cám ơn Doan Van Ha đã hoàn thiện nốt giúp mình, cám ơn ketxu.

- Tuy nhiên mình muốn nhờ thêm một đoạn code nữa làm sao nó MATCHROP Linetype scale của đường pline vừa bị phá ra từ block đó. Ví dụ nó là dạng đường nét đứt có Linetype scale là 30 thì đường pline tiếp theo được vẽ sau khí phá block thì cũng là 30.

- Chân thành 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
Doan Van Ha    2.678

-Tuyệt vời cám ơn Doan Van Ha đã hoàn thiện nốt giúp mình, cám ơn ketxu.

- Tuy nhiên mình muốn nhờ thêm một đoạn code nữa làm sao nó MATCHROP Linetype scale của đường pline vừa bị phá ra từ block đó. Ví dụ nó là dạng đường nét đứt có Linetype scale là 30 thì đường pline tiếp theo được vẽ sau khí phá block thì cũng là 30.

- Chân thành cám ơn!

Bạn thêm dòng dưới đây:

(setvar "CELTSCALE" (cdr (assoc 48 pl)))

Vào bên dưới dòng dưới đây là được:

(setvar "PLINEWID" (cdr (assoc 40 pl)))

  • 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
bachngoctung    11

-Cám ơn Doan Van Ha, cho mình hỏi chút là mấy thông số (setvar "CELTSCALE" (cdr (assoc 48 pl))) bạn đọc từ tài liệu nào vậy, nếu có thể thì gửi cho mình đuợc không?. Nhiều tài liệu autolisp thì tốt, lần sau mình sẽ chủ động đưa code lên rồi nhờ a em chỉnh sửa, cùng nhau thảo luận.

-Mail của mình: bachngoctung@gmail.com

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
Doan Van Ha    2.678

-Cám ơn Doan Van Ha, cho mình hỏi chút là mấy thông số (setvar "CELTSCALE" (cdr (assoc 48 pl))) bạn đọc từ tài liệu nào vậy, nếu có thể thì gửi cho mình đuợc không?. Nhiều tài liệu autolisp thì tốt, lần sau mình sẽ chủ động đưa code lên rồi nhờ a em chỉnh sửa, cùng nhau thảo luận.

-Mail của mình: bachngoctung@gmail.com

1). 40, 48... là mã DXF của đối tượng, dùng hàm entget thì biết được, nhưng bạn phải có những hiểu biết về cơ sở dữ liệu của đối tượng. Nó có hàng trăm mã DXF lận.

2). Plinewid, Celtscale... là biến hệ thống cần đặt tương ứng. Bạn vào Express -> Tools -> System Variable Editor để xem giá trị hiện hành hoặc đặt lại.

3). Sách thì bạn down trên mạng, vào google tìm là có, nhưng ít sách hay, tôi cũng thế thôi, và chủ yếu đọc help, chứ không ai nhớ nỗi.

Vài lời vậy bạn nhé, chúc 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
bachngoctung    11

Chào cả nhà. Theo như hướng dẫn chỉnh sửa của Doan Van Ha mình đã thêm các dòng mã và được lisp như mình up kèm.

Lúc trước mình sửa thì dùng được luôn, nhưng đến hôm nay cần dùng và app lại lisp thì lại ko được ở vấn đề " Layer tự chuyển về layer của đường pline có độ dày là 2 (laymcur)"

- Quá trình thực hiện nó bão lỗi như sau:

Command: AC

Chọn Block : explode

Select object:

Command: ; error: AutoCAD variable setting rejected: "CELTSCALE" nil

Mình cũng đã thử tải lại lisp gốc của ketxu và làm lại theo huong dan của Doan Van Ha nhưng kết quả vẫn vậy.

Rất mong được giúp đỡ.

Thanks!!!

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
Doan Van Ha    2.678

Bạn thay dòng dưới đây:

(setvar "CELTSCALE" (cdr (assoc 48 pl)))

Thành dòng này chắc được:

(setvar "CELTSCALE" (cond ((cdr (assoc 48 pl))) (1.0)))

  • 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

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

Đăng nhập để thực hiện theo  

×