Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
48 replies to this topic

#41 quan08

quan08

    biết vẽ pline

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

Đã gửi 06 September 2012 - 01:55 PM

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

#42 ketxu

ketxu

    Copier - Paster - Editor

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

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

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 ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#43 quan08

quan08

    biết vẽ pline

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

Đã gửi 06 September 2012 - 04:58 PM

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

#44 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 06 September 2012 - 05:17 PM

@Ketxxu: 0.99 sao tạo đủ lòng tin?
  • 0

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


#45 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 06 September 2012 - 05:51 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#46 nhantony

nhantony

    biết vẽ line

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

Đã gửi 27 November 2014 - 08:45 AM

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


  • 1

#47 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 27 November 2014 - 11:09 AM

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


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#48 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 27 November 2014 - 04:39 PM

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

  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#49 nhantony

nhantony

    biết vẽ line

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

Đã gửi 28 November 2014 - 11:06 AM

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


  • 0