Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
trinhhoanghieu090

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

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

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

https://www.dropbox.com/s/p5v3amnfb1nean2/POS_Bathy%20chart_Rev00_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

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
gia_bach    1.442

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

https://www.dropbox.com/s/p5v3amnfb1nean2/POS_Bathy%20chart_Rev00_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à đủ.

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
thanhtpvp    0

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ỉ

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

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
nhoclangbat    382

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)
)
 

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

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
Tot77    501

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]*")))))))))
)

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
Doan Van Ha    2.676

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: "-." "."

  • 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
Tot77    501

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.

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
Tot77    501

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),

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

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:

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
Tot77    501

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.

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
Doan Van Ha    2.676

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. 

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ạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×