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ị

Mình đã thử với tất cả các đường trong các bản vẽ của bạn thì đều ổn cả.

Bạn thử lại lisp cũ cho đường pline, nếu ổn thì sửa thủ công theo cách này.

Nếu Bạn copy vào 1 file mới thì Lisp mới chỉ sửa 4 chỗ sau:

Dòng 3: "T2/l1-" => "T1/l1-"

 

Dòng 38: (setq d0 (+ d0 d) )

=> (setq d0 (+ d0 d) i (fix (abs (/ len d))))

Dòng 39 : (while (setq p1 (vlax-curve-getpointatdist plObj d0))

=> (while (and (> i 0) (setq p1 (vlax-curve-getpointatdist plObj d0)))

Dòng 46: (setq d0 (+ d0 d) p0 p1 a0 a1)

=> (setq d0 (+ d0 d) p0 p1 a0 a1 i (1- i))

 

Như vậy thì nếu việc thoát luôn là hơi vô lý vì chương trình chưa chạy đến chỗ sửa

Nếu còn lỗi thì gửi bản vẽ vào ndtnve@yahoo.com

 

 

Cảm ơn bạn NDTNV, bạn BÌNH, bạn TUE, vanhờ các bạn mình đã giải quyết đuợc vấn đề. chúc các bạn và mọi nguời trên cadviet mạnh khoẻ và hạnh phú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
có đồng chí nào giúp mình được cái này không :

mình muốn tạo một cái lisp sao cho khi quét các đối tượng line, nếu 2 line vuông góc nhau thì insert block A như hình vẽ (đương nhiên trục block sẽ theo 2 trục của line tạo ra, nếu có 2 line vuông góc nhưng dư ra thì insert block B như hình vẽ.

 

cám ơn các bác nhiều.

mình nghĩ cái này hơn khó đấy.

 

Mình tạm nghĩ ra cái lisp này, mới thử sơ sơ thôi nhưng thấy chạy cũng đc. Mình đặt tên block là 1 và 2 theo file đính kèm.

Sau khi nhập lệnh ins, chọn các line, nó sẽ tự động chèn block. Chú ý là các block có điểm insert và chiều như hình vẽ.

http://myfreefilehosting.com/f/6c60799b99_0.03MB

 

(defun vg(p / ss1 v1 v2 pt1 pt2 pt3 pt4 a1 a2 a)
 (setq ss1 (ssget "c" (polar p (* -0.25 pi) 1)
	       (polar p (* 0.75 pi) 1) '((0 . "LINE"))))
 (if (= (sslength ss1) 2)
    (setq v1 (ssname ss1 0)
   v2 (ssname ss1 1)
   pt1 (cdr (assoc 10 (entget v1)))
   pt2 (cdr (assoc 11 (entget v1)))
   pt3 (cdr (assoc 10 (entget v2)))
   pt4 (cdr (assoc 11 (entget v2)))
   a1 (angle pt1 pt2)
   a2 (angle pt3 pt4)
   a (abs (- a2 a1))
   a (if (> a pi) (- a pi) a))
  )
 (if (= (sslength ss1) 2)
    (list (equal a (* 0.5 pi) 0.001)
 (or (equal pt1 pt3 0.001) (equal pt1 pt4 0.001) (equal pt2 pt3 0.001) (equal pt2 pt4 0.001))
 (* a1 (/ 180 pi)))
    (list nil nil nil))
)

;;;;

(defun c:ins()
 (prompt "\nChon cac Line:")
 (setq ss (ssget '((0 . "LINE")))
       L nil)
 (while (and ss (> (sslength ss) 0))
   (setq v (ssname ss 0)
  p1 (cdr (assoc 10 (entget v)))
  p2 (cdr (assoc 11 (entget v))))
   (if (not (member p1 L)) (setq L (cons p1 L)))
   (if (not (member p2 L)) (setq L (cons p2 L)))
   (ssdel v ss)
 )
 (foreach p L
   (setq ds (vg p))
   (cond ((and (car ds) (cadr ds)) (command "-insert" "1" p "" "" (last ds)))
  ((and (car ds) (not (cadr ds))) (command "-insert" "2" p "" "" (last ds))))
 )
)

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 viết giúp lisp:

 

viết 1 file lsp lấy thông số cua HDD, hay lấy (mã) của ổ cứng hoặc lấy ngày sản xuất của ổ 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 các anh!

C ác anh cho em h ỏi t ý, v ì em m ới d ùng CAD 2007 n ên v ẫn đang t ập s ự. Em c ó 1 file b ản v ẽ đ ã v ẽ tr ên Model v à Z oom v ào c ác Layout (Kho ảng 20 Layout ) V ậy l àm nh ư th ế n ào đ ể in to àn b ộ c ác Layout đ ó. Em kh ông bi ết vi ết L ISP nh ư th ế n ào.

C ảm ơn c ác anh

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 tạm nghĩ ra cái lisp này, mới thử sơ sơ thôi nhưng thấy chạy cũng đc. Mình đặt tên block là 1 và 2 theo file đính kèm.

Sau khi nhập lệnh ins, chọn các line, nó sẽ tự động chèn block. Chú ý là các block có điểm insert và chiều như hình vẽ.

http://myfreefilehosting.com/f/6c60799b99_0.03MB

sao mình không sử dụng lisp này được????, unknow command???? bác kiểm tra lại xem thử

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 viết giúp lisp:

 

viết 1 file lsp lấy thông số cua HDD, hay lấy (SERIAL) của ổ cứng hoặc lấy ngày sản xuất của ổ cứng đó.

Để bảo mật phải không? Cái này sẽ giúp bạn lấy serial của ổ cứng

;;;;;----------------------------------------------------------
;;; LAY SERIAL CUA O CUNG
(defun GET_DRIVE_SERIAL (Path / fsObj hSn abPth cDrv)
 (vl-load-com)
 (if
(and
  (setq fsObj (vlax-create-object "Scripting.FileSystemObject"))
  (not
	(vl-catch-all-error-p
	  (setq	abPth (vl-catch-all-apply
					'vlax-invoke-method
					(list fsObj 'GetAbsolutePathName Path)
				  )
	  )
	)
  )
)
 (progn
   (setq cDrv (vlax-invoke-method
				fsObj
				'GetDrive
				(vlax-invoke-method
				  fsObj
				  'GetDriveName
				  abPth
				)
			  )
   )
   (if
	 (vl-catch-all-error-p
	   (setq hSn (vl-catch-all-apply
				   'vlax-get-property
				   (list cDrv 'SerialNumber)
				 )
	   )
	 )
	  (progn
		(vlax-release-object cDrv)
		(setq hSn nil)
	  )
   )
   (vlax-release-object fsObj)
 )
 )
 hSn
)

Path là tên ổ cứng. Ví dụ muốn lấy Serial của ổ C: (GET_DRIVE_Serial "C:")

  • 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
sao mình không sử dụng lisp này được????, unknow command???? bác kiểm tra lại xem thử

 

trong file của bạn đã có block tên "1" và "2" chưa, hoặc nếu bạn muốn đặt tên khác thì sửa dòng :

(command "-insert" "1" p "" "" (last ds)) thành (command "-insert" "ten block 1 cua ban" p "" "" (last ds))

(command "-insert" "2" p "" "" (last ds)) thành (command "-insert" "ten block 2 cua ban" p "" "" (last ds))

Nếu đã sửa tên mà vẫn còn báo lỗi thì bạn gửi file cho mình để mình xem, vì thật ra mình chưa thử nghiệm nhiều tình huống khác nhau, chỉ thử trên hình vẽ đơn giản thấy ok thì post lên luô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
Để bảo mật phải không? Cái này sẽ giúp bạn lấy mã của ổ cứng

 

Path là tên ổ cứng. Ví dụ muốn lấy mã của ổ C: (GET_DRIVE_mã "C:")

Không hiểu sao chữ S e r i a l cứ bị chuyển thành

 

 

 

sao không được vậy bạn xem lại cái

vd ổ C đ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
Để bảo mật phải không? Cái này sẽ giúp bạn lấy serial của ổ cứng

;;;;;----------------------------------------------------------
;;; LAY SERIAL CUA O CUNG
(defun GET_DRIVE_SERIAL (Path / fsObj hSn abPth cDrv)
 (vl-load-com)
 (if
(and
  (setq fsObj (vlax-create-object "Scripting.FileSystemObject"))
  (not
	(vl-catch-all-error-p
	  (setq	abPth (vl-catch-all-apply
					'vlax-invoke-method
					(list fsObj 'GetAbsolutePathName Path)
				  )
	  )
	)
  )
)
 (progn
   (setq cDrv (vlax-invoke-method
				fsObj
				'GetDrive
				(vlax-invoke-method
				  fsObj
				  'GetDriveName
				  abPth
				)
			  )
   )
   (if
	 (vl-catch-all-error-p
	   (setq hSn (vl-catch-all-apply
				   'vlax-get-property
				   (list cDrv 'SerialNumber)
				 )
	   )
	 )
	  (progn
		(vlax-release-object cDrv)
		(setq hSn nil)
	  )
   )
   (vlax-release-object fsObj)
 )
 )
 hSn
)

Path là tên ổ cứng. Ví dụ muốn lấy Serial của ổ C: (GET_DRIVE_Serial "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 c ác anh

C ác anh cho em h ỏi t ý, v ì em m ới d ùng CAD 2007 n ên v ẫn đang t ập s ự. Em c ó 1 file b ản v ẽ đ ã v ẽ tr ên Model v à Z oom v ào c ác Layout (Kho ảng 20 Layout ) V ậy l àm nh ư th ế n ào đ ể in to àn b ộ c ác Layout đ ó(N ếu chọn từng Layout r ồ in th ì l âu l ắm). Em kh ông bi ết vi ết L ISP nh ư th ế n ào.

C ảm ơn c ác anh!

Khacsau1980@gmail.com

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 anh

C ác anh cho em h ỏi t ý, v ì em m ới d ùng CAD 2007 n ên v ẫn đang t ập s ự. Em c ó 1 file b ản v ẽ đ ã v ẽ tr ên Model v à Z oom v ào c ác Layout (Kho ảng 20 Layout ) V ậy l àm nh ư th ế n ào đ ể in to àn b ộ c ác Layout đ ó(N ếu chọn từng Layout r ồ in th ì l âu l ắm). Em kh ông bi ết vi ết L ISP nh ư th ế n ào.

C ảm ơn c ác anh!

Khacsau1980@gmail.com

Cần gì lisp. Cái này chức năng sheet set manager trong Cad còn nhanh hơn nhiều. Thậm chí còn in nhiều bản vẽ mà không cần mở bản vẽ đó ra.

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 gì lisp. Cái này chức năng sheet set manager trong Cad còn nhanh hơn nhiều. Thậm chí còn in nhiều bản vẽ mà không cần mở bản vẽ đó ra.

 

rất là cảm ơn anh đã giúp em. Nhưng em mới học CAD, em có vào Google tìm nhưng không thấy có ai hướng dẫn dùng heet set manager. Vậy anh có thể hướng dẫn em được không?

Cảm ơn anh!

Khacsau1980@gmail.com (anh mail cho em nhe)

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
rất là cảm ơn anh đã giúp em. Nhưng em mới học CAD, em có vào Google tìm nhưng không thấy có ai hướng dẫn dùng heet set manager. Vậy anh có thể hướng dẫn em được không?

Cảm ơn anh!

Khacsau1980@gmail.com (anh mail cho em nhe)

Anh search trên diễn đàn đi. Có đấy. Em lấy ví dụ 1 link http://www.cadviet.com/cadnews/content/view/32/1/

Nếu anh mua quyển sách Autocad mới thì nó có hướng dẫn chi tiết chức năng này mà.

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 search trên diễn đàn đi. Có đấy. Em lấy ví dụ 1 link http://www.cadviet.com/cadnews/content/view/32/1/

Nếu anh mua quyển sách Autocad mới thì nó có hướng dẫn chi tiết chức năng này mà.

 

 

Cảm ơn bạn, mình đã vào diễn đàn rồi nhưng mà không được chi tiết lắm. Mình đã dùng và thấy nó có 2 điều cần sự giúp đỡ.

Bản vẽ CAD (Mình gọi là bản gốc) gồm có 20 layout và được đánh theo số thứ tự 1/20, 2/20, 3/20......20/20

1. Mình đã tạo New sheet set, rồi New Subset 1. Nhưng khi Import Layouts as Sheets thì số thứ tự trong New Subset 1 không đúng so với bản vẽ gốc (vì thế khi in ra nó không theo thứ tự từ 1/20,2/20,3/20.....20/20 mà nó cứ lung tung cả)

2. Khi chỉnh sửa bản vẽ CAD (mình gọi là bản vẽ gốc) thì New Subset 1 không tự cập nhật theo bản vẽ gốc.

 

Mong các bạn 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

vậy có lisp nào tự động nội suy cao độ trong nova không?

nội suy tại tâm đường tròn dó?

sau đây là phai cad của nó, chư nội suy thủ công lâu quá.

Anh Em nào giỏi thì hãy nghiên cứu giúp tôi cái này. cám ơn nhiều.

Chứ lên diễn đàn toàn nói gì không a?

http://www.cadviet.com/upfiles/BAN_VE_NOVA...4_2009bak_3.rar

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, mình đã vào diễn đàn rồi nhưng mà không được chi tiết lắm. Mình đã dùng và thấy nó có 2 điều cần sự giúp đỡ.

Bản vẽ CAD (Mình gọi là bản gốc) gồm có 20 layout và được đánh theo số thứ tự 1/20, 2/20, 3/20......20/20

1. Mình đã tạo New sheet set, rồi New Subset 1. Nhưng khi Import Layouts as Sheets thì số thứ tự trong New Subset 1 không đúng so với bản vẽ gốc (vì thế khi in ra nó không theo thứ tự từ 1/20,2/20,3/20.....20/20 mà nó cứ lung tung cả)

2. Khi chỉnh sửa bản vẽ CAD (mình gọi là bản vẽ gốc) thì New Subset 1 không tự cập nhật theo bản vẽ gốc.

 

Mong các bạn giúp đỡ.

Tất cả những thắc mắc của bạn đều giải quyết được trong Sheet set. Chỉ có điều bạn chưa quen thôi. Mình có đề nghị thế này nhé: chúng ta sẽ lập một chủ đề mới riêng về sheet set manager để box này dành đất cho các bác yêu cầu lisp, ko các bác mắng chí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 !

Mình mới học CAD nên và cũng ham hố với mấy cái LISP lắm. Mình muốn có một cái LISP "cộng dồn" như thế này:

- Pick object (số bắt đầu)

- Pick object or enter a number (tham số cộng dồn)

- Chọn điểm (Là tổng của 2 tham số trên)

Nếu có tùy chọn nhiều hơn 2 tham số càng tốt.

Mình mới tham gia diễn đàn nên chưa biết nhiều. Nếu bác nào có link thì cho mình xin nha. Thanks 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

-Chào mọi người. Mình có 1 vấn đề nhỏ cần mọi người giúp đỡ.

-Trong lisp hàm nào để lấy được giá trị của Dim vậy.

-VD: có khỏang cách Dim là 3000. Bây giờ mình muốn lấy giá trị 3000 chia cho 1000 rồi lấy kết quả để vào Dim thành 3@1000=<3000>. Mong mọi người giúp đỡ. Đọan code của mình như sau:

(DEFUN C:BU ()

(setq

DIM (entsel "\n Chon kich thuoc dim:")

PT1 (getpoint "\n Chon diem thu nhat:")

PT2 (getpoint "\n Chon diem thu hai:")

BT (getint "\n Buoc @:")

KC (distance PT1 PT2)

KQ (fix (/ KC BT))

)

(command "dim" "newtext" KQ "@" BT "=<>" DIM "")

(command "exit")

(princ)

)

Mình không biết nó sai cho nào ma không lấy kết quả để vào Dim nhờ mọi người giúp đỡ dùm.

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 mọi người. Mình có 1 vấn đề nhỏ cần mọi người giúp đỡ.

-Trong lisp hàm nào để lấy được giá trị của Dim vậy.

Bạn tham khảo cái này có thể lấy giá trị dim :

(alert(rtos (cdr(assoc 42 (entget(car(entsel)))))))

 

Tue_Nv cũng chưa hiểu ý của bạn. Bạn đã có Dim rồi thì pick điểm 1, điểm 2 làm gì nhỉ? Mình nghĩ có lẽ không cần thiế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

(command "dim" "newtext" KQ "@" BT "=<>" DIM "")

(command "exit")

Dòng lệnh dán kết quả vào Dim như vậy đúng vậy bạn Tue_NV. Mình là nó sai và hok biết sửa như thế nào bạn gíup mình nha. Cám ơn bạ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
(command "dim" "newtext" KQ "@" BT "=" DIM "")

(command "exit")

Dòng lệnh dán kết quả vào Dim như vậy đúng vậy bạn Tue_NV. Mình là nó sai và hok biết sửa như thế nào bạn gíup mình nha. Cám ơn bạn nhiều.

Bạn bị sai ở chổ này :

KQ : phải là một biến kí tự chữ (string). Trong đoạn Code trên thì biến KQ là kiểu số thực nên nó bị lỗi

Bạn dùng hàm Rtos để chuyển kiểu số thực sang kiểu string

 

BT : phải là một biến kí tự chữ (string). Trong đoạn Code trên thì biến BT là kiểu số nguyên nên nó bị lỗi

Bạn dùng hàm itoa để chuyển kiểu số nguyên sang kiểu string

 

Và ta dùng hàm strcat để nối chuỗi

 

Mình sửa lại cho bạn này. Bạn xem nhé :

(DEFUN C:BU() 
(setq od (getvar "dimzin"))
(setvar "dimzin" 0)
(setq 
DIM (car(entsel "\n Chon kich thuoc dim:"))
ENT (cdr(assoc 42 (entget DIM)))
BT (getint "\n Buoc @:")
thapphan (getint "\n So chu so thap phan :")
entc (/ ENT BT)
)
(command "dimedit" "n" (strcat (itoa BT) "@" (rtos entc 2 thapphan) "= ") DIM "")
(setvar "dimzin" od)
(princ)
)

 

có thể sử dụng lệnh dimedit hoặc dòng lệnh (command "dim" "newtext"....

là tuỳ bạn.

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

×