Đến nội dung


Hình ảnh
- - - - -

[yêu cầu ] lisp nối text tự động !


  • Please log in to reply
30 replies to this topic

#1 leejang

leejang

    biết lệnh move

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

Đã gửi 10 July 2012 - 02:03 PM

Em đang cần cái lisp nối text với các yêu cầu cụ thể như sau:
giả sử text 1 =15, text 2=25 và bây giờ cần nối 2 text này lại thành 15,25
tức là sẽ thêm dấu phẩy đằng sau text 1. Lisp sẽ tự động nối các text lại với nhau nếu khoảng cách giữa 2 text = giá trị ta nhập vào.
text có tọa độ X nhỏ hơn sẽ là text 1, và text có tọa độ x lớn sẽ là text 2 ( phần sau dấu phẩy )
command: nt
khoang cach noi d=:
select object:
Kết quả là lisp sẽ so sánh các text nào cách nhau 1 đoạn = d thì sẽ nối lại. Text có x nhỏ sẽ là text 1,
Lisp này sử dụng cho các bình đồ bị explode bằng autocad, các text cao độ bị vỡ. Mong các anh trên diễn đàn giúp đỡ. Xin đừng xóa bài của em. Nếu xóa xin cho em biết lý do ?
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 10 July 2012 - 02:12 PM

Mình Hide bài của bạn.
Lý do :
1 - không hình ảnh hoặc file mô tả.
2 - Lisp đã được viết rất nhiều trên diễn đàn - bạn hãy tìm kiếm với các từ nối text
  • 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


#3 leejang

leejang

    biết lệnh move

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

Đã gửi 10 July 2012 - 03:11 PM

Trên diễn đàn đã từng viết lisp dạng này. em đã từng tải về và dùng thử song không đúng yêu cầu và không chạy được. Còn về hình ảnh minh họa cho yêu cầu này thì rõ ràng là em đã diễn đạt được rồi, không thể dùng hình ảnh để vẽ text. Xin phép Ban quản trị không xóa bài của em !
  • 0

#4 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 10 July 2012 - 03:23 PM

Có thật là bạn diễn đạt đủ rồi k ?
- Text bạn chọn lần lượt từng cặp một hay quét chọn ?
- Khoảng cách d tính từ tâm text tới text hay từ viền đến viền hay từ Insertion Point đến InsertioPoint hay từ AlignmentPoint đến ALignment Point ?
- Text nối xong nó nằm ở đâu ?
- Text cũ thì để hay bỏ ?
- File để người ta test của bạn đâu ???
- Sao có lisp tương tự rồi bạn không hỏi tại chính topic đó
....

Mới bữa trước mình send bài yêu cầu Lisp nhưng lại để tiền tố [Text] của bạn vào thùng rác xong, nhưng bạn vẫn vô tư như chưa biết ?

Không phải lần đầu bạn yêu cầu, mà rất rất nhiều lần rồi - từ khi mình còn chưa bắt đầu học lisp đến bây giờ - Mong bạn chú ý cho !
  • 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


#5 leejang

leejang

    biết lệnh move

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

Đã gửi 10 July 2012 - 03:54 PM

- xin lỗi anh KETXU, vì hôm trước em viết yêu cầu bị đưa vào thùng rác nên em nghĩ đã diễn đạt đủ. hic. Em xin update lại như sau:
- text quét chọn all
- khoảng cách text d tính từ tâm text tới text hay từ viền đến viền hay từ Insertion Point đến InsertioPoint hay từ AlignmentPoint đến ALignment Point em nghĩ nó giống nhau ? Cái này em cũng không hiểu lắm. Xin gửi file lên để các anh ngâm cứu.
- text 1 =15 có x nhỏ sẽ là phần bên trái dấu phẩy , text 2=25 có X lớn sẽ là phần thập phân sau khi nối , text nối xong ghi đè vào text 1 và text 2 bị xóa đi.
đây là file Text : http://www.mediafire...0be6iraymbmdzzo

15 25 sẽ nối thành 15.25 và ghi đè vào 15, xóa 25 đi
  • 0

#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 10 July 2012 - 09:17 PM

