Đến nội dung


Hình ảnh
- - - - -

[yêu cầu] LISP tìm & hiệu chỉnh nhóm TEXT


  • Please log in to reply
14 replies to this topic

#1 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 07 April 2013 - 11:32 PM

Xin chào các bác!

Cho em được hỏi vấn đề này, em cần một chương trình autoLISP với mục đích như sau:
Hoàn cảnh: Trong bản vẽ hiện đang có nhiều nhóm (như hình vẽ) nằm rãi rác.

[Vui lòng xem Hình 1 trong file songnhi.dwg đính kèm]

Trong đó: 1/- Kích thước và vị trí tương đối của các TEXT được ghi cụ thể trong hình.
                 2/- Ngoài nhóm SA6, còn có các nhóm khác: SA1; SA2;... SB1; SB2;... S1; S2... FS1; FS8... Cùng thuộc layer: ki_hieu.
Yêu cầu:  3/- Dữ kiện đầu vào:
                      3.1/- Nhóm text (không phân biệt chữ thường và chữ hoa). Ví dụ: sa6 hoặc Sa6; sA6; SA6 đều được hiểu là nhóm TEXT được minh họa trong hình vẽ.
                      3.2/- Giá trị biến đổi: <-1> or <+1>, nhập giá trị dương hay âm.
                      3.3/- Vùng giới hạn thao tác.
                 4/- Chương trình sẽ truy tìm trong vùng giới hạn thao tác (3.3) các nhóm TEXT đúng yêu cầu, sau đó hiệu chỉnh giá trị thứ ba (Ví dụ: sa6 → giá trị thứ ba là 6). Nhóm TEXT nào phù hợp với dữ kiện đầu vào thì giá trị thứ 3 thì được hiệu chỉnh, sau khi hiệu chỉnh xong → được đổi ra màu xanh (Green) in ra màn hình.

Ví dụ: Mời các bác xem hình minh họa:

[Vui lòng xem Hình 2 trong file songnhi.dwg đính kèm]

Trường hợp 1: sa6
Truy tìm trong vùng giới hạn thao tác (3.3) những nhóm TEXT có giá trị thứ nhất là S → Truy tìm trong số đó những nhóm có giá trị thứ hai là A → Trong các nhóm đó, nếu nhóm nào có giá trị thứ ba ≥ 6 thì hiệu chỉnh bằng: giá trị hiện tại + giá trị biến đổi (3.2).

Trường hợp 2: f7
Truy tìm trong vùng giới hạn thao tác (3.3) những nhóm TEXT có giá trị thứ nhất là F → Truy tìm trong số đó những nhóm có giá trị thứ hai là nil (nếu giá trị này khác nil thì nhóm này xem như không phù hợp bị loại khỏi danh sách truy tìm của bước tiếp theo sau đây) → Trong các nhóm đó, nếu nhóm nào có giá trị thứ ba ≥ 7 thì hiệu chỉnh bằng: giá trị hiện tại + giá trị biến đổi (3.2).

 

 Đính kèm: http://www.cadviet.c...7_songnhi_3.dwg


Xin chân thành cám ơn các bác đã dành thời gian đọc!

 


  • 2

#2 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 643 Bài viết
Điểm đánh giá: 224 (khá)

Đã gửi 08 April 2013 - 12:24 PM

Tạm thời mình chưa thử, hi vọng có mem khác giúp bạn, Nhưng trước hết phải nói cảm ơn bạn cái đã

Mình thích những bài như thế này, rất kỳ công, rất dễ hiểu, những bài đăng có chung nội dung yêu cầu, nhờ giúp nên có tác phong  chuẩn bị như thế này, mình phải học hỏi bạn nhiều. hi hì

Nếu có mục Form topic (chứa các topic mẫu, topic tiêu biểu) mình nghĩ mình sẽ ủng hộ cho bài này lên đầu. Nhờ các thành viên Cad vì sự cố gắng của chủ pic giúp đỡ tận tình

:D


  • 1

#3 Hoan1111

Hoan1111

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2587 Bài viết
Điểm đánh giá: 692 (tốt)

Đã gửi 08 April 2013 - 01:24 PM

Tạm thời mình chưa thử, hi vọng có mem khác giúp bạn, Nhưng trước hết phải nói cảm ơn bạn cái đã

