Chuyển đến nội dung
Diễn đàn CADViet
Đă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ị

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

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

-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

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

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

-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

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

 

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

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

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
Vào lúc 27/3/2015 tại 08:29, Tot77 đã nói:

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

Thấy vẫn chưa ổn bác ak 
1/4 hai ffaauf dầm không giống nhau. đầu dầm bên trái thì okk, nhưng đầu dầm bên phải cần m ra 1 đoạn 50 mm nữa
theo e nghĩ k biết được k ? bác thử rải trên 1 nửa dầm và lấy đối xứng
image.thumb.png.b7e586234ffa5ccf1d199ac06a696a1d.png

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  

×