Lisp nối Text? Riêng tôi đã có tới 4 lisp nối text trên Cadviet. Bạn vào các link dưới đây xem link nào phù hợp thì dùng, hoặc link nào gần phù hợp thì y/c sửa. Tôi sẽ sửa cho (để tránh loãng 4rum).
http://www.cadviet.c...80
http://www.cadviet.c...60
http://www.cadviet.c...=0
http://www.cadviet.c...40
  • 1

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


#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 10 July 2012 - 10:38 PM

- xin lỗi anh KETXU, vì hôm trước em viết yêu cầu bị đưa vào thùng rác nên em nghĩ đã diễn đạt đủ. hic. Em xin update lại như sau:
- text quét chọn all
- khoảng cách text d tính từ tâm text tới text hay từ viền đến viền hay từ Insertion Point đến InsertioPoint hay từ AlignmentPoint đến ALignment Point em nghĩ nó giống nhau ? Cái này em cũng không hiểu lắm. Xin gửi file lên để các anh ngâm cứu.
- text 1 =15 có x nhỏ sẽ là phần bên trái dấu phẩy , text 2=25 có X lớn sẽ là phần thập phân sau khi nối , text nối xong ghi đè vào text 1 và text 2 bị xóa đi.
đây là file Text : http://www.mediafire...0be6iraymbmdzzo

15 25 sẽ nối thành 15.25 và ghi đè vào 15, xóa 25 đi

- Yêu cầu của bạn mình viết không đến 10p, nhưng - như mình đã nói - Bạn yêu cầu lisp tính khoảng cách chính xác để nối (chính xác tức là hoàn toàn), mà bạn lại chẳng biết là phải tính khoảng cách đó như thế nào, thì cái d bạn lấy ở đâu ra mà nhập ????
=> Đề nghị bạn vẽ cái đoạn mà bạn cho rằng nó bằng d ra

- Nếu bạn chưa biết thế nào là InsertionPoint, AlignmentPoint, Viền bao text thì thật đáng ngại. Khoảng cách là cái j đây ??
  • 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


#8 leejang

leejang

    biết lệnh move

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

Đã gửi 11 July 2012 - 04:47 AM

Khoảng cách d đó do người dùng nhập vào " tính theo phương X, không tính là khoảng cách theo mọi phương để tránh nối nhầm", để tổng quát bài toán và mọi người sử dụng được thì ta sẽ phân làm 2 trường hợp lựa chọn, Lựa chọn 1: lisp sẽ nối 2 text có khoảng cách <d lại với nhau, Lựa chọn 2: lisp chỉ nối các text cánh nhau 1 đoạn đúng bằng d. cái khoảng cách d em đo sử dụng bắt điểm insert, nó là giá trị cố định. ( với cái file text em gửi thì phải chuyển toàn bộ Justify của text về left )

command: nt
khoang cach noi d=:
Nối text cách nhau = d bấm 1; nối text cách nhau <d bấm 2
select object:
  • 0

#9 leejang

leejang

    biết lệnh move

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

Đã gửi 11 July 2012 - 04:59 AM

Lisp nối Text? Riêng tôi đã có tới 4 lisp nối text trên Cadviet. Bạn vào các link dưới đây xem link nào phù hợp thì dùng, hoặc link nào gần phù hợp thì y/c sửa. Tôi sẽ sửa cho (để tránh loãng 4rum).
http://www.cadviet.c...80
http://www.cadviet.c...60
http://www.cadviet.c...=0
http://www.cadviet.c...40

Em đã thử tất cả các lisp nối text của anh và anh Ketxu viết nhưng mà không nối được đúng trong bài toán này. Có cái lisp "Ha" của anh là dạng gần giống bài toán này nhất, nhưng mà nó không nối được. Cái file text cần nối http://www.mediafire...0be6iraymbmdzzo
Em nghiên cứu cái file text cần nối đó thì thấy rằng mình nối tự động bằng cách nối các text cách nhau 1 đoạn <d (lựa chọn 1) hoặc nối các text cách nhau =d ( lựa chọn 2) theo phương X thì sẽ cho kết quả chuẩn nhất.
  • 0

#10 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 11 July 2012 - 11:29 AM