Mình thích những bài như thế này, rất kỳ công, rất dễ hiểu, những bài đăng có chung nội dung yêu cầu, nhờ giúp nên có tác phong  chuẩn bị như thế này, mình phải học hỏi bạn nhiều. hi hì

Nếu có mục Form topic (chứa các topic mẫu, topic tiêu biểu) mình nghĩ mình sẽ ủng hộ cho bài này lên đầu. Nhờ các thành viên Cad vì sự cố gắng của chủ pic giúp đỡ tận tình

:D

 

Thú thực là em rất thích cách trình bầy bài viết, rõ ràng từng khoản mục và em đã like this, chỉ có điều xem file bản vẽ em lại chẳng hiểu gì cả!


  • 1

66 Câu Phật Học Cho Cuộc Sống : http://ngocchinh.com...-cho-cuoc-song/

Gió đưa cây cải về trời / Rau răm ở lại chịu lời đắng cay...

 

 


#4 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 08 April 2013 - 02:04 PM

Xin chào các bác!

Cho em được hỏi vấn đề này, em cần một chương trình autoLISP với mục đích như sau:
Hoàn cảnh: Trong bản vẽ hiện đang có nhiều nhóm (như hình vẽ) nằm rãi rác.

[Vui lòng xem Hình 1 trong file songnhi.dwg đính kèm]

Trong đó: 1/- Kích thước và vị trí tương đối của các TEXT được ghi cụ thể trong hình.
                 2/- Ngoài nhóm SA6, còn có các nhóm khác: SA1; SA2;... SB1; SB2;... S1; S2... FS1; FS8... Cùng thuộc layer: ki_hieu.
Yêu cầu:  3/- Dữ kiện đầu vào:
                      3.1/- Nhóm text (không phân biệt chữ thường và chữ hoa). Ví dụ: sa6 hoặc Sa6; sA6; SA6 đều được hiểu là nhóm TEXT được minh họa trong hình vẽ.
                      3.2/- Giá trị biến đổi: <-1> or <+1>, nhập giá trị dương hay âm.
                      3.3/- Vùng giới hạn thao tác.
                 4/- Chương trình sẽ truy tìm trong vùng giới hạn thao tác (3.3) các nhóm TEXT đúng yêu cầu, sau đó hiệu chỉnh giá trị thứ ba (Ví dụ: sa6 → giá trị thứ ba là 6). Nhóm TEXT nào phù hợp với dữ kiện đầu vào thì giá trị thứ 3 thì được hiệu chỉnh, sau khi hiệu chỉnh xong → được đổi ra màu xanh (Green) in ra màn hình.

Ví dụ: Mời các bác xem hình minh họa:

[Vui lòng xem Hình 2 trong file songnhi.dwg đính kèm]

Trường hợp 1: sa6
Truy tìm trong vùng giới hạn thao tác (3.3) những nhóm TEXT có giá trị thứ nhất là S → Truy tìm trong số đó những nhóm có giá trị thứ hai là A → Trong các nhóm đó, nếu nhóm nào có giá trị thứ ba ≥ 6 thì hiệu chỉnh bằng: giá trị hiện tại + giá trị biến đổi (3.2).

Trường hợp 2: f7
Truy tìm trong vùng giới hạn thao tác (3.3) những nhóm TEXT có giá trị thứ nhất là F → Truy tìm trong số đó những nhóm có giá trị thứ hai là nil (nếu giá trị này khác nil thì nhóm này xem như không phù hợp bị loại khỏi danh sách truy tìm của bước tiếp theo sau đây) → Trong các nhóm đó, nếu nhóm nào có giá trị thứ ba ≥ 7 thì hiệu chỉnh bằng: giá trị hiện tại + giá trị biến đổi (3.2).

 

 Đính kèm: http://www.cadviet.c...7_songnhi_3.dwg


Xin chân thành cám ơn các bác đã dành thời gian đọc!

 

Hề hề hề.

Trước hết, bạn phải gửi cái file có chứa các nhóm text cần chỉnh lên để mọi người xem xét và test lisp mới giúp bạn được.

Trong bản vẽ bạn gửi có sự mâu thuẫn với bài viết của bạn. Hình 1 bạn nói rằng các nhóm text có các kích thước tương đối là cố định. Nhưng sang hình 2 thì các nhóm text này lại bị thu nhỏ lại. vậy các nhóm text thực sự trên bản vẽ của bạn cần hiệu chỉnh là như thế nào.???

