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ị

Chào anh Nguyễn Hoanh!

Em đã tải và dùng Lisp sắp dim(SD) của anh nhưng khi chọn xong đường Dim gốc thì CAD báo lỗi như sau:

 

Command: sd

Sap xep dim © CADViet.com

Chon duong dim goc: Unknown command "SD". Press F1 for help.

,Anh cho em hỏi dòng lệnh này đã được sử lại rồi phải không a:

 

(* (* D (sin (- A B ))) (phia p1 (polar p1 goc 1.0) p2))

 

Mong anh chỉ giúp.

PS/Cảm ơn anh vì sự giúp đỡ nhiệt tình với mọi người!!!

Trích lời bác Hòanh : Không ngờ, ACAD 2008 đã có sẵn lệnh này với cái tên là DIMSPACE.

Tham khảo : http://www.cadviet.com/forum/index.php?showtopic=1661

@haanh6285 : Bạn có thể tải Lisp của bác Hoành từ bài viết số 5 trong chủ đề này :

http://www.cadviet.com/forum/index.php?sho...c=15968&hl=

 

@thanhliemvqh : Bạn vui lòng nói rõ hơn : ghi cốt Đỉnh và Đáy mương, tên hố ga như thế nào??

Vui lòng upload file .dwg minh hoạ và nói rõ. nhé. Cụ thể, chi tiết .

  • 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ãy giúp mình viết lisp cho cái này nhé các ban. cảm ơn

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

http://www.cadviet.com/upfiles/2/file_hoan...u_the_nay_1.dwg

 

mình cần rãi hố ga và điền cốt cho các vị trí hố ga với khoảng cách các hố ga đó

khi đã biết hố ga và cốt của hố ga này và cốt ga cuố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

Mình có nhiều đối tượng được vẽ ra, sau một lệnh LISP (ví dụ Đường tròn, hình chữ nhật, đường line, pline,... Tất cả các đối tượng này được vẽ trong một lệnh của AutoLisp).

 

Vậy các bạn có thể chỉ cho mình cách chọn lại tất cả các đối tượng trên bằng lệnh của LISP không? Hoặc cách add các đối tượng trên vào một tập các đối tượng được không? Để mình copy, hoặc move, hoặc array,...tập đối tượng đó.

 

Xem file đính kèm.

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

 

Cám ơn tất cả cá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

Cảm ơn anh Tue_NV đã viết giùm em lisp vẽ phân giác! Lisp chạy rất tốt (tuy không extend được).

Hôm nay em muốn nhờ mọi người và anh viết giùm em một lisp tính diện tích và lập bảng.

Em đã tham khảo nhiều lisp tính diện tích trên Diễn đàn và tìm được lisp r của anh Thaistreetz là gần giống với mong muốn của mình.

Nay em muốn nhờ viết một lisp như sau:

Em có bản vẽ gồm các khu đất đã được chia ô và đánh số thứ tự như trong file đính kèm sau:

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

Em muốn nhờ viết lisp tính diện tích một vùng (tam giác) bằng cách pick vào một điểm trong vùng và viết kết quả vào bảng như trong file đính kèm trên.

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 anh Tue_NV đã viết giùm em lisp vẽ phân giác! Lisp chạy rất tốt (tuy không extend được).

Hôm nay em muốn nhờ mọi người và anh viết giùm em một lisp tính diện tích và lập bảng.

Em đã tham khảo nhiều lisp tính diện tích trên Diễn đàn và tìm được lisp r của anh Thaistreetz là gần giống với mong muốn của mình.

Nay em muốn nhờ viết một lisp như sau:

Em có bản vẽ gồm các khu đất đã được chia ô và đánh số thứ tự như trong file đính kèm sau:

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

Em muốn nhờ viết lisp tính diện tích một vùng (tam giác) bằng cách pick vào một điểm trong vùng và viết kết quả vào bảng như trong file đính kèm trên.

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

Chào svba1608, đề toán em đưa ra rất hay, tiếc là anh bận quá, chỉ xin đưa ra các hướng giải, các bác nào rảnh xin giúp cho svba 1 tay:

- Chọn các Lwpolyline (gọi tắt là LWP) với điều kiện Lwpolyline đóng hay Lwpolyline có startpoint trùng endpoint và thuộc lớp vh như trong bản vẽ.

