Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu]Lisp vẽ đoạn thẳng có điều kiện?


  • Please log in to reply
12 replies to this topic

#1 quan08

quan08

    biết vẽ pline

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

Đã gửi 03 September 2012 - 02:42 PM

Nhờ các bác viết gùm đoạn lisp:
Sau khi đánh lệnh TT chẳng hạn,sẽ hiện lên yêu cầu nhập chiều dài đoạn thứ nhất hoặc nếu không nhập ta sẽ pick 2 điểm để chọn khoảng cách giống lệnh offset sẽ vẽ đoạn thẳng có chiều dài bằng giá trị nhập vào hoặc khoảng cách 2 điểm pick chọn.
(nhưng chiều dài này sẽ bằng giá trị đầu vào chia cho 6.Nếu giá trị đầu vào là 3000 thì chiều dài đoạn cần vẽ là 500,nếu khi chia cho 6 mà lẻ sẽ là:
Phần lẻ hàng chục nhỏ hơn 50 sẽ làm tròn 50,lớn hơn 50 sẽ làm tròn 100
Ví dụ 666,666 thì làm tròn 700 nếu1025 sẽ làm tròn 1050.)
Sau khi có đoạn thứ nhất sẽ hỏi có nhập tiếp không,nếu không thì giá trị tiếp theo sẽ bằng đúng giá trị đầu vào mà không chia cho 6 và kết thúc lệnh.Nếu có thì giá trị giống đoạn thứ nhất là chia cho 6.
Ví Dụ cụ thể:
Đánh lệnh TT:
1- nhập giá trị :3000
2-Tiếp tục hay không:K
3-Nhập giá trị tiếp:4000
Kết thúc lệnh ta vẽ được đoạn thẳng =1 + 3 = 3000/6 + 4000 = 4500
Nếu 2- nhấn C:
3-Nhập giá trị tiếp:4000
4-Tiếp tục hay không:K
5-Nhập giá trị tiếp:1000
Kết thúc lệnh ta vẽ được đoạn thẳng =1+ 3 + 5= (3000/6=500) + (4000/6 = 666,66 )+1000 = 500+700+1000=2200
Chân thành cảm ơn sự quan tâm giúp đỡ.
  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 September 2012 - 05:49 PM

Bài toán có vô số nghiệm nếu bạn vẽ đoạn thẳng biết độ dài mà không biết góc
  • 1

#3 quan08

quan08

    biết vẽ pline

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

Đã gửi 03 September 2012 - 06:08 PM

Bài toán có vô số nghiệm nếu bạn vẽ đoạn thẳng biết độ dài mà không biết góc

Cảm ơn bác đã nhắc,vậy sau khi đánh tên lệnh sẽ có dòng hỏi góc nghiêng của đoạn thẳng để ta nhập vào.Thanks
  • 0

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 03 September 2012 - 06:12 PM

Bài toán sẽ tiếp tục có vô số nghiệm nếu biết độ dài và góc nhưng không biết điểm khởi đầu.
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#5 quan08

quan08

    biết vẽ pline

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

Đã gửi 03 September 2012 - 06:16 PM

Bài toán sẽ tiếp tục có vô số nghiệm nếu biết độ dài và góc nhưng không biết điểm khởi đầu.

Có điểm khơi đầu do ta pick điểm chọn bác ah.Pick điểm khởi đầu,tới góc nghiêng,tới chiều dài...
  • 0

#6 quansla

quansla

    biết lệnh xclip

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

Đã gửi 03 September 2012 - 07:05 PM

Có điểm khơi đầu do ta pick điểm chọn bác ah.Pick điểm khởi đầu,tới góc nghiêng,tới chiều dài...

Hix, bạn dùng list này cho cái gì vậy, cảm giác như kiểu gõ xong ngần ấy lệnh thì lâu lắm, không biết cái này áp dụng cho gì vậy bạn lúc thì /6 lúc lại không?
  • 0

#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 September 2012 - 09:33 PM

