Đến nội dung


Hình ảnh
- - - - -

[Nhờ viết Lisp]-Mong các Bro giúp đỡ


  • Please log in to reply
14 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 03 September 2014 - 03:27 PM

Chào các bác. Em có một bản cad như đính kèm:

https://www.dropbox....ev00_1.dwg?dl=0

 

Trong file cad là các text, Mtext có giá trị là  số thập phân với âm dương tùy ý. Chắc các bác cũng thắc mắc khi không lại đưa vào bản vẽ nhiều số thế có mục đích gì, em xin thưa em là dân đo đạc,hi hi. Đây là giá trị cao độ của các điểm chi tiết. 

 

Bây giờ các bác có thể viết một lisp tách một nhóm các giá trị độ cao trong toàn bộ các giá trị ở trên ra lớp khác được không ạ, Ví dụ từ +41.00 đến +42.50 (Toàn bộ các giá trị độ cao được chọn bằng cách quyét chuột). trong đó giá trị từ +41.00 đến +42.50 do người dung khai vào dòng lệnh, lớp chứa giá trị được tách là một  lớp do người dùng đã tạo trước và đang ở chế độ set current layer.

 

Cảm ơn các bác


  • 0

#2 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1432 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 03 September 2014 - 04:15 PM

Chào các bác. Em có một bản cad như đính kèm:

https://www.dropbox....ev00_1.dwg?dl=0

 

Trong file cad là các text, Mtext có giá trị là  số thập phân với âm dương tùy ý. Chắc các bác cũng thắc mắc khi không lại đưa vào bản vẽ nhiều số thế có mục đích gì, em xin thưa em là dân đo đạc,hi hi. Đây là giá trị cao độ của các điểm chi tiết. 

 

Bây giờ các bác có thể viết một lisp tách một nhóm các giá trị độ cao trong toàn bộ các giá trị ở trên ra lớp khác được không ạ, Ví dụ từ +41.00 đến +42.50 (Toàn bộ các giá trị độ cao được chọn bằng cách quyét chuột). trong đó giá trị từ +41.00 đến +42.50 do người dung khai vào dòng lệnh, lớp chứa giá trị được tách là một  lớp do người dùng đã tạo trước và đang ở chế độ set current layer.

 

Cảm ơn các bác

Tìm kiếm trước khi mở Topic mới nhé.

-  lisp lọc chọn các số trong khoảng AB

 

PS: mặc dù y/cầu là chọn các Text-Mtext nhưng trong bản vẽ bạn post lên chỉ có Text nên dùng các Lisp trên là đủ.


  • 0

#3 thanhtpvp

thanhtpvp

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 03 September 2014 - 04:33 PM

em mới tham gia tìm mãi chỗ để gửi câu hỏi chả thấy đâu . chả biết đúng chỗ này khong nữa . mong các bác bỏ qua. :v  em dùng cad 2007 thỉnh thoảng em cứ nhập lệnh xong là con chỏ chuột nó đơ. thời gian gần đây nó mới bị vậy ạ. liệu có phải do máy không các bác nhỉ


  • 0

#4 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 03 September 2014 - 04:53 PM

Tìm kiếm trước khi mở Topic mới nhé.
-  lisp lọc chọn các số trong khoảng AB
 
PS: mặc dù y/cầu là chọn các Text-Mtext nhưng trong bản vẽ bạn post lên chỉ có Text nên dùng các Lisp trên là đủ.

 
Thanks bác gia_bach. Bác có thể hướng dẫn thêm được không ạ. em gõ lệnh theo lisp mà nó báo lỗi như này:
 
Command: td
Select objects: Specify opposite corner: 18 found
Select objects:
Nhap so nho: 1
Nhap so lon: 42
_.PSELECT Unknown command "PSELECT".  Press F1 for help.
  • 0

#5 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 03 September 2014 - 05:58 PM

cũng tò mò, đúng là lỗi, chỗ lệnh pseclect ^^, bạn thử dùng lisp có lệnh s2 trong topic đó xem 

;; free lisp from cadviet.com
(defun c:s2() (SelRange <=))