- Từng LWP lọc lấy các point nút đỉnh cho vào 1 listpointFen để lọc lấy các text A, B, C, D và 1 text số (ví dụ text số tìm được là 1.

- Từng các text A, B, C, D sẽ tìm được insertpoint. Tạo boundary từ từng insertpoint này và có nhãn là 1A hay 1B, hay 1C, hay 1D. Tìm diện tích từ các boundary này

……….

- Tạo 1 table, đưa dữ liệu vào table.

Chúc các bác 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

Goi Bac Hoanh: cai lisp in nhiều bản vẽ cùng lúc hay thật. Nhưng còn một vấn đề nữa là: khi chọn một khổ giấy bất kỳ nhưng in có tỉ lệ thì phải chọn như thế nào???????? :cheers:

In tự động nhiều bản vẽ một lúc bằng MPlot

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, đề toán em đưa ra rất hay, tiếc là anh bận quá, chỉ xin đưa ra các hướng giải, các bác nào rảnh xin giúp cho svba 1 tay:

- Chọn các Lwpolyline (gọi tắt là LWP) với điều kiện Lwpolyline đóng hay Lwpolyline có startpoint trùng endpoint và thuộc lớp vh như trong bản vẽ.

- Từng LWP lọc lấy các point nút đỉnh cho vào 1 listpointFen để lọc lấy các text A, B, C, D và 1 text số (ví dụ text số tìm được là 1.

- Từng các text A, B, C, D sẽ tìm được insertpoint. Tạo boundary từ từng insertpoint này và có nhãn là 1A hay 1B, hay 1C, hay 1D. Tìm diện tích từ các boundary này

……….

- Tạo 1 table, đưa dữ liệu vào table.

Chúc các bác thành công!

Chào bác Thiep

 

Bác có thể vui lòng nói rõ hơn ở bước 1 không?

Làm sao để lọc được các text A, B, C, D và 1 text số ???

 

Bác vui lòng giải thích rõ hơn?

Thanks

 

Edit : Tue_NV hiểu ý bác Thiep rồi. Nếu các LWP mà không chứa các text A, B, C, D và 1 text số thì loại ra khỏi tập chọn LWP?

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 anh Tue_NV đã viết giùm em lisp vẽ phân giác! Lisp chạy rất tốt (tuy không extend được).

Hôm nay em muốn nhờ mọi người và anh viết giùm em một lisp tính diện tích và lập bảng.

Em đã tham khảo nhiều lisp tính diện tích trên Diễn đàn và tìm được lisp r của anh Thaistreetz là gần giống với mong muốn của mình.

Nay em muốn nhờ viết một lisp như sau:

Em có bản vẽ gồm các khu đất đã được chia ô và đánh số thứ tự như trong file đính kèm sau:

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

Em muốn nhờ viết lisp tính diện tích một vùng (tam giác) bằng cách pick vào một điểm trong vùng và viết kết quả vào bảng như trong file đính kèm trên.

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

 

Svba dùng lisp LBD (Lập Bản Đồ), chương trình sẽ yêu cầu Svba pick chọn 3 điểm. 2 điểm đầu (p1, p2) để xác định miền chữ nhật chứa bản đồ, điểm thứ 3 (p3) là tọa độ để chèn bảng. Các vấn đề còn lại lisp sẽ tự hiểu, giám thị không cần giải thích gì thêm :cheers: .

hdsd.png

 

(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 ))
(()
)
)
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 (		     "__err__"
	     (rtos (cdr tmp) 2 2)
	   )
	   "_______"
	 )
    part (1+ part)
     )
     (wtxt gt (list xht yht))
   )
   (setq yht	(- yht lbd_cellheight)
  index	(1+ index)
   )
 )
 (princ)
)

 

Lưu ý:

- Trong lúc lisp chạy Svba đừng nhấn Esc, hãy kiên nhẫn chờ lisp chạy hết, tránh lỗi.

- Trong bảng kết quả, chữ __err___ là cell có chữ nhưng lisp không tính được diện tích, Svba phải tính lại bằng tay. chữ ____ nghĩa là miếng đất đó không có mảnh theo cell (ví dụ thiếu mảnh e thì tại cell e sẽ là ____).

- Sau khi lisp chạy xong, Svba dùng lệnh Line để kẻ lại bảng theo text đã có.

Chỉnh sửa theo phamthanhbinh
Đã sửa lỗi lisp do layer hiện hành không phải là layer 0
  • 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
Svba dùng lisp LBD (Lập Bản Đồ), chương trình sẽ yêu cầu Svba pick chọn 3 điểm. 2 điểm đầu (p1, p2) để xác định miền chữ nhật chứa bản đồ, điểm thứ 3 (p3) là tọa độ để chèn bảng. Các vấn đề còn lại lisp sẽ tự hiểu, giám thị không cần giải thích gì thêm

 

 

