Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
zutum

(NHỜ VIẾT LISP)

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

Hi các bạn,

Mình hay vẽ và chia khe các mặt bàn nên mình muốn nhờ các bạn giúp mình viết 1 lisp về việc chia khe nan.

Ví dụ như ( hình 1) mình có 1 đoạn thẳng và 1 nan bàn. Mình muốn thực hiện lệnh như sau:

Bấm tên lệnh chọn đối tượng ( là nan bàn ) sau đó chọn đoạn thẳng. Sau đó chọn (1) hoặc (-1) [ chọn 1 khi số khe bằng số nan+1 chọn -1 khi số khe bằng số nan -1 ] .

Tiếp nhập số nan thì lisp tự chia số nan và khe.trên đoạn thằng mà mình đã chọn ( hình 2 ).

thanks các bạn nhiều.

 

 

image.png

image.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

Cái này na ná như lệnh ARRAY. Bạn có thể nói rõ hơn không?  ý dưới đây của bạn không???

"Bấm tên lệnh chọn đối tượng ( là nan bàn ) sau đó chọn đoạn thẳng. Sau đó chọn (1) hoặc (-1) [ chọn 1 khi số khe bằng số nan+1 chọn -1 khi số khe bằng số nan -1 ] .

Tiếp nhập số nan thì lisp tự chia số nan và khe.trên đoạn thằng mà mình đã chọn ( hình 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 Tuệ đã xem vấn đề này.

Cái này đúng là hồi giờ mình dùng lệnh Array. Nhưng trước khi dùng lệnh array mình phải tính đc khe nan đó khoảng cách là bao nhiêu thì mới array được. Nên mình muốn nhờ bạn viết lisp để nó có thể tự động tính toán rồi tự ARRay luôn.

+ Bấm tên lệnh chọn đối tượng ( là nan bàn ) sau đó chọn đoạn thẳng. bấm tên lệnh ( bạn đặt gì cũng được ) -> sau đó chọn đối tượng ( nan bàn hình chữ nhật hay bạn để hình khép kín cũng được ) -> chọn đoạn thẳng ( vì mình nghĩ đoạn thẳng dễ tính toán chia khoảng cách còn nếu chia khoảng cách trên hình chữ nhật đc thì quá tốt )

+ Sau đó chọn (1) hoặc (-1) [ chọn 1 khi số khe bằng số nan+1 chọn -1 khi số khe bằng số nan -1 ] . Mình muốn có 2 chế độ chon 1 và -1 ( vì có khi số khe = số nan +1 và ngược lại số khe = số nan -1 .Bạn xem hình đính kèm

+ Tiếp nhập số nan thì lisp tự chia số nan và khe.trên đoạn thằng mà mình đã chọn. Nhấp số lượng nan mình muốn trên đoạn thẳng đó 6 7 8 9 ... nan gì đó. Lisp tự thực hiện.

 

 

 

 

image.thumb.png.7b15d7880fa0a6fcb98e59a3eb3448ed.png

 

image.thumb.png.0c1cf6e05518c023a350101523d9983e.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

Cái nào cũng phải có khoảng cách mới array. Chứ không có khoảng cách thì array thế nào được

Quick code cho bạn (khoảng cách nhập = khoảng cachs nan + khe


(defun c:nb()
  (setq ss (ssget))
  (setq kc (getreal "\khoang cach nan + khe : "))
  (setq nan (getint "\n Nhap so nan :"))
  (command "._Array" ss "" "R" "C" nan "1" "S" kc "")
)

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

 

@Tue_NV:  thanks Tuệ. Hình như bạn chưa hiểu ý mình. Ý mình muốn bạn giúp 1 lisp có thể tự động tính luôn khoảng cách. Nói đơn giản mình có 1 hình chữ nhất bất kì và 1 đoạn thẳng. Mình muốn khi bấm lisp chọn hình chữ nhật, chọn đoạn thẳng ( pick điểm đầu diểm cuối đoạn thẳng cũng được ) . Nhập số nan lisp tự động chia cách khe và nan trên đường thẳng đó.

@cuongtk2:  thanks bạn đã giúp. Lisp bạn phần khe mình nghĩ vậy cũng ok. nhưng mình muốn chọn hình chữ nhật sau đó chọn đường thẳng lisp tự chia như vậy được không bạ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

Bạn cứ array path. Ở property của array có nhập số obj vằ có chọn tự chia mà.

Bạn có thể tạo 1 line làm path. Khi chỉnh line đó thì array thay đổi theo.

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

 

@Tue_NV:  thanks Tuệ. Hình như bạn chưa hiểu ý mình. Ý mình muốn bạn giúp 1 lisp có thể tự động tính luôn khoảng cách. Nói đơn giản mình có 1 hình chữ nhất bất kì và 1 đoạn thẳng. Mình muốn khi bấm lisp chọn hình chữ nhật, chọn đoạn thẳng ( pick điểm đầu diểm cuối đoạn thẳng cũng được ) . Nhập số nan lisp tự động chia cách khe và nan trên đường thẳng đó.

 

Như vậy là khi nhập số nan lấy chiều dài đoạn thẳng đó đi tính toán. Vậy thì khi chia tách là bề rộng nan thay đổi hay giữ nguyên, bề rộng khe thay đổi hay giữ nguyên??? 

1 đoạn thẳng chia làm bề rộng nan và bề rộng khe và lại phụ thuộc vào số nan nữa? Thietj khó hiểu quá

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

Như vậy là khi nhập số nan lấy chiều dài đoạn thẳng đó đi tính toán. Vậy thì khi chia tách là bề rộng nan thay đổi hay giữ nguyên, bề rộng khe thay đổi hay giữ nguyên??? 

1 đoạn thẳng chia làm bề rộng nan và bề rộng khe và lại phụ thuộc vào số nan nữa? Thietj khó hiểu quá

Ý bạn đó như thế này. Mình ko có trên máy tính nên ko viết.

1. Chọn nan là 1 rectang. Giả sử có cạnh ngắn là h.

2. Chọn Path là 1 line chiều dài l

3. Nhập số nan n

4. Chọn option a/b

  a.Khe bằng nan - 1: array nan khoảng cách (l - h)/n

  b.Khe bằng nan +1: array nan khoảng cách (l + h)/(n + 2)

5. Align array vào giữa line.

 

Tuy nhiên mình dùng array thì cứ array path bình thường nhưng chọn divide. Path là line nhưng kéo đỉnh nhỏ hơn line 1 đoạn h cho trường hợp a. Còn trường hợp b thì chia n+2 và path dài hơn h ( có thể ex nó rồi xoá bớt hay vẽ path khác rồi chỉnh lại array.

 

     

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

như bình thường mình vẽ. ví dụ như trong hình 1 mình có đoạn thẳng 545 và nan rộng 50. Mình phải dùng máy tính tính khoảng cách khe ở bên ngoài trước, như trong hình 1 mình có 10 nan thì mình tính khe là 5mm ( (545-(50x10)/9=5 )  sau đó vẽ nan rồi array ra. (ĐÂY LÀ TRƯỜNG HỢP 10 NAN NHƯNG 9 KHE NHƯ NÓI Ở TRÊN )

với hình 2 thì mình tính khe được 4.09 ( (545-(50x10)/11=4.09 ) sau đó vẽ nan move vào đoạn thẳng cách 1 đoạn 4.09 rồi array. (ĐÂY LÀ TRƯỜNG HỢP 10 NAN NHƯNG 11 KHE NHƯ NÓI Ở TRÊN )

ý của mình là muốn lisp chỉ cần chọn nan ( rộng 50 ) --> sau chọn đoạn thẳng (545)  --> nhập số nan ( ví dụ 10 nan ) -->lisp tự chạy ra 10 nan rộng 50 trên đoạn thẳng 545 hồi nãy chọn với khe 5mm . 

image.thumb.png.e255ba8a5eac59584b2c17af2fbcad49.png

image.thumb.png.2fa2cf870253c13222c926e2128beb59.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

@ngokiet thanks bạn. cái chỗ số 4 của bạn mình nghĩ nên là ( (L - (hxn))/n ) và ( (L - (hxn))/n+1 ) chứ bạn.

Còn cái array path mình cũng không biết chỗ nào nhập số đối tượng mà nó tự ra không cần tính khe vì mình toàn phải tính ra khe bao nhiêu rồi mới ARRay

ví dụ như hình ( ở phần item  nhập 10 )  thì phần item spacing phải nhập khoảng cách 55 ( cái này phải tính ở ngoài, nhập thì nó mới chính xác được ). Hay có chỗ nào khác bạn có thể hướng dẫn giúp mình được khô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

Bạn dùng thử lisp NB

Command: NB

Pick hinh chu nhat (pick vao canh) : -> Pick vào cạnh chữ nhật (chính là cạnh nan cần chia)
Pick doan thang :

Kieu chia: [+1 -1] :+1

 Nhap so nan :10


(defun c:nb()
  (setq e1 (entsel "\nPick hinh chu nhat (pick vao canh) :"))
  (setq e2 (car (entsel "\nPick doan thang :")))
  (initget "+1 -1")
  (setq kieuchia (getkword "Kieu chia: [+1 -1] :"))
  (setq nan (getint "\n Nhap so nan :"))
  (setq p1 (vlax-curve-getStartPoint e2)) (setq p2 (vlax-curve-getEndPoint e2))
  (setq d2 (distance p1 p2)) 
  (setq ptg (cadr e1)) (setq e (car e1))
  (setq p11 (vlax-curve-getPointAtParam e (fix (vlax-curve-getParamAtPoint e (vlax-curve-getClosestPointto e ptg)))))
  (setq p12 (vlax-curve-getPointAtParam e (1+ (fix (vlax-curve-getParamAtPoint e (vlax-curve-getClosestPointto e ptg))))))
  (setq d1 (distance p11 p12))   (if (< (cadr p11) (cadr p12)) (setq pb p11) (setq pb p12))
  (if (= kieuchia "+1") (setq khe (/ (- d2 (* nan d1)) (1- nan))) (setq khe (/ (- d2 (* nan d1)) (1+ nan))))
      (if (= kieuchia "-1") (setq p1 (polar p1 (angle p1 p2) khe)))
    (Repeat nan
      (command "._copy" e "" "_non" pb "_non" p1)
     (setq p1 (polar p1 (angle p1 p2) (+ d1 khe)))
    )
)

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 thì chia lan can cũng tương tự như bạn. Chỉ dùng lệnh ray mà còn việc chia kệ nó . chỉ có điều phải chọn điểm đặt kể co kéo ( + hoặc trừ một lan thôi mà)

Drawing1.dwg

SharedScreenshot.jpg

1.jpg

2.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ăn bản là lệnh array rườm rà với tính toán khoảng cach không thể nhanh hơn lisp đượ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

thanks các bạn rất nhiều vì đã giúp đỡ mình.

Cái lisp của Tuệ rất đúng ý mình nhưng nó có 1 vần đề nhỏ là khi dùng lisp nó không tự chia trên đoạn thẳng luôn mà cách 1 đoạn trên đoạn thẳng đó cả 2 trường hợp (+1 và -1 ) như hình 1 đó bạn. Nên cái này phải dùng lệnh move và move xuống lần nữa.

. Bạn có thể giúp mình thêm 1 cái nữa cho nó sắp xếp trên đường đó luôn đc không. Như hình 2 vậy đó bạn.

image.thumb.png.7cf8176d66bee20c7a4013b5b9e7d4da.png

image.thumb.png.f1df591bc9d036f2481394eaab1882c7.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

@vobanho, @ngokiet thanks 2 bạn về vấn đề ARRAY. Như bạn thấy mình dùng bản 2018 nhưng vẫn giao diện về 2007 cho quen và dễ dùng. Đây là vấn đề hình như đa phần người dùng từ 2007 đi lên không quen với giao diện mới. Mình biết cái mới có nhiều cái hay, nhưng do thói quen nên phải dùng cái giao diện này mặc dù mình chẳng bao giờ dùng chuột để chỉ lệnh mà toàn dùng phím. Nên cái giao diện khi ARRAY nó không ra như cái của 2 bạn đc. Nên cũng hơi khó với mình.

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ùng 1 cạnh vẽ từ dưới lên sẽ có start point nằm dưới và ngược lại nếu vẽ từ trên xuống.  

Đó là lý do hình chữ nhật bị move nhé bạ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

@zutum: Lisp chạy ra đúng y hình 2 mà. Bạn test lại thử 
dữ liệu là 1 đoạn thẳng và 1 hình chữ nhật. Bạn chú ý khi pick trên hình chữ nhật là pick trên cạnh của hình chữ nhật (cần chia trên đoạn thẳng đó)

@cuongtk2 : đâu có. Lisp nhận các RECTANG cho dù là vẽ trên xuống hay vẽ dưới 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

@Tue_NV đã thử lại và vẫn bị lỗi. Bạn xem hình mình làm các bước từ 1-3. 1 chọn hình chữ nhật chọn cạnh (mình chọn cạnh bên tô màu đỏ ). 2 chọn đoạn thẳng . Nhập (+1 hay -1)  sau đó nhập số lượng đều ra như hình chỗ số 3 là hình chữ nhật nằm ở đỉnh của đoạn thẳng ( chỗ đỉnh mình làm dấu X màu xanh đó bạn.Nhìn đoạn thẳng màu vàng ở dưới còn 1 đoạn trống đó). Mình dùng cad 2018 không biết nó có bị cái gì không nữa.

@cuongtk2: Vì mình vẽ bàn ghế mà nan bàn thì toàn hình chữ nhật (trừ các nan đặc biệt ra thì đa phần hình chữ nhật và nó chạy thẳng 90 độ với đường thẳng ). Nên vẽ sẵn nan dùng lisp sau đó lên 3d cho nhanh. Còn nếu nan không có hình chữ nhật hay đoạn thẳng không 90 độ thì mình tính khe và dùng ARRay path. Vì mình nhờ viết lisp mà nói đoạn thẳng cho dễ chứ phức tạp quá cũng ngại ^^

 

image.thumb.png.00767209e4ba39d2c2e56fcd127c1f69.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

@tue_nv: bạn phải reset lại p1 p2 để cho nó copy từ dưới lên chứ. Đơn giản bạn vẽ 1 đoạn thẳng nối vào startpoint là thấy vấn đề 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

@zutum:

Lisp sửa lại đây bạn. Nếu đoạn thẳng và hình chữ nhật xiên cùng 1 góc thì Lisp chấp nhận luôn đó nhé


(defun c:nb()
  (setq e1 (entsel "\nPick hinh chu nhat (pick vao canh) :"))
  (setq e2 (car (entsel "\nPick doan thang :")))
  (initget "+1 -1")
  (setq kieuchia (getkword "Kieu chia: [+1 -1] :"))
  (setq nan (getint "\n Nhap so nan :"))
  (setq p1 (vlax-curve-getStartPoint e2)) (setq p2 (vlax-curve-getEndPoint e2))
  (if (> (cadr p1)(cadr p2)) (setq pptg p2 p2 p1 p1 pptg))
  (setq d2 (distance p1 p2)) 
  (setq ptg (cadr e1)) (setq e (car e1))
  (setq p11 (vlax-curve-getPointAtParam e (fix (vlax-curve-getParamAtPoint e (vlax-curve-getClosestPointto e ptg)))))
  (setq p12 (vlax-curve-getPointAtParam e (1+ (fix (vlax-curve-getParamAtPoint e (vlax-curve-getClosestPointto e ptg))))))
  (setq d1 (distance p11 p12))   (if (< (cadr p11) (cadr p12)) (setq pb p11) (setq pb p12))
  (if (= kieuchia "+1") (setq khe (/ (- d2 (* nan d1)) (1- nan))) (setq khe (/ (- d2 (* nan d1)) (1+ nan))))
      (if (= kieuchia "-1") (setq p1 (polar p1 (angle p1 p2) khe)))
    (Repeat nan
      (command "._copy" e "" "_non" pb "_non" p1)
     (setq p1 (polar p1 (angle p1 p2) (+ d1 khe)))
    )
)

  • Like 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 Tuệ. Quá tuyệt vời nó ok rồi đó. Cảm ơn bạn 2 ngày nay đã giúp mình nhé.

Cũng cảm ơn cuongtk2, ngokiet, vobanho nữa 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

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  

×