Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
18 replies to this topic

#1 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 01 October 2009 - 10:30 PM

Ý 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))
  • 0
Hoàng Giang

#2 tivanteo

tivanteo

    biết vẽ circle

  • Members
  • PipPip
  • 36 Bài viết
Điểm đánh giá: 17 (tàm tạm)

Đã gửi 01 October 2009 - 11:07 PM

(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 "")
)
  • 0

#3 tivanteo

tivanteo

    biết vẽ circle

  • Members
  • PipPip
  • 36 Bài viết
Điểm đánh giá: 17 (tàm tạm)

Đã gửi 02 October 2009 - 12:45 AM

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ư
  • 0

#4 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 02 October 2009 - 02:25 AM

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
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#5 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 02 October 2009 - 05:52 AM

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)
  • 1
Hoàng Giang

#6 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 02 October 2009 - 09:01 AM

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.c...&...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...
  • 0

#7 neweng

neweng

    biết pan

  • Members
  • Pip
  • 8 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 05 October 2009 - 11:32 AM

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.
  • 0

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 05 October 2009 - 02:36 PM

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é.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 chien_lv

chien_lv

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 24 July 2016 - 08:14 AM

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


  • 0

#10 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 24 July 2016 - 12:51 PM

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


  • 1

#11 chien_lv

chien_lv

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 24 July 2016 - 01:14 PM

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


  • 0

#12 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 24 July 2016 - 02:14 PM

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


  • 0

#13 chien_lv

chien_lv

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 24 July 2016 - 06:45 PM

Đ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


  • 0

#14 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 24 July 2016 - 07:44 PM

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

  • 0

#15 chien_lv

chien_lv

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 25 July 2016 - 01:01 AM

Đố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. 


  • 0

#16 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 25 July 2016 - 02:36 AM

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


  • 0

#17 chien_lv

chien_lv

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 25 July 2016 - 08:00 AM

- 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


  • 0

#18 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 25 July 2016 - 05:32 PM

+ 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.c.../141736_rtc.rar


  • 1

#19 chien_lv

chien_lv

    biết vẽ rectang

  • Members
  • PipPip
  • 89 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 26 July 2016 - 07:45 AM

+ 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.c.../141736_rtc.rar

Mình cảm ơn nhé


  • 0