Nhờ các bác viết gùm đoạn lisp:
Sau khi đánh lệnh TT chẳng hạn,sẽ hiện lên yêu cầu nhập chiều dài đoạn thứ nhất hoặc nếu không nhập ta sẽ pick 2 điểm để chọn khoảng cách giống lệnh offset sẽ vẽ đoạn thẳng có chiều dài bằng giá trị nhập vào hoặc khoảng cách 2 điểm pick chọn.
(nhưng chiều dài này sẽ bằng giá trị đầu vào chia cho 6.Nếu giá trị đầu vào là 3000 thì chiều dài đoạn cần vẽ là 500,nếu khi chia cho 6 mà lẻ sẽ là:
Phần lẻ hàng chục nhỏ hơn 50 sẽ làm tròn 50,lớn hơn 50 sẽ làm tròn 100
Ví dụ 666,666 thì làm tròn 700 nếu1025 sẽ làm tròn 1050.)
Sau khi có đoạn thứ nhất sẽ hỏi có nhập tiếp không,nếu không thì giá trị tiếp theo sẽ bằng đúng giá trị đầu vào mà không chia cho 6 và kết thúc lệnh.Nếu có thì giá trị giống đoạn thứ nhất là chia cho 6.
Ví Dụ cụ thể:
Đánh lệnh TT:
1- nhập giá trị :3000
2-Tiếp tục hay không:K
3-Nhập giá trị tiếp:4000
Kết thúc lệnh ta vẽ được đoạn thẳng =1 + 3 = 3000/6 + 4000 = 4500
Nếu 2- nhấn C:
3-Nhập giá trị tiếp:4000
4-Tiếp tục hay không:K
5-Nhập giá trị tiếp:1000
Kết thúc lệnh ta vẽ được đoạn thẳng =1+ 3 + 5= (3000/6=500) + (4000/6 = 666,66 )+1000 = 500+700+1000=2200
Chân thành cảm ơn sự quan tâm giúp đỡ.

Lisp của bạn đây:

(defun c:TT (/ L ang dd L1 oldos)
(defun Rnd (sc sbc)
(if (/= (rem sc sbc) 0.0) (+ (- sc (rem sc sbc)) sbc) sc)
)
(setq oldos (getvar "osmode"))
(setvar "cmdecho" 0)
(setq dd (getpoint "\n Diem dau :"))
(setq ang (getangle dd "\nGoc nghieng :"))
(while (setq L (getdist dd "\n Nhap do dai <enter ket thuc lenh> :"))
(setq L1 L)
(setvar "osmode" 0)
(command "line" dd (setq dd (polar dd ang (Rnd (/ L 6.0) 50.0))) "" )

)
(command "lengthen" "T" L1 (cdr(assoc 11 (entget(entlast)))) "")
(setvar "osmode" oldos)
(princ)
)

  • 2

#8 quan08

quan08

    biết vẽ pline

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

Đã gửi 03 September 2012 - 09:45 PM

Lisp của bạn đây:

 (defun c:TT (/ L ang dd L1 oldos) (defun Rnd (sc sbc) (if (/= (rem sc sbc) 0.0) (+ (- sc (rem sc sbc)) sbc) sc) ) (setq oldos (getvar "osmode")) (setvar "cmdecho" 0) (setq dd (getpoint "\n Diem dau :")) (setq ang (getangle dd "\nGoc nghieng :")) (while (setq L (getdist dd "\n Nhap do dai <enter ket thuc lenh> :")) (setq L1 L) (setvar "osmode" 0) (command "line" dd (setq dd (polar dd ang (Rnd (/ L 6.0) 50.0))) "" ) ) (command "lengthen" "T" L1 (cdr(assoc 11 (entget(entlast)))) "") (setvar "osmode" oldos) (princ) ) 

Cảm ơn bác nhưng chưa đầy đủ bác ah.
Ở phần nhập độ dài,cho ta nhập trực tiếp và pick 2 điểm chọn(cái này sử dụng nhiều hơn nhập trực tiếp giá trị) giống lệnh offset.
Ví Dụ cụ thể:
Đánh lệnh TT:
Điểm đầu:....
Góc nghiêng:....
1- nhập giá trị :3000
2-Tiếp tục hay không:K
3-Nhập giá trị tiếp:4000
Kết thúc lệnh ta vẽ được đoạn thẳng =1 + 3 = 3000/6 + 4000 = 4500
Nếu 2- nhấn C:
3-Nhập giá trị tiếp:4000
4-Tiếp tục hay không:K
5-Nhập giá trị tiếp:1000
Kết thúc lệnh ta vẽ được đoạn thẳng =1+ 3 + 5= (3000/6=500) + (4000/6 = 666,66 )+1000 = 500+700+1000=2200
Thanks.
  • 0

#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 September 2012 - 10:00 PM

Cảm ơn bác nhưng chưa đầy đủ bác ah.
Ở phần nhập độ dài,cho ta nhập trực tiếp và pick 2 điểm chọn(cái này sử dụng nhiều hơn nhập trực tiếp giá trị) giống lệnh offset.
Ví Dụ cụ thể:
Đánh lệnh TT:
Điểm đầu:....
Góc nghiêng:....
1- nhập giá trị :3000
2-Tiếp tục hay không:K
3-Nhập giá trị tiếp:4000
Kết thúc lệnh ta vẽ được đoạn thẳng =1 + 3 = 3000/6 + 4000 = 4500
Nếu 2- nhấn C:
3-Nhập giá trị tiếp:4000
4-Tiếp tục hay không:K
5-Nhập giá trị tiếp:1000
Kết thúc lệnh ta vẽ được đoạn thẳng =1+ 3 + 5= (3000/6=500) + (4000/6 = 666,66 )+1000 = 500+700+1000=2200
Thanks.

