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ị

Bạn có thể post yêu cầu về autolisp ở topic này.

bác ơi, cái lệnh trả về kích thước thật của một đường kích thước sau khi bị sửa giá trị là gì ấy nhỉ? em nhớ có lần đọc đc trên diễn đàn như giờ tìm lại không thấ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
cho em hỏi có lisp nào chuyển Dtext có giá trị dương thành giá trị âm không. ví dụ: 2 chuyển thành -2

 

Đoạn code sau sẽ giúp đổi số dương thành số âm và ngược lại:

(defun c:so-am ( / ent ent0 noidung)
 (while
 (setq ent (car (entsel "\n Chon so:")))
 (progn
(setq ent0 (entget ent)
  noidung (cdr (assoc 1 ent0)))
(if
  (= 45 (vl-string-elt noidung 0))
  (setq noidung (vl-string-left-trim "-" noidung))
  (setq noidung (strcat "-" noidung))
  )
(setq ent0 (subst (cons 1 noidung) (assoc 1 ent0) ent0))
(entmod ent0)
(entupd ent)
)))

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ác ơi, cái lệnh trả về kích thước thật của một đường kích thước sau khi bị sửa giá trị là gì ấy nhỉ? em nhớ có lần đọc đc trên diễn đàn như giờ tìm lại không thấy

 

Cái này nằm trong express->dimention->reset dim text value

  • 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

Tại sao nhỉ?

 

Cho mình hỏi chen ngang một chút; Trong autocard 2008 lệnh slice chỉ cắt được vài đối tượng phải không? Mong các bạn sớm trả lời vì mình sử dụng cắt nhỏ nhiều lần một đối tượng 3dsolid nhưng không được. 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

Xin lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành

VD. Đang sử dung dim với tỷ lệ 50

Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50

Thanks các Bac 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
Xin lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành

VD. Đang sử dung dim với tỷ lệ 50

Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50

Thanks các Bac nhiều

 

Hy vọng là đúng ý bạn.

(command "insert" "cot" (getpoint "\nDiem dat :") (getvar "dimscale") "" (getangle "\nGoc xoay :"))

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

Mong bác Hoành và mọi người giúp đỡ.

Tôi muốn có 1 lisp "cộng" thêm vào các số đã có 1 số nào đó. Kết quả cho sẽ thay thế luôn dãy số cũ. Ví dụ: tôi đang tính khối lượng đắp nền. có rất nhiều mặt cắt và mỗi mặt cắt có khối lượng khác nhau. Giờ tôi muốn thêm vào 0.5 cho tất cả các khối lượng đó để cho khối lượng dư ra.Làm thủ công từng con số thì sẽ mất rất nhiều thời gian.

Thanks!

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 ơi!

Mình có một ý tưởng thế này!

Mình đang cần một lisp tính tổng chiều dài các đoạn thẳng theo từng layer.

ví dụ: Mình có khoảng 10 layer (IF1 --> IF10), trên bản vẽ, mình đã vẽ rất nhiều đoạn Poly line theo từng layer đó. Bây giờ mình muốn tính tổng chiều dài các đoạn thẳng này và đưa ra kết quả dưới dạng bảng trong cad (hoặc trong Excel thì càng tốt).

Các bạn có thể giúp mình được không?

Thanks trước 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
Mong bác Hoành và mọi người giúp đỡ.

Tôi muốn có 1 lisp "cộng" thêm vào các số đã có 1 số nào đó. Kết quả cho sẽ thay thế luôn dãy số cũ. Ví dụ: tôi đang tính khối lượng đắp nền. có rất nhiều mặt cắt và mỗi mặt cắt có khối lượng khác nhau. Giờ tôi muốn thêm vào 0.5 cho tất cả các khối lượng đó để cho khối lượng dư ra.Làm thủ công từng con số thì sẽ mất rất nhiều thời gian.

Thanks!

 

Bạn dùng thử đoạn code này xem sao.

