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  
traichoi85

offset cùng 1 lúc nhiều đối tượng "về 1 phía"

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

traichoi85    1

chào cả nhà. 


mặc dù chủ đề này mình có hỏi bên thớt " o ffset tự động" nhưng không ai trả lời nên em post lên đây để mọi người giúp đỡ


mình làm bên quy hoạch. muốn vẽ các ô phố thì mình offset từ vỉa hè ra ngoài. Nếu làm 4 hoặc 5 đối tượng thì được. gặp nhiều lô đất gần cả 100 đối tượng thì gặp khó khăn. nên em mong các bạn viết dùm mình 1 lisp để quét các đối tượng o ffset về 1 phía ( ra ngoài hoạch vô trong) theo khoảng cách tùy chon.


( các li sp của anh hạ và anh ketxu mình có thử nhưng không làm được)


4060_drawing2model.jpgám ơn các bạn nhiều


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
ketxu    2.653

Các đối tượng của bạn là loại gì ? Có đặc thù gì để quét chọn k lẫn các đối tượng khác ? "Ra ngoài" tức là làm cho nó to hơn, "vào trong" tức là nhỏ hơn đúng k ? Bạn gửi file CAD đầu vào đầu ra lên, chắc chắn sẽ có ngay đáp á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
traichoi85    1

trước hết mình xin cảm ơn bạn ketxu đã quan tâm đến câu hỏi của mình.

theo bạn góp ý mình đã làm chi tiết hơn.

và mình cũng xin nhờ các bạn giúp mình viết dum 2 li sp nữa ( xin lỗi vì yêu cầu có hơi cao quá. các bạn thông cảm làm thủ công mệt quá). mình xin các bạn giúp dùm các khoảng

1. o ffset nhiều đối tượng cùng 1 lúc

2. fillet cùng 1 lúc

3. champer cùng 1 lúc

mình xin cám ơn.

và đây là ví dụ của mình

hình mình họa:

4060_lam_nhieu_doi_tuong_cung_1_luc.jpg

 

 

và đây là file cad: https://www.mediafire.com/?0y3zy179d6bw127

 

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
ketxu    2.653

Quick code cho bạn 4 lisp o+, o-, mF, mC. Bạn test nếu thấy sai thì ấn F2 copy đoạn lỗi lên nhé. Mình chỉ kịp làm thế này thôi, phải đi rồi ^^