Bạn trình bày các thủ tục tiến hành khà cụ thể như vậy, nếu lisp có cấu trúc khác mà vẫn đảm bảo yêu cầu của bạn thì sao nhỉ???

Theo thiển ý của mình có thể chỉ cần sử dụng một lisp là có thể xử lý cả hai trường hợp bạn nêu ra mà không nhất thiết phải đưa thành hai lisp khác nhau.

Ngoài hai trường hợp bạn nêu còn có các trường hợp nào khác cần hiệu chỉnh hay không??? Nếu có thì chúng sẽ ra sao???

 

Hy vọng rằng bạn sẽ có câu trả lời xác đáng để mọi người có thể thuận lợi trong việc giúp bạn.


  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 08 April 2013 - 02:19 PM

Trước tiên xin chân thành cám ơn sự quan tâm của các bác!

 

Thưa bác: phamthanhbinh

1/- Sự mâu thuẩn trong hình 2 - trong hình 2 chỉ là em đang cố gắng mô tả yêu cầu của em thôi. Các kích thước thì vẫn cố định như hình 1. Em sẽ đính kèm file thử nghiệm lên ở cuối post này!

2/- Nếu bác viết theo một hướng khác, mà vẫn đáp ứng được thì quá tốt chứ - em chỉ nghĩ được vậy, mà cũng không lấy gì chắc chắn cả! hic - Bác làm cho nó hoàn thiện hơn (về mặt giải thuật) để chương trình tương tác thân thiện hơn với người dùng thì quá tốt - cám ơn bác nhiều lắm - về ý kiến này.

3/- Em cũng muốn là viết một chương trình thui, nhưng tùy vào giá trị nhập vào có 2 hay 3 ký tự mà chương trình tự phân ra thành từng trường hợp đó chứ.

 

Em xin được trình bày lại như thế này:

Sau khi gọi lệnh - chương trình yêu cầu nhập vào chuỗi text, ví dụ nhập: sa6; hoặc s6 ...

tham số tiếp theo là giá trị hiệu chỉnh. ví dụ nhập vào +1 hoặc -3 ... (*)

Tiếp theo chương trình yêu cầu là tô chọn vùng thao tác.

Sau khi xử lý xong - chương trình sẽ đổi màu cho những giá trị nào được hiệu chỉnh (thành màu xanh). Để người sử dụng dễ theo dõi (làm dấu!)

 

(*): chúng ta cũng có thể gộp chung dữ liệu 1& 2 thành một chuỗi: sa6+1 hoặc s6-3 ...

 

Đính kèm: http://www.cadviet.c...nghiem_text.dwg

 

Chân thành cám ơn các bác!

 


  • 0

#6 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 08 April 2013 - 02:56 PM

Lisp của bạn đây. Lisp này áp dụng cho trường hợp chiều cao chữ Input1 là 100 nhé. Nếu chữ thay đổi thì phải đổi lại code. Khi nhập số liệu thì nhập từng kí tự 1. Ví dụ SA9+2 thì nhập như sau: 

Input1: s

Input2: a

Input3: 9

Giá trị thay doi: 2

Lisp áp dụng cho nhiều trường hợp có trên bản vẽ của bạn mà không phải chia nhỏ ra trường hợp Input2 nil hoặc khác nil. Nếu Input2 = nil thì chỉ việc Enter hoặc Space là được.

