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

Viết lisp theo yêu cầu [phần 2]

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

cảm ơn bác nhưng em chạy thử cái lips đó không được. bác xem lại hộ em với.

Chào bạn violetamour,

Bạn nói không được là sao nhỉ??? Bạn phải load file này về, chép vào một thư mục thường trực của Cad, trước khi chạy nó bạn phải mở bản vẽ và vào load application, chọn file lisp này, load rồi sau đó mới dùng được. Khi dùng bạn chỉ cần gõ 1 trên dòng command rồi enter là nó sẽ mợ cái lệnh dimlinear cho bạn xài.

Chúc bạn thành cô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
Cảm ơn bác Hoành, bác Bình, anh Tuệ đã nhiệt tình giúp em trong lisp tính diện tích này. Em đã thử check lại, rất chính xác (so với lệnh aa). Tuy nhiên, kết quả chạy lisp của em và anh Tuệ có nhiều điểm khác biệt.

Kết quả check lại lisp bác Bình đã sửa, khi đặt layer vh là layer hiện hành trước khi chạy lisp cũng ra kết quả chính xác.

Nay em muốn nhờ bác Hoành và mọi người, cải tiến thêm chức năng của lisp trên là: ngoài lập bảng kết quả ra, có thể cho kết quả tính diện tích xuất hiện trong mỗi ô được tính toán tùy theo yêu cầu của người sử dụng.

Ví dụ:

Ban muon ket qua tinh toan xuat hien o dau:

1. Tren ban do

2. Lap bang

3. Ca hai

Em xin chân thành cảm ơn!

Chào bạn SVBA1608 và các bác trên diễn đàn,

Theo đề nghị của bạn, mình dựa vào cái lisp của bác Hoành và bổ sung chút chút để chạy thử. Kết quả là lisp chạy ve ve, cho ra được cả hai trường hợp bạn mong muốn, song rất tiếc là hai cái kết quả nó lại chả khớp nhau tẹo nào. Nguyên nhân thì mình vẫn chưa rõ nên mạo muội post nó lên đây, mong bác Hoành và các bác khác chỉ bảo thêm.

Theo mình nghĩ có thể do cái Boundary nó loằng ngoằng sao đó nhưng mà không hiểu nên chưa thể khắc phục. Mình post lên đây cả file lisp và file kết quả chạy ra để mọi người ngâm cứu thử

Đây là file lisp:

