Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
13 replies to this topic

#1 traichoi85

traichoi85

    biết vẽ circle

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

Đã gửi 22 October 2014 - 04:37 PM

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


  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 October 2014 - 05:04 PM

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


  • 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


#3 traichoi85

traichoi85

    biết vẽ circle

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

Đã gửi 23 October 2014 - 10:18 AM

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.mediafir...0y3zy179d6bw127

 


  • 0

#4 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 October 2014 - 11:20 AM

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

  • 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


#5 traichoi85

traichoi85

    biết vẽ circle

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

Đã gửi 25 October 2014 - 08:59 AM

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.mediafir...mchpj3e8rthxobn


  • 0

#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 25 October 2014 - 09:24 AM

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 ?


  • 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


#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 25 October 2014 - 09:47 AM

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.


  • 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


#8 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 25 October 2014 - 10:10 AM

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

  • 1

#9 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 25 October 2014 - 06:27 PM

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 :)
  • 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 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 25 October 2014 - 07:01 PM

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

#11 traichoi85

traichoi85

    biết vẽ circle

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

Đã gửi 27 October 2014 - 09:57 AM

cám ơn bạn "ketxu" và bạn "tot77" đã giúp mình li sp theo yêu cầu


  • 0

#12 peiruan88

peiruan88

    Chưa sử dụng CAD

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

Đã gửi 27 October 2014 - 10:27 AM

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


  • 0

#13 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 October 2014 - 10:30 AM

Mở file lisp ra. Xem cái đoạn nào có dạng (defun C:XYZ(...) thì bạn sửa chữ XYZ lại tùy thích.


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


#14 HUNGMETRO

HUNGMETRO

    biết vẽ line

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

Đã gửi 15 October 2015 - 02:17 PM

 

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


  • 0