;=============KANGKUNG 08/04/2013==================
(DEFUN C:KK()
  (command "UNDO" "BE")
  (setq Input(strcase(getstring T "\n Input ")))
  (setq Input1(substr Input 1 1))
  (setq Input2(substr Input 2 1))
  (setq Input3(atoi(substr Input 3 1)))
  (setq gttd(atoi(substr Input 4 2)))
  (setq taphop(ssget "_X" (list (cons 0 "TEXT") (cons 40 100))) i 0)
  (while (< i (sslength taphop))
    (setq TEXT (entget (ssname taphop i)))
    (setq String(cdr(assoc 1 TEXT)))
    (if (= (strcase(cdr(assoc 1 TEXT))) Input1)
      (progn
	(setq pt(cdr (assoc 11 TEXT)))
	(command "ZOOM" "W" (list (- (car pt) 100) (+ (cadr pt) 150)) (list (+ (car pt) 200) (- (cadr pt) 150)))
	(if (ssget "W" (list (+ (car pt) 50) (+ (cadr pt) 90)) (list (+ (car pt) 130) (cadr pt)) '((0 . "TEXT")))
	  (setq text2(strcase(cdr(assoc 1 (entget (ssname (ssget "W" (list (+ (car pt) 50) (+ (cadr pt) 90)) (list (+ (car pt) 130) (cadr pt)) '((0 . "TEXT"))) 0))))))
	  (setq text2 " ")
	  )
	(if (ssget "W" (list (- (car pt) 100) (cadr pt)) (list (+ (car pt) 200) (- (cadr pt) 90)) '((0 . "TEXT")))
	  (setq text3(entget (ssname (ssget "W" (list (- (car pt) 100) (cadr pt)) (list (+ (car pt) 200) (- (cadr pt) 90)) '((0 . "TEXT"))) 0)))
	  (setq text3 "")
	  )
	(if (and (= text2 Input2) (>= (atoi (cdr (assoc 1 text3))) Input3))
	  (progn
	    (if (= (assoc 62 text3) nil)
	      (entmod (setq text3 (append text3 (list (cons 62 3)))))
	      (entmod (subst (cons 62 3) (assoc 62 text3) text3))
	      )
	    (entmod (subst (cons 1 (rtos (+ (atoi (cdr (assoc 1 text3))) gttd) 2 0)) (assoc 1 text3) text3))
	    )
	  )
	)
      )
    (setq i (+ i 1))
    )
  (command "REGEN")
  (command "UNDO" "END")
  (princ)
  (alert "Well Done")
  )
(princ "\n         Written By KangKung - 08/04/2013\n")
(princ "\n           Nhap KK de chay chuong trinh\n")

  • 2

#7 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 08 April 2013 - 03:11 PM

Lisp của bạn đây. Lisp này áp dụng cho trường hợp chiều cao chữ Input1 là 100 nhé. Nếu chữ thay đổi thì phải đổi lại code

;=============KANGKUNG 08/04/2013==================

.......................................................

(princ "\n         Written By KangKung - 08/04/2013\n")
(princ "\n           Nhap KK de chay chuong trinh\n")


Chân thành cám ơn anh KangKung!
Chương trình của anh đã thoả mãn được yêu cầu của em!
Mặc dù: chương trình của anh không quan tâm đến chiều cao của các TEXT nhỏ (height = 50) nhưng điều này không hệ trọng lắm - căn bản là quan tâm đến vị trí tương đối của các TEXT!!!

Tuy nhiên, nếu được "tham lam - đòi hỏi thêm", xin anh giúp cho mấy chuyện này nữa được không anh:

a. Đầu vào nhập luôn nguyên một dãy text. Ví dụ: sa6 thay vì phải nhập 3 lần s; a và 6! (điều này em đã nói từ đầu - như vậy thì tương tác với chương trình thân thiện hơn!!!)
b. Nếu có thể - chúng ta nhập chung luôn dữ liệu input 2 vào input 1, như sau: sa6+2 hoặc sb7-3...
c. Nếu chúng ta bỏ qua bước chọn vùng thao tác (enter), chương trình tự động mặc định là ALL.
d. Các điều a; b & c cũng không quan trọng lắm - nhưng nếu có thể dành thời gian - mong các bác giúp thêm điều này: trong chỗi nhập vào, ví dụ theo cú pháp: sa6.12+2 (ví dụ vậy) --> Chương trình sẽ lọc SA từ 6 đến 12, và chỉ thay đổi trong ĐOẠN đó +2 mà thôi, gtrị < 6 và > 12 thì không hiệu chỉnh. cùng cú pháp đó, nếu nhập chuỗi: sa6-3 --> chương trình hiệu chỉnh SA, -3 cho tất cả các giá trị >5 (lớn hơn bằng 6). Thêm nữa, cùng cú pháp đó, nếu chúng ta nhập chuỗi: sa.10+1 --> chỉ hiệu chỉnh +1 cho các giá trị < 11 (nhỏ hơn bằng 10) các giá trị >10 không hiệu chỉnh. Vậy làm sao để thêm trong chuỗi nhập vào một dấu chấm ngăn các min.max như vậy: "6.12" # [6;12]. Chân thành cám ơn!
PS: Bác Phamthanhbinh còn cao kiến j nữa không ạ?!

Chân thành cám ơn các bác rất nhiều!
  • 0

#8 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 08 April 2013 - 03:34 PM

Bạn down lại lisp ở trên nhé. Vừa sửa lại Code theo đúng ý bạn.

Cách nhập: sa6+2 hoặc F[space]7+1


  • 1

#9 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 08 April 2013 - 03:34 PM

@ Song Nhi: bạn hỏi, và trình bày câu hỏi rõ ràng, đã được 2 người vote. Sao bạn không vote cho mấy bác giúp bạn?

@ KangKung: substr giải quyết input 1 lần được mà bạn?


  • 2

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


#10 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 08 April 2013 - 03:39 PM

 KangKung: substr giải quyết input 1 lần được mà bạn?

Thanks bác Hà

Đầu tiên chủ thớt yêu cầu Input1,2,3 nên mới viết code như vậy. Mới sửa lại code theo ý của bạn Song Nhi rồi. Giờ chỉ input 1 lần.


  • 0

#11 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 08 April 2013 - 04:04 PM

Chân thành cám ơn anh KangKung!
Chương trình của anh đã thoả mãn được yêu cầu của em!
Mặc dù: chương trình của anh không quan tâm đến chiều cao của các TEXT nhỏ (height = 50) nhưng điều này không hệ trọng lắm - căn bản là quan tâm đến vị trí tương đối của các TEXT!!!

Tuy nhiên, nếu được "tham lam - đòi hỏi thêm", xin anh giúp cho mấy chuyện này nữa được không anh:

a. Đầu vào nhập luôn nguyên một dãy text. Ví dụ: sa6 thay vì phải nhập 3 lần s; a và 6! (điều này em đã nói từ đầu - như vậy thì tương tác với chương trình thân thiện hơn!!!)
b. Nếu có thể - chúng ta nhập chung luôn dữ liệu input 2 vào input 1, như sau: sa6+2 hoặc sb7-3...
c. Nếu chúng ta bỏ qua bước chọn vùng thao tác (enter), chương trình tự động mặc định là ALL.
d. Các điều a; b & c cũng không quan trọng lắm - nhưng nếu có thể dành thời gian - mong các bác giúp thêm điều này: trong chỗi nhập vào, ví dụ theo cú pháp: sa6.12+2 (ví dụ vậy) --> Chương trình sẽ lọc SA từ 6 đến 12, và chỉ thay đổi trong ĐOẠN đó +2 mà thôi, gtrị < 6 và > 12 thì không hiệu chỉnh. cùng cú pháp đó, nếu nhập chuỗi: sa6-3 --> chương trình hiệu chỉnh SA, -3 cho tất cả các giá trị >5 (lớn hơn bằng 6). Thêm nữa, cùng cú pháp đó, nếu chúng ta nhập chuỗi: sa.10+1 --> chỉ hiệu chỉnh +1 cho các giá trị < 11 (nhỏ hơn bằng 10) các giá trị >10 không hiệu chỉnh. Vậy làm sao để thêm trong chuỗi nhập vào một dấu chấm ngăn các min.max như vậy: "6.12" # [6;12]. Chân thành cám ơn!
PS: Bác Phamthanhbinh còn cao kiến j nữa không ạ?!

Chân thành cám ơn các bác rất nhiều!

Yêu cầu của bạn có thể giải quyết được. Tuy nhiên hãy suy nghĩ kỹ xem còn trường hợp nào nữa không. Chứ cứ viết xong lại yêu cầu thay đổi cũng mất thời gian vì yêu cầu khác nhau thì thuật toán sẽ khác nhau bạn ah.


  • 0

#12 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 08 April 2013 - 04:15 PM

Cám ơn anh rất nhiều! Có lẽ tôi đã đòi hỏi quá đáng - Với những gì anh đã giúp cho, phần còn lại tôi sẽ cố gắng để tự mình làm được! Chân thành cám ơn anh!
  • 0

#13 nguyenngoc971

nguyenngoc971

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 385 Bài viết
Điểm đánh giá: 74 (tàm tạm)

Đã gửi 08 April 2013 - 04:24 PM

Mình có sẵn cái này bạn xem có dùng được không nha.

 

123.png


  • 0

114123_building_folds_demolition.gif


#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 08 April 2013 - 10:50 PM

Cám ơn anh rất nhiều! Có lẽ tôi đã đòi hỏi quá đáng - Với những gì anh đã giúp cho, phần còn lại tôi sẽ cố gắng để tự mình làm được! Chân thành cám ơn anh!

Hề hề hề,
Vậy là đã có khá nhiều đáp án cho bạn rồi. Mình chậm chân một chút và thấy rằng cái mình làm ra chưa đáp ứng đúng các yêu cầu bổ sung của bạn. Tuy nhiên vẫn có thể sử dụng nó với việc nhập dữ liệu chỉ bằng một chuỗi, sau đó dùng hàm substr kết hợp với hàm tách chuỗi để tách chuỗi này thành các biến t1 t2 t3 và k thậm chí có thể thêm biến giới hạn như bạn yêu cầu. Vì bạn là người cũng khá am tường về lisp nên mình không sửa nữa và post cái mình đã làm để bạn tham khảo thêm.

 
(defun c:updtxt ( / oldos t1 t2 t3 k sst p1 t4 t5 ss1 ss2 etxt )
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(while (= (setq t1 (strcase (getstring "\n Nhap gia tri text mau thu nhat: "))) ""))
(setq t2 (strcase (getstring "\n Nhap gia tri text mau thu hai: ")))
(while (or (= (setq t3 (getstring "\n Nhap gia tri text so mau thu ba: ")) "") (= (atoi t3) 0)) )
(setq k (getint "\n Nhap gia tri gia so: ") 
          sst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 100.0) (cons 1 t1) (cons 72 1) (cons 73 2)))) )
(foreach txt sst
        (setq p1 (cdr (assoc 11 (entget txt))))
        (if (and  (/= t2 "") (setq ss1 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100)) (list (+ (car p1) 150) (+ (cadr p1) 100)) 
                                                 (list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 1) (cons 73 2))))  )
            (setq t4 (cdr (assoc 1 (entget (ssname ss1 0)))))
        )
        (if (and (/= k nil) (= t2 t4) )
            (progn
                   (if (setq ss2 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100)) (list (+ (car p1) 150) (+ (cadr p1) 100)) 
                                                (list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 2) (cons 73 2)))) 
                       (progn
                              (setq t5 (cdr (assoc 1 (setq etxt (entget (ssname ss2 0))))))
                              (if (>= (atoi t5) (atoi t3))
                                 (progn 
                                        (setq etxt (subst (cons 1 (itoa (+ (atoi t5) k))) (assoc 1 etxt) etxt))
                                        (if (assoc 62 etxt)
                                              (setq etxt (subst (cons 62 3) (assoc 62 etxt) etxt))
                                              (setq etxt (append (list (cons 62 3)) etxt))
                                        )
                                        (entmod etxt)
                                 )
                              )
                       )
                    )
             )
         )
         
         (if (and (= t2 "") (/= k nil) (not (setq ss1 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100))
                                                                    (list (+ (car p1) 150) (+ (cadr p1) 100)) 
                                                           (list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 1) (cons 73 2)))))  )
              (progn 
                    (if (setq ss2 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100)) (list (+ (car p1) 150) (+ (cadr p1) 100)) 
                                                (list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 2) (cons 73 2)))) 
                       (progn
                              (setq t5 (cdr (assoc 1 (setq etxt (entget (ssname ss2 0))))))
                              (if (>= (atoi t5) (atoi t3))
                                 (progn 
                                        (setq etxt (subst (cons 1 (itoa (+ (atoi t5) k))) (assoc 1 etxt) etxt))
                                        (if (assoc 62 etxt)
                                              (setq etxt (subst (cons 62 3) (assoc 62 etxt) etxt))
                                              (setq etxt (append (list (cons 62 3)) etxt))
                                        )
                                        (entmod etxt)
                                 )
                              )
                       )
                    )
             )
         )
 
         (setq t4 nil ss1 nil t5 nil ss2 nil)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Chúc bạn vui.  