Ở dòng này : (setq L (getdist dd "\n Nhap do dai <enter ket thuc lenh> :"))
Bạn sửa thành :(setq L (getdist "\n Nhap do dai <enter ket thuc lenh> :"))

Hàm getdist cho phép nhập theo 2 cách : nhập trực tiếp và pick 2 điểm chọn trên màn hình làm khoảng cách

Ngoài ra, thay vì nhập C/K (lâu) như yêu cầu của bạn thì mình làm dòng nhắc :Nhap do dai <enter ket thuc lenh> :Khi bạn enter kết thúc lệnh thì đoạn thẳng cuối đúng bằng giá trị mà bạn nhập vào lần cuối cùng (trước khi bạn enter kết thúc lệnh).
  • 1

#10 quan08

quan08

    biết vẽ pline

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

Đã gửi 03 September 2012 - 10:22 PM

Ở dòng này : (setq L (getdist dd "\n Nhap do dai <enter ket thuc lenh> :"))
Bạn sửa thành :(setq L (getdist "\n Nhap do dai <enter ket thuc lenh> :"))

Hàm getdist cho phép nhập theo 2 cách : nhập trực tiếp và pick 2 điểm chọn trên màn hình làm khoảng cách

Ngoài ra, thay vì nhập C/K (lâu) như yêu cầu của bạn thì mình làm dòng nhắc :Nhap do dai <enter ket thuc lenh> :Khi bạn enter kết thúc lệnh thì đoạn thẳng cuối đúng bằng giá trị mà bạn nhập vào lần cuối cùng (trước khi bạn enter kết thúc lệnh).

Sau khi sửa lại theo như ý bác chỉ:

(defun c:TT (/ L ang dd L1 oldos) (defun Rnd (sc sbc) (if (/= (rem sc sbc) 0.0) (+ (- sc (rem sc sbc)) sbc) sc) ) (setq oldos (getvar "osmode")) (setvar "cmdecho" 0) (setq dd (getpoint "\n Diem dau :")) (setq ang (getangle dd "\nGoc nghieng :")) (while (setq L (getdist "\n Nhap do dai <enter ket thuc lenh> :")) (setq L1 L) (setvar "osmode" 0) (command "line" dd (setq dd (polar dd ang (Rnd (/ L 6.0) 50.0))) "" ) ) (command "lengthen" "T" L1 (cdr(assoc 11 (entget(entlast)))) "") (setvar "osmode" oldos) (princ) )
Thì bị vướng mắc vài chỗ:
nhập độ dài lần 1 bằng pick chọn 2 điểm thì có truy bắt điểm để pick,nhập độ dài lần 2 thì không có truy bắt điểm để pick nếu pick 2 điểm bất kỳ thì kết quả sẽ là đoạn thẳng có chiều dài không chia cho 6.
Ý e muốn:
1/Nếu vẽ đoạn thẳng với 2 giá trị:giá trị đầu chia 6 giá trị sau giữ nguyên thì không được.
2/Vẽ đoạn thẳng với 3 giá trị thì 2 giá trị đầu chia 6 giá trị cuối không chia 6 thì được.
Mong bác sửa sao cho có thể vẽ đoạn thẳng thỏa mãn cả 1 và 2.Thanks.
  • 0

#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 September 2012 - 10:36 PM

Sau khi sửa lại theo như ý bác chỉ:


(defun c:TT (/ L ang dd L1 oldos) (defun Rnd (sc sbc) (if (/= (rem sc sbc) 0.0) (+ (- sc (rem sc sbc)) sbc) sc) ) (setq oldos (getvar "osmode")) (setvar "cmdecho" 0) (setq dd (getpoint "\n Diem dau :")) (setq ang (getangle dd "\nGoc nghieng :")) (while (setq L (getdist "\n Nhap do dai <enter ket thuc lenh> :")) (setq L1 L) (setvar "osmode" 0) (command "line" dd (setq dd (polar dd ang (Rnd (/ L 6.0) 50.0))) "" ) ) (command "lengthen" "T" L1 (cdr(assoc 11 (entget(entlast)))) "") (setvar "osmode" oldos) (princ) )
Thì bị vướng mắc vài chỗ:
nhập độ dài lần 1 bằng pick chọn 2 điểm thì có truy bắt điểm để pick,nhập độ dài lần 2 thì không có truy bắt điểm để pick nếu pick 2 điểm bất kỳ thì kết quả sẽ là đoạn thẳng có chiều dài không chia cho 6.
Ý e muốn:
1/Nếu vẽ đoạn thẳng với 2 giá trị:giá trị đầu chia 6 giá trị sau giữ nguyên thì không được.
2/Vẽ đoạn thẳng với 3 giá trị thì 2 giá trị đầu chia 6 giá trị cuối không chia 6 thì được.
Mong bác sửa sao cho có thể vẽ đoạn thẳng thỏa mãn cả 1 và 2.Thanks.