Em đã thử tất cả các lisp nối text của anh và anh Ketxu viết nhưng mà không nối được đúng trong bài toán này. Có cái lisp &quot;Ha&quot; của anh là dạng gần giống bài toán này nhất, nhưng mà nó không nối được. Cái file text cần nối http://www.mediafire...0be6iraymbmdzzo Em nghiên cứu cái file text cần nối đó thì thấy rằng mình nối tự động bằng cách nối các text cách nhau 1 đoạn &lt;d (lựa chọn 1) hoặc nối các text cách nhau =d ( lựa chọn 2) theo phương X thì sẽ cho kết quả chuẩn nhất.

Hề hề hề,
Có phải bạn cần cái này không???

(defun c:ntm ( / oldos sst d p1 p2 t1 n et et1 t2 )
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq sst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 72 2)))))
(foreach tx sst
(setq et (entget tx)
d (distance (car (textbox et)) (cadr (textbox et)))
p1 (cdr (assoc 10 et))
p2 (list (+ (car p1) d) (+ (cadr p1) (cdr (assoc 40 et))))
t1 (cdr (assoc 1 et))
n (sslength (setq ss1 (ssget "c" p1 p2 (list (cons 0 "text") (cons 72 0)))))
)
(if (= n 1)
(progn
(setq et1 (entget (ssname ss1 0))
t2 (strcat t1 "." (cdr (assoc 1 et1)))
et (subst (cons 1 t2) (assoc 1 et) et)
)
(entmod et)
(command "erase" ss1 "")
)
)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Chúc bạn vui và hy vọng rằng lần post bài sau bạn sẽ tuân thủ đúng nối quy của diển đàn. Đừng vì cái tôi của mình mà làm diễn đàn lộn xộn hơn và mất vui bạn nhé.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#11 leejang

leejang

    biết lệnh move

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

Đã gửi 11 July 2012 - 01:31 PM

cảm ơn anh Phamthanhbinh, nhưng lisp của anh không nối được text em đã post kèm file lên ạ và không có mục nhập khoảng cách text để nối! anh xem lại giúp em với !
  • 0

#12 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 11 July 2012 - 02:48 PM

cảm ơn anh Phamthanhbinh, nhưng lisp của anh không nối được text em đã post kèm file lên ạ và không có mục nhập khoảng cách text để nối! anh xem lại giúp em với !

Hề hề hề,
Bạn nói không nối được là sao?? Hay bạn chưa thử??? Mình đã check trên bản vẽ bạn gửi thấy nó nối lia chia mà.
Tuy nhiên nó còn lỗi khi bản vẽ của bạn có chứa các text trùng nhau.
Mình đã fix lại lỗi này trong lisp đưới đây và test lại trên bản vẽ bạn gửi thì đạt kết quả >99%. Chỉ còn một số text chưa được nối do chùng trùng nhau quá hớp mà lisp không biết chọn text nào để nối cũng như các cụm text mà hai text cách nhau quá xa (lớn hơn kích thước textbox). Trường hợp này bạn phải xử lý bằng tay thôi.

(defun c:ntm ( / oldos sst d p1 p2 t1 n et et1 t2 ss1)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq sst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 72 2)))))
(foreach tx sst
(setq n nil)
(setq et (entget tx)
d (distance (car (textbox et)) (cadr (textbox et)))
p1 (cdr (assoc 10 et))
p2 (list (+ (car p1) d) (+ (cadr p1) (cdr (assoc 40 et))))
t1 (cdr (assoc 1 et))
ss1 (ssget "c" p1 p2 (list (cons 0 "text") (cons 72 0)))

)
(if ss1 (setq n (sslength ss1)) )
(if (= n 1)
(progn
(setq et1 (entget (ssname ss1 0))
t2 (strcat t1 "." (cdr (assoc 1 et1)))
et (subst (cons 1 t2) (assoc 1 et) et)
)
(entmod et)
(command "erase" ss1 "")
)
)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)


Đây là hình ảnh kết quả. Chú ý cái vòng tròn màu đỏ.
http://www.cadviet.c...3/5194_test.jpg
http://www.cadviet.c.../5194_test2.jpg

Bạn chú y là líp viết cho các bản vẽ có cấu tạo các text đúng như bản vẽ bạn đã gửi. Nếu text có cấu tạo khác thì mình không đảm bảo lisp sẽ làm việc đúng.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#13 leejang

