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

Tập sửa lisp rải thép

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

Ý tưởng chung của Lisp này là để phục vụ cho vịêc rải thép, khoảng cách rải thép người dùng nhập vào chỉ mang tính chất tương đối,

Command : CPA

Select object : " Chọn đối tượng "

Fist point : " Chọn điểm đầu rải thép " A

Second point : " Chọn điểm cuối" B

khoang cach rai : " Nhap khoang cach giua cot thep:" m

 

Mục đích của người viết lisp là tìm ra thuật toán làm sao đó để copy đối tượng được chọn từ điểm A chia đều nhau đến điểm B sao cho khoảng cách giữa 2 đối tượng là giá trị gần giá trị "m" ta nhập vào nhất .

Thuật toán của em ở đây là Phần thập phân của AB/m < 0.5 thì rải với khoảng cách là AB / ( phần nguyên của AB/m )

NẾu Phần thập phân của AB/m > 0.5 thì rải với khoảng cách là AB / ( phần nguyên của AB/(m+1) )

Nhưng hiện tại lisp đang bị lỗi ở đâu đó em chưa tìm ra để sửa được. Mong các bậc đàn anh đi trước am hiểu Lisp sửa giúp em để chương trình chạy được theo ý tác giả.

em xin chân thành cảm ơn !

 

 

 

 

 

CODE

;============== dai thep=======

(defun cpa (/ ss1 p1 p2 a d di n cmdo)

(setq cmdo (getvar "cmdecho"))

(setvar "cmdecho" 0)

 

(princ "\nCopy array:")

(setq ss1 (ssget))

(setq p1 (getpoint "\nFirst point: "))

(setq p2 (getpoint "\nSecond point: "))

 

(setq a (* (/ 180 pi) (angle p1 p2)))

(command "_.ucs" "z" a)

(setq di (distance p1 p2))

(setq d (getreal "\nkhoang cach rai: "))

(setq n (/ di d))

(if (< (- n (setq n1 (fix n))) 0.5)

(setq n n1)

(setq n (1+ n1))

(setq n (1- n1)))

(command "_.array" ss1 "" "r" 1 (1+n) (/ di n))

(command "_.ucs" "")

(setvar "cmdecho" cmdo)

(princ)

)

(defun c:cpp() (cpa))

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

(defun c:cpp ()

(setq p1 (getpoint "\nNhap diem dau:")

p2 (getpoint "\nNhap diem cuoi:")

d (distance p1 p2)

 

)

(setq m (getreal "\nNhap khoang cach giua cac rai thep:")

)

 

(setq so (fix (/ d m)))

(setq ss (ssget))

(command "copy" ss "" p1 p2 "")

(command "array" ss "" "r" "" so m "")

)

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

chương trình đơn gian nhất tôi viết bạn tham khảo khoảng cách giữa 2 rải thép cuôí cùng sẽ là phần 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
chương trình đơn gian nhất tôi viết bạn tham khảo khoảng cách giữa 2 rải thép cuôí cùng sẽ là phần dư

tivanteo chưa hiểu ý của hg rồi. ý bạn ấy như sau: khoảng cách giữa P1 và P2 là cố đinh. giờ ta phải chia khoảng cách P1 và P2 thành những đoạn thẳng bằng nhau sao cho gía trị khoảng cách đó càng gần một giá trị m nhập vào càng tốt.

@hg: Thuật toán của bạn sai ở chỗ mình tô đậm như sau

Nếu Phần thập phân của AB/m < 0.5 thì rải với khoảng cách là AB / ( phần nguyên của AB/m )

NẾu Phần thập phân của AB/m > 0.5 thì rải với khoảng cách là AB / ( phần nguyên của AB/(m+1) )

Đây là thuật toán bạn cần.

KCách P1 P2 = A

kcách giữa các cốt thép nhập vào là B

Gọi C là phần dư của A/B,

D là phần nguyên của A/B

Nếu C =< B/2 => khoảng cách cốt thép cần vẽ = A/D

Nếu C > B/2 => khoảng cách cốt thép cần vẽ = A/(D+1)

Gợi ý bạn có thể sử dụng hàm Rem để lấy giá trị phần dư của một fép chia. VD: (setq C (rem A B ))

 

Bạn chú ý: mọi người đã ý kiến với bạn về cách dùng từ trên tiêu đề topic (tại đây). nhưng hình như bạn không fải là người biết lắng nghe người khác thì fải. đây cũng không fải lần đầu mình có suy nghĩ như thế này về 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
tivanteo chưa hiểu ý của hg rồi. ý bạn ấy như sau: khoảng cách giữa P1 và P2 là cố đinh. giờ ta phải chia khoảng cách P1 và P2 thành những đoạn thẳng bằng nhau sao cho gía trị khoảng cách đó càng gần một giá trị m nhập vào càng tốt.