(defun C:0+ (/ a ss obj obj_ent nd i)
 (setq a (getreal "\nLuong bien doi :")
n (getint "\nSo chu so thap phan :"))
 ; So chu so thap phan cua k/qua, vd 123,567 thi nhap 3
 (setq	ss (ssget (list (cons 0 "TEXT")))
i  0
 )
 (repeat (sslength ss)
   (setq obj (ssname ss i)
  obj_ent (entget obj)
  nd  (cdr (assoc 1 obj_ent))
  nd  (+ (atof nd) a)
  nd  (rtos nd 2 n) 
  i   (+ 1 i)
   )
   (setq obj_ent (subst (cons 1 nd) (assoc 1 obj_ent) obj_ent))
   (entmod obj_ent)
 )
 (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
Bạn dùng thử đoạn code này xem sao.

(defun C:0+ (/ a ss obj obj_ent nd i)
 (setq a (getreal "\nLuong bien doi :")
n (getint "\nSo chu so thap phan :"))
 ; So chu so thap phan cua k/qua, vd 123,567 thi nhap 3
 (setq	ss (ssget (list (cons 0 "TEXT")))
i  0
 )
 (repeat (sslength ss)
   (setq obj (ssname ss i)
  obj_ent (entget obj)
  nd  (cdr (assoc 1 obj_ent))
  [b][color="#FF0000"]nd  (+ (atof nd) a)[/color][/b]
  nd  (rtos nd 2 n) 
  i   (+ 1 i)
   )
   (setq obj_ent (subst (cons 1 nd) (assoc 1 obj_ent) obj_ent))
   (entmod obj_ent)
 )
 (princ)
)

 

 

Nếu ở trên không là một số mà là một chuỗi ký tự thì nó ra cái gì vậy 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
Mong bác Hoành và mọi người giúp đỡ.

Tôi muốn có 1 lisp "cộng" thêm vào các số đã có 1 số nào đó. Kết quả cho sẽ thay thế luôn dãy số cũ. Ví dụ: tôi đang tính khối lượng đắp nền. có rất nhiều mặt cắt và mỗi mặt cắt có khối lượng khác nhau. Giờ tôi muốn thêm vào 0.5 cho tất cả các khối lượng đó để cho khối lượng dư ra.Làm thủ công từng con số thì sẽ mất rất nhiều thời gian.

Thanks!

Đây là lisp bạn cần

Lệnh addi : cộng thêm giá trị cho hàng loạt các số nguyên

addr : cộng thêm giá trị cho hàng loạt các số thực (cái này bạn đang cần)

addt : cộng thêm giá trị cho các text số thứ tự

adde : cộng thêm giá trị cho các text cao độ (có thêm dấu +, -)

 

(defun myerror (s)
 (cond
   ((= s "quit / exit abort") (princ))
   ((/= s "Function cancelled") (princ (strcat "\nError: " s)))
 )
 (setvar "cmdecho" CMD)		; Restore saved modes
 (setvar "osmode" OSM)
 (setq *error* OLDERR)			; Restore old *error* handler
 (princ)
)

(defun bocchu (ss1 c)
 (setq ob (entget (ssname ss1 c)))
 (setq ts (assoc 1 ob))
 (setq a (cdr ts))
)
(defun sothanhchu (num) (rtos num 2 2))
(defun connumint (num) (rtos num 2 0))
(defun thaychu (Ob newstr)
 (setq txtstr (assoc 1 Ob))
 (setq newstr (cons 1 newstr))
 (entmod (subst newstr txtstr Ob))

)
(defun chonchu (dongnhac)
 (prompt dongnhac)
 (ssget
   '((-4 . "<OR") (0 . "text") (0 . "mtext") (-4 . "OR>"))
 )
)
(defun chon (str) (ssget '((cons (0 str)))))
(defun bamchon (st) (entget (car (entsel st))))
(defun bocdt (ss1 c) (entget (ssname ss1 c)))

;;; Sua nhieu text (cong tru gia tri nguyen)
(defun c:addi ()
 (command "undo" "mark")
 (setq	ss1 (chonchu "\nChon gia tri can cong them ...")
 )
 (if (= Ostr nil)
   (setq Ostr "\nNhap gia tri tang them <>...: ")
 )

 (while (= ss1 nil)
   (setq ss1 (chonchu "\nChon gia tri can cong them ...")
   )
 )

 (setq	i     0
num2  (getint Ostr)
sslen (sslength ss1)
 )
 (if (/= num2 nil)
   (setq
     numadd num2
   )
 )
 (if (/= numadd nil)
   (setq Ostr (strcat "\nNhap gia tri tang them <"
	       (rtos numadd 2 0)
	       "> : "
       )
   )
 )

 (while (<= i (1- sslen))
   (setq num1 (atof (bocchu ss1 i))

   )
   (setq num (+ num1 numadd))
   (setq ob (bocdt ss1 i))
   (setq st (connumint num))			

   (thaychu ob st)
   (princ)

   (setq i (1+ i))
 )
)


;;; Sua nhieu text (cong tru gia tri)
(defun c:addr ()
 (command "undo" "mark")
 (setq	ss1 (chonchu "\nChon gia tri can cong them ...")
 )
 (if (= Ostr nil)
   (setq Ostr "\nNhap gia tri tang them <>...: ")
 )

 (while (= ss1 nil)
   (setq ss1 (chonchu "\nChon gia tri can cong them ...")
   )
 )

 (setq	i     0
num2  (getreal Ostr)
sslen (sslength ss1)
 )
 (if (/= num2 nil)
   (setq
     numadd num2
   )
 )
 (if (/= numadd nil)
   (setq Ostr (strcat "\nNhap gia tri tang them <"
	       (rtos numadd 2 2)
	       "> : "
       )
   )
 )

 (while (<= i (1- sslen))
   (setq num1 (atof (bocchu ss1 i))

   )
   (setq num (+ num1 numadd))
   (setq ob (bocdt ss1 i))

   (setq st (sothanhchu num))


   (thaychu ob st)
   (princ)

   (setq i (1+ i))
 )
)

;;; Sua nhieu text (cong tru gia tri nguyen - So thu tu)
(defun c:addt ()
 (command "undo" "mark")
 (setq	ss1 (chonchu "\nChon gia tri can cong them ...")
 )
 (if (= Ostr nil)
   (setq Ostr "\nNhap gia tri tang them <>...: ")
 )

 (while (= ss1 nil)
   (setq ss1 (chonchu "\nChon gia tri can cong them ...")
   )
 )

 (setq	i     0
num2  (getint Ostr)
sslen (sslength ss1)
 )
 (if (/= num2 nil)
   (setq
     numadd num2
   )
 )
 (if (/= numadd nil)
   (setq Ostr (strcat "\nNhap gia tri tang them <"
	       (rtos numadd 2 0)
	       "> : "
       )
   )
 )

 (while (<= i (1- sslen))
   (setq num1 (atof (bocchu ss1 i))

   )
   (setq num (+ num1 numadd))
   (setq ob (bocdt ss1 i))
   (if	(< num 10)
     (setq st (strcat "0" (connumint num)))
     (setq st (connumint num))
   )

   (thaychu ob st)
   (princ)

   (setq i (1+ i))
 )
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Tang giam gia tri cao do
(defun c:adde ()
 (command "undo" "mark")
 (setq	ss1 (chonchu "\nChon gia tri can cong them ...")
 )
 (if (= Ostr nil)
   (setq Ostr "\nNhap gia tri tang them <>...: ")
 )

 (while (= ss1 nil)
   (setq ss1 (chonchu "\nChon gia tri can cong them ...")
   )
 )

 (setq	i     0
num2  (getreal Ostr)
sslen (sslength ss1)
 )
 (if (/= num2 nil)
   (setq
     numadd num2
   )
 )
 (if (/= numadd nil)
   (setq Ostr (strcat "\nNhap gia tri tang them <"
	       (rtos numadd 2 2)
	       "> : "
       )
   )
 )

 (while (<= i (1- sslen))
   (setq num1 (atof (bocchu ss1 i))

   )
   (setq num (+ num1 numadd))
   (setq ob (bocdt ss1 i))
   (if	(> num 0)
     (setq st (strcat "+" (sothanhchu num)))
     (setq st (sothanhchu num))
   )

   (thaychu ob st)
   (princ)

   (setq i (1+ i))
 )
)

;;;

Với đoạn code như thế này, các bạn hoàn toàn có thể tự chế biến cho mình những công cụ phù hợp, chẳng hạn thay cộng , trừ thành nhân, chia, thêm ký tự vào kết quả .... Mình thấy một số yêu cầu ..na ná nhau như : đánh số nhà, biến số - thành +, hay thêm bớt ký tự vào text ... làm loãng cả nội dung của box, mọi người cũng khó khăn trong việc tìm kiếm. Các mod có nên lập ra các box phân loại lisp theo công dụng và đối tượng không nhỉ (ví dụ như box lisp for text, text style, box lisp for block, box lisp for dim, box lisp for print...

  • 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ếu ở trên không là một số mà là một chuỗi ký tự thì nó ra cái gì vậy bạn

Chết thật, đang type thì đã có bác post trước rồi :s_big:

Bác vndesperados ạ, hàm atof, hay rtos ko được thông minh lắm đâu, nếu gặp tham số là chuỗi ký tự thì nó trả về giá trị 0 chứ ko gây lỗi đâ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ết thật, đang type thì đã có bác post trước rồi :s_big:

Bác vndesperados ạ, hàm atof, hay rtos ko được thông minh lắm đâu, nếu gặp tham số là chuỗi ký tự thì nó trả về giá trị 0 chứ ko gây lỗi đâu

 

 

Tôi biết chuyện đó bạn ạh, nhưng như thế thì cũng gây ra một sự thay đổi không đúng theo mong muốn của người dùng rùi. Theo tôi nên có thểm một hàm kiểm tra là số hay chuỗi ký tự trước khi thực hiện thay đổ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
Tôi biết chuyện đó bạn ạh, nhưng như thế thì cũng gây ra một sự thay đổi không đúng theo mong muốn của người dùng rùi. Theo tôi nên có thểm một hàm kiểm tra là số hay chuỗi ký tự trước khi thực hiện thay đổi

 

 

Cám ơn vndesperados và Snowman đã phát hiện lỗ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, nhân tiện đây tôi cũng muốn nhờ luôn các bác:

Tôi cũng đã tìm chủ đề về Wipeout trên diễn đàn nhưng chưa được như mong muốn.

Tôi muốn biến 1 đường tròn thành 1 Wipeout. Thực ra, đường tròn cũng tạo bởi các đoạn thẳng, nên có thể chia nó ra thành nhiều đoạn thẳng nhỏ, sau đó Join chúng lại thành 1 Pline kín và dùng lệnh Wipeout. Độ mịn của đường tròn lúc đó sẽ phụ thuộc vào số khoảng chia mà ta chọn.

Như vậy Lisp sẽ yêu cầu chọn đối tượng là đường tròn cần chuyển. Chọn số khoảng chia.và sau đó thực hiện.

Mong các bác 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
Chết thật, đang type thì đã có bác post trước rồi :s_big:

Bác vndesperados ạ, hàm atof, hay rtos ko được thông minh lắm đâu, nếu gặp tham số là chuỗi ký tự thì nó trả về giá trị 0 chứ ko gây lỗi đâu

 

Lisp cũng có nhiều cái hay phết.

Nhân dịp nhắc đến điều này, mình cũng xin lưu ý đến các Bác đang vật lộn với lisp (cái này mình vấp phải lúc mới quen với lisp):

Kết quả của phép chia 1 số nguyên cho 1 số nguyên là 1 số nguyên.???

(/ 5 3) = 1

(/ 3 5) = 0

(/ -5 3) = -1

Nếu kg biết đc cái này các Bác sẽ kg biết tại sao chtrình của mình lập chạy kg đúng như ý hoặc thậm chí là lỗ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
Lisp cũng có nhiều cái hay phết.

Nhân dịp nhắc đến điều này, mình cũng xin lưu ý đến các Bác đang vật lộn với lisp (cái này mình vấp phải lúc mới quen với lisp):

Kết quả của phép chia 1 số nguyên cho 1 số nguyên là 1 số nguyên.???

(/ 5 3) = 1

(/ 3 5) = 0

(/ -5 3) = -1

Nếu kg biết đc cái này các Bác sẽ kg biết tại sao chtrình của mình lập chạy kg đúng như ý hoặc thậm chí là lỗi.

Khắc phục cái này như sau

(/ 5.0 3.0) = mình thấy vớ vẩn vậy nhưng máy nó không như mình. :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
Tôi biết chuyện đó bạn ạh, nhưng như thế thì cũng gây ra một sự thay đổi không đúng theo mong muốn của người dùng rùi. Theo tôi nên có thểm một hàm kiểm tra là số hay chuỗi ký tự trước khi thực hiện thay đổi

Đúng rồi lổi này rất phiền. Ví dụ tôi viết lisp tính trung bình các số nếu nó không loại bỏ các chuổi ra khỏi việc tính toán thì kết quả sẽ sai vì trong tổng thì không có giá trị của nó nhưng khi chia lấy trung bình thì chia cả phần của nó nên ........ :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
Đúng rồi lổi này rất phiền. Ví dụ tôi viết lisp tính trung bình các số nếu nó không loại bỏ các chuổi ra khỏi việc tính toán thì kết quả sẽ sai vì trong tổng thì không có giá trị của nó nhưng khi chia lấy trung bình thì chia cả phần của nó nên ........ :s_big:

 

 

Tặng các bác hàm kiểm tra một chuỗi có phải là số hay không

 

;=====Ham kiem tra chuoi co la so hay khong======
(DEFUN IsNumeric (str / kq n1 n2 l)
 (setq kq Nil)
 (setq n1 0)
 (setq n2 0)
 (if (= (substr str 1 1)"-")
(setq str (substr str 2 (- (strlen str) 1))))

 (setq l (strlen str))
 (if (= (substr str 1 1)".")
(setq kq Nil)
(progn
  (setq i 1)
  (while (<= i l)
(setq a (substr str i 1))
(if (and (> (ascii a)47) (< (ascii a)58))
  (setq n1 (+ n1 1))
)
(if (= a ".")
  (setq n2 (+ n2 1))
)
(setq i (+ i 1))
  )
  (if (and (<= n2 1) (= (+ n2 n1)l))
(setq kq T)	
  )
)
 )
 kq
)

  • 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
Tặng các bác hàm kiểm tra một chuỗi có phải là số hay không

 

(DEFUN IsNumeric (str )
(if (member (type (read str)) '(REAL INT) )
 T
 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

Xin lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành

VD. Đang sử dung dim với tỷ lệ 50

Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50

Thanks các Bac nhiều

 

Bác Gia_Bach nói vậy thì khác nào chỉ sử dụng đc cho mỗi block cột

Lish sẽ scale tất cả các block insert theo ẻy lệ dim.

Mog các Bác giúp

 

Hy vọng là đúng ý bạn.

(command "insert" "cot" (getpoint "\nDiem dat :") (getvar "dimscale") "" (getangle "\nGoc xoay :"))

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 lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành

VD. Đang sử dung dim với tỷ lệ 50

Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50

Thanks các Bac nhiều

 

Bác Gia_Bach nói vậy thì khác nào chỉ sử dụng đc cho mỗi block cột

Lish sẽ scale tất cả các block insert theo ẻy lệ dim.

Mog các Bác giúp

Bạn dùng lệnh SB trong bộ ACV 1.0

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 làm ơn viết giúp em một lisp có chức năng gán giá trị của text cho elevation của pline.

cú pháp lệnh: gõ tên lệnh chương trình yêu cầu chọn text sau đó yêu cầu chọn pline cần gán text vào elevation.

(nếu có thể gán được 1 text cho nhiều pline thì càng tốt)

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

×