(setq
lbd_textheight 20.0
lbd_cellheight 50.0
lbd_cellwidth 200.0
lbd_textlayer "sttkhu"
lbd_kdlayer "vh"
)
(defun c:lbd ()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ss2ent (ss / sodt index lstent)
(setq sodt (if ss (sslength ss) 0)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 lbd_textheight)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun dxf (code ent)
(cdr (assoc code (entget ent)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun findmother (p / mm)
(foreach e lstm
(if (null (ssget "_F" (list p (dxf 10 e)) (list (cons 8 lbd_kdlayer))))
(setq
mother (dxf 1 e)
)
)
)
mother
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun tinhdt (ent / p)
(setq p (dxf 10 ent)
elast (entlast)
)
(command ".boundary" p "")
(setq enew (entlast))
(list
(findmother p)
(dxf 1 ent)
(if (eq enew elast)
-1
(progn
(command ".area" "ob" enew)
(command ".erase" enew "")
(getvar "area")
)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;(setvar "clayer" "0")
(command "undo" "be")
(setq
p1 (getpoint "\nGoc 1 cua mien chua ban do: ")
p2 (getcorner p1 "\nGoc 2 cua mien chua ban do: ")
ss (ssget "_W" p1 p2
(list (cons 0 "TEXT") (cons 8 lbd_textlayer) (cons 1 "[a-e]"))
)
lst (ss2ent ss)
lstm (ss2ent
(ssget "_W" p1 p2
(list (cons 0 "TEXT") (cons 8 lbd_textlayer) (cons 1 "~*[~0-9]*"))
) ;;;;; Dong ssget
) ;;;;; Dong ss2ent
;;;;;; diemchen (getpoint "\nDiem chen ket qua: ")
lst1 lst
) ;;;;; Dong setq

(setq ans2 (getstring "\n Ban muon ghi ket qua vào ban ve: [y or n] " ))
(if (= ans2 "y")
(progn
(foreach ent lst1
(setq ds (tinhdt ent)
p (dxf 10 ent))
(setq pt (list (car p) (- (cadr p) (* 2 lbd_textheight)))
gt (if (caddr ds)
(if ("__err__"
(rtos (caddr ds) 2 2)
) ;;;;; Dong if trong
"_______"
) ;;;;; Dong if ngoai
) ;;;; Dong setq
(wtxt gt pt)
) ;;;;; Dong foreach
) ;;;; Dong progn
) ;;;;; Dong if

(setq ans1 (getstring "\n Ban muon lap bang ket qua: [ y or n] "))
(if  (= ans1 "y")
(progn
(setq diemchen (getpoint "\nDiem chen ket qua: ") )
(command ".layer" "off" lbd_textlayer "")
(command ".zoom" p1 p2)
(setq lst (mapcar 'tinhdt lst))
(command ".layer" "on" lbd_textlayer "")
(command ".zoom" "p")
(setq 
x0 (car diemchen)
y0 (cadr diemchen)
yht y0
lst (vl-sort lst '(lambda (a b )
(if (= (car a) (car b ))
(() ;;;; Dong if
) ;;;; Dong lambda
) ;;;; Dong vl-sort
lastindex (atoi (car (nth (1- (length lst)) lst)))
index 1
lst (mapcar '(lambda (x) (cons (strcat (car x) (cadr x)) (caddr x))) lst)
) ;;;;; Dong setq

(repeat lastindex
(wtxt (itoa index) (list x0 yht))
(setq xht x0
part 97
)

(repeat 5
(setq xht (+ xht lbd_cellwidth)
gt (if (setq tmp (assoc (strcat (itoa index) (chr part)) lst))
(if ("__err__"
(rtos (cdr tmp) 2 2)
) ;;;;; Dong if trong
"_______"
) ;;;;; Dong if ngoai
part (1+ part)
) ;;;;Dong setq
(wtxt gt (list xht yht))
) ;;;;; Dong repeat trong
(setq yht (- yht lbd_cellheight)
index (1+ index)
) ;;;; Dong setq
) ;;;;; Dong repeat ngoai
) ;;;;; Dong progn
) ;;;;; Dong if


(command "undo" "e")
(princ)
)

 

Trong code này, phần lập bảng vẫn giũ nguyên như code bác Hoành đã viết nên chắc không có sai sót gì nhiều. Phần code viết thêm để ghi kết quả vào bản vẽ chắc có sai sót nhưng mình chưa hiểu rõ.

 

Đây là file CAD đã chạy thử từ bản vẽ do bạn SVBA1608 cung cấp

http://www.cadviet.com/upfiles/2/test1.dwg

 

Còn một vấn đề nữa là khi chạy lisp lần đầu với bản vẽ của bạn svba1608, không hiểu sao nó không cho kết quả ngay mà báo lỗi, tuy nhiên cứ để nguyên chạy lại lần thứ hai thì nó cho kết quả đẹp như mơ vậy. Điều này mình đã thử khá nhiều lần với ngay cả cái lisp gốc của bác Hoành cũng vậy. Nếu bác nào có kinh nghiệm và có thể giải thích được điều này thì thật là cám ơn lắm lắm.

Sau khi mình bổ sung cái phần ghi kết quả lên bản vẽ vào giữa lisp, trước khi chạy lập bảng thì nó lại chạy phe phé ngay từ phát đầu tiên các bác ạ. hề hề , cứ như có ma vậy.

Rất mong các bác có nhiều kinh nghiệm chỉ dẫn thêm.

  • 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

Cảm ơn bác phamthanhbinh, em đã chạy lisp của bác, đúng là có sự khác nhau giữa kết quả trên hình vẽ và trong bảng.

Ví dụ: lô đất số 1, trên hình vẽ bị lỗi ô 1C và 1D, nhưng trong bảng chỉ lỗi 1D. Lô đất số 49, trong bảng lỗi 49A và 49D, nhưng trên hình vẽ lại lỗi 49B và 49D. Em rất cảm ơn các bác, nhờ có lisp này em đã hoàn thành xong việc tính diện tích.

Nay em có một việc này, biết là khó, không biết lisp có làm được không, nhưng em muốn hỏi thử, biết đâu lại được.

Em có file mô tả như sau:

http://www.cadviet.com/upfiles/2/a_4.dwg

Dữ liệu đầu vào là bản đồ trong vòng tròn. Dữ liệu đầu ra là bảng bên cạnh.

Đoạn ống 29-28 có 2 tiểu khu là 45A và 46B đổ nước vào. Đoạn ống 30-31 chỉ có 1 tiểu khu 45B đổ nước vào. Nhiệm vụ của lisp là cần thống kê xem tiểu khu nào được những đoạn ống nào đổ nước vào.

Nhờ các bác trên Diễn đàn xem giúp.

Em xin chân thành cảm ơ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 phamthanhbinh, em đã chạy lisp của bác, đúng là có sự khác nhau giữa kết quả trên hình vẽ và trong bảng.

Ví dụ: lô đất số 1, trên hình vẽ bị lỗi ô 1C và 1D, nhưng trong bảng chỉ lỗi 1D. Lô đất số 49, trong bảng lỗi 49A và 49D, nhưng trên hình vẽ lại lỗi 49B và 49D. Em rất cảm ơn các bác, nhờ có lisp này em đã hoàn thành xong việc tính diện tích.

Nay em có một việc này, biết là khó, không biết lisp có làm được không, nhưng em muốn hỏi thử, biết đâu lại được.

Em có file mô tả như sau:

http://www.cadviet.com/upfiles/2/a_4.dwg

Dữ liệu đầu vào là bản đồ trong vòng tròn. Dữ liệu đầu ra là bảng bên cạnh.

Đoạn ống 29-28 có 2 tiểu khu là 45A và 46B đổ nước vào. Đoạn ống 30-31 chỉ có 1 tiểu khu 45B đổ nước vào. Nhiệm vụ của lisp là cần thống kê xem tiểu khu nào được những đoạn ống nào đổ nước vào.

Nhờ các bác trên Diễn đàn xem giúp.

Em xin chân thành cảm ơn!

Hì hì, bạn SVBA1608 lại quên rồi, gửi file cad đời sau 2004 là mình chịu chết thôi. Bạn thông cảm vì máy mình nó củ chuối vậy, đành chấp nhận nó thôi. Hì hì hì.

  • 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
Hì hì, bạn SVBA1608 lại quên rồi, gửi file cad đời sau 2004 là mình chịu chết thôi. Bạn thông cảm vì máy mình nó củ chuối vậy, đành chấp nhận nó thôi. Hì hì hì.

Xin lỗi bác Bình, đây là file dwg 2004 :cheers:

http://www.cadviet.com/upfiles/2/a_5.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
Vì có một số lượng lớn bản vẽ cần quản lý nên PP nhờ các Bác viết giúp 1 Lisp nhẳm làm cho công việc dể dàng hơn như sau.

Trong Express của AutoCAD có Lisp attout.lsp, khi dùng lệnh ATTOUT thì AutoCAD sẽ đọc các Attribute (của khung tên được chọn) rồi xuất ra một file .text trong có có các information của các attribute block đã được chọn. Vấn để là Lisp attout.lsp này chỉ xuất information của mỗi MỘT b/v mà thôi. Cái PP cần là nhờ các Bác upgrade Lisp attout này (hoặc viết Lisp mới) để có thể xuất các Attribute của từng b/v viết chung vào mỗi MỘT file Text, sau đó thì User dùng Excel để đọc và modify file Text này thành 1 Danh sách các thông tin của tất cả b/v. Nếu có thể được thì User chỉ Save tất cả các b/v vào 1 folder để Lisp tự động đọc và xuất các Attribute block của khung tên.

Phụ thêm với Lisp ( sau khi đã tạo được 1 danh sách) là làm sao Rename Filenames của tất cả các b/v (vài ngàn b/v trong 1 folder) với tên nguyên gốc dạng 12345-001-X-XX.dwg trở thành 12345-001.dwg

PP up vài khung tên b/v được đơn giản hoá và 1 file .csv để các Bác thử nghiệm. Xin cảm ơn các Bác thật nhiều.

http://www.cadviet.com/upfiles/2/drawing_i...mation_list.zip

Lisp MacAtt_MacAttExt_MacAttEdit_ V2_3.lsp của Lee dùng để xuất các Attribute values vào 1 Excel spreadsheet, nhưng cần nhờ các Bác upgrade thêm để có 1 Excel sheet như PP đã post. Thank you.

http://www.cadviet.com/upfiles/2/macatt_ma...tedit__v2_3.lsp

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 Bình, đây là file dwg 2004 :cheers:

http://www.cadviet.com/upfiles/2/a_5.dwg

Hề hề hề,

Cái này khá khó nhằn đây bạn SVBA1608 à. Có lẽ bạn nên cung cấp thêm các tiêu chí về việc chọn hướng dòng chảy và việc chọn các tiểu khu để hạn chế bớt đáp án mới được 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
Hề hề hề,

Cái này khá khó nhằn đây bạn SVBA1608 à. Có lẽ bạn nên cung cấp thêm các tiêu chí về việc chọn hướng dòng chảy và việc chọn các tiểu khu để hạn chế bớt đáp án mới được bạn ạ.

 

Cảm ơn bác Bình nhiều! Tuy nhiên, em xin dừng đề nghị này vì em thấy nó là không khả thi.

Nay em muốn nhờ các anh chị em trên Diễn đàn viết giùm em một lisp có tính năng như sau:

Lisp tính chiều dài đoạn thẳng và lập bảng.

Em cũng đã tham khảo nhiều lisp tính chiều dài trên Diễn đàn nhưng chưa có lisp nào đúng theo mong muốn của em.

Đoạn thẳng ở đây không cần quan tâm là line hay polyline vì 2 đầu đoạn thẳng do người sử dụng pick chọn.

Bảng ở đây cũng không cần kẻ ô sẵn (như lisp của lbd của bác Hoành) mà chỉ cần viết giá trị chiều dài đã đo theo thứ tự đo.

Lisp sẽ yêu cầu như sau:

+ Chọn vị trí lập bảng.

+ Chọn điểm thứ nhất.

+ Chọn điểm thứ hai.

Sau khi enter, giá trị chiều dài sẽ được viết vào vị trí lập bảng. Tiếp tục enter, lisp sẽ hỏi:

+ Chọn điểm thứ nhất.

+ Chọn điểm thứ hai.

Sau khi enter, giá trị chiều dài sẽ được viết vào vị trí lập bảng, phía dưới giá trị vừa viết trên...

Cứ như vậy đến hết.

Nhờ các anh chị em trên Diễn đàn giúp đỡ! Em cảm ơ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 Bình nhiều! Tuy nhiên, em xin dừng đề nghị này vì em thấy nó là không khả thi.

Nay em muốn nhờ các anh chị em trên Diễn đàn viết giùm em một lisp có tính năng như sau:

Lisp tính chiều dài đoạn thẳng và lập bảng.

Em cũng đã tham khảo nhiều lisp tính chiều dài trên Diễn đàn nhưng chưa có lisp nào đúng theo mong muốn của em.

Đoạn thẳng ở đây không cần quan tâm là line hay polyline vì 2 đầu đoạn thẳng do người sử dụng pick chọn.

Bảng ở đây cũng không cần kẻ ô sẵn (như lisp của lbd của bác Hoành) mà chỉ cần viết giá trị chiều dài đã đo theo thứ tự đo.

Lisp sẽ yêu cầu như sau:

+ Chọn vị trí lập bảng.

+ Chọn điểm thứ nhất.

+ Chọn điểm thứ hai.

Sau khi enter, giá trị chiều dài sẽ được viết vào vị trí lập bảng. Tiếp tục enter, lisp sẽ hỏi:

+ Chọn điểm thứ nhất.

+ Chọn điểm thứ hai.

Sau khi enter, giá trị chiều dài sẽ được viết vào vị trí lập bảng, phía dưới giá trị vừa viết trên...

Cứ như vậy đến hết.

Nhờ các anh chị em trên Diễn đàn giúp đỡ! Em cảm ơn!

Chào Svba1608,

Hy vọng rằng cái này đúng ý bạn

http://www.cadviet.com/upfiles/2/svba.lsp

(defun c:gkc ()
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 20)
)
)
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Hay chon diem dat bang")
cnt 0
h 30)
(setq ans (getstring "\n Ban muom tiep tuc: [y or n] "))
(while (= ans "y")
(setq kc (rtos (getdist) 2 2)
pt (list (car p) (- (cadr p) (* cnt h))))
(wtxt kc pt)
(setq cnt (1+ cnt)
ans (getstring "\n Ban muom tiep tuc: [y or n] "))
)
(setvar "osmode" oldos)
(princ)
)

Lệnh chạy lisp là gkc. Khi chạy lisp, mỗi khi bạn trả lời "y" và nhấn enter, lisp sẽ dừng để bạn pick hai điểm theo ý bạn và lisp sẽ ghi kích thước này vào bảng, khi muốn dừng bạn trả lời "n" và nhấn enter khi lisp hỏi hoặc chỉ cần nhấn enter.

Chúc bạn vui.

  • 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
Chào Svba1608,

Hy vọng rằng cái này đúng ý bạn

Lệnh chạy lisp là gkc

Chúc bạn vui.

 

Cảm ơn bác Bình nhiều! Lisp chạy đúng ý em! Nhờ bác check lại giùm lisp một chút, vì khi chạy lisp không hiểu sao tất cả các truy bắt điểm (trong lệnh Osnap) đều bị mất, khiến cho em không thể pick vào được điểm cần pick.

Nhờ bác và các anh chị em sửa thêm cho lisp một chút. Ấy là lúc trước em quên mất rằng những đối tượng em cần đo chiều dài không chỉ có đoạn thẳng mà có nhiều đường gấp khúc (vẽ bằng lệnh pline). Nay em muốn cải tiến lisp như sau:

Lisp đo chiều dài đối tượng bằng cách pick nhiều điểm trên đối tượng cho đến khi enter (hay làm động tác gì đó) để kết thúc việc chọn điểm trên đối tượng. Hoặc nếu có thể, xin cho lisp thêm chức năng ghi chiều dài của pline được chọn (vẫn lập thành bảng).

Xin mô tả ý muốn của mình như sau:

Em cần đo chiều dài nhiều đoạn ống và lập bảng. Trong đó có đoạn ống 17-18 và 18-21 như hình ảnh minh họa.

Thực chất đây là các đoạn polyline gãy khúc. Vì vậy em muốn đo chiều dài theo 2 cách: pick chọn polyline và pick chọn điểm.

Rất mong nhận được sự giúp đỡ! Em xin chân thành cảm ơn!

i.jpg

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
Chào Svba1608,

Hy vọng rằng cái này đúng ý bạn

http://www.cadviet.com/upfiles/2/svba.lsp

(defun c:gkc ()
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 20)
)
)
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Hay chon diem dat bang")
cnt 0
h 30)
(setq ans (getstring "\n Ban muom tiep tuc: [y or n] "))
(while (= ans "y")
(setq kc (rtos (getdist) 2 2)
pt (list (car p) (- (cadr p) (* cnt h))))
(wtxt kc pt)
(setq cnt (1+ cnt)
ans (getstring "\n Ban muom tiep tuc: [y or n] "))
)
(setvar "osmode" oldos)
(princ)
)

Lệnh chạy lisp là gkc

Chúc bạn vui.

Chào bác PhamthanhBinh

 

1. Tue_NV biết bác tắt chế độ bắt điểm để ghi Text cho đúng, nhưng bác nên cho 1 đoạn mã bật chế độ bắt điểm khi nhập khoảng cách bằng hàm (getdist)

(setvar "osmode" 0)

 

2. (setq ans (getstring "\n Ban muom tiep tuc: [y or n] "))

(dòng này trên dòng (while (= ans "y")

--->> Theo Tue_NV bác nên thay dòng này bằng dòng (setq ans "y")

Dạo đầu mà bác, đương nhiên là muốn tiếp tục rồi :cheers: :cheers:

 

3. Nên cho 1 vòng lặp while lồng vào vòng lặp (while (= ans "y") ...... ---> lặp lại hành động nhập khoảng cách để cho đúng như ý muốn của svba1608 ở bài viết trên, để tăng nhanh hiệu quả làm việc của Lisp

 

Mình cũng vừa mới đọc bài của svba1608 ở trên thì ý thứ 3 mình nên đưa vào để USER có 2 lựa chọn :

a./ Nhập chiều dài bằng cách chọn đối tượng

b/ Nhập chiều dài bằng cách pick điểm

  • Vote tăng 2

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
Chào bác PhamthanhBinh

 

1. Tue_NV biết bác tắt chế độ bắt điểm để ghi Text cho đúng, nhưng bác nên cho 1 đoạn mã bật chế độ bắt điểm khi nhập khoảng cách bằng hàm (getdist)

(setvar "osmode" 0)

 

2. (setq ans (getstring "\n Ban muom tiep tuc: [y or n] "))

(dòng này trên dòng (while (= ans "y")

--->> Theo Tue_NV bác nên thay dòng này bằng dòng (setq ans "y")

Dạo đầu mà bác, đương nhiên là muốn tiếp tục rồi :cheers: :cheers:

 

3. Nên cho 1 vòng lặp while lồng vào vòng lặp (while (= ans "y") ...... ---> lặp lại hành động nhập khoảng cách để cho đúng như ý muốn của svba1608 ở bài viết trên, để tăng nhanh hiệu quả làm việc của Lisp

 

Mình cũng vừa mới đọc bài của svba1608 ở trên thì ý thứ 3 mình nên đưa vào để USER có 2 lựa chọn :

a./ Nhập chiều dài bằng cách chọn đối tượng

b/ Nhập chiều dài bằng cách pick điểm

Chào bác Tue_nv và bạn svba1608,

Ý 1 và 2 của bác, mình nhất trí, song có điều sau khi nhập khoảng cách lại phải đặt chế độ osnap về 0.

Ý 3 của bác mình chưa hiểu rõ, nếu là để thực hiện yêu cầu cho phép hai kiểu nhập khoảng cách khác nhau nhừ bạn svba đề nghị thì theo mình có thể dùng hàm điều kiện if sẽ hay hơn bác ạ.

Gửi bác và bạn SVBA1608 cái lisp mình đã sửa theo ý như trên. Mong rằng nó giúp ích được cho bạn SVBA1608.

(defun c:gkc ()
(vl-load-com)
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 20)
)
)
)
(defun Length(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Hay chon diem dat bang")
cnt 0
h 30)
(setq ans "y")
(while (= ans "y")
(setq pt (list (car p) (- (cadr p) (* cnt h))))
(setq a (getstring "\n Hay chon kieu nhap : [1 or 2] "))
(if (= a "1")
(progn
(setvar "osmode" oldos)
(setq kc (rtos (getdist) 2 2))
(setvar "osmode" 0)
)
(progn
(setq ent (entsel)
e (car ent)
kc (rtos (length e) 2 2))
)
)
(wtxt kc pt)
(setq cnt (1+ cnt)
ans (getstring "\n Ban muom tiep tuc: [y or n] "))
)
(setvar "osmode" oldos)
(princ)
)

Cách dùng tương tự lisp trước nhưng lưu ý khi lisp hỏi kiểu nhập khoảng cách, "1" là kiểu nhập bằng pick hai điểm, "2" là kiểu nhập bằng cách chọn đối tượng.

Do chỉ có hai kiểu nhập nên nếu chọn kiểu 2 bạn có thể nhấn enter ngay khi lisp hỏi mà không cần thiết phải nhập ký tự 2. Nhưng nếu muốn nhập kiểu 1 thì bắt buộc phải nhập ký tự 1 trước khi nhấn enter.

Chúc mọi người luôn mạnh giỏi và yêu đời.

@ SVBA1608: Cái lisp ghi diện tích vào ngay trong bản vẽ mình vẫn chưa gỡ được vì không hiểu tại sao nó lại cho kết quả khác với khi lập bảng. Mong bạn thông cảm. Hy vọng diễn đàn sẽ có người gỡ giúp cái xơ to tổ bố này. Hề hề hề, đau răng quá.....

  • 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
Tuy nhiên, em xin dừng đề nghị này vì em thấy nó là không khả thi.

Chào svba1608, và bác phanthanhbinh, Đề toán ra lần này có khó hơn đề toán trước, nhưng vẫn có khả thi giải được bài toán này! Thiep gợi ý như thế này:

- Từng đoạn ống, xác định được text số đầu ống ví dụ 29-28, tuy nhiên muốn đúng theo hướng dòng chảy thì hướng của polyline (ống) phải cùng hướng mũi tên dòng chảy (startpoint tại text 29, endpoint tại text 28)

- Từng đoạn ống sẽ tìm được điểm giữa, từ điểm giữa tìm được 2 đường ranh thửa (màu số 153) gần nó nhất, gọi là đường LWP.

- Từng LWP lọc lấy các point nút đỉnh cho vào 1 listpoint để lọc lấy các text A, B, C, D, E và 1 text số (dùng mã hàm (ssget “CP” listpoint ‘((0 . “TEXT”)))

- Từng các text A, B, C, D sẽ tìm được insertpoint và tìm được khoảng cách từ text đến LWP. So sánh để tìm ra 1 text chữ gần LWP nhất. Nối với text số để tạo nhãn của tiểu khu.

Tuy nhiên, trong bản vẽ của svba1608 có 1 đường ống rất dài từ điểm 18 -> 21 -> 25 -> 31 -> 30, không xử lý được, cần phải cắt ra 4 đoạn mới làm được.

Vài điều trao đổi với các bác, Lúc rày Thiep đang bận lắm, muốn ra lisp này nhưng đành chịu, nhờ các bác nào rảnh tay giúp svba1608 với.

  • Vote tăng 2

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
Chào bác Tue_nv và bạn svba1608,

Ý 1 và 2 của bác, mình nhất trí, song có điều sau khi nhập khoảng cách lại phải đặt chế độ osnap về 0.

Ý 3 của bác mình chưa hiểu rõ, nếu là để thực hiện yêu cầu cho phép hai kiểu nhập khoảng cách khác nhau nhừ bạn svba đề nghị thì theo mình có thể dùng hàm điều kiện if sẽ hay hơn bác ạ.

 

i.jpg

 

Cảm ơn bác Bình rất nhiều! Tuy nhiên em muốn nhờ thay đổi chức năng của lisp: kiểu 2 vẫn là pick chọn polyline, nhưng kiểu 1 là pick chọn nhiều điểm trên đối tượng chứ không phải 2 điểm.

Xin giải thích lý do phải pick chọn nhiều điểm như sau:

Đoạn ống 17 - 18 nếu đúng ra thì nút 17 phải gần nút 20. Nhưng do yêu cầu của việc thiết kế HTTN mà phải tách ra, nhưng khi tính chiều dài đoạn ống 17-18, người thiết kế phải tính chiều dài đoạn gấp khúc 20-18 chứ không phải 17-18. Như vậy lúc này em dùng kiểu 1: pick 2 điểm hay kiểu 2: pick chọn polyline đều không chính xác.

Vì vậy nhờ các bác sửa lisp giùm em thành pick chọn nhiều điểm.

 

@ SVBA1608: Cái lisp ghi diện tích vào ngay trong bản vẽ mình vẫn chưa gỡ được vì không hiểu tại sao nó lại cho kết quả khác với khi lập bảng. Mong bạn thông cảm. Hy vọng diễn đàn sẽ có người gỡ giúp cái xơ to tổ bố này. Hề hề hề, đau răng quá.....

Cảm ơn bác Bình, với svba1608, lisp này là quá tuyệt vời, và nhờ sự giúp đỡ của mọi người, svba1608 đã hoàn thành xong việc tính diện tích rồi.

 

Chào svba1608, và bác phanthanhbinh, Đề toán ra lần này có khó hơn đề toán trước, nhưng vẫn có khả thi giải được bài toán này!

Rất cảm ơn sự giúp đỡ của anh Thiệp.

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
i.jpg

 

Cảm ơn bác Bình rất nhiều! Tuy nhiên em muốn nhờ thay đổi chức năng của lisp: kiểu 2 vẫn là pick chọn polyline, nhưng kiểu 1 là pick chọn nhiều điểm trên đối tượng chứ không phải 2 điểm.

Xin giải thích lý do phải pick chọn nhiều điểm như sau:

Đoạn ống 17 - 18 nếu đúng ra thì nút 17 phải gần nút 20. Nhưng do yêu cầu của việc thiết kế HTTN mà phải tách ra, nhưng khi tính chiều dài đoạn ống 17-18, người thiết kế phải tính chiều dài đoạn gấp khúc 20-18 chứ không phải 17-18. Như vậy lúc này em dùng kiểu 1: pick 2 điểm hay kiểu 2: pick chọn polyline đều không chính xác.

Vì vậy nhờ các bác sửa lisp giùm em thành pick chọn nhiều điểm.

Cảm ơn bác Bình, với svba1608, lisp này là quá tuyệt vời, và nhờ sự giúp đỡ của mọi người, svba1608 đã hoàn thành xong việc tính diện tích rồi.

Rất cảm ơn sự giúp đỡ của anh Thiệp.

Chào bạn SVBA1608,

Cái lisp này mình đã sửa lại theo ý bạn. Bạn thử dùng xem nhé. Nó có hai kiểu chọn là pick nhiều điểm và pick đối tượng. Tất nhiên khi pick nhiều điểm thì nó hơi nhiêu khê hơn pick hai điểm. Nó yêu cầu bạn phải trả lời có chọn điểm tiếp theo hay không. Nếu bạn không chọn tiếp nó sẽ tính tổng khoảng cách từ điểm đầu lần lượt qua các điểm chọn tới điểm cuối cùng mà bạn đã chọn.

Nó đây nè:

(defun c:gkc ()
(vl-load-com)
(defun wtxt (txt p / sty d h)
(entmake
(list (cons 0 "TEXT")
(cons 1 txt)
(cons 10 p)
(cons 40 20)
)
)
)
(defun Length(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
(defun tkc ()
(setq kc 0
p0 (getpoint "\n Hay chon diem dau")
as "y")
(while (= as "y")
(setq kc (+ kc (distance p0 (setq p1 (getpoint))))
p0 p1
as (getstring "\n Ban muon chon diem tiep theo: [y or n] ")
)
)
;;; (setq kc (rtos kc 2 2))
kc
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Hay chon diem dat bang")
cnt 0
h 30)
(setq ans "y")
(while (= ans "y")
(setq pt (list (car p) (- (cadr p) (* cnt h))))
(setq a (getstring "\n Hay chon kieu nhap : [1 or 2] "))
(if (= a "1")
(progn
(setvar "osmode" oldos)
(setq kc (rtos (tkc) 2 2))
(setvar "osmode" 0)
)
(progn
(setq ent (entsel)
e (car ent)
kc (rtos (length e) 2 2))
)
)
(wtxt kc pt)
(setq cnt (1+ cnt)
ans (getstring "\n Ban muom tiep tuc: [y or n] "))
)
(setvar "osmode" oldos)
(princ)
)

 

Bạn có thể so sánh cái lisp này với các lisp trước đó để thấy được cái cách mình sửa. Qua đó bạn có thể học được cách sửa lisp theo ý mình.

Chúc bạn vui.

  • 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

TUE_NV ah, lần trước mình nhờ anh em trên diễn đàn giúp mình về lisp rải taluy, sau đó mình nhận đc lisp của bạn, tuy nhiên bây giờ sử dụng lại nảy sinh ra một vấn đề , đó là khi rải taluy, nếu đường cơ sở (chọn đường thứ nhất) mà là đường gãy khúc hoặc là đường cong thì các đường taluy sẽ chồng chéo lên nhau,mình lải phải trim đi, vẽ lại.Nếu như nét Taluy mà vuông góc vơi đường chọn thứ 2 thì coi như giải quyết được vấn đề. Vậy việc này nhờ TUE_NV và anh em trên diễn đàn cùng thảo luận, giải quyết giúp mình với nhé. Mình up file minh hoạ ở đây:

http://www.cadviet.com/upfiles/2/minh_hoa_1.dwg

Và lisp mình up lai ở đây

http://www.cadviet.com/upfiles/2/mtl.lsp

Xin chân thành cảm ơn bạn và anh em trên diễn đà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

Anh em trên diễn đàn bớt chút thời gian xem xét và giải quyết vướng mắc về lisp "mtl" trên của em với, em đang cần quá.

Xin chân thành cảm ơ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
Anh em trên diễn đàn bớt chút thời gian xem xét và giải quyết vướng mắc về lisp "mtl" trên của em với, em đang cần quá.

Xin chân thành cảm ơn!!!

Chào nqt266, gì mà cần gấp quá dậy! Lisp này, Thiep viết đã lâu, bạn thử lisp này xem. Lệnh là TLU

http://www.cadviet.com/upfiles/2/taluy.lsp

Chúc bạn thành công

  • 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
Tuynh:

Mình đưa file lên đây

http://www.cadviet.com/upfiles/2/2d3d.dwg

đường 2d poline có cao độ là 10, đường 3d poline có cao độ khác nhau tại các điểm point, bạn có lisp nào mà khi pick vào đường

2d poline thì tại các điểm point hiện cao độ cho mình nhập theo ý muốn và đường 2d poline chuyển thành 3d poline.

 

Chào Tuynh, lisp sau đây, yêu cầu Bạn pick các node của polyline sẽ biến 2D polyline thành 3D polyline. Sau đó bạn tiếp tục thay đổi độ cao các node của 3d polyline

;;; Lisp thay doi do cao cac node cua POLYLINE
;;; copyright by Thiep 7/2009
;;; yeu cau: cai dat day du Expresstools 
;;;--------------------------
(defun DXF (code en) (cdr (assoc code (entget en))))
;;;---------------------
(defun SAVE_MODE ()
 (command "UCS" "W" "")
 (setq	OLD_OSMODE    (getvar "OSMODE")
OLD_CECOLOR   (getvar "CECOLOR")
OLD_AUTOSNAP  (getvar "AUTOSNAP")
OLD_ORTHOMODE (getvar "ORTHOMODE")
 )
 (setvar "cmdecho" 0)
 (setvar "plinegen" 1)

)
(defun RESTORE ()
 (setvar "osmode" OLD_OSMODE)
 (setvar "AUTOSNAP" OLD_AUTOSNAP)
 (setvar "ORTHOMODE" OLD_ORTHOMODE)
 (setvar "CECOLOR" OLD_CECOLOR)
 (setvar "cmdecho" 1)
)
;;;--------------------------
;;;----------------------------------------
(defun 3DPoly (Lp *ModelSpace* / PntArr)
 (setq	PntArr (vlax-make-safearray
	 vlax-vbDouble
	 (cons 0 (1- (length Lp)))
       )
 )
 (vlax-safearray-fill PntArr Lp)
 (vla-Add3Dpoly *ModelSpace* PntArr)
)
;;;-----------------------------------
(vl-load-com)
(defun c:3dp (/ ActDoc *Model* wp lwp Obj n pn pcl Pe lstP Elev lt lstN)
 (SAVE_MODE)
 (setvar "osmode" 1)
 (setq	ActDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
*Model*	(vla-get-ModelSpace ActDoc)
 )
 (while (setq pn (getpoint "\nPick a point on Polyine: "))
   (setq lwp (ssname (ssget pn) 0))
   (redraw lwp 3)
   (setq heinode (getreal "\nEnter height of node: ")
  obj	  (vlax-ename->vla-object lwp)
  lstP (ACET-GEOM-VERTEX-LIST lwp)
   )
   (if	(eq (dxf 0 lwp) "LWPOLYLINE")
     (progn
(setq Elev (vla-get-Elevation obj))
(setq lstN nil)
(foreach lt lstP
  (if (and (eq (car lt) (car pn)) (eq (cadr lt) (cadr pn)))
    (setq lt (list (car lt) (cadr lt) heinode))
    (setq lt (list (car lt) (cadr lt) Elev))
  )
  (setq lstN (append lt lstN))
)
(vla-update (3DPoly lstN *Model*))
(vla-delete obj)
     )
     (progn
(setq lstP (ACET-GEOM-VERTEX-LIST lwp))
(setq lstN nil)
(foreach lt lstP
  (if (and (eq (car lt) (car pn)) (eq (cadr lt) (cadr pn)))
    (setq lt (list (car lt) (cadr lt) heinode))
  )
  (setq lstN (append lt lstN))
)
(vla-update (3DPoly lstN *Model*))
(vla-delete obj)
     )
   )
 )
 (RESTORE)
 (princ "\nChuc cac ban vui ve! Thiep")
 (princ)
)

Tuy nhiên, nếu bạn thay đổi 1 polyline có hàng 100 node thì nên dùng cách khác nhanh hơn: Dùng bảng kê tọa độ trong Excel đổi qua đuôi *.csv, sau đó xây dựng 1 3D polyline theo 1 lisp khác.

Bác có cái lisp và excel .csv thực hiện vẽ 3d polyline không cho em xin với!

Cảm ơn trươc :cheers:

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
Anh em trên diễn đàn bớt chút thời gian xem xét và giải quyết vướng mắc về lisp "mtl" trên của em với, em đang cần quá.

Xin chân thành cảm ơn!!!

Bạn có thể sử dụng Lisp của bác Thiep hoặc sử dụng code này đã sửa lại cho bạn :

Chú ý sử dụng code của bác Thiep là phải cài phụ trợ Express

(defun c:mtl(/ doc Util MS c1 c2 kc2tl L1 oldos i j p dgiao pc2)
(vl-load-com)
(setq doc (vla-get-activeDocument (vlax-get-acad-object))
Util (vla-get-utility doc)
MS (vla-get-ModelSpace doc))
(vla-StartUndoMark doc)
(setq c1 (car(entsel "\n Chon duong bien thu nhat :")))
(setq c2 (car(entsel "\n Chon duong bien thu hai :")))
(if (not *kc2tl*) (setq *kc2tl* 2))
(setq kc2tl (getdist (strcat "\n Khoang cach giua taluy ngan va taluy dai 				(rtos *kc2tl* 2 2) " > : "
		     )
	   )
)
(if (not kc2tl) (setq kc2tl *kc2tl*) (setq *kc2tl* kc2tl))
(setq L1 (vlax-curve-getDistAtParam c1
		(setq pre (vlax-curve-getEndParam c1))
	)
)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq i 0 j 0)
(Repeat (1+ (fix (/ L1 kc2tl)))
(setq p (vlax-curve-getPointAtDist c1 i))
(setq dgiao (vlax-curve-getClosestPointTo c2 p nil))
(if (= (rem j 2) 0)
(setq pc2 dgiao)
(setq pc2 (list (/ (+ (car p) (car dgiao)) 2) (/ (+ (cadr p) (cadr dgiao)) 2) 0))
)
(vla-addline MS (vlax-3d-point p)
	 (vlax-3d-point pc2)
)
(setq i (+ i kc2tl))
(setq j (1+ j))
);repeat
(setvar "osmode" oldos)
(vla-EndUndoMark doc)
(princ)
)

:cheers:

 

Vì có một số lượng lớn bản vẽ cần quản lý nên PP nhờ các Bác viết giúp 1 Lisp nhẳm làm cho công việc dể dàng hơn như sau.

......

Phụ thêm với Lisp ( sau khi đã tạo được 1 danh sách) là làm sao Rename Filenames của tất cả các b/v (vài ngàn b/v trong 1 folder) với tên nguyên gốc dạng 12345-001-X-XX.dwg trở thành 12345-001.dwg

.....

Chào Phiphi

Bạn sử dụng code này thử xem sao :

(defun c:rnf(/ f fn list_dwg tbve_find tbve_re nx)
 (setq f (getfiled "\n Chon 1 file bat ki trong folder"
	    "" "dwg" 4))
 (setq fn (vl-filename-directory f))
 (setq list_dwg (vl-directory-files fn "*.dwg"))
 (if (= (strlen fn) 3)
   	(setq tbve_find (substr f (+ (strlen fn) 1) (strlen f)))
 	(setq tbve_find (substr f (+ (strlen fn) 2) (strlen f)))
 )
 (setq tbve_re (getstring t (strcat "\n Ten Ban ve can thay  : ")))
 (foreach x list_dwg
   (if (wcmatch x tbve_re)
     (progn
       (setq nx  (strcat (substr tbve_re 1 (1- (strlen tbve_re)))
	  	  (substr x (strlen tbve_re) 1) 
	 	   (substr x (- (strlen x) 3) 4)
	  )
)
   	(vl-file-rename (strcat fn "\\" x)
  		(strcat fn "\\" nx)
       )
     )
   )
   (princ (strcat "\n Ban ve : " x " da duoc thay thanh ban ve : " nx))
 );foreach
 (textscr)
 (princ)
)

Hướng dẫn sử dụng

1.Gõ lệnh Rnf (rename files) -> Chon 1 file .dwg trong folder mà bạn cần đặt tên. Cụ thể là chọn 1 file bất kì trong folder Test Attribute trên máy tính của bạn

2. Gõ tên file cần thay thế. Chú ý * là kí tự đại diện

123456-001-X-01.dwg -> phải được thay bằng 123456-00* (cái này giống với ý của Phi phi đã post là 12345-001-X-XX.dwg

 

Command: rnf

 

Ten Ban ve can thay : 123456-00*

 

Ban ve : 123456-001-X-01.dwg da duoc thay thanh ban ve : 123456-001.dwg

Ban ve : 123456-002-A-03.dwg da duoc thay thanh ban ve : 123456-002.dwg

Ban ve : 123456-003-B-04.dwg da duoc thay thanh ban ve : 123456-003.dwg

Ban ve : 123456-004-C-02.dwg da duoc thay thanh ban ve : 123456-004.dwg

Ban ve : 123456-005-D-06.dwg da duoc thay thanh ban ve : 123456-005.dwg

 

-> Toàn bộ bản vẽ được thay rồi.

Thế là vui nhé.

:cheers:

  • Vote tăng 2

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

Chào Tue_NV, trường hợp trong folder có vài bản vẽ missing (rất phổ biến) thì Rename theo cách trên có được chính xác hay không vậy Tue_NV?

PP có thử 5 bv trong folder đã post thì thấy OK.

Cám ơn nhiều nhé.

(Còn yêu cầu thứ nhất thì Tue_NV có ý kiến gì 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
Chào Tue_NV, trường hợp trong folder có vài bản vẽ missing (rất phổ biến) thì Rename theo cách trên có được chính xác hay không vậy Tue_NV?

PP có thử 5 bv trong folder đã post thì thấy OK.

Cám ơn nhiều nhé.

(Còn yêu cầu thứ nhất thì Tue_NV có ý kiến gì không?)

Chào Phiphi

Cách trên hoàn toàn chính xác. Chỉ có điều để nhập được chính xác kí tự cần thay bản vẽ thì khi chọn tên bản vẽ trong hộp thoại thì Phiphi nên chọn tên bản vẽ đó nằm trong bản vẽ missing (rất phổ biến) đó. Phiphi hiểu chứ? :cheers:

 

Lisp sẽ tự động kiểm tra anh bản vẽ nào mà cùng chữ với bản vẽ thay thế thì nó mới thay

Ví dụ : Chuỗi "123456-001-X-01.dwg" = với chuỗi này "123456-00*" -> file này sẽ được thay

Chuỗi "123456-011-X-01.dwg" không bằng với chuỗi này "123456-00*" -> file này sẽ không được thay

 

+ Ngoài ra, Phiphi cũng cần chú ý rằng file khi thay không được trùng nhau. Computer không bao giờ không chấp nhập như vậy, bằng chứng là bạn copy và paste 1 file tại chổ của file đó thì nó bao giờ cũng thêm vào tiền tố trước file đó là Copyof....

 

Ví dụ : ở dòng này mà bạn đánh như sau :

 

Command: rnf

 

Ten Ban ve can thay : 123456-0*

=> Nếu như vậy bản vẽ sẽ bị trùng tên ngay và lúc này Lisp sẽ thay 1 tên file trong số các file đó.

Do đó hãy cẩn thận. Be careful!!!!

 

Nếu bạn đánh chẳng trùng tên hay chuỗi không bằng nhau (sự so sánh chuỗi) thì Lisp sẽ hiện bảng thông báo

Đây là Lisp chỉnh lại để hiện lên thông báo đó

(defun c:rnf(/ f fn list_dwg tbve_find tbve_re nx)
 (setq f (getfiled "\n Chon 1 file bat ki trong folder"
	    "" "dwg" 4))
 (setq fn (vl-filename-directory f))
 (setq list_dwg (vl-directory-files fn "*.dwg"))
 (if (= (strlen fn) 3)
   	(setq tbve_find (substr f (+ (strlen fn) 1) (strlen f)))
 	(setq tbve_find (substr f (+ (strlen fn) 2) (strlen f)))
 )
 (setq tbve_re (getstring t (strcat "\n Ten Ban ve can thay  : ")) i 0)
 (foreach x list_dwg
   (if (wcmatch x tbve_re)
     (progn
       (setq nx  (strcat (substr tbve_re 1 (1- (strlen tbve_re)))
	  	  (substr x (strlen tbve_re) 1) 
	 	   (substr x (- (strlen x) 3) 4)
	  )
)
   	(vl-file-rename (strcat fn "\\" x)
  		(strcat fn "\\" nx)
       )
(setq i (1+ i))
(princ (strcat "\n Ban ve : " x " da duoc thay thanh ban ve : " nx))
     )
   )
 );foreach
(if (= i 0) (alert "\n Chang co ban ve nao duoc thay ca :")
   (progn 
      (princ (strcat "\n Co tong cong : " (itoa i) " ban ve duoc thay"))
 		(textscr)
   )
)
 (princ)
)

Y/cầu 1 của Phiphi vì Tue_NV chưa rõ ý của PP lắm nên chưa có ý kiến gì.

  • 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

Xin chân thành cảm ơn bác thiep và bac TUE_NV đã nhanh chóng giúp đỡ em,vì công việc đang gấp quá mà. Chúc 2 bác tiếp tục có những lisp hay để giúp đỡ anh em phần nào nhẹ bớt được công việc thiết kế. Chúc anh em trên diễn đàn mạnh khoẻ và sôi nổi!!!

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 chân thành cảm ơn bác thiep và bac TUE_NV đã nhanh chóng giúp đỡ em,vì công việc đang gấp quá mà. Chúc 2 bác tiếp tục có những lisp hay để giúp đỡ anh em phần nào nhẹ bớt được công việc thiết kế. Chúc anh em trên diễn đàn mạnh khoẻ và sôi nổi!!!

Chân thành cảm ơn bạn vì lời chúc.

 

Tuy nhiên, mình nghĩ bạn nên tick Thanks ngay dưới bài viết thay vì viết những bài như vầy.

 

Vì rằng, việc tìm kiếm rất khó khăn, nhất là trong topic này.

 

:cheers:

  • 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×