@hg: Thuật toán của bạn sai ở chỗ mình tô đậm như sau

 

Đây là thuật toán bạn cần.

 

Gợi ý bạn có thể sử dụng hàm Rem để lấy giá trị phần dư của một fép chia. VD: (setq C (rem A B ))

 

Bạn chú ý: mọi người đã ý kiến với bạn về cách dùng từ trên tiêu đề topic (tại đây). nhưng hình như bạn không fải là người biết lắng nghe người khác thì fải. đây cũng không fải lần đầu mình có suy nghĩ như thế này về bạn

Cảm ơn thuật toán và lời góp ý của bạn Thái, mình đã sửa lại ok rùi !!!!

============CODE=========

(DEFUN C:AS (/ CMD SLT SPT EPT PT1 NET DST DST1 BDT GC OSM DEM)

(SETQ CMD (GETVAR "CMDECHO"))

(SETQ OSM (GETVAR "OSMODE"))

(SETVAR "CMDECHO" 0)

(PROMPT "\nArray object!")

(SETQ SLT (SSGET))

(initget 7)

(SETQ NET (GETINT "\na="))

(PROMPT "\nStart point:")

(SETQ SPT (GETPOINT))

(PROMPT "\nEnd point:")

(SETQ EPT (GETPOINT SPT))

(SETVAR "OSMODE" 0)

(SETQ GC (ANGLE SPT EPT))

 

 

 

 

 

(SETQ DST (DISTANCE SPT EPT))

(SETQ NET1 (/ dst net))

 

(SETQ NET2 (+ net1 0.5))

(SETQ NET3 (fix net2))

 

 

 

 

(SETQ DST1 (/ DST NET3 ))

(SETQ DEM 1)

(WHILE (< DEM NET3 )

(SETQ BDT (* DEM DST1))

(SETQ PT1 (POLAR SPT GC BDT))

(COMMAND "COPY" SLT "" SPT PT1)

(SETQ DEM (+ DEM 1))

)

(SETVAR "CMDECHO" CMD)

(SETVAR "OSMODE" OSM))

