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ị

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

- Em có 1 tập hợp các đối tượng text SS, các text trong SS đã được sắp xếp theo thứ tự mà người dùng mong muốn (theo X, theo Y hay theo thứ tự pick)

- Bây giờ em muốn thực hiện một vòng lặp để tính khoảng cách giữa các điểm chèn của các text tương ứng trong SS. E cũng viết thử viết 1 đoạn những toàn lỗi.

Các anh giúp e đoạn code thực hiện công việc trên với ạ.

Chú thích thêm là cuối vòng lặp e muốn nhận được khoảng cách để ghi ra file .txt

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 nhoc thử viết dựa trên ý tưởng của bạn, bạn xem thử, nếu danh sách text của bạn đã sếp theo thứ tự mong mún, và danh sách đó là ename của các text rùi thì công việc đỡn hơn ^^

(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)     
(setq e (ssname ss i)        
Le (append Le (list e))        
i (1+ i)    ))
Le)
(defun c:kki (/ ss_nametext i td_text ds_kc ds_tdtext)
(setq ss_nametext (ss2ent (ssget '((0 . "TEXT")))))
(if ss_nametext
(progn
(setq i 0)
(foreach v ss_nametext
(setq td_text (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) (entget v))))
(setq ds_tdtext (append ds_tdtext td_text))
)
(repeat (1- (length ds_tdtext))
(setq kc (distance (nth i ds_tdtext) (nth (setq i (1+ i)) ds_tdtext)))
(setq ds_kc (append ds_kc (list (rtos kc 2 2))))
)
)
)
(princ (vl-princ-to-string ds_kc))
(princ)
)

- lsp nhoc viết để chạy thử ^^, kết quả cuối cùng trả về là danh sách khoảng cách giữa các text, biến ds_kc, từ đó bạn làm tiếp hen, nhoc chưa học xuất qua txt ^^

  • 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

Cho em hỏi: 1- Hàm vl-cmdf có ảnh hưởng đến biến osmode như hàm command không? :(

2- Hàm vl-cmdf và command giống nhau, khác nhau chỗ nào?

Em thấy một số lisp viết bằng hàm Vl, Vlax thì không quan tâm đến Osmode thì phả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

Cho em hỏi: 1- Hàm vl-cmdf có ảnh hưởng đến biến osmode như hàm command không? :(

2- Hàm vl-cmdf và command giống nhau, khác nhau chỗ nào?

Em thấy một số lisp viết bằng hàm Vl, Vlax thì không quan tâm đến Osmode thì phải...

 

1./ Hàm vl-cmdf có ảnh hưởng đến biến osmode như hàm command không? -> Có 

2./

Hàm vl-cmdf sẽ trả về giá trị T nếu công việc diễn ra suôn sẻ, như vậy anh có thể lấy luôn hàm vl-cmdf để làm điều kiện cho if được. Nếu suôn sẻ thì biểu thứ 1, nếu không suôn sẻ thì biểu thức 2. Đó là ý kiến riêng của em.

 chức năng của vl-cmdf tương tự như hàm command.

Tuy nhiên vl-cmdf thêm chức năng xác minh (kiểm tra tính hợp lệ) các đối số và chỉ thực thi nếu đối số là hợp lệ.

Và như ý của Nataca : Hàm vl-cmdf sẽ trả về giá trị T (true) nếu công việc diễn ra suôn sẻ

Nguợc lại command thực hiện lần luợt các đối số cho đến khi lỗi được phát hiện (nếu có). Do đó, lệnh có thể được thực thi một phần và chưa hoàn toàn kết thú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

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

×