Đến nội dung


Hình ảnh
- - - - -

[Autolisp] Tập tành viết lisp mong các bro tư vấn


  • Please log in to reply
9 replies to this topic

#1 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 08 November 2014 - 03:33 PM

Dear các bro!

 

Trong lúc rảnh rỗi tập tành viết lisp, sản phẩm của em đây các bác ạ:

 

(defun c:lenn()

(or *dl* (setq *dl* 350))
(setq dl (getreal (strcat "\n Nhap chieu dai moi <"
			  (rtos *dl* 2 2)
			 "> :"
		  )
	 )
)
(if (not dl) (setq dl *dl*) (setq *dl* dl))
 (princ "Chon Day Neo Can Thay Doi Chieu Dai: ")
 (setq ss (ssget))
(command ".LENGTHEN" "T" dl ss )
)

Đây là cái lisp thay đổi chiều dài một đoạn thẳng bằng cách nhập tổng chiều dài mới vào. Mong các bro chỉ giáo chỉnh sửa chút sao cho chọn đoạn thẳng đến đâu nó thay đổi luôn chiều dài đến đó như lệnh " Lengthen" chứ không đợi mình chọn tất cả các đối tượng bấm enter nó mới thay đổi hàng loạt.

 

 


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 08 November 2014 - 04:02 PM

Sửa lại như thế này:

(defun c:lenn()
 (or *dl* (setq *dl* 350))
 (setq dl (getreal (strcat "\n Nhap chieu dai moi <"(rtos *dl* 2 2) ">: ")))
 (if (not dl) (setq dl *dl*) (setq *dl* dl))
 (while (setq ent (car (entsel "Chon Day Neo Can Thay Doi Chieu Dai: ")))
  (command ".LENGTHEN" "T" dl ent "")))
 


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 08 November 2014 - 04:43 PM

Thanks bác @ Doan Van Ha
  • 0

#4 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 08 November 2014 - 05:08 PM

Để như lệnh " Lengthen" thì chắc vậy vẫn chưa đủ, vì Lengthen nó sẽ kéo dài (rút ngắn) đầu mút nào gần điểm pick.

hề hề :D


  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#5 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 08 November 2014 - 08:04 PM

Bác @ hieptr nói quá chuẩn đi.
Cho em hỏi các bro thêm chút xíu. Bây giờ em có một đoạn thẳng là line hoặc pline. Gọi biến ta tb là biến tọa độ 2 đầu đoạn thẳng đó. Các bác viết giúp em mấy dòng code sao cho khi chọn vào đoạn thẳng điểm gần vị trí chọn hơn là tb còn đầu còn lại là ta.
  • 0

#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 08 November 2014 - 09:17 PM

Bác @ hieptr nói quá chuẩn đi.
Cho em hỏi các bro thêm chút xíu. Bây giờ em có một đoạn thẳng là line hoặc pline. Gọi biến ta tb là biến tọa độ 2 đầu đoạn thẳng đó. Các bác viết giúp em mấy dòng code sao cho khi chọn vào đoạn thẳng điểm gần vị trí chọn hơn là tb còn đầu còn lại.

Giả sử bạn thử sửa lại như sau xem sao. Với lại, chịu khó thank bằng nút xanh cho tiện.

(defun c:lenn()
 (or *dl* (setq *dl* 350))
 (setq dl (getreal (strcat "\n Nhap chieu dai moi <"(rtos *dl* 2 2) ">: ")))
 (if (not dl) (setq dl *dl*) (setq *dl* dl))
 (command ".LENGTHEN" "T" dl))
 

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#7 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 08 November 2014 - 10:08 PM

Bác @ Doan Van Ha hiểu nhầm ý em rồi. Cái lisp "lenn" bác sửa cho lần đầu như thế là ổn rồi. Đoạn em nhờ lấy tọa độ như trên là dùng cho lisp khác bác ạ. Bác ngó lại giúp em tí
  • 0

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 09 November 2014 - 07:25 AM

Bác @ hieptr nói quá chuẩn đi.
Cho em hỏi các bro thêm chút xíu. Bây giờ em có một đoạn thẳng là line hoặc pline. Gọi biến ta tb là biến tọa độ 2 đầu đoạn thẳng đó. Các bác viết giúp em mấy dòng code sao cho khi chọn vào đoạn thẳng điểm gần vị trí chọn hơn là tb còn đầu còn lại là ta.

Câu màu đỏ không hiểu bạn à.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#9 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 09 November 2014 - 08:35 AM

Em làm cái lisp xoay đối tượng như thế này:
(defun c:roo()
(princ "Chon Doi Tuong Can Quay: ")
(setq ss (ssget))
(setq dg (getpoint "\n Chon Diem Goc:"))
(setq dh (getpoint "\n Chon Diem Dinh Huong:"))
(command ".rotate" ss "" dg "r" dg dh )
)

Nếu như khi quay một đoạn thẳng là line hoặc polyline em muốn bỏ không phảichọn điểm gốc và điểm định hướng mà điểm gốc để đoạn thẳng quay quanh nó là điểm xa vị trí chọn đoạn thẳng, còn điểm định hướng là điểm gần vị trí click chuột. Bác xem hộ em tí
  • 0

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 09 November 2014 - 09:31 AM

Đây!

(defun c:roo(/ dt ent lst p px pg)
 (vl-load-com)
 (setq dt (entsel "Chon doi tuong can quay: "))
 (setq p (cadr dt)
       ent (car dt)
       lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))
 (if (> (distance p (setq px (car lst))) (distance p (setq pg (cadr lst))))
  (command ".rotate" ent "" px "r" px pg)
  (command ".rotate" ent "" pg "r" pg px)))
 

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.