Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp offset nhiều đường tròn


  • Please log in to reply
44 replies to this topic

#21 saycaphe

saycaphe

    biết vẽ circle

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

Đã gửi 25 December 2011 - 06:07 PM

Bác cho mình hỏi cú pháp lệnh filber trong lisp với :D
  • 0

#22 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 25 December 2011 - 06:13 PM

Bác cho mình hỏi cú pháp lệnh filber trong lisp với :D

Tôi mới biết lệnh này hôm nay nên chưa thể tìm ra cú pháp của nó được liền. Cần phải n/c đã.
  • 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.


#23 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 25 December 2011 - 09:09 PM

Bác chỉ giùm tôi trong Cad cách thức chọn các Circle có R<=15 để giải quyết nhanh bài toán này, vì thật tình tôi chưa biết điều này.

http://www.cadviet.c...?showtopic=8811
^^ Filter quá phức tạp để sử dụng với command bác ạ ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#24 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 25 December 2011 - 09:16 PM

http://www.cadviet.c...?showtopic=8811
^^ Filter quá phức tạp để sử dụng với command bác ạ ^^

Ấy ấy! Tôi hỏi là lúc tôi chưa biết có lệnh "filter". Chứ nhìn Dialoge của nó thì ngộ ra rồi. OK?
  • 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.


#25 saycaphe

saycaphe

    biết vẽ circle

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

Đã gửi 26 December 2011 - 09:41 AM

Biết mà! Đây bạn!
P/S: đã sửa lỗi do sơ ý quên hàm (vl-load-com)


;Doan Van Ha - CADViet.com - Ngay 23/12/2011
;Muc dich: Scale tat ca duong tron duoc chon co R<=15 ve R=10.
(defun C:HA()
(vl-load-com)
(princ "\nChon cac Circle can Scale...")
(setq entlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "CIRCLE") (-4 . "<=") (40 . 15.0)))))))
(foreach ent entlst
(vla-put-Radius (vlax-ename->vla-object ent) 10.0))
(princ))

Bác ơi, lisp này chỉ hoạt động khi tồn tại Circle đáp ứng điều kiện R <=15, còn nếu ko tồn tại thì sẽ gặp lỗi ko chạy đc. Có cách nào cho nó kiểm tra, xem có tồn tại đường tròn R<=15, nếu tồn tại thì mới thực hiện lệnh scale circle vậy bác?
  • 0

#26 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 26 December 2011 - 10:39 AM

Bác ơi, lisp này chỉ hoạt động khi tồn tại Circle đáp ứng điều kiện R <=15, còn nếu ko tồn tại thì sẽ gặp lỗi ko chạy đc. Có cách nào cho nó kiểm tra, xem có tồn tại đường tròn R<=15, nếu tồn tại thì mới thực hiện lệnh scale circle vậy bác?


