Đến nội dung


Hình ảnh
- - - - -

Kết hợp lệnh ar (array) và ct (lệnh coppy tịnh tiến)


  • Please log in to reply
9 replies to this topic

#1 Binh47b

Binh47b

    biết zoom

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

Đã gửi 06 December 2010 - 10:02 AM

Thông thường ta sử dụng lệnh ar để tạo mảng và ct để coppy tịnh tiến (lisp ct có trên 4r)
Mình có một bảng muốn đánh số từ 1 đến 100 theo cột dọc, mà khoảng cách giữa các số này là giống nhau, cùng bằng 5 đvị chẳng hạn
Bây giờ để cho nhanh, mình muốn ar sô 1 (số đầu tiên của chuỗi) mà các số sau tịnh tiến theo đúng nguyên tắc của lisp ct thì làm thế nào?
  • 0

#2 npham

npham

    biết lệnh rotate

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

Đã gửi 06 December 2010 - 10:54 AM

Thông thường ta sử dụng lệnh ar để tạo mảng và ct để coppy tịnh tiến (lisp ct có trên 4r)
Mình có một bảng muốn đánh số từ 1 đến 100 theo cột dọc, mà khoảng cách giữa các số này là giống nhau, cùng bằng 5 đvị chẳng hạn
Bây giờ để cho nhanh, mình muốn ar sô 1 (số đầu tiên của chuỗi) mà các số sau tịnh tiến theo đúng nguyên tắc của lisp ct thì làm thế nào?

Bạn thử xem code này được không. Nó array luôn 1 dòng bạn chọn.
Mình quên cho array luôn cái line (dòng kẻ). bạn thêm vào nhé

;Lisp by nPham - www.cadviet.com
(defun copy+ (ss row / ename ent i number str p ssnew)
(setq j 0)
(setq ssnew (ssadd))
(while
(setq ename (ssname ss j))
(setq ent (entget ename))
(setq str (cdr (assoc 1 ent)))
(setq i 1)
(while (< i (+ (strlen str) 1))
(if (not (wcmatch (substr str i) "*@*"))
(progn
(setq number (substr str i))
(setq i 10000)
)
(setq i (1+ i))
)
)
(if number (setq str (strcat (substr str 1 (- (strlen str) (strlen number)))
(if (vl-string-search " " number) " " "")
(itoa (+ (atoi number) 1)))))
(setq ent (subst (cons 1 str) (assoc 1 ent) ent))
(setq p (cdr (assoc 10 ent)))
(setq ent (subst (cons 10 (polar p (* pi 1.5) row)) (assoc 10 ent) ent))
(setq p (cdr (assoc 11 ent)))
(setq ent (subst (cons 11 (polar p (* pi 1.5) row)) (assoc 11 ent) ent))
(entmake ent)
(entupd ename)
(setq ssnew (ssadd (entlast) ssnew ))
(setq j (1+ j))
)
ssnew
)

(defun c:ar+ (/ ss num row)
(setq ss (ssget (list (cons 0 "TEXT"))))
(setq num (getint "\nSo luong dong:"))
(setq row (getint "\nKhoang cach dong:"))

(repeat num (setq ss (copy+ ss row)))
(redraw)
(princ)
)

  • 1

#3 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 06 December 2010 - 11:12 AM

Bạn có thể k cần sử dụng thêm lisp, chỉ cần kết hợp lệnh ar và tcount của express là được r mà.THêm lisp chi cho mệt nè ^^
  • 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


#4 Binh47b

Binh47b

    biết zoom

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

Đã gửi 10 December 2010 - 10:24 AM

Bạn thử xem code này được không. Nó array luôn 1 dòng bạn chọn.
Mình quên cho array luôn cái line (dòng kẻ). bạn thêm vào nhé

;Lisp by nPham - www.cadviet.com
(defun copy+ (ss row / ename ent i number str p ssnew)
(setq j 0)
(setq ssnew (ssadd))
(while
(setq ename (ssname ss j))
(setq ent (entget ename))
(setq str (cdr (assoc 1 ent)))
(setq i 1)
(while (< i (+ (strlen str) 1))
(if (not (wcmatch (substr str i) "*@*"))
(progn
(setq number (substr str i))
(setq i 10000)
)
(setq i (1+ i))
)
)
(if number (setq str (strcat (substr str 1 (- (strlen str) (strlen number)))
(if (vl-string-search " " number) " " "")
(itoa (+ (atoi number) 1)))))
(setq ent (subst (cons 1 str) (assoc 1 ent) ent))
(setq p (cdr (assoc 10 ent)))
(setq ent (subst (cons 10 (polar p (* pi 1.5) row)) (assoc 10 ent) ent))
(setq p (cdr (assoc 11 ent)))
(setq ent (subst (cons 11 (polar p (* pi 1.5) row)) (assoc 11 ent) ent))
(entmake ent)
(entupd ename)
(setq ssnew (ssadd (entlast) ssnew ))
(setq j (1+ j))
)
ssnew
)

