Đến nội dung


Hình ảnh
- - - - -

Nhờ hoàn thiện lisp xóa đối tượng trong miền kín !


  • Please log in to reply
12 replies to this topic

#1 leejang

leejang

    biết lệnh move

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

Đã gửi 02 May 2011 - 06:23 AM

Em tải trên diễn đàn được cái lisp xóa tất cả các đối tượng trong hoặc ngoài 1 miền kín. Nhưng khi mình chạy với 1 bản vẽ mới, có ít đối tượng thì nó chạy ok ! Khi chạy với 1 bản vẽ bình đồ, có nhiều đối tượng thì nó báo lỗi như sau :
Command:ewb
Ban muon xoa Trong hay Ngoai duong bao <T/N>: t
error: too few arguments

Đây là Code


;;;;===========================
(defun C:EWB ( / en ss lst ssall bbox bit) ;EWB -> Erasre With Boudary
(vl-load-com)
(if (and (setq en (car(entsel "\n Chon duong bao : ")))
(wcmatch (cdr(assoc 0 (entget en))) "*POLYLINE"))
(progn
(setq bbox (ACET-ENT-GEOMEXTENTS en))
(setq bbox (mapcar '(lambda(x)(trans x 0 1)) bbox))
(setq lst (ACET-GEOM-OBJECT-POINT-LIST en 1e-3))
(ACET-SS-ZOOM-EXTENTS (ACET-LIST-TO-SS (list en)))
(command "_.Zoom" "0.95x")
(if (null etrim)(load "extrim.lsp"))
(initget "T N")
(setq bit (getkword "\nBan muon xoa Trong hay Ngoai duong bao <T/N>: " ) )
(if (= bit "T") ;xoa Trong duong bao
(progn
(etrim en (polar (GetInside en) (- ang) 10) )
(if (setq ss (ssget "_CP" lst))
(progn
(if (ssmemb en ss) (ssdel en ss))
(ACET-SS-ENTDEL ss)
)
)
)
(progn ;(= bit "N") ;xoa Ngoai duong bao
(progn
(etrim en (GetInside en))
(if (and
(setq ss (ssget "_CP" lst))
(setq ssall (ssget "_X" (list (assoc 410 (entget en)))))
)
(progn
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(foreach e1 lst (ssdel e1 ssall))
(if (ssmemb en ssall) (ssdel en ssall))
(ACET-SS-ENTDEL ssall)
)
)
)
);cond
)
)
)
)

(defun GetInside(cEnt / param Flag pt)
(setq param (vlax-curve-getStartParam cEnt)
Flag nil
)
(while (and (not Flag) (< param (vlax-curve-getEndParam cEnt)) )
(setq pt (vlax-curve-getPointAtParam cEnt param)
ang (- (angle '(0 0 0) (vlax-curve-getFirstDeriv cEnt param)) (/ pi 2)) )
(cond
((insidep (polar pt ang 10) cEnt) (setq Flag T) )
((insidep (polar pt ang -10) cEnt) (setq Flag T) )
)
(setq param (+ param 0.1) )
)
pt
)
;; Copyright © 2009, Lee McDonnell
;; (Contact Lee Mac, CADTutor.net)
(defun insidep (pt Obj / Obj Tol ang doc spc flag int lin xV yV)
(defun vlax-list->3D-point (lst flag)
(if lst
(cons ((if flag car cadr) lst)
(vlax-list->3D-point (cdddr lst) flag))))
(or (eq 'VLA-OBJECT (type Obj))
(setq Obj (vlax-ename->vla-object Obj)))
(setq Tol (/ pi 6) ; Uncertainty
ang 0.0 flag T)
(setq doc (vla-get-ActiveDocument (vlax-get-Acad-Object))
spc (if (zerop (vla-get-activespace doc))
(if (= (vla-get-mspace doc) :vlax-true)
(vla-get-modelspace doc)
(vla-get-paperspace doc))
(vla-get-modelspace doc)))
(while (and (< ang (* 2 pi)) flag)
(setq flag (and
(setq int
(vlax-invoke
(setq lin
(vla-addLine spc
(vlax-3D-point pt)
(vlax-3D-point
(polar pt ang
(if (vlax-property-available-p Obj 'length)
(vla-get-length Obj) 1.0)))))
'IntersectWith Obj
acExtendThisEntity))
(<= 6 (length int))
(setq xV (vl-sort (vlax-list->3D-point int T) '<)
yV (vl-sort (vlax-list->3D-point int nil) '<))
(or (<= (car xV) (car pt) (last xV))
(<= (car yV) (cadr pt) (last yV))))
ang (+ ang Tol))
(vla-delete lin))
flag
T
)



Và em muốn rằng lisp có thể xóa được tất cả mọi loại đối tượng trong hoặc ngoài vùng đó. Kể cả đối tượng Proxy
Đây là file mà khi chạy bị lỗi :
http://www.mediafire...hj7trsoxckx17d1
  • 0

#2 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 02 May 2011 - 08:09 AM

Em tải trên diễn đàn được cái lisp xóa tất cả các đối tượng trong hoặc ngoài 1 miền kín. Nhưng khi mình chạy với 1 bản vẽ mới, có ít đối tượng thì nó chạy ok ! Khi chạy với 1 bản vẽ bình đồ, có nhiều đối tượng thì nó báo lỗi như sau :

Có thể bạn down về nhưng bị lỗi. Bạn down lại cái này xem sao nhé. Chúc bạn ngày nghỉ vui vẻ
http://www.4shared.c...WithBoudar.html
  • 1



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#3 leejang

leejang

    biết lệnh move

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

Đã gửi 02 May 2011 - 12:53 PM

Có thể bạn down về nhưng bị lỗi. Bạn down lại cái này xem sao nhé. Chúc bạn ngày nghỉ vui vẻ
http://www.4shared.c...WithBoudar.html

Đúng là e tải về bị lỗi thật. Cảm ơn bác nhiều. Lisp này rất hay !
  • 0

#4 duyngoc

duyngoc

    biết vẽ pline

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

Đã gửi 25 October 2011 - 03:44 PM

cho mình hỏi tý,sao mình vẽ một hình kín sau đó dùng lisp rồi chọn xóa các đối tượng bên trong có lúc nó xóa đúng,có lúc nó xóa cả bên ngoài,mong các cao thủ giúp đỡ
  • 0

#5 hotanphi

hotanphi

    biết vẽ polygon

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

Đã gửi 03 June 2012 - 07:37 AM

Xin chào mọi người
Mình có tìm được lisp này trên diễn đàn nhưng khi xóa đối tượng thì nó xóa luôn cả bên ngoài trong khi mình chỉ chọn xóa trong.
Mong anh em chỉnh sửa giúp mình
  • 0

#6 hotanphi

hotanphi

    biết vẽ polygon

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

Đã gửi 03 June 2012 - 07:44 AM

Đây là ví dụ xóa bị lỗi. Khi ta chọn xóa trong nhưng lại xóa luôn cả bên ngoài nữa
http://www.cadviet.c...04866_vi_du.dwg
Đây là lisp em load được trên diễn đàn
http://www.cadviet.c...withboudary.lsp
  • 1

#7 hotanphi

hotanphi

    biết vẽ polygon

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

Đã gửi 03 June 2012 - 08:56 PM

Sao không thấy bác Bach hay bac Thiep vao giúp đỡ hết vậy.
Rất mong nhờ các anh trong diễn đàn giúp đỡ.
Em xin cảm ơn
  • 0

#8 mathan

mathan

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 03 June 2012 - 09:17 PM

Mãn phép bạn một chút
File cad của bạn, các đường pline hoặc line đi cắt qua cả trong và ngoài đường tròn thì tất nhiên LISP sẽ xóa đi cũng dễ hiểu thôi
Nếu bạn mong muốn nó vừa xóa, vừa TRIM cho đúng mép đường bao thì lại là vấn đề khác không dùng LISP này được nữa
Mỗi LISP thực hiện một việc khác nhau, nên tìm hiểu kỹ, chứ k phải là LISP sai đâu bạn nhé
Mình dùng LISP đó nhiều rồi, cũng thấy ngon lắm
  • 0
-----------
Hình đã gửi Hãy chia sẻ để thấy có được nhiều hơn điều mình muốn!
Best regard,

#9 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 03 June 2012 - 09:59 PM

Dùng extrim bên trong trước khi dùng lisp xóa bên trong
  • 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


#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 June 2012 - 10:12 PM

Lệnh Extrim này lùng bùng lắm. Nhiều khi nó chạy như... say rượu ấy.
Tôi đã thử với rất nhiều lisp xoá đối tượng trong vùng, giữa 2 vùng, ngoài vùng, kể cả extrim, nhưng đều không cho kết quả mong muốn. Hình đơn giản và ít đối tượng thì ok nhưng nhiều là loạn ngay.
  • 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 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 04 June 2012 - 07:26 AM

Đây là ví dụ xóa bị lỗi. Khi ta chọn xóa trong nhưng lại xóa luôn cả bên ngoài nữa
http://www.cadviet.c...04866_vi_du.dwg
Đây là lisp em load được trên diễn đàn
http://www.cadviet.c...withboudary.lsp

Lisp này chỉ chạy đúng với các đối tựong đồng phẳng thôi.
Với các đối tuợng có cao độ khác nhau trong file cad của bạn, kết quả như bạn đã thấy ...
  • 0

#12 hotanphi

hotanphi

    biết vẽ polygon

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

Đã gửi 04 June 2012 - 08:23 AM

Vậy anh cho em hỏi a có lisp nào để thực hiện công việc này không anh
Nếu có anh giúp em với.
Em xin chân thành cảm ơn anh.
Chúc anh và mọi người sức khỏe
  • 0

#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 June 2012 - 08:52 AM

Tôi đã nói ở trên rồi: các lisp về xoá đối tượng trong/giữa/ngoài vùng mà tôi được biết (của nước ngoài nước trong đều có) đều không cho kết quả mong muốn nếu số đối tượng lớn, nhiều kiểu đối tượng... Nó chỉ ok khi bản vẽ đơn giản thôi. Với bản vẽ của bạn thì ngay cả khi đã flatten cho nó đồng phẳng rồi thì nó vẫn xoá hết sức bậy bạ (bác Gia_Bach nói nhưng chắc chưa test đấy thôi).
Lệnh Extrim cũng không đáng tin.
Bạn thử cách này xem: chia vùng cần xoá thành từng vùng nhỏ, rồi xoá từ từ (nhớ zoom đủ lớn), xem liệu có được không? Còn không được nữa thì tôi cũng bó tay.
  • 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.