Cảm ơn anh Hoành đã giúp đỡ, tuy nhiên giám thị vẫn cần giải thích thêm, vì em không chạy được ra kết quả của lisp trên, sau khi chọn xong 3 điểm là lisp dừng luôn. Thông báo từ command như sau:

 

 

Command: lbd

Goc 1 cua mien chua ban do:

Goc 2 cua mien chua ban do:

Diem chen ket qua: .layer

Current layer: "sttkhu"

Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/MATerial/Plot/Freeze/Thaw/LOck/Unlock

/stAte]: off

Enter name list of layer(s) to turn off or : sttkhu Really want

layer "sttkhu" (the CURRENT layer) off? Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/MATerial/Plot/Freeze/Thaw/LOck/Unlock

/stAte]: .zoom

Invalid option keyword.

; error: Function cancelled

Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/MATerial/Plot/Freeze/Thaw/LOck/Unlock

/stAte]: M

 

Enter name for new layer (becomes the current layer) :

Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/MATerial/Plot/Freeze/Thaw /LOck/Unlock

/stAte]:

 

m.jpg

 

Và cứ như vậy cho đến khi nhấn phím Esc. Nhờ anh Hoành kiểm tra lại giùm. 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 anh Tue_NV đã viết giùm em lisp vẽ phân giác! Lisp chạy rất tốt (tuy không extend được).

Hôm nay em muốn nhờ mọi người và anh viết giùm em một lisp tính diện tích và lập bảng.

Em đã tham khảo nhiều lisp tính diện tích trên Diễn đàn và tìm được lisp r của anh Thaistreetz là gần giống với mong muốn của mình.

Nay em muốn nhờ viết một lisp như sau:

Em có bản vẽ gồm các khu đất đã được chia ô và đánh số thứ tự như trong file đính kèm sau:

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

Em muốn nhờ viết lisp tính diện tích một vùng (tam giác) bằng cách pick vào một điểm trong vùng và viết kết quả vào bảng như trong file đính kèm trên.

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

Xin lỗi SVBA1608,

Bạn có thể upload lại file bản vẽ ở dạng cad2004 được không. Do mình chỉ có cad2004 nên không mở được file của bạn để hiểu được bạn cần gì?

Theo mình biết trên diễn đàn đã có lisp về lập bảng tọa độ góc ranh của các thửa đất, nếu dựa vào lisp này thì việc thực hiện các yêu cầu của bạn có thể làm được vì nó đơn giản hơn việc lầy tọa độ góc ranh. Bạn có thể dựa vào lisp này để cải tạo nó theo yêu cầu của bạn được không? Nếu có khó khăn hãy post lên mình nghĩ rằng mọi người sẽ giúp được mà.

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
Xin lỗi SVBA1608,

Bạn có thể upload lại file bản vẽ ở dạng cad2004 được không. Do mình chỉ có cad2004 nên không mở được file của bạn để hiểu được bạn cần gì?

Theo mình biết trên diễn đàn đã có lisp về lập bảng tọa độ góc ranh của các thửa đất, nếu dựa vào lisp này thì việc thực hiện các yêu cầu của bạn có thể làm được vì nó đơn giản hơn việc lầy tọa độ góc ranh. Bạn có thể dựa vào lisp này để cải tạo nó theo yêu cầu của bạn được không? Nếu có khó khăn hãy post lên mình nghĩ rằng mọi người sẽ giúp được mà.

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

 

Cảm ơn bác Bình nhiều!

Đây là file dwg 2004 của bản vẽ em muốn nhờ Diễn đàn viết lisp:

http://www.cadviet.com/upfiles/2/bando.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
Cảm ơn bác Bình nhiều!

Đây là file dwg 2004 của bản vẽ em muốn nhờ Diễn đàn viết lisp:

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

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 ))
(()
)
)
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 (		     "__err__"
	     (rtos (cdr tmp) 2 2)
	   )
	   "_______"
	 )
    part (1+ part)
     )
     (wtxt gt (list xht yht))
   )
   (setq yht	(- yht lbd_cellheight)
  index	(1+ index)
   )
 )
 (princ)
)

  • 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
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 ))
(()
)
)
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 (		     "__err__"
	     (rtos (cdr tmp) 2 2)
	   )
	   "_______"
	 )
    part (1+ part)
     )
     (wtxt gt (list xht yht))
   )
   (setq yht	(- yht lbd_cellheight)
  index	(1+ index)
   )
 )
 (princ)
)

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.

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

Lisp chỉ kết xuất text thôi, kẻ bảng vẫn phải thủ 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
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!

 

bn.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
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!

 

bn.jpg

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:

  • 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

Đè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é.

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

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

)

)

)

)

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

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!

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

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

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

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

×