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

[Đã xong] Lisp chọn 2 text cho ra 1 điểm toạ độ

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

Các bác là cao thủ lisp cho em hỏi 1 chút:

Em đang cần 1 lisp có nội dung sau

có 2 text (riêng biệt là số) trên màn hình (nhưng phải cùng 1 dòng)

text1 là số x, text2 là số y

lisp yêu cầu chọn 2 text này thì sẽ cho ra 1 điểm (point) trên màn hình

có toạ độ (x,y)

với chú ý: text1 ở phía trái text2 ở phía phải so với màn hình

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

Lệnh là T2P (text to point)

(defun c:t2p(  / sst text1 text2 tt1 tt2 x1 x2 gt1 gt2 gtx gty)
 (setq sst (ssget '((0 . "TEXT")))
       text1 (ssname sst 0)
       text2 (ssname sst 1)
       tt1   (entget text1)
       tt2   (entget text2)
       x1    (car (cdr (assoc 10 tt1)))
       x2    (car (cdr (assoc 10 tt2)))
       gt1   (atof (cdr (assoc 1 tt1)))
       gt2   (atof (cdr (assoc 2 tt2)))
 )
 (if (    (setq gtx gt1 gty gt2)
   (setq gtx gt2 gty gt1)
 )
 (entmake 
   (list
     (cons 0 "POINT")
     (list 10 gtx gty 0.0)
   )
 )
 (princ)
)

bạn thử dùng xem có đúng không, vì tôi đang dùng 1 máy không có ACAD và viết lisp trực tiếp trên trình duyệt không test đượ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
Lệnh là T2P (text to point)

(defun c:t2p(  / sst text1 text2 tt1 tt2 x1 x2 gt1 gt2 gtx gty)
 (setq sst (ssget '((0 . "TEXT")))
       text1 (ssname sst 0)
       text2 (ssname sst 1)
       tt1   (entget text1)
       tt2   (entget text2)
       x1    (car (cdr (assoc 10 tt1)))
       x2    (car (cdr (assoc 10 tt2)))
       gt1   (atof (cdr (assoc 1 tt1)))
      [b] gt2   (atof (cdr (assoc 2 tt2)))[/b]
 )
 (if (< x1 x2)
   (setq gtx gt1 gty gt2)
   (setq gtx gt2 gty gt1)
 )
 (entmake 
   (list
     (cons 0 "POINT")
     (list 10 gtx gty 0.0)
   )
 )
 (princ)
)

bạn thử dùng xem có đúng không, vì tôi đang dùng 1 máy không có ACAD và viết lisp trực tiếp trên trình duyệt không test được.

Ssg check lại được không bác Hoành? Chỉ có 1 sơ suất nhỏ (chỗ đánh dấu bold). Sửa lại là:

gt2 (atof (cdr (assoc 1 tt2)))

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
Ssg check lại được không bác Hoành? Chỉ có 1 sơ suất nhỏ (chỗ đánh dấu bold). Sửa lại là:

gt2 (atof (cdr (assoc 1 tt2)))

Cảm ơn Ssg nhé.

 

Khi viết lisp không có ACAD, mình cứ copy và edit theo quán tính, dòng trên là 1 thì dòng dưới là 2 :s_dead: .

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 Ssg nhé.

 

Khi viết lisp không có ACAD, mình cứ copy và edit theo quán tính, dòng trên là 1 thì dòng dưới là 2 :s_dead: .

 

Nhờ anh Hoành hướng dẫn giúp: tôi nhập theo định dạng text1(số thực),text2(số thực) và trên cùng 1 dòng, chương trình báo lỗi :

Select objects:

; error: bad argument type: lentityp nil

cảm ơn anh.

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ờ anh Hoành hướng dẫn giúp: tôi nhập theo định dạng text1(số thực),text2(số thực) và trên cùng 1 dòng, chương trình báo lỗi :

Select objects:

; error: bad argument type: lentityp nil

cảm ơn anh.

bác Vbao kiểm tra lại như sau:

- Lúc chọn có đúng là chọn 2 đối tượng không?

- Đối tượng chọn có phải là text không?

 

Nếu đúng rồi mà vẫn lỗi, Vbao có thể upload file lỗi đó lên diễn đàn được 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
bác Vbao kiểm tra lại như sau:

- Lúc chọn có đúng là chọn 2 đối tượng không?

- Đối tượng chọn có phải là text không?

 

Nếu đúng rồi mà vẫn lỗi, Vbao có thể upload file lỗi đó lên diễn đàn được không?

 

File dùng test chương trình, nhờ anh Hoành xem giúp.Thanks

http://www.cadviet.com/upfiles/test_T2P.dwg

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
File dùng test chương trình, nhờ anh Hoành xem giúp.Thanks

http://www.cadviet.com/upfiles/test_T2P.dwg

 

Nhờ anh Hoành hướng dẫn giúp tôi cách sử dụng tiện ích trên, tôi vẫn gắp lỗi nếu ghi 2 text trên cùng 1 dòng và phân cách bằng dấu phẩy (,)

Select objects:

; error: bad argument type: lentityp nil.

 

Xin cảm ơn anh.

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ờ anh Hoành hướng dẫn giúp tôi cách sử dụng tiện ích trên, tôi vẫn gắp lỗi nếu ghi 2 text trên cùng 1 dòng và phân cách bằng dấu phẩy (,)

Select objects:

; error: bad argument type: lentityp nil.

 

Xin cảm ơn anh.

 

VBao đọc kỹ yêu cầu của Xaydung:

Các bác là cao thủ lisp cho em hỏi 1 chút:

Em đang cần 1 lisp có nội dung sau

2 text (riêng biệt là số) trên màn hình (nhưng phải cùng 1 dòng)

text1 là số x, text2 là số y

lisp yêu cầu chọn 2 text này thì sẽ cho ra 1 điểm (point) trên màn hình

có toạ độ (x,y)

với chú ý: text1 ở phía trái text2 ở phía phải so với màn hình

Thanks!

Bản vẽ của Vbao chỉ là 1 text chứa cả 2 số chứ không phải 2 text mỗi text chứa 1 số như yêu cầu của Xaydung.

Vì vậy, lisp này sẽ chạy sai trong trường hợp 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
VBao đọc kỹ yêu cầu của Xaydung:

 

Bản vẽ của Vbao chỉ là 1 text chứa cả 2 số chứ không phải 2 text mỗi text chứa 1 số như yêu cầu của Xaydung.

Vì vậy, lisp này sẽ chạy sai trong trường hợp này.

 

tôi thực hiện chọn 2 số nhưng vẫn gặp lỗi :

 

Command: t2p

 

Select objects: 1 found

 

Select objects: 1 found, 2 total

 

Select objects:

; error: bad argument type: stringp nil

 

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
tôi thực hiện chọn 2 số nhưng vẫn gặp lỗi :

 

Command: t2p

 

Select objects: 1 found

 

Select objects: 1 found, 2 total

 

Select objects:

; error: bad argument type: stringp nil

 

Thanks

Xin lỗi, đoạn mã của tôi không đúng.

Vbao đọc bài của Ssg rồi sửa theo đoạn mã mới chắc chắn sẽ chạy đượ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

Các bác là cao thủ lisp cho em hỏi 1 chút:

Vẫn cái lisp trên Em đang cần thêm 1 chút :

có 2 text (riêng biệt là số) trên màn hình (nhưng phải cùng 1 dòng)

text1 là số x, text2 là số y

lisp yêu cầu chọn 2 text này thì sẽ cho ra 1 điểm (point) trên màn hình

có toạ độ (x,y)

với chú ý: text1 ở phía trái text2 ở phía phải so với màn hình

 

 

Thêm: chèn 1 text có toạ độ (x,y) vào gần point trên

 

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ác bác là cao thủ lisp cho em hỏi 1 chút:

Vẫn cái lisp trên Em đang cần thêm 1 chút :

có 2 text (riêng biệt là số) trên màn hình (nhưng phải cùng 1 dòng)

text1 là số x, text2 là số y

lisp yêu cầu chọn 2 text này thì sẽ cho ra 1 điểm (point) trên màn hình

có toạ độ (x,y)

với chú ý: text1 ở phía trái text2 ở phía phải so với màn hình

Thêm: chèn 1 text có toạ độ (x,y) vào gần point trên

 

Thanks!

 

Tên lệnh vẫn là T2P.

 

(defun c:t2p( / sst text1 text2 tt1 tt2 x1 x2 gt1 gt2 gtx gty)
(setq sst (ssget '((0 . "TEXT")))
text1 (ssname sst 0)
text2 (ssname sst 1)
tt1 (entget text1)
tt2 (entget text2)
x1 (car (cdr (assoc 10 tt1)))
x2 (car (cdr (assoc 10 tt2)))
gt1 (atof (cdr (assoc 1 tt1)))
gt2 (atof (cdr (assoc 1 tt2)))
theight (cdr (assoc 40 tt1))
)
(if ((setq gtx gt1 gty gt2)
(setq gtx gt2 gty gt1)
)
(entmake
(list
(cons 0 "POINT")
(list 10 gtx gty 0.0)
)
)
(entmake
(list
(cons 0 "TEXT")
(cons 1 (strcat "("(rtos gtx 2 2) "," (rtos gty 2 2) ")"))
(cons 40 theight)
(list 10 gtx gty 0.0)

)
)

(princ)
)

  • 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

Thanks bác, cho em hỏi thêm 1 chút

liệu có thể làm thế này được không ạ:

không phải là chọn 2 text nữa mà em chọn 4 text

ví dụ:

12 24 ( cùng 1 dòng nằm ngang)

25 50 ( cùng 1 dòng nằm ngang)

khi chạy lisp chọn các text sẽ cho ra kết quả là:

(12,24) và (25,50)

Bác Hoanh giúp em chút nữa nha?!

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
Thanks bác, cho em hỏi thêm 1 chút

liệu có thể làm thế này được không ạ:

không phải là chọn 2 text nữa mà em chọn 4 text

ví dụ:

12 24 ( cùng 1 dòng nằm ngang)

25 50 ( cùng 1 dòng nằm ngang)

khi chạy lisp chọn các text sẽ cho ra kết quả là:

(12,24) và (25,50)

Bác Hoanh giúp em chút nữa nha?!

Bạn phải làm 2 lần thôi!

 

lần thứ nhất, biến 2 text trên 1 dòng thành 1 chữ (bằng lệnh T2P).

Lần thứ 2, dùng lệnh n2text của lisp dưới đây để nối 2 text lại:

(defun c:n2text()
(entmake
(list
(cons 0 "TEXT")
(cons 1 (strcat (cdr (assoc 1 (setq tt (entget (car (entsel "\nHay vao text dau tien: ")))))) " va " (cdr (assoc 1 (entget (car (entsel "\nHay vao text thu hai: ")))))))
(cons 10 (getpoint "\nVao diem chen text ket qua: "))
(assoc 40 tt)
)
)
)

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 lỗi bác, ý em hơi khác bác à:

khi chọn toàn bộ 4 text trên thì sẽ

vẽ ra trên màn hình 2 điểm point là

(12,24); (25,50) bác giúp em chút nữa 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
Xin lỗi bác, ý em hơi khác bác à:

khi chọn toàn bộ 4 text trên thì sẽ

vẽ ra trên màn hình 2 điểm point là

(12,24); (25,50) bác giúp em chút nữa vậy!

bạn chỉ cần sửa chữ " va " thành "; " trong mã lisp vừa rồi là được.

 

Lần sau, bạn hãy nêu kỹ yêu cầu trước khi tôi viết lisp, sẽ tiện hơn cho 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

Cám ơn Bác em đang rất cần 1 lisp nữa có nội dung như sau:

trên màn hình có 9 text

A E H

B F L

C G M

khi chọn 3 text A, B, C ( chọn dạng cross windown không chạm vào E, F, G)

lisp sẽ tự động nhận ra text gần nhất so với A, B ,C theo phương ngang (là E, F, G)

và kết quả trên màn hình lúc này là là

A,E H

B,F L

C,G M

bác xem giúp em nha!

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 em đang rất cần 1 lisp nữa có nội dung như sau:

trên màn hình có 9 text

A E H

B F L

C G M

khi chọn 3 text A, B, C ( chọn dạng cross windown không chạm vào E, F, G)

lisp sẽ tự động nhận ra text gần nhất so với A, B ,C theo phương ngang (là E, F, G)

và kết quả trên màn hình lúc này là là

A,E H

B,F L

C,G M

bác xem giúp em nha!

 

Lệnh là NTH, bạn chọn luôn 1 lúc 9 text, chương trình sẽ tự động nhận biết các đối tượng nằm ở đâu.

(defun c:nth ()
 (defun ss2ent	(ss / sodt index lstent)
   (setq
     sodt  (cond
      (ss (sslength ss))
      (t 0)
    )
     index 0
   )
   (repeat sodt
     (setq ent	   (ssname ss index)
    index  (1+ index)
    lstent (cons ent lstent)
     )
   )
   (reverse lstent)
 )
 (princ "\nNoi Text thanh Hang © CADViet.com")
 (setq	sst    (ssget '((0 . "TEXT")))
lstent (ss2ent sst)
tttext (entget (car lstent))
height (cdr (assoc 40 (entget (car lstent))))
lstent (mapcar '(lambda	(x)
		  (cons	(cdr (assoc 10 (entget x)))
			(cdr (assoc 1 (entget x)))
		  )
		)
	       lstent
       )
pmin   nil
 )

 (foreach pp lstent
   (if	(or (not pmin)
    (> (caar pmin) (caar pp))
)
     (setq pmin pp)
   )
 )
 (setq
   tapdiem    (list pmin)
   lsttapdiem (list tapdiem)
 )
 (foreach pp lstent
   (setq tdluu nil)
   (foreach tapdiem lsttapdiem
     (setq ploai (car tapdiem))
     (if (	(setq tdluu tapdiem)
     )
   )
   (if	tdluu
     (if (not (member pp tdluu))
(setq lsttapdiem
       (subst (append tdluu (list pp)) tdluu lsttapdiem)
)
     )
     (setq lsttapdiem (append lsttapdiem (list (list pp))))
   )
 )
 (foreach tapdiem lsttapdiem
   (setq tapdiem (vl-sort tapdiem '(lambda (x1 x2) (    (setq strht (strcat (cdr (car tapdiem)) ","))
   (foreach pp	(cdr tapdiem)
     (setq strht (strcat strht (cdr pp) " "))
   )
   (setq strht (substr strht 1 (1- (strlen strht))))    
   (princ strht)
   (setq tttext (subst (cons 10 (car (car tapdiem))) (assoc 10 tttext) tttext)
  tttext (subst (cons 1 strht) (assoc 1 tttext) tttext))

   (entmake tttext)
   (princ "\n")
 )
 (command ".erase" sst "")
 (princ)
)
(princ "\nNTH - free lisp from www.cadviet.com")
(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

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

×