Và đây là lisp cải tiến lại lisp trên để có thể nhập dữ liệu đầu vào một lần theo ý bạn. Cấu trúc của chuỗi dữ liệu đầu vào như sau: @@##+#* #*
tức là chữ cái thứ nhất, chữ cái thứ hai,chữ số thứ nhất, chữ số thứ hai, dấu + hoặc trừ, các chử số chỉ giá trị gia số, khoảng trắng, các chữ số chỉ giá trị hạn chế trên.
Như vậy khi chữ cái thứ hai không cần dùng sẽ thay bằng ký tự "/". Nếu chữ số cần điều chỉnh chỉ có 1 chữ số thì phải thêm một chữ số 0 vào phía trước. Nếu không cần giá trị giới hạn trên thì chỉ cần nhập một khoảng trắng và không cần nhập thêm các chữ số nữa.
Bạn hãy dùng thử coi sao nhé.

(defun c:updtxt ( / oldos t1 t2 t3 k sst p1 t4 t5 ss1 ss2 etxt t0 t01 k1)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(alert "\n Nhap chuoi text mau theo cu phap @@##+#* #*")
(setq t0 (getstring T "\n Nhap chuoi text mau: "))
(setq k1 (atoi (cadr (separate t0 " ")))
t01 (car (separate t0 " "))
k (atoi (substr t01 5))
t1 (strcase (substr t01 1 1))
t2 (strcase (substr t01 2 1))
t3 (substr t01 3 2)
;;;(while (= (setq t1 (strcase (getstring "\n Nhap gia tri text mau thu nhat: "))) ""))
;;;(setq t2 (strcase (getstring "\n Nhap gia tri text mau thu hai: ")))
;;;(while (or (= (setq t3 (getstring "\n Nhap gia tri text so mau thu ba: ")) "") (= (atoi t3) 0)) )
;;;(setq k (getint "\n Nhap gia tri gia so: ")
sst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 100.0) (cons 1 t1) (cons 72 1) (cons 73 2)))) )
(if (= k1 0) (setq k1 10000))
(foreach txt sst
(setq p1 (cdr (assoc 11 (entget txt))))
(if (and (/= t2 "/") (setq ss1 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100)) (list (+ (car p1) 150) (+ (cadr p1) 100))
(list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 1) (cons 73 2)))) )
(setq t4 (cdr (assoc 1 (entget (ssname ss1 0)))))
)
(if (and (/= k 0) (= t2 t4) )
(progn
(if (setq ss2 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100)) (list (+ (car p1) 150) (+ (cadr p1) 100))
(list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 2) (cons 73 2))))
(progn
(setq t5 (cdr (assoc 1 (setq etxt (entget (ssname ss2 0))))))
(if (and (>= (atoi t5) (atoi t3)) (<= (atoi t5) k1))
(progn
(setq etxt (subst (cons 1 (itoa (+ (atoi t5) k))) (assoc 1 etxt) etxt))
(if (assoc 62 etxt)
(setq etxt (subst (cons 62 3) (assoc 62 etxt) etxt))
(setq etxt (append (list (cons 62 3)) etxt))
)
(entmod etxt)
)
)
)
)
)
)