(vl-load-com)	
(defun ooo(f / ss isClosed)
(cond 
	(
		(ssget '((0 . "CIRCLE,ELLIPSE,POLYLINE,LWPOLYLINE,SPLINE")))
			(or #d (setq #d 5))
			(setq 	#d (cond ((getdist (strcat "\nDistance <" (rtos #d 2 2) ">")))(#d))
					isClosed 
					(lambda(x)
						(or  
							(and  (= (vla-get-ObjectName x) "AcDbEllipse")(zerop (vla-get-StartAngle x)))
							(= (vla-get-objectname x) "AcDbCircle")
							(and  	(wcmatch (vla-get-ObjectName x) "AcDb*line")
									(equal  (car (setq sth (acet-geom-vertex-list (vlax-vla-object->ename x))))
										(last sth)
										0.01
									)
							)
						)
					)
			)
			(vlax-for obj (setq ss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
				(if (isclosed obj)
					(vla-delete
						(f
						  (vl-sort
						   (mapcar 'car (list (vlax-invoke obj 'Offset #d)  (vlax-invoke obj 'Offset (- #d))))
						   '(lambda(x y)(< (vlax-get x 'Area)(vlax-get y 'Area)))
						  )
						)
					)
				 )
			)
			(vla-delete ss)
		)
		(T (princ "\nNo thing to do"))
)
)
(defun c:o-()(ooo last)) ;Offset thu nho
(defun c:o+()(ooo car))	;Offset phong to

(defun c:mF(/ ss);Multi Fillet
(cond ((setq ss (ssget '((0 . "LWPOLYLINE"))))
    (or #r (setq #r (getvar 'FILLETRAD)))
    (setq     #r (cond ((getdist (strcat "\nRadius : <" (rtos #r 2 2) ">")))(#r)))
    (setvar 'FILLETRAD #r)
    (foreach o (acet-ss-to-list ss)
        (vl-cmdf "._Fillet" "_Polyline" o)
    )
)))
(defun c:mC(/ ss);Multi chamfer
(cond ((setq ss (ssget '((0 . "LWPOLYLINE"))))
    (or #dis (setq #dis (getvar 'CHAMFERA)))
    (setq     #dis (cond ((getdist (strcat "\nDistance : <" (rtos #dis 2 2) ">")))(#dis)))
    (mapcar 'setvar '(CHAMFERA CHAMFERB) (list #dis #dis))
    (foreach o (acet-ss-to-list ss)
        (vl-cmdf "._Chamfer" "_Polyline" o)
    )
)))

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
traichoi85    1

Cám ơn bạn "ketxu" đã giúp mình nhiều. đúng là đã gỡ được rắc rối cho mình trong nhiều năm qua. nhưng trong lúc thao làm mình thấy còn 1 vấn không biết bạn giúp mình được không.

Đó là bạn giúp mình lúc o ffset đối tượng thì sẽ nhảy thành laye r hiện hành luôn hoặc 1 laye r này khác.

Bạn có thể giúp mình để khi mình bật tắt laye r  và fillet hoặc champer cho nó nhanh.

Mình cảm ơn bạn nhé

Đây là file ảnh

4060_hoi_lam_1_luc_nhieu_doi_tuong_lan_2

Đây là file cad: https://www.mediafire.com/?mchpj3e8rthxobn

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
ketxu    2.653

Bạn định chọn layer hiện hành hay layer nào khác bằng cách nào ? Chọn đối tượng mẫu, đánh tê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
ketxu    2.653

Chỉ là put layer đơn giản thôi n k kịp chờ bạn trả lời rồi. :) Hẹn bạn khi mình đi về (tối CN) hoặc mấy bác khác giúp 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
Tot77    501

Sửa chút xíu lsp của Ket, có 2 điều :

1. Pline không cần phải closed mới dùng được, nhưng dĩ nhiên pline phải có nhiều đoạn nó mới biết cái nào vào trong cái nào ra ngoài.

2. Gộp 2 lệnh o+o- vào chung 1 lệnh, bạn nhập số >0 thì offset ra ngoài, <0 thì offset vào trong.

Còn các lệnh chamfer và fillet vẫn như cũ.

 Bạn đặt sẵn layer hiện hành trước khi chạy lsp, màu theo bylayer.

 

(vl-load-com) 
(defun c:ofs( / ss lay lst)
  (setq lay (getvar 'clayer))
  (cond ((ssget '((0 . "CIRCLE,ELLIPSE,POLYLINE,LWPOLYLINE,SPLINE")))
(or #d (setq #d 5))
(setq #d (cond ((getdist (strcat "\nDistance <" (rtos #d 2 2) ">"))) (#d)))
(vlax-for obj (setq ss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
 (setq lst (mapcar 'car (list (vlax-invoke obj 'Offset #d)  (vlax-invoke obj 'Offset (- #d)))))
 (mapcar '(lambda (x) (vla-put-Layer x lay) (vla-put-Color x 256)) lst)
 (vla-delete (car (vl-sort lst
'(lambda(x y) ((if (< #d 0) > <) (vlax-get x 'Area) (vlax-get y 'Area))) ))
 )
)
(vla-delete ss)
)
(T (princ "\nNo thing to do"))
  )
)
  • 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
ketxu    2.653

Cám ơn tot77 tương trợ ^^

Ý 1 của tot77 cũng hơi chủ quan, pline 1000 phân đoạn thẳng nhau như kẻ thì cũng k có khái niệm to, bé hơn chứ đừng nói vào trong, ra ngoài :)

Vì pline luôn có thuộc tín diên tích nên theo logic chỉ cẩn kiểm tra tất cả đỉnh k thẳng hàng là được chứ k thể "nhiều đoạn là đc" đc.

4fun :)

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âc Ket lại bắt bẻ câu cú nữa rồi, nói như tren thì user phải tự hiểu là 2 đoạn k thẳng hàng, chứ nếu thg hàng hoăc dạng kín kiểu aba thì nó cũng offset thôi, nhưng chiều thì hên xui ráng mà chịu.

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

Hì, không liên quan lắm, em có mấy cái lisp trên diễn đàn, nhưng vì lệnh lisp mỗi người đặt một cách, em muốn đặt theo ý mình thì phải làm sao ah, mong mọi người chỉ giú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
HUNGMETRO    5

 

Sửa chút xíu lsp của Ket, có 2 điều :

1. Pline không cần phải closed mới dùng được, nhưng dĩ nhiên pline phải có nhiều đoạn nó mới biết cái nào vào trong cái nào ra ngoài.

2. Gộp 2 lệnh o+o- vào chung 1 lệnh, bạn nhập số >0 thì offset ra ngoài, <0 thì offset vào trong.

Còn các lệnh chamfer và fillet vẫn như cũ.

 Bạn đặt sẵn layer hiện hành trước khi chạy lsp, màu theo bylayer.

(vl-load-com) 
(defun c:ofs( / ss lay lst)
  (setq lay (getvar 'clayer))
  (cond ((ssget '((0 . "CIRCLE,ELLIPSE,POLYLINE,LWPOLYLINE,SPLINE")))
(or #d (setq #d 5))
(setq #d (cond ((getdist (strcat "\nDistance <" (rtos #d 2 2) ">"))) (#d)))
(vlax-for obj (setq ss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
 (setq lst (mapcar 'car (list (vlax-invoke obj 'Offset #d)  (vlax-invoke obj 'Offset (- #d)))))
 (mapcar '(lambda (x) (vla-put-Layer x lay) (vla-put-Color x 256)) lst)
 (vla-delete (car (vl-sort lst
'(lambda(x y) ((if (< #d 0) > <) (vlax-get x 'Area) (vlax-get y 'Area))) ))
 )
)
(vla-delete ss)
)
(T (princ "\nNo thing to do"))
  )
)

Cảm ơn bạn nhiêu nha đoạn lisp trên thật tuyệt đúng lúc minh cầ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  

×