(defun C:scc ( / ss)
(prompt "\nSelect circles to change... ")
(cond
((not (setq ss (ssget '((0 . "CIRCLE") (-4 . "<=") (40 . 15.0)))))(princ "Nothing or no Circle selected."))
(T (vl-load-com)
(vlax-for circle (setq ss (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
(vla-put-Radius circle 10)
)
))
(princ)
)

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#27 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 26 December 2011 - 10:45 AM


(defun C:scc ( / ss)
(prompt "\nSelect circles to change... ")
(cond
((not (setq ss (ssget '((0 . "CIRCLE") (-4 . "<=") (40 . 15.0)))))(princ "Nothing or no Circle selected."))
(T (vl-load-com)
(vlax-for circle (setq ss (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
(vla-put-Radius circle 10)
)
))
(princ)
)

Đã dùng ActiveSelectionSet thì không cần (setq ss ...)

(defun C:scc ()
(prompt "\nSelect circles to change... ")
(cond
((not (ssget '((0 . "CIRCLE") (-4 . "<=") (40 . 15.0))))(princ "Nothing or no Circle selected."))
(T (vl-load-com)
(vlax-for circle (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-put-Radius circle 10) )))
(princ))

  • 2

#28 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 26 December 2011 - 10:47 AM

Đã dùng ActiveSelectionSet thì không cần (setq ss ...)

E chưa xóa ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#29 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 26 December 2011 - 12:14 PM

Bác cho mình hỏi cú pháp lệnh filber trong lisp với :D

Một vài ví dụ về Filter trong lisp.

;chon d/tron co b/kinh = 500
(setq ss (ssget '((0 . "CIRCLE") (40 . 500))))
;chon d/tron co b/kinh > 500
(setq ss (ssget '((0 . "CIRCLE") (-4 . ">") (40 . 500))))
;chon d/tron co b/kinh < 500
(setq ss (ssget '((0 . "CIRCLE") (-4 . "<") (40 . 500))))
;chon d/tron co b/kinh /= 500
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<NOT")
(40 . 500)
(-4 . "NOT>") )))
;chon d/tron co b/kinh = 400 va b/kinh = 600
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<OR")
(40 . 400)
(40 . 600)
(-4 . "OR>") )))
;chon d/tron co b/kinh /= 400 va b/kinh /= 600
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<NOT")
(-4 . "<OR")
(40 . 400)
(40 . 600)
(-4 . "OR>")
(-4 . "NOT>") )))
;chon d/tron co b/kinh 400 <= R <= 600
(setq ss (ssget '((0 . "CIRCLE") (-4 . "<=") (40 . 600) (-4 . ">=") (40 . 400))))
;chon d/tron co b/kinh R < 400 va R > 600
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<OR")
(-4 . ">") (40 . 600)
(-4 . "<") (40 . 400)
(-4 . "OR>") )))

  • 1

#30 saycaphe

saycaphe

    biết vẽ circle

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

Đã gửi 26 December 2011 - 02:46 PM

vậy muốn lọc Arc theo lengh hay total angle, thì dxf code của nó là gì vậy các bác?
  • 0

#31 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 26 December 2011 - 03:15 PM

vậy muốn lọc Arc theo lengh hay total angle, thì dxf code của nó là gì vậy các bác?

Không có dxf quy định Length của arc
Còn total angle của arc thì dựa vào mã dxf 50 và dxf 51 để tính total angle (A)
Mã dxf40 quy định bán kính arc ®
-> Có ® và (A) -> Length của arc

Muốn lọc các điều kiện về Length hay Total Angle của Arc thì phải lọc qua Arc -> xét điều kiện -> Nếu thỏa mãn thì cho vào tập chọn selection set
Hình như mình đã đi lạc chủ đề rồi thì phải......
  • 1

#32 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 26 December 2011 - 03:44 PM

Một vài ví dụ về Filter trong lisp.


;chon d/tron co b/kinh = 500
(setq ss (ssget '((0 . "CIRCLE") (40 . 500))))
;chon d/tron co b/kinh > 500
(setq ss (ssget '((0 . "CIRCLE") (-4 . ">") (40 . 500))))
;chon d/tron co b/kinh < 500
(setq ss (ssget '((0 . "CIRCLE") (-4 . "<") (40 . 500))))
;chon d/tron co b/kinh /= 500
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<NOT")
(40 . 500)
(-4 . "NOT>") )))
;chon d/tron co b/kinh = 400 va b/kinh = 600
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<OR")
(40 . 400)
(40 . 600)
(-4 . "OR>") )))
;chon d/tron co b/kinh /= 400 va b/kinh /= 600
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<NOT")
(-4 . "<OR")
(40 . 400)
(40 . 600)
(-4 . "OR>")
(-4 . "NOT>") )))
;chon d/tron co b/kinh 400 <= R <= 600
(setq ss (ssget '((0 . "CIRCLE") (-4 . "<=") (40 . 600) (-4 . ">=") (40 . 400))))
;chon d/tron co b/kinh R < 400 va R > 600
(setq ss (ssget '((0 . "CIRCLE")
(-4 . "<OR")
(-4 . ">") (40 . 600)
(-4 . "<") (40 . 400)
(-4 . "OR>") )))

Em viết Chọn đường tròn có bán kính /=400 và đường tròn có bán kính /=600 khác anh giabach 1 chút xíu

;chon d/tron co b/kinh /= 400 va b/kinh /= 600

(setq ss (ssget '((0 . "CIRCLE")
(-4 . "!=")
(40 . 400)
(-4 . "!=")
(40 . 600)
)))

  • 1

#33 saycaphe

saycaphe

    biết vẽ circle

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

Đã gửi 26 December 2011 - 03:55 PM

Không có dxf quy định Length của arc
Còn total angle của arc thì dựa vào mã dxf 50 và dxf 51 để tính total angle (A)
Mã dxf40 quy định bán kính arc ®
-> Có ® và (A) -> Length của arc

Muốn lọc các điều kiện về Length hay Total Angle của Arc thì phải lọc qua Arc -> xét điều kiện -> Nếu thỏa mãn thì cho vào tập chọn selection set
Hình như mình đã đi lạc chủ đề rồi thì phải......

Thanks bác hì hì.
Vậy mình muốn lọc các cung tròn, có R<15, có total angle <85 thì làm thế nào vậy bác :D
  • 0

#34 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 26 December 2011 - 03:57 PM

Những câu hỏi này nên dành ở topic Hỏi thì hơn ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#35 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 26 December 2011 - 04:16 PM

Thanks bác hì hì.
Vậy mình muốn lọc các cung tròn, có R<15, có total angle <85 thì làm thế nào vậy bác :D

Bạn tham khảo


(defun c:artt(/ ss ssa dxf i en)
(defun dxf (code e) (cdr(assoc code (entget e))))
(if (setq ss (ssget '((0 . "ARC") (-4 . "<") (40 . 15))) )
(progn
(setq ssa (ssadd) i -1)
(while (setq en (ssname ss (setq i (1+ i))))
(if (< (setq ang (abs (- (dxf 50 en) (dxf 51 en))))
(/ (* 85 pi) 180.0)
)
(setq ssa (ssadd en ssa))
)
)
(sssetfirst ssa ssa)
)
)
(princ)
)

  • 1

#36 saycaphe

saycaphe

    biết vẽ circle

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

Đã gửi 26 December 2011 - 10:06 PM

Bạn tham khảo



(defun c:artt(/ ss ssa dxf i en)
(defun dxf (code e) (cdr(assoc code (entget e))))
(if (setq ss (ssget '((0 . "ARC") (-4 . "<") (40 . 15))) )
(progn
(setq ssa (ssadd) i -1)
(while (setq en (ssname ss (setq i (1+ i))))
(if (< (setq ang (abs (- (dxf 50 en) (dxf 51 en))))
(/ (* 85 pi) 180.0)
)
(setq ssa (ssadd en ssa))
)
)
(sssetfirst ssa ssa)
)
)
(princ)
)

Bác siêu quá hixhix. Đúng là chuyên gia có khác ^^. Bác giúp em luôn cái scale R =10 với, em mò hoài ko đc :(
  • 0

#37 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 26 December 2011 - 10:43 PM

Bác siêu quá hixhix. Đúng là chuyên gia có khác ^^. Bác giúp em luôn cái scale R =10 với, em mò hoài ko đc :(


(defun c:artt(/ ss ssa dxf i en)
(defun dxf (code e)
(cdr (assoc code (entget e))))
(if (setq ss (ssget '((0 . "ARC") (-4 . "<") (40 . 15))))
(progn
(setq ssa (ssadd) i -1)
(while (setq en (ssname ss (setq i (1+ i))))
(if (< (setq ang (abs (- (dxf 50 en) (dxf 51 en)))) (/ (* 85 pi) 180.0))
(setq ssa (ssadd en ssa))))
(if ssa
(progn
(vl-load-com)
(setq entlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssa))))
(foreach ent entlst
(vla-put-Radius (vlax-ename->vla-object ent) 10.0))))))
(princ))

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


#38 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 27 December 2011 - 06:27 AM


(defun c:artt(/ ss ssa dxf i en)
(defun dxf (code e)
(cdr (assoc code (entget e))))
(if (setq ss (ssget '((0 . "ARC") (-4 . "<") (40 . 15))))
(progn
(setq ssa (ssadd) i -1)
(while (setq en (ssname ss (setq i (1+ i))))
(if (< (setq ang (abs (- (dxf 50 en) (dxf 51 en)))) (/ (* 85 pi) 180.0))
(setq ssa (ssadd en ssa))))
(if ssa
(progn
(vl-load-com)
(setq entlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssa))))
(foreach ent entlst
(vla-put-Radius (vlax-ename->vla-object ent) 10.0))))))
(princ))

Nếu đã duyệt qua từng ARC rồi thì không nên dùng thêm vòng lặp Foreach đâu bạn, chỉ mỗi vòng While là đủ rồi, biến ssa cũng không cần luôn
- Khi đã (setq ssa (ssadd)) thì (type ssa) -> PICKSET rồi nên dòng (if ssa (progn là thừa , không cần phải kiểm tra ssa đâu bạn, biến ssa đã khai báo trên rồi.
(setq entlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssa)))) -> sẽ trở về NIL nếu không có en nào nằm trong ssa cả. Cái này mình biết bạn hay mắc lỗi nên cái bệnh nghề nghiệp thì nó thế hề hề
Hơn nữa, mình đã kiểm tra ss rồi nên việc kiểm tra ssa nữa thì việc đó không cần thiết


(vl-load-com)
(defun c:artt(/ ss dxf i en)
(defun dxf (code e) (cdr (assoc code (entget e))))
(if (setq ss (ssget '((0 . "ARC") (-4 . "<") (40 . 15))))
(progn
(setq i -1)
(while (setq en (ssname ss (setq i (1+ i))))
(if (< (abs (- (dxf 50 en) (dxf 51 en))) (/ (* 85 pi) 180.0))
(vla-put-Radius (vlax-ename->vla-object en) 10.0)))))
(princ))

  • 0

#39 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 27 December 2011 - 06:47 AM

Bệnh ở đây là viết nhanh theo kiểu nối đuôi vào cái có sẵn của bác.
  • 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.


#40 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 27 December 2011 - 06:57 AM

Bệnh ở đây là viết nhanh theo kiểu nối đuôi vào cái có sẵn của bác.

Ồ! Có thể sửa lại code của Tue_NV mà. Tue_NV không ngại khi bạn sửa code của mình mà giúp cho người khác đâu. Giúp được ai là quý hóa lắm rồi.
Cái mình đang nói tới là biến ssa mà bạn đang dùng làm điều kiện logic cho hàm If ấy có thể bỏ đi ấy mà.
  • 0