leejang

    biết lệnh move

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

Đã gửi 11 July 2012 - 03:24 PM

Lúc trước em đã thử rồi mới nói chứ ạ, nhưng lisp không nối được do xung với lisp của em mà em không biết.Đúng là lisp có nối được. nhưng mà lisp chạy ko ổn định lúc chạy lúc không ? Do cách quét đối tượng sao ý ? quét ít text thì thường ko nối được. Em thấy cách quét đối tượng ở đây có ảnh hưởng đến việc chạy lisp ? không biết anh Nguyenthanhbinh có lời khuyên nào về cách quét đối tượng không ạ ?
Khi đổi 2 text đều có justify là left thì lisp không nối được mặc dù các text xích lại gần nhau hơn ???
Và khi một số cặp text có khoảng cách xa nhau cũng không nối được ? => chưa đúng đề bài đặt ra là nối text cách nhau <d ( trường hợp tổng quát nhất ) ?
  • 0

#14 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 11 July 2012 - 04:24 PM

Lúc trước em đã thử rồi mới nói chứ ạ, nhưng lisp không nối được do xung với lisp của em mà em không biết.Đúng là lisp có nối được. nhưng mà lisp chạy ko ổn định lúc chạy lúc không ? Do cách quét đối tượng sao ý ? quét ít text thì thường ko nối được. Em thấy cách quét đối tượng ở đây có ảnh hưởng đến việc chạy lisp ? không biết anh Nguyenthanhbinh có lời khuyên nào về cách quét đối tượng không ạ ?
Khi đổi 2 text đều có justify là left thì lisp không nối được mặc dù các text xích lại gần nhau hơn ???
Và khi một số cặp text có khoảng cách xa nhau cũng không nối được ? => chưa đúng đề bài đặt ra là nối text cách nhau <d ( trường hợp tổng quát nhất ) ?

Hề hề hề,
1/- Cách quét chọn đối tượng chả ảnh hưởng gì tới kết quả đâu.
2/- Như đã nói ở bài post trức, lisp chỉ nối khi text đứng trước có mã DXF 72 là 2 và text đứng sau có mã dxf 72 là 0. Nếu bạn thay đổi cái này thì lisp không nối là đương nhiên. Nếu bạn muốn nối mọi text thì việc phân loại text cần làm khác.
3/- Khi hai text quá xa nhau thì đương nhiên là không nối như bài trước mình đã post. Đề bài của bạn không hề cho biết d được xác định kiểu gì, ở đây mình chọn d là kích thước đường chóe của textbox. nếu bạn muốn tăng nó lên thì tăng bao nhiêu là đủ??? 2d 3d, 4d.... nếu tăng quá lớn e rằng text sẽ chơi nhầm vợ thằng khác.
4/- Đại thể cái lisp của mình là vậy, mình giải thích để bạn biết và tự sửa theo những gì bạn muốn. Mình hết hứng với yêu cầu của bạn rồi.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#15 leejang

leejang

    biết lệnh move

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

Đã gửi 11 July 2012 - 08:50 PM

hic. Anh hết hứng thì em cũng xin chịu rồi. Nhưng em đã nói ở trên là khoảng cách D do người dùng nhập vào rồi mà. Anh không đọc kỹ thôi. Còn để tổng quát bài toán để có thể áp dụng trong trường hợp khác được thì làm sao để với những text có mã DXF khác nhau nó nối được thì mọi người mới dùng được ạ ?
  • 0

#16 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 July 2012 - 10:02 PM

hic. Anh hết hứng thì em cũng xin chịu rồi. Nhưng em đã nói ở trên là khoảng cách D do người dùng nhập vào rồi mà. Anh không đọc kỹ thôi. Còn để tổng quát bài toán để có thể áp dụng trong trường hợp khác được thì làm sao để với những text có mã DXF khác nhau nó nối được thì mọi người mới dùng được ạ ?

@Giang : không ai nghi ngờ sự nhiệt tình của bác Bình, vậy mà .. Bảo sao ...
Mình nhắc lại với riêng G lần nữa, nếu sau này bạn có cần sự giúp đỡ của CV, hãy suy nghĩ về cách đặt vấn đề của mình. Những bài thiếu rõ ràng hoặc chứng tỏ sự hời hợt sẽ bị xóa thẳng tay.

