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

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

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

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 đỡ.

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

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

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

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ể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?

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

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

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

  • 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

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

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

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

  • 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

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.

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

  • 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

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  

×