Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
18 replies to this topic

#1 xaydung

xaydung

    biết lệnh trim

  • Members
  • PipPipPip
  • 191 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 01 August 2007 - 11:47 PM

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

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 02 August 2007 - 09:11 AM

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

#3 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 02 August 2007 - 09:46 AM

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

#4 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 02 August 2007 - 10:46 AM

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

#5 vbao

vbao

    biết lệnh array

  • CADViet Team
  • PipPipPip
  • 184 Bài viết
Điểm đánh giá: 80 (tàm tạm)

Đã gửi 02 August 2007 - 11:37 PM

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

#6 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 03 August 2007 - 12:20 AM

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

#7 vbao

vbao

    biết lệnh array

  • CADViet Team
  • PipPipPip
  • 184 Bài viết
Điểm đánh giá: 80 (tàm tạm)

Đã gửi 03 August 2007 - 07:09 PM

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

#8 vbao

vbao

    biết lệnh array

  • CADViet Team
  • PipPipPip
  • 184 Bài viết
Điểm đánh giá: 80 (tàm tạm)

Đã gửi 07 August 2007 - 09:41 PM

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

#9 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 08 August 2007 - 01:37 AM

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

#10 vbao

vbao

    biết lệnh array

  • CADViet Team
  • PipPipPip
  • 184 Bài viết
Điểm đánh giá: 80 (tàm tạm)

Đã gửi 08 August 2007 - 05:22 AM

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

#11 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 08 August 2007 - 07:19 AM

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

#12 xaydung

xaydung

    biết lệnh trim

  • Members
  • PipPipPip
  • 191 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 10 August 2007 - 09:56 PM

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

#13 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 10 August 2007 - 10:43 PM

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 (< x1 x2)
(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)
)

  • 1

#14 xaydung

xaydung

    biết lệnh trim

  • Members
  • PipPipPip
  • 191 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 11 August 2007 - 10:34 AM

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?!
  • 0

#15 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 11 August 2007 - 09:22 PM

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

  • 0

#16 xaydung

xaydung

    biết lệnh trim

  • Members
  • PipPipPip
  • 191 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 11 August 2007 - 09:45 PM

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

#17 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 11 August 2007 - 09:56 PM

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

#18 xaydung

xaydung

    biết lệnh trim

  • Members
  • PipPipPip
  • 191 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 14 August 2007 - 08:34 AM

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

#19 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 14 August 2007 - 09:29 AM

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 (< (abs (- (cadr (car pp)) (cadr (car ploai)))) height)
(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) (< (caar x1) (caar 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)

  • 0