(defun SelRange(f / ss a b)
    (setq ss  (acet-ss-to-list (ssget '((0 . "TEXT")))))
    (setq a (getreal "\nNhap so nho: ") b (getreal "\nNhap so lon: "))
    (command "_.PSELECT" (acet-list-to-ss (vl-remove nil (mapcar '(lambda(x) (if (f a (distof (cdr (assoc 1 (entget x)))) b) x nil)) ss))) "")
    (princ)
)
 


  • 1
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#6 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 03 September 2014 - 10:04 PM

cũng tò mò, đúng là lỗi, chỗ lệnh pseclect ^^, bạn thử dùng lisp có lệnh s2 trong topic đó xem 

;; free lisp from cadviet.com
(defun c:s2() (SelRange <=))

(defun SelRange(f / ss a b)
    (setq ss  (acet-ss-to-list (ssget '((0 . "TEXT")))))
    (setq a (getreal "\nNhap so nho: ") b (getreal "\nNhap so lon: "))
    (command "_.PSELECT" (acet-list-to-ss (vl-remove nil (mapcar '(lambda(x) (if (f a (distof (cdr (assoc 1 (entget x)))) b) x nil)) ss))) "")
    (princ)
)
 

Cảm ơn bác, nhưng em vẫn bị báo lỗi như trên, hiện tại em đang dùng cad 2010. híc


  • 0

#7 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 04 September 2014 - 08:02 AM

Bạn dùng thử cái này, cách dùng :

1. Nhập biểu thức, thí dụ : 

   >=3

  <6

  2.3<=5.0

  (2 cái trên thì dễ hiểu rồi, cái thứ 3 nghĩa là trong khoảng từ 2.3 đến 5.0 có lấy cả 2 số đó)

2. Quét chọn text.

3. Cái text nào thoả thì bị bắt, khi đó bạn muốn đổi layer như thế nào cũng được.

(defun c:tim()
  (defun ssfrom (sl / ss0) (setq ss0 (ssadd)) (mapcar '(lambda(x) (ssadd x ss0)) sl) ss0)
  (setq gtt (getstring t "\nNhap bieu thuc :")
lso ".1234567890"
so  (read (strcat "(" (vl-list->string (mapcar '(lambda(x) (if (vl-string-search (chr x) lso) x 32)) (vl-string->list gtt))) ")"))
chu (car (read (strcat "(" (vl-list->string (mapcar '(lambda(x) (if (vl-string-search (chr x) lso) 32 x)) (vl-string->list gtt))) ")")))
  )  
  (sssetfirst nil (ssfrom (vl-remove-if-not '(lambda(x)
(if (= 1 (length so))
  ((eval chu) (atof (cdr (assoc 1 (entget x)))) (car so))
  (and ((eval chu) (car so) (atof (cdr (assoc 1 (entget x)))) (last so)))))
(vl-remove-if 'listp (mapcar 'cadr (ssnamex  (ssget '((0 . "*TEXT") (1 . "~*[~-0--9]*")))))))))
)

  • 0

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 September 2014 - 09:02 AM

Tot77 bổ sung thêm tí nữa để những text khá "vô nghĩa" đừng bị hiểu là số thì tuyệt.

Ví dụ biểu thức là "<2" thì các text "vô nghĩa" sau đây vẫn được chọn: "-." "."


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


#9 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 04 September 2014 - 09:36 AM

Tôi quên cái vụ số âm, bạn sửa cái chỗ   ".1234567890" thành "-.1234567890"

Cám ơn bác Ha về cái vụ text vô nghĩa, nhưng nêu có bắt nhầm cũng chẳng sao, trường hợp đó khá là hi hữu, lisp nếu viết cho mọi trường hợp thì e rằng dài quá không cần thiết đâu bác.


  • 0

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 September 2014 - 09:48 AM

Tôi cũng đã từng sa vào cái này rồi. Khá oải. Tôi nghĩ dùng distof thì ổn hơ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.


#11 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 04 September 2014 - 10:36 AM

Thể theo yêu cầu của bác Ha, tôi viết lại như sau:

 

(defun c:tim()
  (defun ssfrom (sl / ss0) (setq ss0 (ssadd)) (mapcar '(lambda(x) (ssadd x ss0)) sl) ss0)
  (setq gtt (getstring t "\nNhap bieu thuc :")
lso "-.1234567890"
so  (read (strcat "(" (vl-list->string (mapcar '(lambda(x) (if (vl-string-search (chr x) lso) x 32)) (vl-string->list gtt))) ")"))
chu (car (read (strcat "(" (vl-list->string (mapcar '(lambda(x) (if (vl-string-search (chr x) lso) 32 x)) (vl-string->list gtt))) ")")))
  )  
  (sssetfirst nil (ssfrom (vl-remove-if-not '(lambda(x)
(if (= 1 (length so))
  ((eval chu) (atof (cdr (assoc 1 (entget x)))) (car so))
  (and ((eval chu) (car so) (atof (cdr (assoc 1 (entget x)))) (last so)))))
    (vl-remove-if-not '(lambda(x) (distof (cdr (assoc 1 (entget x)))))
      (vl-remove-if 'listp (mapcar 'cadr (ssnamex  (ssget (list '(0 . "*TEXT") )))))))))
)

 

Các biểu thức so sánh hợp lệ là  <, <=, >, >=, =, /= (khác),


  • 0

#12 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 04 September 2014 - 04:25 PM

Thể theo yêu cầu của bác Ha, tôi viết lại như sau:
 
 

(defun c:tim()  (defun ssfrom (sl / ss0) (setq ss0 (ssadd)) (mapcar '(lambda(x) (ssadd x ss0)) sl) ss0)  (setq gtt (getstring t "\nNhap bieu thuc :")lso "-.1234567890"so  (read (strcat "(" (vl-list->string (mapcar '(lambda(x) (if (vl-string-search (chr x) lso) x 32)) (vl-string->list gtt))) ")"))chu (car (read (strcat "(" (vl-list->string (mapcar '(lambda(x) (if (vl-string-search (chr x) lso) 32 x)) (vl-string->list gtt))) ")")))  )    (sssetfirst nil (ssfrom (vl-remove-if-not '(lambda(x)(if (= 1 (length so))  ((eval chu) (atof (cdr (assoc 1 (entget x)))) (car so))  (and ((eval chu) (car so) (atof (cdr (assoc 1 (entget x)))) (last so)))))    (vl-remove-if-not '(lambda(x) (distof (cdr (assoc 1 (entget x)))))      (vl-remove-if 'listp (mapcar 'cadr (ssnamex  (ssget (list '(0 . "*TEXT") ))))))))))
 
Các biểu thức so sánh hợp lệ là  <, <=, >, >=, =, /= (khác),
Thanks bác nhé. Đúng cái em cần, rất linh hoạt trong việc chọn lọc số. Nhưng mà sau nhập biểu thức so sánh vào thì không ngắt lệnh bằng phím cách ( space bar) được, Mong bác xử lý nốt cái này nữa là lisp cực kỳ hoàn hảo.
Với lại nếu thực hiện hai lệnh tìm liên tiếp thì thỉnh thoảng bị lỗi:
 
Command: tim
Nhap bieu thuc :>=-44
Select objects: Specify opposite corner: 996 found
Select objects:
(nil <Selection set: 3d6>)
Command:
Command:
TIM
Nhap bieu thuc :<=-44.5
291 found
(nil <Selection set: 530>)
Command:
  • 0

#13 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 04 September 2014 - 07:59 PM

1.Sở dĩ phải enter mới ngắt lệnh là để cho những người thích viết "thoáng" và hay dùng dấu cách, thí dụ:  2.5 <= 4.6

Còn nếu bạn muốn viết liền và ngắt bằng space thì xóa chữ t ở dòng (getstring t "\nNhap bieu thuc :")

2. Khi bạn làm xong 1 lệnh tim thì sẽ hiện lên các text bị bắt (có điểm bắt màu xanh) , nếu bạn không làm gì hết thì nên bấm esc để thoát cái đó đi, nếu không thì ở lệnh sau nó sẽ chọn những text đó để so sánh tiếp.


  • 0

#14 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

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

Em đã thông suốt, chúc cho bác Tot77 ngày càng thành công trong công cuộc chinh phục autocad.


  • 0

#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 September 2014 - 08:46 PM

Em đã thông suốt, chúc cho bác Tot77 ngày càng thành công trong công cuộc chinh phục autocad.

Chịu khó nhấn Like nhé 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.