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

Viết Lisp theo yêu cầu

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

Nhờ Anh viết cho lisp để chọn Hatch, kiểu đường, chèn block

1. lisp chọn hatch có tên trong thư mục ở support hoặc trong file.pat, ví dụ như : Hatch betong lệnh HBETONG thì chương trình yêu cầu chọn vùng , chọn tỉ lệ hatch, màu hatch.

2. Lisp chọn loại đường để vẽ, ví như lệnh vẽ đường sắt DSAT thì chọn kiểu đừơng, màu, dộ dài.

3. Lisp chọn block trong một thư mục , như lệnh chèn , thì lisp chọn tên của block bản vẽ đó ra.

Vì trình độ có hạn, mong đươc các anh giúp và hướng dẫn cho cách viết để học tập về sau .

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

Không phải ý bạn Haiduong2105 là đi xác định thằng áp út là thằng nào đâu.

 

Ý của bạn ấy là xác định cho được Text mà thôi.

Và khi sử dụng lệnh hatch thì đâu cần có phải xác định thằng nào anh hay thằng nào em làm gì?

Bạn hãy làm một ví dụ là hatch 1 hình chữ nhật bên trong có Text thì bạn hãy chọn text trước sau đó chọn hình chữ nhật sau thì kết quả sẽ như thế nào?

Kết quả sẽ chẳng khác gì khi hatch ta chọn hình chữ nhật trước và chọn các text sau

 

Mình tìm hoài không thấy bài của bác SSG nói rằng khi dùng hàm ssget nếu có các tham số thì nó sẽ chọn các đối tượng theo thứ tự ngược với khi khởi tạo. Bạn có thể Link bài viết đó về đây được không?

Cảm ơn bạn.

 

Đúng như lời của Phanthanhbinh đấy cái hàm ssget chậy kkhông ổn định minh tlàm thử được 30-40 vị trí là loạn cả nên theo kiểu bị tràn nil. dùng hàm step thi không bị lỗi này

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

Nhờ các bác sửa giúp

(defun c:NH()

(prompt "\n Nhap 2 toa do la 2 goc doi dien cua hinh chu nhat :")

(setq dc1 (getpoint "\nNhap diem thu nhat :"))

(setq dc2 (getpoint dc1"\nNhap diem thu 2 :"))

(step nha (getstring “\nNhap kieu nha :”))

(setq dc3 (list(car dc2) (cadr dc1)))

(setq dc4 (list(car dc1) (cadr dc2)))

(command "pline" dc1 dc3 dc2 dc4 "c")

(command "text" "j" "M" (list (/ (+ (car dc1) (car dc2)) 2) (/ (+ (cadr dc1) (cadr dc2)) 2)) "1.5" "0" nha "")

(princ)

)

 

Khi cho thêm dòng gán getstring vào nó không chậy các vị trí nỗi hình như la các vị tri được tô đậm.

Và nhờ các bác hướng dẫn sử dụng hàm load trong lisp (có ví dụ càng tốt)

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 các bác.

 

Em muốn nhờ các bác viết hộ em cái lisp như thế này ạ:

 

Nó có thể scale như một đoạn lisp có lệnh tắt là scc, và còn thêm các loại đường nghi kích (cả phần chữ số ghi giá trị của kích thước ) thước cũng phải scale theo tỉ lệ ta chọn.

 

Em xin 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ác bác trong diễn đàn bỏ chút ít thời gian giúp em làm một việc nhỏ thế này nhé: em cần lisp tính diện tích tổng của các đường polyline kín có sẵn, kết quả không cần xuất ramàn hình mà chỉ cần hiện trên dòng command line: tổng diện tich các vùng polyline kín là:...

Em đã search thử trước khi hỏi nhưng chỉ thấy lisp tính dt của 1 hình kín, sau đó xuất kq ra màn hình.Cái này lại không thích hợp với việc em đang làm vì Property của vung kín có dt rồi, em cần dt tổng của một đống các polyline kín cơ các bác ạ.

Các bác giúp em nhé, em xin 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
Chào các bác.

 

Em muốn nhờ các bác viết hộ em cái lisp như thế này ạ:

 

Nó có thể scale như một đoạn lisp có lệnh tắt là scc, và còn thêm các loại đường nghi kích (cả phần chữ số ghi giá trị của kích thước ) thước cũng phải scale theo tỉ lệ ta chọn.

 

Em xin cảm ơn!

Chào bạn Ui_troi_2005,

Bạn thử xài cái này xem nhé.

