Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

- ^^, khó phết anh Tue nhỉ, khuya rùi nhoc mới mò đc vậy ko biết  có ổn ko, nhưng hơi dài kaka,mai lại bận cả ngày ko có thời gian ngâm tiếp ^^

(defun c:caodo(/ chon hh kk c_do c)
(setq chon (car (entsel "\nchon cao do chuan:")))
(if (= chon nil)
(progn
(setq hh (getvar "lastprompt"))
(setq kk (strlen "chon cao do chuan: "))
(setq c_do (distof (substr hh kk)))
)
(setq c_do (distof (cdr (assoc 1 (entget chon)))))
)
(princ (setq c (+ 0.5 c_do)))
(princ)
)

Đang thức chờ nhoc viết đây heheehè

cám ơn bạn nhiều lấy về dùng thử thế nào mai sẽ nhận xét

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

- ^^, khó phết anh Tue nhỉ, khuya rùi nhoc mới mò đc vậy ko biết  có ổn ko, nhưng hơi dài kaka,mai lại bận cả ngày ko có thời gian ngâm tiếp ^^

(defun c:caodo(/ chon hh kk c_do c)
(setq chon (car (entsel "\nchon cao do chuan:")))
(if (= chon nil)
(progn
(setq hh (getvar "lastprompt"))
(setq kk (strlen "chon cao do chuan: "))
(setq c_do (distof (substr hh kk)))
)
(setq c_do (distof (cdr (assoc 1 (entget chon)))))
)
(princ (setq c (+ 0.5 c_do)))
(princ)
)

Đã đúng như yêu cầu rồi

Bây giờ muốn ràng buộc điều kiện vào cho nó nhưng làm hoài mà không xong mới được 50%

muốn chọn đối tượng là text còn cao hơn nữa bắt buộc text đó phải là số

Đây là lisp chế thêm

(defun c:caod () ;(/ chon hh kk c_do c)
(setq chon (car (entsel "\nCao do chuan chon hoac nhap so:")))
(if (/= chon nil)
(while
 	 (or
	 (null chon)
   	 (/= "TEXT" (cdr (assoc 0 (entget chon))))
	 )
	(princ "\nDoi tuong khong phai la text! Chon lai")
	(setq chon (car (entsel "\nCao do chuan chon hoac nhap so:")))
)
)
(if (= chon nil)
(progn
(setq hh (getvar "lastprompt"))
(setq kk (strlen "Cao do chuan chon hoac nhap so: "))
(setq c_do (distof (substr hh kk)))
)
(setq c_do (distof (cdr (assoc 1 (entget chon)))))
)
(princ (setq c (+ 0.5 c_do)))
(princ)
)

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

Đưa

(while
  (null c_do)

)

ra ngoài cùng, kiểm tra nội dung text hoặc giá trị nhập hh là số

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 này cũng tàm tạm nè!

 

(defun C:HA(/ ent cd)
 (if (setq ent (car (entsel "\nChon hoac nhap cao do: ")))
  (while (not (setq cd (distof (cdr (assoc 1 (entget ent))))))
   (if (setq ent (car (entsel "\nChon hoac nhap cao do: ")))
    (setq cd (distof (cdr (assoc 1 (entget ent)))))))
  (setq cd (distof (substr (getvar "lastprompt") (strlen "Chon hoac nhap cao do: ")))))
 cd) 
 
  • 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

Đưa

(while

  (null c_do)

)

ra ngoài cùng, kiểm tra nội dung text hoặc giá trị nhập hh là số

 Vẫn chưa hiểu nên chưa làm được

hh là ok rồi nếu không phải số là không được 

chỉ còn lại text 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

 

Cái này cũng tàm tạm nè!

 

(defun C:HA(/ ent cd)
 (if (setq ent (car (entsel "\nChon hoac nhap cao do: ")))
  (while (not (setq cd (distof (cdr (assoc 1 (entget ent))))))
   (if (setq ent (car (entsel "\nChon hoac nhap cao do: ")))
    (setq cd (distof (cdr (assoc 1 (entget ent)))))))
  (setq cd (distof (substr (getvar "lastprompt") (strlen "Chon hoac nhap cao do: ")))))
 cd) 
 

Chưa ổn:

1. Nếu chọn đối tượng không có dxf 1

2. Nếu INPUTHISTORYMODE > 7 và nhập số nguyê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

1). Thậm chí còn ràng buộc thêm vài điều kiện nữa, ví dụ chừng nào chọn được số, hoặc chừng nào nhập đúng số, không cho enter .v.v...

Tuy nhiên do chủ topic y/c ngắn gọn quá nên cứ để tự bổ sung cho họ sướng.

2). Nhập 23 >> 23.0. Chủ topic có nói gì thêm nữa đâu, nên không hiểu ý.

  • 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

1). Thậm chí còn ràng buộc thêm vài điều kiện nữa, ví dụ chừng nào chọn được số, hoặc chừng nào nhập đúng số, không cho enter .v.v...

