Chuyển đến nội dung
Diễn đàn CADViet
NTD

[Yêu cầu ] Lisp Tự Động Phát Sinh Đối Tượng Theo " UCS ảo "

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

Em cần 1 Lisp chạy có tính năng như sau . Mục đích để khi gọi bất kỳ 1 lệnh vẽ ,hay khi gọi bất kỳ 1 lệnh nào có tính phát sinh đối tượng mới sẽ tự động copy ra thêm n đối tượng nữa nằm tai các vị trí mà ta đã cho trước các điểm làm chuẩn

 

Bước 1 - Gọi lệnh thứ nhất của Lips

Bước 2 - Chọn điểm A làm chuẩn , hướng X , hướng Y , đã xong 1 "UCS ảo" đầu tiên

- Chọn điểm B làm chuẩn , hướng X , hướng Y , đã xong 1 "UCS ảo" tiếp theo

- Chọn điểm C làm chuẩn , hướng X , hướng Y , đã xong 1 "UCS ảo" tiếp theo

.........

.........

( Có thể chọn n điểm bao nhiêu cũng đc để xác định các "UCS ảo" )

 

- Kết thúc ko chọn điểm nào nữa

Bước 3 - Đăt chế độ là On hay 1 để xác lập môi trường các cho mọi lênh cơ bản của AutoCAD mà làm phát sinh đối tượng mới sẽ tự động copy ra thêm n đối tượng nữa ( chế độ là OFF hay 0 sẽ làm mọi thứ như chưa bao giơ có Lips này nhưng các điểm ABC....N thì vần đc lưu trong bộ nhớ để khi cần thì về On )

Bước 4 - Enter kết thúc , đã xác lập xong môi trường "UCS ảo"

 

Vì đã đặt là On (1) nên vẽ bất kỳ đối tượng mới hay nhóm đối tượng mới nào cũng sẽ tự động copy chúng ra thêm ( Điểm A làm chuẩn cho đối tượng đâu tiên đc tạo bởi các lệnh cơ bản của AutoCAD . Điểm B, C ...N , làm chuẩn cho các đối tượng đươc phát sinh ) , Đăc biêt nếu nhìn rõ cả quá trình động thi tốt quá , VD vẽ 1 cái Dim chưa kết thúc lệnh mà di chuột thì sẽ thấy cái Dim đó di chuyển tại môi trường của các "UCS ảo" rồi .

 

* Nếu khó quá hay ý tưởng của em phi thức tế quá thì các bác viết theo hướng cho Gọi lệnh thứ 2 của Lips để chọn các đối tượng ==> Enter kêt thúc tự động copy ra n đối tượng còn lại , xong . Tức Lisp về lệnh Copy nhưng ko cần chọn điểm đầu tiên và các điểm tiếp theo vì sẽ tự động đưa thông tin tọa độ của điểm A là điểm đầu tiên , B,C,D ... cho các điểm tiếp theo

 

Em xin cảm ơn mọi coment và Lisp của các 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

Bạn cho hình minh họa hoặc file CAD lúc trước và sau khi thực hiện Lisp đi mọi người dễ tưởng tượng và có file để chạy test thử lisp luô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

em gủi File CAD minh họa ý tưởng đây thưa các bác http://www.cadviet.c...theo_ucs_ao.dwg

 

Post 1 em nói chưa hết ý :

- Sau khi thiết lập đc 1 hệ thống "UCS ảo" A-B-C-D....-N như vậy thì thông tin về hệ thống đó sẽ đc lưu giữ để sau khi đóng Files mở lại thì vẫn dùng tiếp được mà ko phải thiết lập lại từ đầu

- Có thêm chế độ Reset để xóa toàn bộ thông tin về hệ thống "UCS ảo" đó ===> Thiết lập 1 hệ thống "UCS ảo" khác cho 1 công việc khác

 

- Mà tốt nhất là các bác làm theo kiểu : Tại các điểm A-B-C-D-....-N sẽ tự động chèn vào các Block có tên lần lần lượt là Goc-A ; Goc-B ; Goc-C; Goc-D ; Goc-N . Các Block này có điểm chèn nằm tại chính các các điểm A-B-C-D-....-N . Mục đích của việc này là nhằm sử dụng tọa độ điểm chèn của các Block đó đưa vô hệ thống và giả lập lên tọa độ của các "UCS ảo" trong UCS quốc tế thật . Nhờ thế sẽ chỉnh sửa thêm bớt tùy biến được hệ thống "UCS ảo" bằng các lệnh cơ bản nhất như Move , Erase , Copy .... ===> Giải quyết đc bài toán vẽ hàng loat các thứ giống nhau tại các vùng khác nhau trên bản vẽ sao cho nhàn nhất có thể VD: cụ thể ơ đây là hàng loạt các Text giống nhau trên các MB của 1 tòa nhà cao tầng như em đã vẽ trong File CAD minh họa ý 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

em gủi File CAD minh họa ý tưởng đây thưa các bác http://www.cadviet.c...theo_ucs_ao.dwg

 

Post 1 em nói chưa hết ý :

- Sau khi thiết lập đc 1 hệ thống "UCS ảo" A-B-C-D....-N như vậy thì thông tin về hệ thống đó sẽ đc lưu giữ để sau khi đóng Files mở lại thì vẫn dùng tiếp được mà ko phải thiết lập lại từ đầu

