Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

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


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#841 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 06 March 2010 - 03:27 PM

Chào bác Hoành,
Sau khi bác sửa lại thì lisp đã chạy một mạch cho tới khi kết thúc, ngoại trừ một vài chỗ không lấy boundary được. Tuy nhiên chưa thấy viết ra được cái bảng kết quả như bạn SVBA 1608 mô tả. Nhờ bác xem lại cái chỗ viết kết quả một chút, có thể có lầm lẫn gì chăng???
Chúc bác khỏe và vui.


Cảm ơn bác Hoành và bác Bình rất nhiều!
Em cũng cùng ý kiến với bác Bình vậy. Lisp chạy vù vù, thỉnh thoảng lại hiện ra thông báo: "Error analyzing internal islands" - bấm Ok thì lisp chạy tiếp ..., cứ như thế đến hết thì dừng lại và không hiện ra gì cả. Nhờ bác Hoành check lại. Em cảm ơn!

Hình đã gửi
  • 0
http://khuyen.space

#842 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 March 2010 - 03:47 PM

Cảm ơn bác Hoành và bác Bình rất nhiều!
Em cũng cùng ý kiến với bác Bình vậy. Lisp chạy vù vù, thỉnh thoảng lại hiện ra thông báo: "Error analyzing internal islands" - bấm Ok thì lisp chạy tiếp ..., cứ như thế đến hết thì dừng lại và không hiện ra gì cả. Nhờ bác Hoành check lại. Em cảm ơn!

Hình đã gửi

Em bật sáng "đèn" toàn bộ Layer là thấy. Vì không "bật đèn" -> tối cho nên không thấy :cheers:
Có lẽ nên "bật sáng" đèn" trong Lisp luôn bác Hoành à :cheers:
  • 1

#843 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 06 March 2010 - 04:02 PM

Đèn là chủ ý mình tắt đi để boundary không bị sai.

Svba thử chọn p1 và p2 chỉ bao đúng 1 hình thôi (như hình vẽ ban đầu của mình) xem sao, như hình Svba đang chụp thì hiện nay Svba chọn p1 và p2 rộng quá (vì lúc chạy lisp sẽ zoom tạm theo p1 p2).

Chọn P1 và P2 sao cho vừa đủ, không lớn cũng không bé (như cái hình mình chụp lên là vừa). Vì lisp dùng lệnh boundary, lệnh này rất hay bị lỗi nếu tỷ lệ zoom lớn hoặc bé.
  • 1

#844 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 06 March 2010 - 04:07 PM

Chào bác Hoành,
Sau khi bác sửa lại thì lisp đã chạy một mạch cho tới khi kết thúc, ngoại trừ một vài chỗ không lấy boundary được. Tuy nhiên chưa thấy viết ra được cái bảng kết quả như bạn SVBA 1608 mô tả. Nhờ bác xem lại cái chỗ viết kết quả một chút, có thể có lầm lẫn gì chăng???
Chúc bác khỏe và vui.

Sau khi kiểm tra so sánh giữa hai cái lisp trước và sau khi bác Hoành đã sửa, mình thử vô hiệu hóa cái dòng code (setvar "clayer" "0") đi thì thấy lisp cho ra bảng kết quả khá ngon lành, và từ đó thấy rằng nếu trước khi chạy lisp, ta chuyển layer hiện hành về layer "vh" thì cái lisp cũ của bác Hoành cũng chạy tốt và cho ra kết quả y chang. Bạn SVBA 1608 hày thử xem và cho ý kiến nha.
Chúc bạn vui và luôn mạnh khỏe.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#845 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 March 2010 - 05:56 PM

Sorry,

Lisp dưới đây sẽ khắc phục nhược điểm trên (lỗi xảy ra do layer hiện hành là sttkhu):


(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")
(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]*")
)
)
)
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 ))
(< (cadr a) (cadr b ))
(< (atoi (car a)) (atoi (car b )))
)
)
)
lastindex (atoi (car (nth (1- (length lst)) lst)))
index 1
lst (mapcar '(lambda (x) (cons (strcat (car x) (cadr x)) (caddr x)))
lst
)
)
(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 (< (cdr tmp) 0.0)
"__err__"
(rtos (cdr tmp) 2 2)
)
"_______"
)
part (1+ part)
)
(wtxt gt (list xht yht))
)
(setq yht (- yht lbd_cellheight)
index (1+ index)
)
)
(princ)
)

Tue_NV nghĩ rằng "giám thị" cần giải thích cho "thí sinh" hiểu là Lisp Chỉ nhận chữ a, b, c, d, e thường chứ không phải là chữ hoa :cheers:
Nếu là chữ hoa thì Lisp chạy không đúng kết quả ngay
Do đó trước khi chạy Lisp phải chuyển chữ hoa thành chữ thường hoặc Có thể bác Hoành chỉnh lại chổ này 1 chút cho đúng với mọi trường hợp.

@Bác Hoành : Bác vui lòng cho Tue_NV hỏi thêm : số -1 trong đoạn Code tính diện tích này có nghĩa là gì? Em chưa hiểu chổ này lắm. Cảm ơn bác nhiều :cheers:

(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")
)
)
)
)
  • 1

#846 violetlamuors

violetlamuors

    biết zoom

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