Tuy nhiên do chủ topic y/c ngắn gọn quá nên cứ để tự bổ sung cho họ sướng.

2). Nhập 23 >> 23.0. Chủ topic có nói gì thêm nữa đâu, nên không hiểu ý.

Đã sửa ở bài #2278 nhưng khổ nổi khi lở chọn đối tượng rồi thì không nhập được số 

Không thoát được (while)

còn nhập số ko đúng vẫn được nhập lại nhập khi đúng thì thôi hoặc quay lại phép chọn vẫn được

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

Đã sửa ở bài #2278 nhưng khổ nổi khi lở chọn đối tượng rồi thì không nhập được số

Không thoát được (while)

còn nhập số ko đúng vẫn được nhập lại nhập khi đúng thì thôi hoặc quay lại phép chọn vẫn được

Tôi chỉ hiểu được dòng màu xanh. Dòng màu tím thì không hiểu vì tôi dùng OK. Dòng màu đỏ thì mâu thuẫn quá: sao đã chọn đối tượng mà còn nhập số?

Nếu bạn cứ trình bày vấn đề khó hiểu thế này thì chịu thôi.

@ndtnv: ý của bạn là khi biến "INPUT..." >> 7 thì sao nhỉ, tôi không hiểu?

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

Sorry là test chưa kỹ nên hiểu sai nguyên nhân, nhưng lisp của bạn nếu chọn text không phải là số, sau đó nhập số thì kq = nil

@ huunhantvxdts: Đã gợi ý và pm chi tiết hơn nhưng bạn không đọc.

 

(while (null c_do)
(acet-ss-clear-prev)
    (if    (setq chon (car (entsel "\nCao do chuan chon hoac nhap so:")))
        (if (= "TEXT" (cdr (assoc 0 (entget chon))))
            (setq c_do (distof (cdr (assoc 1 (entget chon))))))
        (setq c_do (distof (substr (getvar "lastprompt") (strlen "Cao do chuan chon hoac nhap so: "))))
    )
)

Ps: đang tìm nguyên nhân vì sao nếu chọn text không phải là số thì entsel luôn khác nil

Ps2:  Đã tìm ra nguyên nhân là nếu không chọn gì, entsel trả về đối tượng previous

@Ha: tôi chưa rãnh để thử nhưng nếu dùng grread thì có thể được, nhưng viết thì dài mà xuất hiện 2 dòng thì cũng không ảnh hưởng gi lớn

  • 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ôi chỉ hiểu được dòng màu xanh. Dòng màu tím thì không hiểu vì tôi dùng OK. Dòng màu đỏ thì mâu thuẫn quá: sao đã chọn đối tượng mà còn nhập số?

Nếu bạn cứ trình bày vấn đề khó hiểu thế này thì chịu thôi.

@ndtnv: ý của bạn là khi biến "INPUT..." >> 7 thì sao nhỉ, tôi không hiểu?

Ở đây tôi dùng lở là vì

Text đó đang nằm trong Block và Block thuộc tính hay đại loại không phải là text. Bây giờ muốn nhập lại số thì không được nữa.

Cám ơn bạn nhiều

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

Sorry là test chưa kỹ nên hiểu sai nguyên nhân, nhưng lisp của bạn nếu chọn text không phải là số, sau đó nhập số thì kq = nil

@ huunhantvxdts: Đã gợi ý và pm chi tiết hơn nhưng bạn không đọc.

 

(while (null c_do)
(acet-ss-clear-prev)
    (if    (setq chon (car (entsel "\nCao do chuan chon hoac nhap so:")))
        (if (= "TEXT" (cdr (assoc 0 (entget chon))))
            (setq c_do (distof (cdr (assoc 1 (entget chon))))))
        (setq c_do (distof (substr (getvar "lastprompt") (strlen "Cao do chuan chon hoac nhap so: "))))
    )
)

Ps: đang tìm nguyên nhân vì sao nếu chọn text không phải là số thì entsel luôn khác nil

Ps2:  Đã tìm ra nguyên nhân là nếu không chọn gì, entsel trả về đối tượng previous

Đã đọc rồi nhưng không hiểu để làm 

Cám ơn bạn nhiều

Bây giờ thì quá là đúng luô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

- hi mấy anh trợ giúp nhoc với, bài toán text né line, nhoc mót nhặt từ nhiều nơi tới đc đây mà vẫn còn xíu gì đó nhoc vẫn chưa hiểu ^^, chạy vẫn chưa đc như ý.

- vd: vẽ 1 rectang sau đó viết text trên các đỉnh, justy là middle, mã 11 trùng với đỉnh. khi chạy quét từng text thì nó chạy đúng ý nhoc là 45 độ là góc đầu tiên, còn quét 1 lần để duyệt thì mỗi text lại chạy khác nhau đúng ra đều 45 độ hết, mặc dù xung quanh đang trống chưa có vật cản nào ^^

