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

LISP tự động cộng liên tiếp khoảng cách giữa các điểm bất kỳ

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

Chào các anh chị !

cũng cung đề tài này em muốn nhờ các anh giúp em tạo một lísp cộng dồn khỏang cách trong dimension có tính theo tỵ lệ của dimension.

vd: em có điểm A có số 250 đến b khỏang cách 50 sẽ đuợc thể hiện tại b là 300 tỷ lệ bản vẽ ;à 1/500.Cám nơn các anh chị .

Bạn sử dụng Lisp cộng trừ dim của Tue_NV ở đây :

Bài viết số 2081

  • 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

Chào bạn Votanphu,

Cái này cho phép bạn đo nhiều đoạn thẳng và cho ra kết quả tổng độ dài của các đoạn thẳng đó.

.....

Sau khi bạn đã chọn đoạn thẳng thứ hai thì lisp sẽ hỏi bạn có muốn tiếp tục hay không. Nếu bạn trả lời "y" thì nó cho bạn chọn tiếp đoạn thẳng thứ ba và cứ thế cho đến khi bạn trả lời "n". Khi ấy lisp sẽ cho ra kết quả cuối cùng bạn nhé.

Chúc bạn vui.

Em đã thử Test Lisp này của bác và nhận thấy nếu lựa chọn "Y" thì vẫn chỉ đo được 2 đoạn thẳng thôi bác ạ, không đo được 3 đoạn thẳng và cho ra tổng chiều dài của 3 đoạn thẳng đó! bác xem lại giúp em vì thi thoảng bọn em cũng cần dùng cái này!

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

Em đã thử Test Lisp này của bác và nhận thấy nếu lựa chọn "Y" thì vẫn chỉ đo được 2 đoạn thẳng thôi bác ạ, không đo được 3 đoạn thẳng và cho ra tổng chiều dài của 3 đoạn thẳng đó! bác xem lại giúp em vì thi thoảng bọn em cũng cần dùng cái này!

Hề hề hề,

Sorry bạn,

Bạn hãy gửi cái kết quả bạn thử để mình check lại. Có nhẽ bạn đã nhập "Y" thay vì "y" 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

Nên viết thế này thôi bác ạ :

 

(defun c:do(/ lst p1 p2 p)
(setq p2 (getpoint (setq p1 (getpoint "\nP1 :")) "\nP2:") lst (list p2 p1))
(while (setq p (getpoint (car lst) "\nDiem tiep theo <space to exit>")) (setq lst (cons p lst)))
(alert (rtos (apply '+ (mapcar '(lambda(x y)(distance x y)) lst (cdr lst))) 2 2))
)

  • Vote tăng 3

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

Nên viết thế này thôi bác ạ :

 

(defun c:do(/ lst p1 p2 p)
(setq p2 (getpoint (setq p1 (getpoint "\nP1 :")) "\nP2:") lst (list p2 p1))
(while (setq p (getpoint (car lst) "\nDiem tiep theo <space to exit>")) (setq lst (cons p lst)))
(alert (rtos (apply '+ (mapcar '(lambda(x y)(distance x y)) lst (cdr lst))) 2 2))
)

Nếu viết thì như thế này thôi ket:

Gọn -> Khỏi sử dụng biến luôn

(defun c:do ()
(command "pline")(while (< 0 (getvar "CMDACTIVE")) (command pause))
(command "lengthen" "L" "" "undo" 2)
(alert (rtos (getvar "perimeter")))
(princ)
)

  • Vote tăng 3

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

Nếu yêu cầu cho phép sử dụng cách cheat này ^^ Và nếu bác undo thì phải mark trước - để tránh undo gây lỗi (theo e thì entel sẽ hay hơ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
Nên viết thế này thôi bác ạ :
 (defun c:do(/ lst p1 p2 p) (setq p2 (getpoint (setq p1 (getpoint "\nP1 :")) "\nP2:") lst (list p2 p1)) (while (setq p (getpoint (car lst) "\nDiem tiep theo <space to exit>")) (setq lst (cons p lst))) (alert (rtos (apply '+ (mapcar '(lambda(x y)(distance x y)) lst (cdr lst))) 2 2)) ) 