(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 thuật toán và lời góp ý của bạn Thái, mình đã sửa lại ok rùi !!!!

============CODE=========

(DEFUN C:AS (/ CMD SLT SPT EPT PT1 NET DST DST1 BDT GC OSM DEM)

...

)

Chào hhhhgggg, bạn tham khảo lisp rải thép trên các loại đường curve, Thiep đã viết ở đây:

http://www.cadviet.com/forum/index.php?s=&...ost&p=69981

Góp ý hhhhgggg, bạn không nên mở nhiều topic quá, mà nên trao đổi với nhau tại các topic như Viết lisp theo yêu cầu, hỏi về lisp...

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 thuật toán và lời góp ý của bạn Thái, mình đã sửa lại ok rùi !!!!

============CODE=========

(DEFUN C:AS (/ CMD SLT SPT EPT PT1 NET DST DST1 BDT GC OSM DEM)

(SETQ CMD (GETVAR "CMDECHO"))

(SETQ OSM (GETVAR "OSMODE"))

(SETVAR "CMDECHO" 0)

(PROMPT "\nArray object!")

(SETQ SLT (SSGET))

(initget 7)

(SETQ NET (GETINT "\na="))

(PROMPT "\nStart point:")

(SETQ SPT (GETPOINT))

(PROMPT "\nEnd point:")

(SETQ EPT (GETPOINT SPT))

(SETVAR "OSMODE" 0)

(SETQ GC (ANGLE SPT EPT))

 

(SETQ DST (DISTANCE SPT EPT))

(SETQ NET1 (/ dst net))

 

(SETQ NET2 (+ net1 0.5))

(SETQ NET3 (fix net2))

(SETQ DST1 (/ DST NET3 ))

(SETQ DEM 1)

(WHILE (< DEM NET3 )

(SETQ BDT (* DEM DST1))

(SETQ PT1 (POLAR SPT GC BDT))

(COMMAND "COPY" SLT "" SPT PT1)

(SETQ DEM (+ DEM 1))

)

(SETVAR "CMDECHO" CMD)

(SETVAR "OSMODE" OSM))

(PRINC)

 

Cảm ơn rất nhiều về lisp của bạn, nó thật sự rất hữu ích, tuy nhiên mình không thể đánh được các khoảng cách bằng các số thập phân (VD: 1.5 , 3.7 ....) nếu thực hiện được thì lisp này ...tuyệt vờ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
Cảm ơn rất nhiều về lisp của bạn, nó thật sự rất hữu ích, tuy nhiên mình không thể đánh được các khoảng cách bằng các số thập phân (VD: 1.5 , 3.7 ....) nếu thực hiện được thì lisp này ...tuyệt vời.

Chào bạn Neweng,

Cái bạn hhhhgggg viết chỉ cho phép nhập dữ liệu khoảng cách là số nguyên do hàm (SETQ NET (GETINT "\na=")), nếu bạn muốn nhập dữ liệu là các số thập phân thì bạn hãy thay hàm này thành (SETQ NET (GETreal "\na=")).

Bạn hãy thử xem nhé.

  • 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 thuật toán và lời góp ý của bạn Thái, mình đã sửa lại ok rùi !!!!

============CODE=========

(DEFUN C:AS (/ CMD SLT SPT EPT PT1 NET DST DST1 BDT GC OSM DEM)

(SETQ CMD (GETVAR "CMDECHO"))

(SETQ OSM (GETVAR "OSMODE"))

(SETVAR "CMDECHO" 0)

(PROMPT "\nArray object!")

(SETQ SLT (SSGET))

(initget 7)

(SETQ NET (GETINT "\na="))

(PROMPT "\nStart point:")

(SETQ SPT (GETPOINT))

(PROMPT "\nEnd point:")

(SETQ EPT (GETPOINT SPT))

(SETVAR "OSMODE" 0)

(SETQ GC (ANGLE SPT EPT))

 

 

 

 

 

(SETQ DST (DISTANCE SPT EPT))

(SETQ NET1 (/ dst net))

 

(SETQ NET2 (+ net1 0.5))

(SETQ NET3 (fix net2))

 

 

 

 

(SETQ DST1 (/ DST NET3 ))

(SETQ DEM 1)

(WHILE (< DEM NET3 )

(SETQ BDT (* DEM DST1))

(SETQ PT1 (POLAR SPT GC BDT))

(COMMAND "COPY" SLT "" SPT PT1)

(SETQ DEM (+ DEM 1))

)

(SETVAR "CMDECHO" CMD)

(SETVAR "OSMODE" OSM))

(PRINC)

 

bạn có thể bổ sung giúp mình một yêu cầu nhỏ không vì nó cần với công việc của mình. trong lisp của bạn sau khi chọn đối tượng và nhập các yêu cầu của lisp thì lúc rải đối tượng vị trí cuối cùng của đường dẫn sẽ có thêm đối tượng, và khoảng cách của đối tượng cách đều nhau mình gửi kèm ảnh minh họa bạn xem giúp mình với 119043_untitled_1.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

Thử thay (WHILE (< DEM NET3 ) => (WHILE (< DEM (1+ NET3)) xem sao!

bạn có thể chỉnh giúp mình để đối tượng nằm trọn trong một đường dẫn không? mình gửi kèm ảnh. thanks119043_untitled_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

Điều đó phụ thuộc vào bán kính của thằng chấm tròn kia...​

mình thì thường dùng để rải các thanh thép với các đường kính nhập theo tỷ lệ bản vẽ, nên nó không cố định một giá trị nào cả. hi, tạm hài lòng với lisp này và thêm một bước thủ công là move nó vào đúng vị trí mong muốn. thanks you

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

Đối tượng chấm tròn bạn dùng là loại đối tượng nào? Block, Donut ...?

Lisp này giải quyết vấn đề trên.

Với điều kiện:

1.  Đối tượng chấm tròn là Block.

2. Block chọn để rải có điểm chèn lùi vào 1 khoảng = bán kính hình tròn theo hướng rải.

(defun c:tt (/ bdt bro dem dia dst ent ept goc len lst obj p10 pmax pmin pt1 slg spt)

(vl-load-com)

(or #kc_rai_tt# (setq #kc_rai_tt# 150))

(if (and (setq ent (car (entsel "\nPick chon Block: ")))

(eq (cdr (assoc 0 (entget ent))) "INSERT")

(setq spt (getpoint "\nStart point:"))

(setq ept (getpoint "\nEnd point:" spt))

(not (initget 6))

(setq #kc_rai_tt# (cond ((getdist (strcat "\nKhoang cach a <" (itoa #kc_rai_tt#) ">: ")))

(#kc_rai_tt#))))

(progn (setq lst (vl-remove-if '(lambda (x) (member (car x) '(-1 5 10 330))) (entget ent))

p10 (cdr (assoc 10 (entget ent))))

(setq obj (vlax-ename->vla-object ent))

(or (eq (setq bro (vlax-get obj 'Rotation)) 0) (vlax-put obj 'Rotation 0))

(vla-getboundingbox obj 'pmin 'pmax)

(and (not (eq bro 0)) (vlax-put obj 'Rotation bro))

(setq pmin (vlax-safearray->list pmin)

pmax (vlax-safearray->list pmax)

dia (abs (- (car pmin) (car pmax))))

(setq goc (angle spt ept)

dst (- (distance spt ept) dia)

slg (fix (+ (/ dst #kc_rai_tt#) 0.5))

len (/ dst slg)

dem 0)

(while (< dem slg)

(setq bdt (* (setq dem (1+ dem)) len)

pt1 (polar p10 goc bdt))

(entmakex (append lst (list (cons 10 pt1)))))))

(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

Đối tượng chấm tròn bạn dùng là loại đối tượng nào? Block, Donut ...?

Lisp này giải quyết vấn đề trên.

Với điều kiện:

1.  Đối tượng chấm tròn là Block.

2. Block chọn để rải có điểm chèn lùi vào 1 khoảng = bán kính hình tròn theo hướng rải.

(defun c:tt (/ bdt bro dem dia dst ent ept goc len lst obj p10 pmax pmin pt1 slg spt)

(vl-load-com)

(or #kc_rai_tt# (setq #kc_rai_tt# 150))

(if (and (setq ent (car (entsel "\nPick chon Block: ")))

(eq (cdr (assoc 0 (entget ent))) "INSERT")

(setq spt (getpoint "\nStart point:"))

(setq ept (getpoint "\nEnd point:" spt))

(not (initget 6))

(setq #kc_rai_tt# (cond ((getdist (strcat "\nKhoang cach a <" (itoa #kc_rai_tt#) ">: ")))

(#kc_rai_tt#))))

(progn (setq lst (vl-remove-if '(lambda (x) (member (car x) '(-1 5 10 330))) (entget ent))

p10 (cdr (assoc 10 (entget ent))))

(setq obj (vlax-ename->vla-object ent))

(or (eq (setq bro (vlax-get obj 'Rotation)) 0) (vlax-put obj 'Rotation 0))

(vla-getboundingbox obj 'pmin 'pmax)

(and (not (eq bro 0)) (vlax-put obj 'Rotation bro))

(setq pmin (vlax-safearray->list pmin)

pmax (vlax-safearray->list pmax)

dia (abs (- (car pmin) (car pmax))))

(setq goc (angle spt ept)

dst (- (distance spt ept) dia)

slg (fix (+ (/ dst #kc_rai_tt#) 0.5))

len (/ dst slg)

dem 0)

(while (< dem slg)

(setq bdt (* (setq dem (1+ dem)) len)

pt1 (polar p10 goc bdt))

(entmakex (append lst (list (cons 10 pt1)))))))

(princ))

 

 

 

Đối tượng mình dùng là Donut bạn ah? mình chạy lisp của bạn thì thấy như sau: load lần đầu tiên thì chạy được, lần thứ 2 thì không chạy được, mình phải mở bản vẽ mới ra và load lại thì ok tuy nhiên nó mặc định khoảng cách a sau lần chạy đầu tiên mình nghĩ cái này không nên để mặc định như thế. bạn có thể giúp mình chỉnh với đối tượng là donut không và mỗi lần chạy đề hỏi khoảng cách a=? sau khi mình chọn hai điểm đầu và cuố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

- Lần 2 không chạy được => Thay cái này: (itoa #kc_rai_tt#) bởi (rtos #kc_rai_tt# 2 0)

- Khoảng cách a sao lại mặc định? Sao lại không nên? Nó là ghi nhớ, gợi ý, nếu lần sau đồng ý với giá trị đó thì chỉ cần Enter, không đồng ý thì nhập giá trị mới (Đó là ưu, đâu phải nhược. Ý bạn muốn cải lùi sao?).

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

- Lần 2 không chạy được => Thay cái này: (itoa #kc_rai_tt#) bởi (rtos #kc_rai_tt# 2 0)

- Khoảng cách a sao lại mặc định? Sao lại không nên? Nó là ghi nhớ, gợi ý, nếu lần sau đồng ý với giá trị đó thì chỉ cần Enter, không đồng ý thì nhập giá trị mới (Đó là ưu, đâu phải nhược. Ý bạn muốn cải lùi sao?).

Sau khi thay lại vào thì ok rồi bạn. Bạn cho mình hỏi nếu đối tượng là Donut thì cần bổ sung thêm cái gì để nó chạy đượ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

+ Lisp dưới đây, 1 lệnh dùng chung cho cả Block và Donut.

+ Đối tượng gốc chọn để rải có thể nằm bất kỳ ở đâu (Không cần nằm cạnh đường dẫn).

+ Rải xong có tùy chọn xóa hay không đối tượng gốc .

+ Lệnh: RTC.

http://www.cadviet.com/upfiles/6/141736_rtc.rar

  • 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

+ Lisp dưới đây, 1 lệnh dùng chung cho cả Block và Donut.

+ Đối tượng gốc chọn để rải có thể nằm bất kỳ ở đâu (Không cần nằm cạnh đường dẫn).

+ Rải xong có tùy chọn xóa hay không đối tượng gốc .

+ Lệnh: RTC.

http://www.cadviet.com/upfiles/6/141736_rtc.rar

Mình cảm ơn 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

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  

×