- Có thêm chế độ Reset để xóa toàn bộ thông tin về hệ thống "UCS ảo" đó ===> Thiết lập 1 hệ thống "UCS ảo" khác cho 1 công việc khác

 

- Mà tốt nhất là các bác làm theo kiểu : Tại các điểm A-B-C-D-....-N sẽ tự động chèn vào các Block có tên lần lần lượt là Goc-A ; Goc-B ; Goc-C; Goc-D ; Goc-N . Các Block này có điểm chèn nằm tại chính các các điểm A-B-C-D-....-N . Mục đích của việc này là nhằm sử dụng tọa độ điểm chèn của các Block đó đưa vô hệ thống và giả lập lên tọa độ của các "UCS ảo" trong UCS quốc tế thật . Nhờ thế sẽ chỉnh sửa thêm bớt tùy biến được hệ thống "UCS ảo" bằng các lệnh cơ bản nhất như Move , Erase , Copy .... ===> Giải quyết đc bài toán vẽ hàng loat các thứ giống nhau tại các vùng khác nhau trên bản vẽ sao cho nhàn nhất có thể VD: cụ thể ơ đây là hàng loạt các Text giống nhau trên các MB của 1 tòa nhà cao tầng như em đã vẽ trong File CAD minh họa ý tưởng

Ý của bạn chủ topic giống như là vẽ đối tượng trong ETAB với chế độ vẽ Similar Story (Vẽ cho từng tầng giống nhau) -> Vẽ cho tầng điển hình thì các tầng Similar Story tự phát sinh đối tượng

Hoặc là chế độ vẽ All Story (Vẽ cho toàn bộ các tầng) Vẽ tầng điển hình thì toàn bộ các tầng cũng phát sinh đối tương như thế

Cái này hơi bị khó nhỉ? Chắc là đi theo phương án 2 của bạn thô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

Mình viết cho bạn đây rùi đây theo phương án đơn giản hơn là phương án số 2 của bạn

Bạn đóng điểm gốc thành 1 block và copy vào các điểm gốc mà bạn chọn

Khi đó bạn không cần pick lần lượt từng điểm gốc nữa nhé

Lệnh: CPN chuyển phát nhanh :D

;; Free lisp code from CADViet.com
;;;;;;;;;;;;;;; Chuyen phat nhanh doi tuong theo block - edit by Mathan
(defun c:CPN ( )
(command "undo" "be")
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(princ "\nChon vung doi tuong: ")
(setq vungdt (ssget))
(princ "\n Chon doi tuong block goc toa do cua vung vua copy ")
(setq blockgoc (ssget (list (cons 0 "INSERT"))))
(setq goc1 (cdr (assoc 10 (entget (ssname blockgoc 0)))))
(setq ten (cdr (assoc 2 (entget (ssname blockgoc 0)))))
(setq sset (ssget "_X" (list (cons 0 "INSERT")(cons 2 ten))))

(setq n (sslength sset))
(setq i 0)
(while (< i n)
(setq Ent (ssname sset i))
(setq dgock (cdr (assoc 10 (entget ENT))))
(if (= goc1 dgock) (princ "\n Trung diem goc ")
 	(command "COPY" vungdt "" goc1 dgock)
)

(setq i (+ i 1))
)
(setvar "osmode" os)
(command "undo" "end")


 (princ)
)

  • 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

Cảm ơn bác mathan em đã xài thử , đã đáp ứng đc phần nào cái em muốn , em có nhận xét như sau

- Bác dựa vào các Block đã có sẵn để làm gốc UCS ảo, ý này hay quá , đỡ tốn công tạo mới, vì bản vẽ các tầng đều có các Block giống nhau có vị tri tương đối như nhau so với hê thống lưới cột , Nếu hệ thống lưới côt cũng là 1 Block như trong File em gửi thì độ chính xác khỏi lo

- Có 1 vấn đề bác chưa tính tới đó là khi có các mặt bằng bị xoay đi thì Lips chưa tính góc xoay của Block đc chọn ==> ko xoay đối tượng theo Block mẫu . Bác sửa cho em chỗ này với ( Mặt bằng có thẻ bị xoay 90 độ đi để vẽ Măt Đứng Mặt Cắt thậm chí là xoay chéo để vẽ các mẳt đứng chéo mà )

- Dòng mã (setq sset (ssget "_X" (list (cons 0 "INSERT")(cons 2 ten)))) em nghĩ nên bỏ "_X"

===> (setq sset (ssget (list (cons 0 "INSERT")(cons 2 ten)))) ===> sẽ ko copy cả vô các MB minh ko muốn

- Em vừa phát hiện thêm 1 lỗi nữa là khi UCS xoay thì kết quả sẽ ko như mong muố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

Thứ nhất: Về dòng code thì mình biết chứ, nhưng để tiện và nhanh mình thấy vẫn thấy nên chọn tất cả, còn tất nhiên khi bạn dùng bạn có thể tùy biến

Thứ hai: Yêu cầu của bạn không có chỗ nào nói về xoay khi copy đi cả. Đó là vấn đề của quá trình yêu cầu !!

Bạn nên thật ngắn ngọn và đủ ý, file mẫu của bạn cũng k hề có xoay đâu.

Bạn yêu cầu đầy đủ thì người viết giúp bác sẽ không mất công sửa lại nhiều lầ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

Vâng lần đâu post yêu cầu Lips em chưa kinh nghiệm , lần sau sễ cố gắng ngắn nhất mà đủ ý :D

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

×