(defun c:ar+ (/ ss num row)
(setq ss (ssget (list (cons 0 "TEXT"))))
(setq num (getint "\nSo luong dong:"))
(setq row (getint "\nKhoang cach dong:"))

(repeat num (setq ss (copy+ ss row)))
(redraw)
(princ)
)


Bạn ơi ko ar khoảng cách lẻ được à, ví dụ khoảng cách dòng là 10,4 chẳng hạn?
  • 0

#5 Binh47b

Binh47b

    biết zoom

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

Đã gửi 10 December 2010 - 10:25 AM

Bạn có thể k cần sử dụng thêm lisp, chỉ cần kết hợp lệnh ar và tcount của express là được r mà.THêm lisp chi cho mệt nè ^^

Có thể nói rõ hơn được ko?
  • 0

#6 npham

npham

    biết lệnh rotate

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

Đã gửi 10 December 2010 - 10:43 AM

Bạn ơi ko ar khoảng cách lẻ được à, ví dụ khoảng cách dòng là 10,4 chẳng hạn?

bạn thay
(setq row (getint "\nKhoang cach dong:"))
thành
(setq row (getreal "\nKhoang cach dong:"))
nhé.

Thân
  • 1

#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 10 December 2010 - 11:31 AM

Có thể nói rõ hơn được ko?


Bạn array 1 số bất kỳ với khoảng cách,hướng theo ý bạn,rồi dùng lệnh tcount,chọn tất các số đó,đánh số đầu tiên và bước nhảy,chọn overwrite là xong.Tuy nhiên cách này hạn chế bước nhảy chỉ là số nguyên.(VD 1->3->5->7...).
Lisp của bạn npham chạy đẹp, n hạn chế ở phương y và bước nhảy cố định là 1.(1->2->3...)
Với yêu cầu của bạn thì dùng cả 2 cách đều được.
  • 1

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 befaint

befaint

    biết pan

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

Đã gửi 10 December 2010 - 11:33 AM

bạn thay
(setq row (getint "\nKhoang cach dong:"))
thành
(setq row (getreal "\nKhoang cach dong:"))
nhé.

Thân

Bạn ơi có thể cho số (text) phân bố lến phía trên được không? mình làm theo thì số chạy xuống phía dưới. :undecided:
  • 0

#9 Binh47b

Binh47b

    biết zoom

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

Đã gửi 10 December 2010 - 01:11 PM

Bạn array 1 số bất kỳ với khoảng cách,hướng theo ý bạn,rồi dùng lệnh tcount,chọn tất các số đó,đánh số đầu tiên và bước nhảy,chọn overwrite là xong.Tuy nhiên cách này hạn chế bước nhảy chỉ là số nguyên.(VD 1->3->5->7...).
Lisp của bạn npham chạy đẹp, n hạn chế ở phương y và bước nhảy cố định là 1.(1->2->3...)
Với yêu cầu của bạn thì dùng cả 2 cách đều được.

Cảm ơn cả 2 bạn nhé!
N­hưng mình muốn làm thế nào để số đầu tiên là 01 thì số tiếp theo là 02, 03... (có số 0 ở đầu), và nếu thực hiện theo lips của bạn npham thì ar theo phương ngang thì sao?
Các bạn giúp mình nhé!
  • 0

#10 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 10 December 2010 - 03:04 PM

1.Với cách mình nói : Nếu đến 10,99 mà vẫn có số 0 đằng trước thì bạn vẫn làm như trên.Aray 1 dãy 01 theo phương bất kỳ.Quét chọn lại các text,chọn số bắt đầu,bước nhảy,đến bước cuối cùng thay vì chọn overwrite thì bạn chọn Find&Replace,đánh số 1 vào :undecided: ( nếu chọn suffix thì bị có dấu cách với số 0:) )

2.Với lisp bạn npham post : những yêu cầu thay đổi của 2 bạn là nằm trong tầm tay bạn ý,chắc chắn sẽ có đáp án nhanh thôi ^^

PS : Các công cụ number cũng có khá nhiều trên mạng,bạn có thể search thấ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