Đã gửi 07 March 2010 - 11:06 PM

Chào bác HOANH em mới bđầu học về lips em muốn viết 1 lips về các dimesion ví dụ như sau
em đặt 1 là tên của lệnh _dimlinear. để khi vẽ em chỉ cần gõ 1 là gọi được lệnh _dimlinear. xin bác viét giùm em để em có cơ sở nghiên cứu tiếp về lips. cảm ơn bác đã cho chúng em học hỏi
  • 0

#847 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 08 March 2010 - 08:06 AM

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!
  • 0
http://khuyen.space

#848 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 March 2010 - 08:10 AM

Chào bác HOANH em mới bđầu học về lips em muốn viết 1 lips về các dimesion ví dụ như sau
em đặt 1 là tên của lệnh _dimlinear. để khi vẽ em chỉ cần gõ 1 là gọi được lệnh _dimlinear. xin bác viét giùm em để em có cơ sở nghiên cứu tiếp về lips. cảm ơn bác đã cho chúng em học hỏi

Chào bạn violetamuors,
Bạn xài thử cái này coi sao.

(defun c:1 ()
(command "_dimlinear" "pause")
)


Trong đoạn code trên dòng code đầu tiên (defun c:1 () là để định nghĩa một lệnh mới cho cad
dòng code thứ 2 (command "_dimlinear" "pause") là để chỉ cho cad thực hiện việc gọi lệnh dimlinear trong Cad ra và trả quyền điều khiển về cho CAD để bạn tiếp tục thực hiện nốt cái việc bạn muốn.

Bạn có thể tìm hiểu thêm về các cú pháp của từng dòng lệnh trong Help Developer của Cad để có thể sử dụng tốt lisp bạn nhé.
Chúc bạn vui
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#849 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 08 March 2010 - 03:55 PM

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.c...mation_list.zip
  • 0

#850 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 March 2010 - 08:36 PM

Tue_NV nghĩ rằng "giám thị" cần giải thích cho "thí sinh" hiểu là Lisp Chỉ nhận chữ a, b, c, d, e thường chứ không phải là chữ hoa :cheers:
Nếu là chữ hoa thì Lisp chạy không đúng kết quả ngay
Do đó trước khi chạy Lisp phải chuyển chữ hoa thành chữ thường hoặc Có thể bác Hoành chỉnh lại chổ này 1 chút cho đúng với mọi trường hợp.

@Bác Hoành : Bác vui lòng cho Tue_NV hỏi thêm : số -1 trong đoạn Code tính diện tích này có nghĩa là gì? Em chưa hiểu chổ này lắm. Cảm ơn bác nhiều :cheers:

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

Chào bác Tue_NV,
Mình mạn phép bác Hoành giải thích thử cái chỗ bác thắc mắc một chút, nếu có sai mong bác chớ giận.
Bác hãy chú ý rằng : đoạn mã đó là nằm trong hàm (list .....)
Do vậy có thể được hiểu như sau: lấy danh sách gồm các phần tử:
- giá trị của hàm findmother với biến p (findmother p)
- giá trị của hàm dxf với tham số 1 và biến ent (dxf 1 ent)
- giá trị của hàm if với điều kiện nếu hàm (eq enew elast) có giá tri là True thì lấy tiếp vào list giá trị là -1, còn nếu hàm (eq enew elast) có giá trị là False thì sẽ thực hiện tiếp các lệnh để lấy giá trị diện tích của vùng chọn từ hàm (getvar "area") vào trong list.
Bác xem cụ thể dưới đây:
(list
(findmother p)
(dxf 1 ent)
(if (eq enew elast)
-1
(progn
(command ".area" "ob" enew)
(command ".erase" enew "")
(getvar "area")
) ;;;; Đóng hàm progn
) ;;;; Đóng hàm if
) ;;;; Đóng hàm list
) ;;;; Đây là dấu đóng hàm (defun tinhdt .......)

Bác có thể cho chạy thử lisp này rồi sau đó lấy giá trị của biến lst sẽ thấy rõ bác ạ. Chúc bác luôn mạnh và vui.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#851 violetlamuors

violetlamuors

    biết zoom

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

Đã gửi 08 March 2010 - 11:19 PM

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

#852 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 09 March 2010 - 09:47 AM

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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#853 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 09 March 2010 - 02:36 PM

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 (< (caddr ds) 0.0)
"__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 ))
(< (cadr a) (cadr b ))
(< (atoi (car a)) (atoi (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 (< (cdr tmp) 0.0)
"__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.c...les/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.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#854 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 09 March 2010 - 06:40 PM

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.c...files/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!
  • 0
http://khuyen.space

#855 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 09 March 2010 - 09:46 PM

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.c...files/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ì.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#856 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 09 March 2010 - 11:13 PM

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.c...files/2/a_5.dwg
  • 0
http://khuyen.space

#857 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 10 March 2010 - 12:10 PM

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.c...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.c...tedit__v2_3.lsp
  • 0

#858 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 10 March 2010 - 03:20 PM

Xin lỗi bác Bình, đây là file dwg 2004 :cheers:
http://www.cadviet.c...files/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 ạ.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#859 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 11 March 2010 - 08:02 AM

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!
  • 0
http://khuyen.space

#860 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 March 2010 - 08:58 AM

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.c...iles/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.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.