lisp đo khoảng cách ,khi đo xong có thể cho ra text có săn không vây 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

lisp đo khoảng cách ,khi đo xong có thể cho ra text có săn không vây bạn?

Hề hề hề,

Có thể bạn ạ. Nhưng sẵn kiểu gì thì bạn phải trình bày cho rõ chứ đừng hỏi bâng quơ như vậy.

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

Hề hề hề,

Có thể bạn ạ. Nhưng sẵn kiểu gì thì bạn phải trình bày cho rõ chứ đừng hỏi bâng quơ như vậy.

TEXT có săn đó bạn.mình có viết trên rồi 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

TEXT có săn đó bạn.mình có viết trên rồi mà

Hề hề hề,

Trên bản vẽ của bạn có bao nhiêu text có sẵn??? Vậy bạn muốn chọn thằng có sẵn nào??? Bạn cần thay thế text có sẵn ây bằng kết quả hay bạn muốn thêm kết quả vào text có sẵn, hay bạn muố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

Hề hề hề,

Trên bản vẽ của bạn có bao nhiêu text có sẵn??? Vậy bạn muốn chọn thằng có sẵn nào??? Bạn cần thay thế text có sẵn ây bằng kết quả hay bạn muốn thêm kết quả vào text có sẵn, hay bạn muốn ........????

Thay thế text có săn nawnm trong đoan tính toán thô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

Nên viết thế này thôi bác ạ :

 

(defun c:do(/ lst p1 p2 p)
(setq p2 (getpoint (setq p1 (getpoint "\nP1 :")) "\nP2:") lst (list p2 p1))
(while (setq p (getpoint (car lst) "\nDiem tiep theo <space to exit>")) (setq lst (cons p lst)))
(alert (rtos (apply '+ (mapcar '(lambda(x y)(distance x y)) lst (cdr lst))) 2 2))
)

Nhờ bác sửa lại thành đo nhiều đoạn chứ không phải đo các đoạn thẳng liền nhau.

1.Chọn điểm P1 rồi chọn điểm P2 là đoạn thứ 1 sẽ hỏi tiếp tục không?

a. Nếu có sẽ chọn điểm P1 và P2 ra đoạn thứ 2,tiếp tục tới n đoạn.kết thúc lệnh sẽ cộng tổng các đoạn tiép là mục 3

b. Nếu chọn không sẽ kết thúc lệnh tiếp là mục 3.

3. Khi kết thúc lệnh thì hiện Số cần chia khi ta nhập số cần chia vào thì lấy kích thước tổng vừa đo chia cho số đó và hiện kết quả làm tròn ở hàng chục.

Ví dụ: Sau khi chia kết quả là 255,33 thì làm tròn là 256.

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

Nhờ bác sửa lại thành đo nhiều đoạn chứ không phải đo các đoạn thẳng liền nhau.

1.Chọn điểm P1 rồi chọn điểm P2 là đoạn thứ 1 sẽ hỏi tiếp tục không?

a. Nếu có sẽ chọn điểm P1 và P2 ra đoạn thứ 2,tiếp tục tới n đoạn.kết thúc lệnh sẽ cộng tổng các đoạn tiép là mục 3

b. Nếu chọn không sẽ kết thúc lệnh tiếp là mục 3.

3. Khi kết thúc lệnh thì hiện Số cần chia khi ta nhập số cần chia vào thì lấy kích thước tổng vừa đo chia cho số đó và hiện kết quả làm tròn ở hàng chục.

Ví dụ: Sau khi chia kết quả là 255,33 thì làm tròn là 256.

Thanks.

Bạn viết kết quả làm tròn ở hàng chục.

Sao tôi thấy bạn ví dụ lại ở hàng đơn vị 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

Bạn viết kết quả làm tròn ở hàng chục.

Sao tôi thấy bạn ví dụ lại ở hàng đơn vị nhỉ

Xin lỗi bác,em lộn.Hàng đơn vị bác ah.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

Nhờ bác sửa lại thành đo nhiều đoạn chứ không phải đo các đoạn thẳng liền nhau.

1.Chọn điểm P1 rồi chọn điểm P2 là đoạn thứ 1 sẽ hỏi tiếp tục không?

