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  
ptd1987

[yêu cầu] Nhờ các bác viết lisp rải thép đai cho dầm

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

ptd1987    5

Do thao tác phải vẽ dầm lặp đi lặp lại nhiều lần nên Nhờ các bác viết lisp rải thép đai cho dầm, Nội dung như sau:

1> Command: RTD

2> Chọn đối tượng: {line}

3> Chọn chiều dài dầm : {pick point 1+2}

4> Chọn khoảng cách rải đai gần gối (l/4): <150> (hiện 150 ở dòng nhắc, thích thì thay đổi, không thì enter tiếp)

5> Chọn khoảng cách rải đai đoạn giữa: <200>  (hiện 200 ở dòng nhắc, thích thì thay đổi, không thì enter tiếp)

Kết quả: line được rải đầu tiên cách point 1 một đoạn 50 (mặc định, không cần dòng lệnh hỏi k/c này), rải và xóa line gốc

vd: dầm dài 4m thì trong 1m đầu tiên: move đối tượng gốc sang phải 50 (lisp tự đặt biến F8 on, sau đó trả về mặc đinh trc khi dùng lệnh  hoặc trc khi dùng lệnh người dùng bật F8 thủ công để vẽ theo phương ngang), rải k/c 150, 2m tiếp theo rải k/c 200( đối tượng đầu tiên trong 2m này cách đối tượng cuối trong đoạn 1m đầu tiên 200 cho dễ nha bác), 1m cuối rải k/c 150 ( đối tượng đầu tiên trong 1m này cách đối tượng cuối trong đoạn 2m là 150 cho dễ nha bác). 

Thanks các bác ^^

E xin edit để đính kèm file ^^

http://www.cadviet.com/upfiles/4/112169_22_1.dwg

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

Thử cái này. Chú ý là cái đai (line) cần rải nằm ở điểm bắt đầu rải.

 

(defun c:rtd(/ ANG B1 B2 DIS DT LI OS P1 P2 TONG)
(defun chan(x n) (* n  (fix (/ x n 1.)) ))
(defun chia (a d1 d2 / D150 D200 DU)
(setq d200 (chan (* 0.5 a) d2)
d150 (chan (* 0.5 (- a d200 100)) d1)
du (* 0.5 (- a d200 (* 2 d150) 100)))
(list du d150 d200)
)
  (setvar 'cmdecho 0) 
(setq os (getvar 'osmode )
dt (car (entsel "\n Chon line de rai:"))
p1 (getpoint "\n Rai tu diem dau:")
p2 (getpoint p1 "\n Den diem cuoi:") 
)
(setq b1 (getint (strcat "\n Buoc cua doan bien <" (if gl_b1 (itoa gl_b1) (itoa (setq gl_b1 150))) ">: ")))
(if b1 (setq gl_b1 b1))
(setq b2 (getint (strcat "\n Buoc cua doan giua <" (if gl_b2 (itoa gl_b2) (itoa (setq gl_b2 200))) ">: ")))
(if b2 (setq gl_b2 b2))
(setq dis (distance p1 p2)
ang (angle p1 p2)
li (chia dis gl_b1 gl_b2))
(setvar 'osmode 0)
(command "copy" dt "" p1 (polar p1 ang (setq tong 50)))
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong (car li)))))
(repeat (/ (cadr li) gl_b1)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1)))))
(repeat (/ (last li) gl_b2)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b2)))))
(repeat (/ (cadr li) gl_b1)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1)))))
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong (car li)))))
(command "copy" dt "" p1 (polar p1 ang (+ tong 50)))
(setvar 'cmdecho 1) (setvar 'osmode os) (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
minhtu2004    35

-Bạn xóa dòng này

(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong (car li)))))

............

-Doi dòng này(command "copy" dt "" p1 (polar p1 ang (+ tong 50))) -----> thanh (command "erase" dt "")

-Còn thêm mấy cái yêu cầu thì để bạn Tot rãnh viết tiếp cho bạn.

  • 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
ptd1987    5

Thanks minhtu2004 , mình đã thử

Xóa 2 dòng: (command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong (car li)))))

-Doi dòng này(command "copy" dt "" p1 (polar p1 ang (+ tong 50))) -----> thanh (command "erase" dt "")

Test thử dầm 6m, 6.5m thì thiếu 1 đai cuối cùng, khoảng cách còn 250 mà ko rải đai nữa.

Dầm 3m 4m 5m đều ok vì k/c < 150 

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

Tôi viết mục đích là rải đối xứng cho dầm, chứ nếu rải từ trái qua còn dư bao nhiêu nằm ở phía bên phải thì khá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
ptd1987    5

-Mình test ok toàn bộ 3m, 3.5m, 6m, 6.5m. Bạn kiểm tra lại.

mình đã kiểm tra lại, nếu xóa 1 dòng (command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong (car li)))))

thì nhịp 6m, 6.5m đoạn cuối đúng là 150 nhưng đoạn liền kề trc thì là 100, tức là rải hơi bị ngược

tại mình xóa 2 dòng nên thử thì thấy dư đoạn 250

 

 

Tôi viết mục đích là rải đối xứng cho dầm, chứ nếu rải từ trái qua còn dư bao nhiêu nằm ở phía bên phải thì khác.

Bác sửa lại dùm e dc ko ạ? rải từ trái qua phải chứ không phải đối xứng, cho nó giống với thi công thực tế

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

Bạn thử cái này xem.

 