(if (and (= t2 "/") (/= k 0) (not (setq ss1 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100))
(list (+ (car p1) 150) (+ (cadr p1) 100))
(list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 1) (cons 73 2))))) )
(progn
(if (setq ss2 (ssget "w" (list (- (car p1) 65) (- (cadr p1) 100)) (list (+ (car p1) 150) (+ (cadr p1) 100))
(list (cons 0 "text") (cons 8 "ki_hieu") (cons 40 50.0) (cons 72 2) (cons 73 2))))
(progn
(setq t5 (cdr (assoc 1 (setq etxt (entget (ssname ss2 0))))))
(if (and (>= (atoi t5) (atoi t3)) (<= (atoi t5) k1))
(progn
(setq etxt (subst (cons 1 (itoa (+ (atoi t5) k))) (assoc 1 etxt) etxt))
(if (assoc 62 etxt)
(setq etxt (subst (cons 62 3) (assoc 62 etxt) etxt))
(setq etxt (append (list (cons 62 3)) etxt))
)
(entmod etxt)
)
)
)
)
)
)

(setq t4 nil ss1 nil t5 nil ss2 nil)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Separate (S sym / i L ch)
(setq i 0 L nil)
(while (< i (strlen S))
(setq i (1+ i) ch (substr S i 1))
(if (= ch sym) (progn
(setq
L (append L (list (substr S 1 (- i 1))))
S (substr S (1+ i) (- (strlen S) i))
i 0
)
))
)
(append L (list S))
)
                
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#15 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 09 April 2013 - 08:09 AM

Chân thành cám ơn sự nhiệt tình của bác phamthanhbinh!
  • 0