Code nhanh cho bạn lisp này, khi hỏi d thì bạn nhập hoặc đo d như thế nào tùy cách bạn định nghĩa khoảng cách Text, nhập sai thì k nên trách lisp làm việc sai ý bạn. Khi kiểm tra nó sẽ so sánh INSERTION POINT
- Khi hỏi = d hay <=d, nếu bạn đánh < hoặc space thì tự động hiểu là <= d thì nối. Nếu đánh chữ nào khác thì tính là bằng (TUYỆT ĐỐI)


(defun c:test(/ lstObj d ans ins! tObj tam isFound lstObj lstRs)
(setq lstObj (mapcar 'vlax-ename->vla-object (acet-ss-to-list (ssget (list (cons 0 "*TEXT")))))
d (getdist "\nKhoang cach :")
ans (getstring "\n<=d hay =d ? [<] :")
)
(defun ins!(e)(vlax-get e 'Insertionpoint))
(while (setq tObj (car lstObj))
(setq tam (ins! tObj))
(cond ((setq isFound (vl-member-if '(lambda(x)(and (setq kc (- (distance (ins! x) tam) d))(if (wcmatch ans ",<")(not (minusp kc))(zerop kc))))
(setq lstObj (cdr lstObj))))
(setq isFound (vl-sort isFound '(lambda(x y)(< (distance (ins! x) tam)(distance (ins! y) tam))))
lstObj (vl-remove (car isFound) lstObj)
lstRs (vl-sort (list tobj (car isFound)) '(lambda(x y)(< (car (ins! x))(car (ins! y))))))
(vla-put-textstring (car lstRs)
(strcat
(vla-get-textstring (car lstRs)) ","
(vla-get-textstring (last lstRs))
)
)
(vla-delete (last lstRs))
)
)
)
)

- Mình cũng k kiểm tra text của bạn là số hay không đâu, dù công việc đó vô cùng đơn giản, nhưng bạn yêu cầu là text quét chọn all
- Mình cũng nói luôn là bạn định nối các text theo khoảng cách phương x thì sẽ sai bét. Tự bạn tìm hiểu nguyên nhân nhé :")

Chúc bạn may mắn
  • 2

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


#17 leejang

leejang

    biết lệnh move

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

Đã gửi 12 July 2012 - 04:59 AM

Cảm ơn anh Ketxu, lisp chạy tốt lắm. Nhưng anh cho em hỏi thêm là cái khoảng cách giữa 2 text đó nó tính bằng đơn vị như thế nào vậy ? bởi vì em đo bằng Di thì khoảng cách insert point = 1.6 nhưng mình nhập giá trị 0.000001 và và chọn < mà nó vẫn nối được ? Còn ở trên em nói là tính khoảng cách theo phương X với mục đích để tránh nó lấy nhầm vợ thằng khác đó ạ. bởi vì các text bị vỡ có đặc điểm là nó có cùng tọa độ y nên mình mới có thể lấy khoảng cách theo X.
Còn trường hợp kiểm tra text là số thì em hoàn toàn có thể tự làm được ạ.
cảm ơn các anh trên diễn đàn ạ, em có gì không phải thì các anh bỏ qua nhé !
  • 0

#18 840244

840244

    biết zoom

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

Đã gửi 12 July 2012 - 05:05 AM

Ủng hộ anh Ketxu, cái ông leejang này hơi lòng vòng nhưng mà cái lisp này rất hữu ích mà em đang cần. Cảm ơn diễn đàn nhé. Chúc mấy anh trên diễn đàn mạnh khỏe.
  • 0

#19 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 July 2012 - 08:14 AM

Cảm ơn anh Ketxu, lisp chạy tốt lắm. Nhưng anh cho em hỏi thêm là cái khoảng cách giữa 2 text đó nó tính bằng đơn vị như thế nào vậy ? bởi vì em đo bằng Di thì khoảng cách insert point = 1.6 nhưng mình nhập giá trị 0.000001 và và chọn < mà nó vẫn nối được ?

Sorry bạn, code nhanh quá nên mình sai chỗ này : (not (minusp kc)). Bạn xóa (not) đi, để lại là (minusp kc) thôi hoặc cho chữ d ra đằng trước (distance (ins! x) tam)
Ý nghĩa đoạn này là khi chọn nhỏ hơn thì khoảng cách giữa 2 text - số d bạn nhập vào ra kết quả âm
  • 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


#20 leejang

leejang

    biết lệnh move

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

Đã gửi 12 July 2012 - 10:39 AM

Em đã xóa chữ not đi, nhưng xóa xong thì ko chạy luôn ạ.
khi chạy thì nó báo lỗi như sau:

Command: di DIST Specify first point: Specify second point:
Distance = 1.60, Angle in XY Plane = 0d0'0", Angle from XY Plane = 0d0'0" ' đoạn này em đo khoảng cách text
Delta X = 1.60, Delta Y = 0.00, Delta Z = 0.00
Command: ntt
Select objects: Specify opposite corner: 36 found
Select objects:
Khoang cach :1.6
<=d hay =d ? [<] :
; error: bad function: T

đây là code đã xóa đi

(defun c:ntt(/ lstObj d ans ins! tObj tam isFound lstObj lstRs)
(setq lstObj (mapcar 'vlax-ename->vla-object (acet-ss-to-list (ssget (list (cons 0 "*TEXT")))))
d (getdist "\nKhoang cach :")
ans (getstring "\n<=d hay =d ? [<] :")
)
(defun ins!(e)(vlax-get e 'Insertionpoint))
(while (setq tObj (car lstObj))
(setq tam (ins! tObj))
(cond ((setq isFound (vl-member-if '(lambda(x)(and (setq kc (- (distance (ins! x) tam) d))(if (wcmatch ans ",<")((minusp kc))(zerop kc))))
(setq lstObj (cdr lstObj))))
(setq isFound (vl-sort isFound '(lambda(x y)(< (distance (ins! x) tam)(distance (ins! y) tam))))
lstObj (vl-remove (car isFound) lstObj)
lstRs (vl-sort (list tobj (car isFound)) '(lambda(x y)(< (car (ins! x))(car (ins! y))))))
(vla-put-textstring (car lstRs)
(strcat
(vla-get-textstring (car lstRs)) "."
(vla-get-textstring (last lstRs))
)
)
(vla-delete (last lstRs))
)
)
)
)




Còn đây là phương án cho chữ d ra đằng trước, khi chạy thì nó chạy bình thường nhưng khoảng cách điểm chèn text là 1.57 đo = di nhưng nhập vào 0.1 vẫn chạy ok.
Delta X = 1.57, Delta Y = -0.30, Delta Z = 0.00
Command: ntt
Select objects: Specify opposite corner: 4 found
Select objects:
Khoang cach :0.1
<=d hay =d ? [<] :<
nil

code

;;;=========== noi text
(defun c:ntt(/ lstObj d ans ins! tObj tam isFound lstObj lstRs)
(setq lstObj (mapcar 'vlax-ename->vla-object (acet-ss-to-list (ssget (list (cons 0 "*TEXT")))))
d (getdist "\nKhoang cach :")
ans (getstring "\n<=d hay =d ? [<] :")
)
(defun ins!(e)(vlax-get e 'Insertionpoint))
(while (setq tObj (car lstObj))
(setq tam (ins! tObj))
(cond ((setq isFound (vl-member-if '(lambda(x)(and (setq kc (- (distance (ins! x) tam) d))(if (wcmatch ans ",<")(not (minusp kc))(zerop kc))))
(setq lstObj (cdr lstObj))))
(setq isFound (vl-sort isFound '(lambda(x y)(< d (distance (ins! x) tam)(distance (ins! y) tam))))
lstObj (vl-remove (car isFound) lstObj)
lstRs (vl-sort (list tobj (car isFound)) '(lambda(x y)(< (car (ins! x))(car (ins! y))))))
(vla-put-textstring (car lstRs)
(strcat
(vla-get-textstring (car lstRs)) "."
(vla-get-textstring (last lstRs))
)
)
(vla-delete (last lstRs))
)
)
)
)
  • 0