1/Nếu vẽ đoạn thẳng với 2 giá trị:giá trị đầu chia 6 giá trị sau giữ nguyên thì không được.
Rep: Bạn enter thì đoạn sau (đoạn cuối) tự động dãn dài ra (giữ nguyên giá trị của nó).
Còn các đoạn đầu chia cho 6.0
Sửa lại code về việc bắt điểm cho bạn

(defun c:TT (/ L ang dd L1 oldos)
(defun Rnd (sc sbc)
(if (/= (rem sc sbc) 0.0) (+ (- sc (rem sc sbc)) sbc) sc)
)
(setq oldos (getvar "osmode"))
(setvar "cmdecho" 0)
(setq dd (getpoint "\n Diem dau :"))
(setq ang (getangle dd "\nGoc nghieng :"))
(while (setq L (getdist "\n Nhap do dai <enter ket thuc lenh> :"))
(setq L1 L)
(setvar "osmode" 0)
(command "line" dd (setq dd (polar dd ang (Rnd (/ L 6.0) 50.0))) "" )
(setvar "osmode" oldos)
)
(command "lengthen" "T" L1 "_non" (cdr(assoc 11 (entget(entlast)))) "")
(princ)
)

  • 2

#12 quan08

quan08

    biết vẽ pline

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

Đã gửi 04 September 2012 - 05:52 AM

1/Nếu vẽ đoạn thẳng với 2 giá trị:giá trị đầu chia 6 giá trị sau giữ nguyên thì không được.
Rep: Bạn enter thì đoạn sau (đoạn cuối) tự động dãn dài ra (giữ nguyên giá trị của nó).
Còn các đoạn đầu chia cho 6.0
Sửa lại code về việc bắt điểm cho bạn


(defun c:TT (/ L ang dd L1 oldos)
(defun Rnd (sc sbc)
(if (/= (rem sc sbc) 0.0) (+ (- sc (rem sc sbc)) sbc) sc)
)
(setq oldos (getvar "osmode"))
(setvar "cmdecho" 0)
(setq dd (getpoint "\n Diem dau :"))
(setq ang (getangle dd "\nGoc nghieng :"))
(while (setq L (getdist "\n Nhap do dai <enter ket thuc lenh> :"))
(setq L1 L)
(setvar "osmode" 0)
(command "line" dd (setq dd (polar dd ang (Rnd (/ L 6.0) 50.0))) "" )
(setvar "osmode" oldos)
)
(command "lengthen" "T" L1 "_non" (cdr(assoc 11 (entget(entlast)))) "")
(princ)
)

Cảm ơn sự nhiệt tình giúp đỡ của bác,cho e hỏi thêm tí,sau khi vẽ đoạn thẳng xong giờ muốn vẽ 1 đoạn thẳng vuông góc và dài 500 vào cuối đoạn thẳng vừa vẽ thì thêm như thế nào?Thanks.
  • 0

#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 04 September 2012 - 06:17 AM

Cảm ơn sự nhiệt tình giúp đỡ của bác,cho e hỏi thêm tí,sau khi vẽ đoạn thẳng xong giờ muốn vẽ 1 đoạn thẳng vuông góc và dài 500 vào cuối đoạn thẳng vừa vẽ thì thêm như thế nào?Thanks.

Bạn chép các dòng này :
(command "line" "_non" (setq dd (cdr(assoc 11 (entget(entlast))))) "_non"
(polar dd (+ ang (/ pi 2.0) ) 500.0) "")
(initget "Y N")
(setq ans (getkword "Quay doan 500 mot goc 180 do < Y/N > "))
(if (= ans "Y") (command "rotate" (entlast) "" "_non" dd "180"))


xuống phía dưới dòng :
(command "lengthen" "T" L1 "_non" (cdr(assoc 11 (entget(entlast)))) "")

Nếu bạn muốn quay đoạn 500 một góc 180 do thì ở dòng :
Quay doan 500 mot goc 180 do < Y/N > : Nhập Y
  • 2