(defun c: scc ()
(setq ss (ssget "x"))
(command "scale" ss "" '(0 0) 0.5)
)

Đoạn lisp trên sẽ scale tất cả các đối tượng có trên bản vẽ của bạn với tâm scale là 0,0 và tỉ lệ scale là 0.5.

Nếu bạn muốn scale không phải tất cả các đối tượng trên bản vẽ thì có thể sử dụng hàm ssget với các tham số khác nhau của nó tùy theo ý bạn.

Nếu muốn chọn tâm scale khác bạn sử dụng hàm '( x y) với x ,y là tọa độ điểm bạn muốn hoặc sử dụng hàm (getpoint) để nhập điểm bạn muốn.

Nếu muốn thay đổi tỷ lệ scale, bạn nhập tỷ lệ đó vào vị trí của số 0.5 trong lisp.

 

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ác bác trong diễn đàn bỏ chút ít thời gian giúp em làm một việc nhỏ thế này nhé: em cần lisp tính diện tích tổng của các đường polyline kín có sẵn, kết quả không cần xuất ramàn hình mà chỉ cần hiện trên dòng command line: tổng diện tich các vùng polyline kín là:...

Em đã search thử trước khi hỏi nhưng chỉ thấy lisp tính dt của 1 hình kín, sau đó xuất kq ra màn hình.Cái này lại không thích hợp với việc em đang làm vì Property của vung kín có dt rồi, em cần dt tổng của một đống các polyline kín cơ các bác ạ.

Các bác giúp em nhé, em xin cảm ơn trước. :cheers:

Chào bạn cmengnie,

Nếu mình nhớ không nhầm thì trên diễn đàn đã có líp này rồi, bạn chịu khó tìm lại.

Nếu bạn ngại tìm hãy post lại cái lisp tính diện tích của một polyline kín mà bạn đã biết lên, mình sẽ giúp bạn làm tiếp bởi vì cái khó là thuật toán tính diện tích chứ không phải là cái lấy tổng. Vì mình chưa rành lắm về lisp mà lại lười tìm kiếm nên mong bạn thông cảm.

Nếu bạn đã có chút vốn liếng về lisp thì mình gợi ý cách làm tiếp như sau nhé:

1/- Tạo một bộ chọn các đối tượng bạn cần tính diện tích bằng hàm ssget.

2/- tạo một biến tdt chứa tổng diện tích bạn cần tìm (setq tdt 0)

3/- Tạo một vòng lặp qua tất cả các phần tử của tập đối tượng bạn chọn và dùng hàm lấy diện tích của một polyline đơn mà bạn có để có được từng diện tích đơn là dtd và dùng hàm (setq tdt (+ dtd tdt)) để có tổng diện tích mới sau mỗi bước lặp.

Bạn xóa phần hiển thị ra màn hình giá trị dtd trong hàm xác định diện tích đơn của bạn đi.

4/- Kết thúc vòng lặp và dùng hàm (princ tdt) sẽ có được giá trị tổng diện tích trên dòng nhắc lệnh của CAD

5/- Dùng hàm (princ) để thoát êm

6/- Đóng defun.

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
Nhờ các bác sửa giúp

(defun c:NH()

(prompt "\n Nhap 2 toa do la 2 goc doi dien cua hinh chu nhat :")

(setq dc1 (getpoint "\nNhap diem thu nhat :"))

(setq dc2 (getpoint dc1"\nNhap diem thu 2 :"))

(step nha (getstring “\nNhap kieu nha :”))

(setq dc3 (list(car dc2) (cadr dc1)))

(setq dc4 (list(car dc1) (cadr dc2)))

(command "pline" dc1 dc3 dc2 dc4 "c")

(command "text" "j" "M" (list (/ (+ (car dc1) (car dc2)) 2) (/ (+ (cadr dc1) (cadr dc2)) 2)) "1.5" "0" nha "")

(princ)

)

 

Khi cho thêm dòng gán getstring vào nó không chậy các vị trí nỗi hình như la các vị tri được tô đậm.

Và nhờ các bác hướng dẫn sử dụng hàm load trong lisp (có ví dụ càng tốt)

Chào bạn haiduong2105,

Mình tìm trong help của Cad không thấy có hàm (step ) bạn ạ. Vì thế mình không hiểu được cái mục đích của hàm này nên không thể giúp gì được cho bạn.

Nếu có thể, bạn hãy giải thích giùm mình về cái hàm (step ) này nhé. Cả cú pháp và cách sử dụng của nó.

Bạn cũng có thể nói cái ý định của bạn khi xài hàm này để mình xem có thể dùng hàm nào khác thông dụng hơn thay thế nó hay không?

Cám ơn bạn trước.

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ạn haiduong2105,

Mình tìm trong help của Cad không thấy có hàm (step ) bạn ạ. Vì thế mình không hiểu được cái mục đích của hàm này nên không thể giúp gì được cho bạn.

Nếu có thể, bạn hãy giải thích giùm mình về cái hàm (step ) này nhé. Cả cú pháp và cách sử dụng của nó.

Bạn cũng có thể nói cái ý định của bạn khi xài hàm này để mình xem có thể dùng hàm nào khác thông dụng hơn thay thế nó hay không?

Cám ơn bạn trước.

 

Mình đọc tron sách hường dẫn thi hàm Step là hàm gán giá trị cho 1 biến ví dụ

cú pháp: (setq b1 gt1 [ok 1234] ...) ý nghĩa b1 gán giá trị là ok, gt1 gán giá trị là 1234 (hạm này còn sử dụng cùng với các hàm get... như getpoint)

mục đích của mình là là vẽ 1 hình và chèn vào tâm của nó 1 text theo ý của người nhập do đó mình dùng hàm getstring để gán cho biến 1 chuối do người nhập và vẽ chuỗi đó vào tâm của hình nhưng khi thêm cái lênh (step nha (getstring “\nNhap kieu nha :”)) vào thi bị lỗi.

Nếu mình ấn định 1 text thi nó chậy ngon lành. nhưng như thế thì bài toán không khó học vì với mỗi text mình lại phải lập 1 lệnh gán text riêng và không linh hoạt.

 

ở đây mình nhờ các bạn giải thích cho mình ham Load và cho ví dụ (mình đọc sách có nói đến mà làm không được)

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ạn haiduong2105,

Mình tìm trong help của Cad không thấy có hàm (step ) bạn ạ. Vì thế mình không hiểu được cái mục đích của hàm này nên không thể giúp gì được cho bạn.

Nếu có thể, bạn hãy giải thích giùm mình về cái hàm (step ) này nhé. Cả cú pháp và cách sử dụng của nó.

Bạn cũng có thể nói cái ý định của bạn khi xài hàm này để mình xem có thể dùng hàm nào khác thông dụng hơn thay thế nó hay không?

Cám ơn bạn trước.

 

 

Xin lôi bạn nhé mình nhầm ham setq thành step nên bị lỗi mình làm được rồi

 

(defun c:NH()

(prompt "\n Nhap 2 toa do la 2 goc doi dien cua nha :")

(setq dc1 (getpoint "\nNhap diem thu nhat :"))

(setq dc2 (getpoint dc1"\nNhap diem thu 2 :"))

(setq nha (strcase (getstring "\n Nhap loai nha : ")))

(setq dc3 (list(car dc2) (cadr dc1)))

(setq dc4 (list(car dc1) (cadr dc2)))

(command "layer" "n" "Nha" "s" "Nha" "c" "1" "" "")

(command "pline" dc1 dc3 dc2 dc4 "c")

(command "text" "j" "M" (list (/ (+ (car dc1) (car dc2)) 2) (/ (+ (cadr dc1) (cadr dc2)) 2)) "1.5" "0" nha "")

(command "layer" "s" "0" "")

(princ)

)

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ác bác trong diễn đàn bỏ chút ít thời gian giúp em làm một việc nhỏ thế này nhé: em cần lisp tính diện tích tổng của các đường polyline kín có sẵn, kết quả không cần xuất ramàn hình mà chỉ cần hiện trên dòng command line: tổng diện tich các vùng polyline kín là:...

Em đã search thử trước khi hỏi nhưng chỉ thấy lisp tính dt của 1 hình kín, sau đó xuất kq ra màn hình.Cái này lại không thích hợp với việc em đang làm vì Property của vung kín có dt rồi, em cần dt tổng của một đống các polyline kín cơ các bác ạ.

Các bác giúp em nhé, em xin cảm ơn trước. :cheers:

Mình có 1 mẹo này cho bạn nhé. Bạn tô mặt cắt cho các pline kín đó. Rồi nhấp ctrl+1, quét chọn các hatch. Bạn xem ở phần Geometry ->Cumumlative area. Đấy là tổng diện tích của các hình pline kín ban đầu của bạn.

@all member: mình thấy trên diễn đàn nhiều bạn rất có tinh thần học hỏi (VD: haiduong2105, phiphi...) mình tin là các bạn sẽ giỏi trong tương lai không xa. Rất khâm phục các bạn. Chúc thành công :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

Nhờ bác Nataca viết giúp cái LISP chia Polyline/Spline theo phương X/Y thành những đoạn nhỏ bằng nhau có kích thước xác định. Thanks you.

http://www.cadviet.com/upfiles/Chia_theo_X.zip

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

 

splinexl1.jpg

w949.png

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

Nhờ Anh chỉnh giúp về Lisp vẽ nhà: VN

Chọn điểm đầu nhà làm gốc, chọn hướng vẽ, chiều rộng nhà, chiều dài nhà, loại nhà.

Rất mong được Anh giú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
Mình có 1 mẹo này cho bạn nhé. Bạn tô mặt cắt cho các pline kín đó. Rồi nhấp ctrl+1, quét chọn các hatch. Bạn xem ở phần Geometry ->Cumumlative area. Đấy là tổng diện tích của các hình pline kín ban đầu của bạn.

@all member: mình thấy trên diễn đàn nhiều bạn rất có tinh thần học hỏi (VD: haiduong2105, phiphi...) mình tin là các bạn sẽ giỏi trong tương lai không xa. Rất khâm phục các bạn. Chúc thành công :cheers:

Uhm, em đã làm theo cách của bác này, xong roài, tại vội quá nên không có thời gian mà trao đổi với bác phamthanhbinh và bác nataca. :cheers: tks mỗi bác 1 cái, chúc diễn đàn luôn vui vẻ, giúp đỡ lẫn nhau :s_big:.

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
Nhờ bác Nataca viết giúp cái LISP chia Polyline/Spline theo phương X/Y thành những đoạn nhỏ bằng nhau có kích thước xác định. Thanks you.

http://www.cadviet.com/upfiles/Chia_theo_X.zip

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

 

splinexl1.jpg

w949.png

Bạn xem cái này đã đạt yêu cầu chưa. Lệnh MEXY

(defun C:MEXY (/ Lent ent vent Fp Ep entL Nent Lstp pInt)
 	(INIT)
 	(SAVE_MODE)
 	(vl-load-com)
(setq trucchia 	(NHAPKEY "\n Chia deu doi tuong theo x/y: " "x y" trucchia)
	  Lent		(SS2LST (ESENT "\n Chon doi tuong can chia" "POLYLINE,LWPOLYLINE,SPLINE,ARC,ELLIPSE,CIRCLE,LINE"))
	  kcach		(NHAPREAL "\n Nhap khoang cach chia:" kcach)
 	)
 	(foreach ent Lent
  	(setq 	vent	(vlax-ename->vla-object ent)
			Fp	(vlax-curve-getStartPoint vent)
			Ep	(vlax-curve-getEndPoint vent)
	)
  	(command "line" Fp (list (car Ep) (cadr Fp)) "")
  	(setq	entL 	(entlast)
	  		Nent 	entL
			Lstp	'()
  	)
  	(command "measure" Nent kcach)
  	(while Nent
	  	(setq Nent 	(entnext Nent)
			  Lstp	(if (and	Nent
								(= (cdr (assoc 0 (entget Nent))) "POINT")
						)
						(append Lstp (list Nent))
					  	Lstp
				  	)
	  	)
  	)


 		(cond	(	(= trucchia "x")
			 	(foreach d Lstp 
				 	(command "xline" "v" (cdr (assoc 10 (entget d))) "")
				  	(setq pInt (car (GIAODT (entlast) ent)))
				  	(entdel (entlast))
				  	(if pInt
						(entmake (list '(0 . "POINT") (cons 10 pInt)))
			  		)
				)
		 	)
			(	(= trucchia "y")
			 	(foreach d Lstp 
				 	(command "xline" "h" (cdr (assoc 10 (entget d))) "")
				  	(setq pInt (car (GIAODT (entlast) ent)))
				  	(entdel (entlast))
				  	(if pInt
						(entmake (list '(0 . "POINT") (cons 10 pInt)))
			  		)
				)
		 	)
	)
  	(foreach p Lstp (entdel p))
  	(entdel entL)
 	)
 	(DONE)
 	(RESTORE)
)

;;;Ham con

; HAM BAY LOI
(defun INIT ()
 	(setq 	OLD_ERROR 	*error*
		*error* 	MYERROR
)
  	(command "Undo" "begin")
)1

(defun MYERROR (errmsg)

 	(cond
   		(	(= errmsg "quit / exit abort")
	 	(princ)
	)
   		(	(/= errmsg "Function cancelled")
	 	(princ (strcat "\n Co loi: " errmsg))
	)
 	)
 	;(command "Undo" 1)
 	(setvar "osmode" OLD_OSMODE)
(command "CECOLOR" OLD_CECOLOR)
	(DONE)
 	(prompt "\n Da thuc hien ham error, Reset lai thiet lap ban dau")
  	(command "Undo" "end")

)

(defun DONE ()
 	(if OLD_ERROR (setq *error* OLD_ERROR))
)
;;;;;----------------------------------------------------------
; HAM LUU VA TRA LAI CAC THONG SO BAN DAU
(defun SAVE_MODE()

 	(command "Undo" "begin")
(command "UCS" "W" "")
	(setq OLD_OSMODE 		(getvar "OSMODE")
			OLD_CECOLOR 	(getvar "CECOLOR")
		OLD_AUTOSNAP	(getvar "AUTOSNAP")
		OLD_ORTHOMODE	(getvar "ORTHOMODE")
)
 	(command "cmdecho" 0)

)
(defun RESTORE()

 	(command "Undo" "end")			
 	(setvar "osmode" 	OLD_OSMODE)
(setvar "AUTOSNAP"	OLD_AUTOSNAP)
(setvar	"ORTHOMODE" OLD_ORTHOMODE)
	(command "CECOLOR" OLD_CECOLOR)
 	(command "cmdecho" 1)
(Grtext -1 "Lisp's written by Nataca - 0983.715.333")
)


;;;NHAP GIA TRI LA SO THUC
(defun NHAPREAL (dongnhac Tso)
(if (null Tso)
	(progn
		(initget (+ 1 2))
		(getreal (strcat dongnhac " <?>:"))
	)
	(progn
		(cond 
		  	(	(progn
					(initget (+ 2))
					(getreal (strcat dongnhac " < "(rtos Tso 2 5) " >:"))
			  	)
			)
			(T Tso)

		)
	)

)
)

;------------------------------------------
;;;NHAP KEY VAO
(defun NHAPKEY	(dongnhac key Text)

(if (null Text)
	(progn
		(initget 1 key)
		(getkword (strcat dongnhac " :"))
	)
	(progn
		(cond
			((progn
				 (initget key)
				 (getkword (strcat dongnhac " < " Text " >:"))
			 )
			)
			(T Text)

		)
	)

)
)


; CHUYEN BIEU DIEN TAP HOP DOI TUONG DUOI DANG LIST CHUA ENAME CUA CAC DOI TUONG
(defun SS2LST (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)
)

;;; CHON DOI TUONG THEO NGUOI DUNG KEM DONG NHAC (BAT BUOC CHON)

(defun ESENT (dongnhac Nent / ss LNent Lst SLst)

 	(if (= Nent nil)
  	(while 	(and	(not (prompt dongnhac))
					(not (setq ss	(ssget)))
			)
  	)
  	(Progn
	  	(setq 	LNent (vl-string->list Nent)
	  			Lst	'()
	  			SLst  (List (cons -4  "  			)
	  	(Foreach e LNent
	  		(if (/= e 44)
			  	(setq 	Lst 	(append Lst (list e)))
			  	(setq	Lst		(vl-list->string Lst)
				  		SLst 	(append SLst (list (cons 0 Lst)))
					  	Lst		'()
			  	)
		  	)
	  	)
		(setq	SLst	(append SLst (list (cons 0 (vl-list->string Lst))))
	  			SLst		(append SLst (list (cons -4  "OR>")))
		)
		(while 	(and	(not (prompt dongnhac))
						(not (setq ss	(ssget SLst)))
				)
	  	)
  	)
 	)
 	ss
)

;;;GIAO CUA 2 DOI TUONG
(defun GIAODT (ent1 ent2 / ob1 ob2 g kq sd)
(setq	ob1 (vlax-ename->vla-object ent1)
		ob2 (vlax-ename->vla-object ent2)
)
(setq	g (vlax-variant-value
			  (vla-IntersectWith ob1 ob2 acExtendNone)
		  )
)
(if (/= (vlax-safearray-get-u-bound g 1) -1)
	(setq g (vlax-safearray->list g))
	(setq g nil)
)
(if g
	(progn
		(setq	kq	nil
				sd	(fix (/ (length g) 3))
		)
		(repeat sd
			(setq	kq	(append kq (list (list (car g) (cadr g) (caddr g))))
					g	(cdddr g)
			)
		)
		kq
	)
	nil
)
)

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 các bạn. Mình muốn nhờ các bạn viết hộ mình lisp đánh kích thước: chọn 1 đường thẳng thì nó cho mình dim của đường đấy luôn. Mình đang cần gấp (vì phải đánh kích thước rất nhiều). Cám ơn nhiều.

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
Bạn xem cái này đã đạt yêu cầu chưa. Lệnh MEXY

 

Thanks bác Nataca, Lisp chạy tốt nhưng nhờ Bác sửa dùm thếm 1 tý nhé:

+ Thêm 1 cái Point đầu tiên.

+ Làm sao cho độ chính xác cao hơn (<=0.001)

 

Tham khảo lisp CK của bác Ssg tại http://www.cadviet.com/forum/index.php?showtopic=9131

 

xdistanceph4.jpg

w1005.png

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 các bạn. Mình muốn nhờ các bạn viết hộ mình lisp đánh kích thước: chọn 1 đường thẳng thì nó cho mình dim của đường đấy luôn. Mình đang cần gấp (vì phải đánh kích thước rất nhiều). Cám ơn nhiều.

Dùng LISP AD (do bác Ssg viết) được PP post ở đây:

http://www.cadviet.com/forum/index.php?showtopic=9019

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 các bạn. Mình muốn nhờ các bạn viết hộ mình lisp đánh kích thước: chọn 1 đường thẳng thì nó cho mình dim của đường đấy luôn. Mình đang cần gấp (vì phải đánh kích thước rất nhiều). Cám ơn nhiều.

 

Chào bạn dacphuong,

Bạn dùng thử đoạn code sau đây xem sao:

(defun c:dm ()
(setq ss (ssget "x" (list (cons 0 "line"))))
(setq lent '())
(setq i 0)
(setq n (sslength ss))
(while (	   (setq en (ssname ss i))
   (setq lent (cons en lent))
   (setq i (+ 1 i))
)
(foreach ent lent
		 (setq vent (vlax-ename->vla-object ent)
				 Fp (vlax-curve-getStartPoint vent)
				 Ep (vlax-curve-getEndPoint vent)
		  )
		 (Command "dimaligned" fp ep (list (+ (car fp) 10) (+ (cadr fp) 10)) "")
)
(princ)
)

Đoạn code này chỉ cho bạn ghi kích thước cho các đường line và nó tự chọn vị trí đặt đường kích thước . Trong trường hợp bản vẽ có quá nhiều đường line cần ghi kích thước bạn cần phải xác định điểm đặt đường kích thước cho phù hợp với yêu cầu của bạn. Bạn có thể chạy lisp rồi sau đó move các đường kích thước về vị trí bạn muốn. Vì không rõ yêu cầu của bạn nên mình viết tạm đoạn code náy, bạn dùng thử và có thể tự điều chỉnh theo ý bạn. Nếu bạn cần bổ sung điều gì thì hãy post nói rõ hơn nhé.

  • 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ạn phamthanhbinh. Mình thử dùng Lisp của bạn nhưng bị lỗi: ; error: no function definition: VLAX-ENAME->VLA-OBJECT. Bạn có thể xem giúp lại mình được ko. Cám ơn nhé.

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 các bạn. Mình muốn nhờ các bạn viết hộ mình lisp đánh kích thước: chọn 1 đường thẳng thì nó cho mình dim của đường đấy luôn. Mình đang cần gấp (vì phải đánh kích thước rất nhiều). Cám ơn nhiều.

Theo mình không nhất thiết phải dùng lisp với yêu cầu của bạn.

Khi dùng lệnh dim lúc cad hỏi bạn chọn điểm thì bạn đừng chọn mà enter một phát sau đó chọn vào line là được. Cách này dùng được cả với trường hợp đồi tượng chọn là 1 phân đoạn của pline.

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
Thanks bác Nataca, Lisp chạy tốt nhưng nhờ Bác sửa dùm thếm 1 tý nhé:

+ Thêm 1 cái Point đầu tiên.

+ Làm sao cho độ chính xác cao hơn (<=0.001)

 

Tham khảo lisp CK của bác Ssg tại http://www.cadviet.com/forum/index.php?showtopic=9131

 

xdistanceph4.jpg

w1005.png

Mình sửa lại đây:

(defun C:MEXY (/ Lent ent vent Fp Ep entL Nent Lstp pInt)
 	(INIT)
 	(SAVE_MODE)
 	(vl-load-com)
 	(setvar "OSMODE" 0)
(setq trucchia 	(NHAPKEY "\n Chia deu doi tuong theo x/y: " "x y" trucchia)
	  huongchia	(NHAPKEY "\n Chon huong chia <1-bat dau phia trai(x)/duoi(y), 2-bat dau phia phai(x)/tren(y): " "1 2" huongchia)
	  Lent		(SS2LST (ESENT "\n Chon doi tuong can chia" "POLYLINE,LWPOLYLINE,SPLINE,ARC,ELLIPSE,CIRCLE,LINE"))
	  kcach		(NHAPREAL "\n Nhap khoang cach chia:" kcach)
 	)
 	(foreach ent Lent
  	(setq 	Fp	(vlax-curve-getStartPoint ent)
			Ep	(vlax-curve-getEndPoint ent)
	)
  	(cond	( 	(= trucchia "x")
  				(command "line" Fp (list (car Ep) (cadr Fp)) "")
			 	(setq Mp	(list (/ (+ (car Fp) (car Ep)) 2) (cadr Fp)))
		 	)
			(	(= trucchia "y")
	  			(command "line" Fp (list (car Fp) (cadr Ep)) "")
			 	(setq Mp	(list (car Fp) (/ (+ (cadr Fp) (cadr Ep)) 2)))
		 	)
  	)

  	(setq	entL 	(entlast)
	  		Nent 	entL
			Lstp	'()
  	)
  	(command "measure" Nent kcach)
  	(while Nent
	  	(setq Nent 	(entnext Nent)
			  Lstp	(if (and	Nent
								(= (cdr (assoc 0 (entget Nent))) "POINT")
						)
						(append Lstp (list Nent))
					  	Lstp
				  	)
	  	)
  	)
  	(if (= huongchia "1")
	  	(foreach p Lstp
		  	(if (= trucchia "x")
	  			(command "mirror" p "" Mp (list (car Mp) (1+ (cadr Mp))) "Y")
			  	(command "mirror" p "" Mp (list (1+ (car Mp)) (cadr Mp)) "Y")
		  	)
 		)
  	)
 		(cond	(	(= trucchia "x")
			 	(foreach d Lstp 
				 	(command "xline" "v" (cdr (assoc 10 (entget d))) "")
				  	(setq pInt (car (GIAODT (entlast) ent)))
				  	(entdel (entlast))
				  	(if pInt
						(entmake (list '(0 . "POINT") (cons 10 pInt)))
			  		)
				)
			 	(entmake (list '(0 . "POINT") (cons 10 Fp)))
			 	(entmake (list '(0 . "POINT") (cons 10 Ep)))
		 	)
			(	(= trucchia "y")
			 	(foreach d Lstp 
				 	(command "xline" "h" (cdr (assoc 10 (entget d))) "")
				  	(setq pInt (car (GIAODT (entlast) ent)))
				  	(entdel (entlast))
				  	(if pInt
						(entmake (list '(0 . "POINT") (cons 10 pInt)))
			  		)
				)
			 	(entmake (list '(0 . "POINT") (cons 10 Fp)))
			 	(entmake (list '(0 . "POINT") (cons 10 Ep)))
		 	)
	)
  	(foreach p Lstp (entdel p))
  	(entdel entL)
 	)
 	(DONE)
 	(RESTORE)
)

;;;Ham con

; HAM BAY LOI
(defun INIT ()
 	(setq 	OLD_ERROR 	*error*
		*error* 	MYERROR
)
  	(command "Undo" "begin")
)1

(defun MYERROR (errmsg)

 	(cond
   		(	(= errmsg "quit / exit abort")
	 	(princ)
	)
   		(	(/= errmsg "Function cancelled")
	 	(princ (strcat "\n Co loi: " errmsg))
	)
 	)
 	;(command "Undo" 1)
 	(setvar "osmode" OLD_OSMODE)
(command "CECOLOR" OLD_CECOLOR)
	(DONE)
 	(prompt "\n Da thuc hien ham error, Reset lai thiet lap ban dau")
  	(command "Undo" "end")

)

(defun DONE ()
 	(if OLD_ERROR (setq *error* OLD_ERROR))
)
;;;;;----------------------------------------------------------
; HAM LUU VA TRA LAI CAC THONG SO BAN DAU
(defun SAVE_MODE()

 	(command "Undo" "begin")
(command "UCS" "W" "")
	(setq   OLD_OSMODE 		(getvar "OSMODE")
			OLD_CECOLOR 	(getvar "CECOLOR")
		OLD_AUTOSNAP	(getvar "AUTOSNAP")
		OLD_ORTHOMODE	(getvar "ORTHOMODE")
)
 	(command "cmdecho" 0)

)
(defun RESTORE()

 	(command "Undo" "end")			
 	(setvar "osmode" 	OLD_OSMODE)
(setvar "AUTOSNAP"	OLD_AUTOSNAP)
(setvar	"ORTHOMODE" OLD_ORTHOMODE)
	(command "CECOLOR" OLD_CECOLOR)
 	(command "cmdecho" 1)
(Grtext -1 "Lisp's written by Nataca - 0983.715.333")
)


;;;NHAP GIA TRI LA SO THUC
(defun NHAPREAL (dongnhac Tso)
(if (null Tso)
	(progn
		(initget (+ 1 2))
		(getreal (strcat dongnhac " <?>:"))
	)
	(progn
		(cond 
		  	(	(progn
					(initget (+ 2))
					(getreal (strcat dongnhac " < "(rtos Tso 2 5) " >:"))
			  	)
			)
			(T Tso)

		)
	)

)
)

;------------------------------------------
;;;NHAP KEY VAO
(defun NHAPKEY	(dongnhac key Text)

(if (null Text)
	(progn
		(initget 1 key)
		(getkword (strcat dongnhac " :"))
	)
	(progn
		(cond
			((progn
				 (initget key)
				 (getkword (strcat dongnhac " < " Text " >:"))
			 )
			)
			(T Text)

		)
	)

)
)


; CHUYEN BIEU DIEN TAP HOP DOI TUONG DUOI DANG LIST CHUA ENAME CUA CAC DOI TUONG
(defun SS2LST (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)
)

;;; CHON DOI TUONG THEO NGUOI DUNG KEM DONG NHAC (BAT BUOC CHON)

(defun ESENT (dongnhac Nent / ss LNent Lst SLst)

 	(if (= Nent nil)
  	(while 	(and	(not (prompt dongnhac))
					(not (setq ss	(ssget)))
			)
  	)
  	(while 	(and	(not (prompt dongnhac))
					(not (setq ss	(ssget (list (cons 0 Nent)))))
			)
  	)

 	)
 	ss
)

;;;GIAO CUA 2 DOI TUONG
(defun GIAODT (ent1 ent2 / ob1 ob2 g kq sd)
(setq	ob1 (vlax-ename->vla-object ent1)
		ob2 (vlax-ename->vla-object ent2)
)
(setq	g (vlax-variant-value
			  (vla-IntersectWith ob1 ob2 acExtendNone)
		  )
)
(if (/= (vlax-safearray-get-u-bound g 1) -1)
	(setq g (vlax-safearray->list g))
	(setq g nil)
)
(if g
	(progn
		(setq	kq	nil
				sd	(fix (/ (length g) 3))
		)
		(repeat sd
			(setq	kq	(append kq (list (list (car g) (cadr g) (caddr g))))
					g	(cdddr g)
			)
		)
		kq
	)
	nil
)
)

Cái này chắc là ngon rồ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
Chào bạn dacphuong,

Bạn dùng thử đoạn code sau đây xem sao:

(defun c:dm ()
(setq ss (ssget "x" (list (cons 0 "line"))))
(setq lent '())
(setq i 0)
(setq n (sslength ss))
(while (< i n)
   (setq en (ssname ss i))
   (setq lent (cons en lent))
   (setq i (+ 1 i))
)
(foreach ent lent
		 (setq vent (vlax-ename->vla-object ent)
				 Fp (vlax-curve-getStartPoint vent)
				 Ep (vlax-curve-getEndPoint vent)
		  )
		 (Command "dimaligned" fp ep (list (+ (car fp) 10) (+ (cadr fp) 10)) "")
)
(princ)
)

Đoạn code này chỉ cho bạn ghi kích thước cho các đường line và nó tự chọn vị trí đặt đường kích thước . Trong trường hợp bản vẽ có quá nhiều đường line cần ghi kích thước bạn cần phải xác định điểm đặt đường kích thước cho phù hợp với yêu cầu của bạn. Bạn có thể chạy lisp rồi sau đó move các đường kích thước về vị trí bạn muốn. Vì không rõ yêu cầu của bạn nên mình viết tạm đoạn code náy, bạn dùng thử và có thể tự điều chỉnh theo ý bạn. Nếu bạn cần bổ sung điều gì thì hãy post nói rõ hơn nhé.

Em thấy bác dùng dimaligned cho tất cả trường hợp thì không ổn lắm nên chăng kiểm tra nếu line nằm ngang hoặc dọc thì cho nó cái dimline còn xiên thì hãy dùng dimaligned

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òn độ chính xác thì bạn xem lại unit của bạn xem sao. Mình kiểm tra thấy độ chính xác ở bài toán này gần như là tuyệt đối mà .

Bác thử lại file PP post ntn nhé, khoảng cách các điểm không cho ra đúng kích thước thật (20 unit). Thanks you

http://www.cadviet.com/upfiles/Chia_X__20.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
Cám ơn bạn phamthanhbinh. Mình thử dùng Lisp của bạn nhưng bị lỗi: ; error: no function definition: VLAX-ENAME->VLA-OBJECT. Bạn có thể xem giúp lại mình được ko. Cám ơn nhé.

Chào bạn dacphuong,

Xin lỗi bạn, chắc tại bạn chưa gọi hàm (vl-load-com) đấy mà. Do trên máy của mình mình đã chạy hàm này rồi nên không thấy có lỗi. Bạn copy hàm này vào phần đầu của đoạn lisp trên sau dòng (defun c:dm ()

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

×