a. Nếu có sẽ chọn điểm P1 và P2 ra đoạn thứ 2,tiếp tục tới n đoạn.kết thúc lệnh sẽ cộng tổng các đoạn tiép là mục 3

b. Nếu chọn không sẽ kết thúc lệnh tiếp là mục 3.

3. Khi kết thúc lệnh thì hiện Số cần chia khi ta nhập số cần chia vào thì lấy kích thước tổng vừa đo chia cho số đó và hiện kết quả làm tròn ở hàng chục.

Ví dụ: Sau khi chia kết quả là 255,33 thì làm tròn là 256.

Thanks.

Quick :

(defun c:do(/ lst p1 p2)
(while
(and
 (setq p1 (getpoint "\nP1:"))
 (setq p2 (getpoint p1 "\nP2:"))
)
(setq lst (cons (distance p1 p2) lst))
)
(alert (itoa (fix (+ (/ (apply '+ lst) (getreal "\nSo can chia :"))0.99))))
)

Dạo này đau đầu quá nên mình k onl đc nhiều để trả lời nhanh ^^

  • 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

Quick :

(defun c:do(/ lst p1 p2)
(while
(and
 (setq p1 (getpoint "\nP1:"))
 (setq p2 (getpoint p1 "\nP2:"))
)
(setq lst (cons (distance p1 p2) lst))
)
(alert (itoa (fix (+ (/ (apply '+ lst) (getreal "\nSo can chia :"))0.99))))
)

Dạo này đau đầu quá nên mình k onl đc nhiều để trả lời nhanh ^^

Cảm ơn bác,sửa thêm giùm mình tí sau khi chia làm tròn giờ mình muốn nó cộng thêm 50 nữa thì sửa làm sao?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ác Hạ : tương đối đủ rồi bác ạ. K thì có thể 0.999, 0.9999, 0.999999...999 :)

Về cơ bản thì người yêu cầu cũng chưa đưa ra quy tắc => hoàn toàn có thể fix k cũng được, ở đây ket còn cẩn thận ngó ví dụ của bạn ấy để tăng lên ^^

 

@quan : bạn sửa dòng này

 

(alert (itoa (fix (+ (/ (apply '+ lst) (getreal "\nSo can chia :"))0.99))))

 

thành :

 

(alert (itoa (+ (fix (+ (/ (apply '+ lst) (getreal "\nSo can chia :"))0.99)) 50)))

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 sử dụng code này nhé :

 

(defun c:ckc(/ po1 po2 oldim tp S te ent)

(setq oldim (getvar "DIMZIN"))

(setvar "DIMZIN" 0)

(if (not tpo) (setq tpo 0))

(setq tp (getint (strcat "\n So chu so thap phan <" (rtos tpo 2 0) ">:")))

(if (not tp) (setq tp tpo) (setq tpo tp))

(setq po1 (getpoint "\n Pick diem dau :"))

 

(while

(setq po2

(getpoint po1 "\n Pick diem tiep theo de tinh khoang cach/ Enter de ket thuc :"))

(setq S (distance po1 po2) po1 po2)

(while (null (setq ent (entsel "\n Pick vao TEXT :")))

(setq ent (entsel "\n Pick lai vao TEXT :"))

)

(setq te (entget (car ent)))

(setq te (entmod(subst(cons 1 (rtos S 2 tp)) (assoc 1 te) te)))

)

(setvar "DIMZIN" oldim)

(princ)

)

Lisp này rất hay nhờ bác thêm chức năng tính khoảng cách theo tỉ lệ bản vẽ được không ạ. Ví dụ như khoảng cách 2 điểm của em là 100 do bản vẽ tỉ lệ 1/500 nên muốn kết quả xuất ra là 50 được không bá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

Khoảng cách 2 điểm là 100, tỉ lệ 1/500, mà lại ra được con số 50 ??

Mình cũng đang định viết hộ bạn cái lisp bên topic kia, mà đọc khái niệm này của bạn chắc mình thua r

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

- oh vậy là hơi giống bên nhoc ^^, 2 điểm = 100 bạn đó nói chắc đc phóng lên theo tile 1/500 rùi tương đương 2lần , giờ bạn ấy mún đo lấy kích thước thật = 50 tương đương tile 1/1000, nhoc nghĩ vậy ko biết đúg ko ^^

- bạn thử xem

(defun c:ckc(/ po1 po2 oldim tp S te ent x)
(setq oldim (getvar "DIMZIN"))
(setvar "DIMZIN" 0)
(setq ttl (getvalueK ttl 500.0 "Nhap ti le ban ve 1 / "))
(setq x (/ 1000.0 ttl))
(if (not tpo) (setq tpo 0))
(setq tp (getint (strcat "\n So chu so thap phan <" (rtos tpo 2 0) ">:")))
(if (not tp) (setq tp tpo) (setq tpo tp))
(setq po1 (getpoint "\n Pick diem dau :"))

(while
(setq po2
(getpoint po1 "\n Pick diem tiep theo de tinh khoang cach/ Enter de ket thuc :"))
(setq S (/ (distance po1 po2) x) po1 po2)
(while (null (setq ent (entsel "\n Pick vao TEXT :")))
(setq ent (entsel "\n Pick lai vao TEXT :"))
)
(setq te (entget (car ent)))
(setq te (entmod(subst(cons 1 (rtos S 2 tp)) (assoc 1 te) te)))
)
(setvar "DIMZIN" oldim)
(princ)
)
;===
;; ham luu gia tri
(defun getvalueK ( a giatri dongnhac / astr) 
(or a (setq a giatri))
(cond
	((= (type a) 'INT) (setq a (cond ((getint (strcat "\n" dongnhac "(" (itoa a) ") :")))(a))))
	((= (type a) 'REAL) (setq a (cond ((getreal (strcat "\n" dongnhac "(" (rtos a 2 1) ") :")))(a))))
	((= (type a) 'STR) (setq a (cond ((= "" (setq astr (getstring T (strcat "\n" dongnhac " (" a "): ")))) a) (astr))))
))
;;;;

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

 

- oh vậy là hơi giống bên nhoc ^^, 2 điểm = 100 bạn đó nói chắc đc phóng lên theo tile 1/500 rùi tương đương 2lần , giờ bạn ấy mún đo lấy kích thước thật = 50 tương đương tile 1/1000, nhoc nghĩ vậy ko biết đúg ko ^^

- bạn thử xem

(defun c:ckc(/ po1 po2 oldim tp S te ent x)
(setq oldim (getvar "DIMZIN"))
(setvar "DIMZIN" 0)
(setq ttl (getvalueK ttl 500.0 "Nhap ti le ban ve 1 / "))
(setq x (/ 1000.0 ttl))
(if (not tpo) (setq tpo 0))
(setq tp (getint (strcat "\n So chu so thap phan <" (rtos tpo 2 0) ">:")))
(if (not tp) (setq tp tpo) (setq tpo tp))
(setq po1 (getpoint "\n Pick diem dau :"))

(while
(setq po2
(getpoint po1 "\n Pick diem tiep theo de tinh khoang cach/ Enter de ket thuc :"))
(setq S (/ (distance po1 po2) x) po1 po2)
(while (null (setq ent (entsel "\n Pick vao TEXT :")))
(setq ent (entsel "\n Pick lai vao TEXT :"))
)
(setq te (entget (car ent)))
(setq te (entmod(subst(cons 1 (rtos S 2 tp)) (assoc 1 te) te)))
)
(setvar "DIMZIN" oldim)
(princ)
)
;===
;; ham luu gia tri
(defun getvalueK ( a giatri dongnhac / astr) 
(or a (setq a giatri))
(cond
	((= (type a) 'INT) (setq a (cond ((getint (strcat "\n" dongnhac "(" (itoa a) ") :")))(a))))
	((= (type a) 'REAL) (setq a (cond ((getreal (strcat "\n" dongnhac "(" (rtos a 2 1) ") :")))(a))))
	((= (type a) 'STR) (setq a (cond ((= "" (setq astr (getstring T (strcat "\n" dongnhac " (" a "): ")))) a) (astr))))
))
;;;;

Cảm ơn nhóc đúng như cái mình cần thank you very much :)

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  

×