(defun c:rtd(/ ANG B1 B2 DIS DT LI OS P1 P2 TONG)
(defun chan(x n) (* n  (fix (/ x n 1.)) ))
(defun chia (a d1 d2 / D150 D200)
(setq d200 (chan (* 0.5 a) d2)
d150 (chan (* 0.5 (- a d200 100)) d1)
)
(list d150 d200)
)
  (setvar 'cmdecho 0) 
(setq os (getvar 'osmode )
dt (car (entsel "\n Chon line de rai:"))
p1 (getpoint "\n Rai tu diem dau:")
p2 (getpoint p1 "\n Den diem cuoi:") 
)
(setq b1 (getint (strcat "\n Buoc cua doan bien <" (if gl_b1 (itoa gl_b1) (itoa (setq gl_b1 150))) ">: ")))
(if b1 (setq gl_b1 b1))
(setq b2 (getint (strcat "\n Buoc cua doan giua <" (if gl_b2 (itoa gl_b2) (itoa (setq gl_b2 200))) ">: ")))
(if b2 (setq gl_b2 b2))
(setq dis (distance p1 p2)
ang (angle p1 p2)
li (chia dis gl_b1 gl_b2))
(setvar 'osmode 0)
(command "copy" dt "" p1 (polar p1 ang (setq tong 50))) 
(repeat (/ (car li) gl_b1)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1)))))
(repeat (/ (last li) gl_b2)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b2)))))
(repeat (/ (car li) gl_b1)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1))))) 
(entdel dt)
(setvar 'cmdecho 1) (setvar 'osmode os) (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
ptd1987    5

 

Bạn thử cái này xem.

(defun c:rtd(/ ANG B1 B2 DIS DT LI OS P1 P2 TONG)
(defun chan(x n) (* n  (fix (/ x n 1.)) ))
(defun chia (a d1 d2 / D150 D200)
(setq d200 (chan (* 0.5 a) d2)
d150 (chan (* 0.5 (- a d200 100)) d1)
)
(list d150 d200)
)
  (setvar 'cmdecho 0) 
(setq os (getvar 'osmode )
dt (car (entsel "\n Chon line de rai:"))
p1 (getpoint "\n Rai tu diem dau:")
p2 (getpoint p1 "\n Den diem cuoi:") 
)
(setq b1 (getint (strcat "\n Buoc cua doan bien <" (if gl_b1 (itoa gl_b1) (itoa (setq gl_b1 150))) ">: ")))
(if b1 (setq gl_b1 b1))
(setq b2 (getint (strcat "\n Buoc cua doan giua <" (if gl_b2 (itoa gl_b2) (itoa (setq gl_b2 200))) ">: ")))
(if b2 (setq gl_b2 b2))
(setq dis (distance p1 p2)
ang (angle p1 p2)
li (chia dis gl_b1 gl_b2))
(setvar 'osmode 0)
(command "copy" dt "" p1 (polar p1 ang (setq tong 50))) 
(repeat (/ (car li) gl_b1)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1)))))
(repeat (/ (last li) gl_b2)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b2)))))
(repeat (/ (car li) gl_b1)
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1))))) 
(entdel dt)
(setvar 'cmdecho 1) (setvar 'osmode os) (princ)
)

em đã thử lisp bác mới fix, dầm 3m 4m 5m ko sao nhưng 6m 6.5m lại bị khoảng cách cuối cùng là 250 ko rải thêm 1 đai cuối nữa, như hình e đính kèm112169_screenhunter_001.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
Tot77    501

Cái này chắc OK.

 

(defun c:rtd (/ ANG B1 B2 DIS DIS1 DT LI OS P1 P2 TONG)
(defun chan(x n) (* n  (fix (/ x n 1.)) ))
(defun chia (a d1 d2 / D150 D200)
(setq d200 (chan (* 0.5 a) d2)
d150 (chan (* 0.5 (- a d200 100)) d1)
)
(list d150 d200)
)
  (setvar 'cmdecho 0) 
(setq os (getvar 'osmode )
dt (car (entsel "\n Chon line de rai:"))
p1 (getpoint "\n Rai tu diem dau:")
p2 (getpoint p1 "\n Den diem cuoi:") 
)
(setq b1 (getint (strcat "\n Buoc cua doan bien <" (if gl_b1 (itoa gl_b1) (itoa (setq gl_b1 150))) ">: ")))
(if b1 (setq gl_b1 b1))
(setq b2 (getint (strcat "\n Buoc cua doan giua <" (if gl_b2 (itoa gl_b2) (itoa (setq gl_b2 200))) ">: ")))
(if b2 (setq gl_b2 b2))
(setq dis (distance p1 p2)
ang (angle p1 p2)
li (chia dis gl_b1 gl_b2))
(setvar 'osmode 0)
(command "undo" "be")
 
(command "copy" dt "" p1 (polar p1 ang (setq tong 50))) 
(repeat (fix (/ (car li) gl_b1))
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1)))))
(repeat (fix (/ (last li) gl_b2))
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b2)))))
(setq dis1 (/ (distance (polar p1 ang tong) p2) gl_b1))
(if (= dis1 (fix dis1))
(setq dis1 (1- (fix dis1)))
(setq dis1 (fix dis1))) 
(repeat dis1
(command "copy" dt "" p1 (polar p1 ang (setq tong (+ tong gl_b1))))) 
(entdel dt)
(command "undo" "e")
(setvar 'cmdecho 1) (setvar 'osmode os) (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
tamkt    1

thanks bác, lisp rải ok rồi ^^

Pác ơi, sao Em dung AutoCAD 2015 nó không chịu vẽ. 

Lỗi:

Command: rtd

 Chon line de rai:

 Rai tu diem dau:

 Den diem cuoi:

 Buoc cua doan bien <150>: 150

 Buoc cua doan giua <200>: 200

; error: bad argument type: numberp: nil

Command:

Command: Specify opposite corner or [Fence/WPolygon/CPolygon]:

Command: Specify opposite corner or [Fence/WPolygon/CPolygon]:

Command: *Cancel*

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  

×