(defun move_text (position height / r ang found pt1 pt2 ssobj newpos)

  (setq	r (* 1.2 height)
	ang   (/ pi 4)
	found nil
  )

  (while (and (not found) (<= ang (* 2 pi)))

    (setq newpos (polar position ang r)
	  pt1	 (list (- (car newpos) (/ height 2.0)) (- (cadr newpos) (/ height 2.0)) 0.0)
	  pt2	 (list (+ (car newpos) (/ height 2.0)) (+ (cadr newpos) (/ height 2.0)) 0.0)
    )

    (setq ssobj (ssget "_C" pt1 pt2))

    (if	(= ssobj nil)
      (setq found T)
    )


    (setq ang (+ ang (/ pi 9)))
  )

  (if found
    newpos
    nil
  )

)
;--------------------------------------------------------------------------------------------------
(defun c:test (/ sstext ssl ent enx newvt pos)
(setq sstext (ssget '((0 . "TEXT"))))
(if sstext
(progn
;---------------------------------
(setq	ssl (sslength sstext))
	  
  (repeat ssl
    (setq ent  (ssname sstext 0)
	  enx  (entget ent)
	  pos  (cdr (assoc 11 enx))
	 )
     
    (setq newvt (move_text pos 3.5))
    (if	newvt
    (entmod (subst (cons 11 newvt) (assoc 11 enx) enx))
	(princ "Ko ne dc\n")
    )

    (ssdel ent sstext)
  )
  ) ;end progn
 ) ;end if sstext
 (princ)
)

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

- lsp test nhoc up ở trên đó anh nhoc set góc đầu tiên mở ra là 45 độ từ đỉnh của rectang rùi dò nếu ko vướn thì lấy tọa độ điểm đó, vướn thì góc sẽ đi tiếp 20 độ

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

Xin hỏi có hàm nào trong lisp có thể chọn đối tượng là text hoặc có thể nhập từ bàn phím người dùng không????

Ngày xưa mình thực hiện ý tưởng đó như thế này, xin đưa ra để bạn tham khảo thêm:

 

(defun C:CHONCHU( / ma name0 name)

 

(defun diem( name n)

(cdr (assoc n (entget name)))

)

 

(if (null st_chuhientai) (setq st_chuhientai ""))

(setq ma "")

(while ma

(initget 128)

(setq ma (Getpoint (strcat "\nText: <" st_chuhientai "> :Pick: ")))

(cond

((NULL MA))

((listp ma)

(if (and (setq name0 (nentselp ma)) (setq name (car name0)) (= (diem name 0) "TEXT"))

(setq st_chuhientai (diem name 1))

)

)

(T (setq st_chuhientai ma))

)

)

)

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

Kết quả test:

TEST

Chọn 4 text.

4 text bị move sang 4 vị trí khác.

Đo góc dịch chuyển: cả 4 góc đều bằng 45độ.

???

- ^^ nhoc quên do cái biến r với height nhoc chạy bên nhoc khác lsp viết , nhoc ngâm thêm 1 ít cảm giác code này chưa ổ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

Ngày xưa mình thực hiện ý tưởng đó như thế này, xin đưa ra để bạn tham khảo thêm:

 

(defun C:CHONCHU( / ma name0 name)

 

(defun diem( name n)

(cdr (assoc n (entget name)))

)

 

(if (null st_chuhientai) (setq st_chuhientai ""))

(setq ma "")

(while ma

(initget 128)

(setq ma (Getpoint (strcat "\nText: <" st_chuhientai "> :Pick: ")))

(cond

((NULL MA))

((listp ma)

(if (and (setq name0 (nentselp ma)) (setq name (car name0)) (= (diem name 0) "TEXT"))

(setq st_chuhientai (diem name 1))

)

)

(T (setq st_chuhientai ma))

)

)

)

Đã giải quyết xong rồi 

Nhờ bạn Nhoc và bạn ndtnv và Bác Hà nữa

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

Xin phép ket spam chút xíu :

 Trong Topic này mong mọi người cố gắng viết ngắn gọn súc tích,

- Hỏi thì trình bày rõ ràng, nghĩ kỹ trước khi hỏi, phải biết mình hỏi cái gì, tránh trường hợp hỏi mỳ ăn liền, đưa 1 câu hỏi lên thì có 10 người hỏi lại "bạn hỏi cái gì"

- Giải thích thì đủ dùng, k lơi quá. Tốt nhất là gợi ý trước, chờ 2 3 ngày bấn lắm thì hãy code giúp (nếu có thể), tránh trường hợp người hỏi k đúc rút được gì ngoài việc chờ người khác code hộ

Ket thấy gần đây toàn nội dung hỏi đi đáp lại, 2 bên chẳng hiểu nhau, cả mấy trang mới học thêm đước xíu

Xin cảm ơn và chào đi ăn cơm ạ 

  • 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

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


×