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  
saycaphe

[Nhờ Giúp Đỡ] Lisp Tự Mirror, Sau Đó Join Các Đường Đã Mirror

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

Các bác ơi.

Em có vấn đề thế này.

em có các polyline, nó cắt nhau, và khoảng cách giữa các polyline tương đối nhỏ.

Em đang tìm cách, đối với mỗi polyline, sẽ mirror qua trục Y, sau đó join 2 polyline đó thành 1( đối tượng đc chọn và đối tượng sau khi mirror).

http://www.cadviet.com/upfiles/7/12799_mirror_y_axis_and_join.dwg

 

Bản vẽ em gửi kèm. 

Các bác xem giúp em nhé.

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

Em mò trên mạng, ra cái Polylines Program của Lee-Mac, nhưng cái này khi mình mirror tất cả, rồi join, thì với các đường giao nhau, nó sẽ join loạn lên, không join chuẩn các đường đối xứng qua trục Y như em cần.

http://www.lee-mac.com/polylineprograms.html#polyjoin

 

em mò theo kiểu thủ công như cái này, thì lượng polyline bị xót rất nhiều, vì nhiều poliline quá gần nhau, nên chọn không chuẩn :wacko: .

http://www.cadviet.com/upfiles/7/12799_123.lsp

 

Làm sao để mình chọn tất cả objects, rồi nó tự chạy lisp theo kiểu one by one đc các bác ơi  :blush:

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

Em mò trên mạng, ra cái Polylines Program của Lee-Mac, nhưng cái này khi mình mirror tất cả, rồi join, thì với các đường giao nhau, nó sẽ join loạn lên, không join chuẩn các đường đối xứng qua trục Y như em cần.

http://www.lee-mac.com/polylineprograms.html#polyjoin

 

em mò theo kiểu thủ công như cái này, thì lượng polyline bị xót rất nhiều, vì nhiều poliline quá gần nhau, nên chọn không chuẩn :wacko: .

http://www.cadviet.com/upfiles/7/12799_123.lsp

 

Làm sao để mình chọn tất cả objects, rồi nó tự chạy lisp theo kiểu one by one đc các bác ơi  :blush:

Quả Lisp thô sơ này chắc chạy ngon. Nhớ move chuẩn trục Y ở 0.0 nhé. ^_^

(defun c:test (/ ss n ss1)
  (setq ss (ssget))
  (setq n 0)
  (setq ss1 (ssadd))
  (repeat (sslength ss)
    (setq ss1 (ssadd (ssname ss n) ss1))    
    (command "mirror" ss1 "" "0,0" "0,1" "N" "")
    (setq ss1 (ssadd (entlast) ss1))
    (command ".PEDIT" "m" ss1 "" "j" "0.025" "" )
    (setq ss1 (ssadd))
    (setq n (1+ n))
    )
  (princ)
  )

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

Tuyệt vời ông mặt zời bác ơi :wub: .

Cảm ơn bác nhiều lắm hehe.

Còn 1 cái nữa, em cũng đang tìm hiểu, mà chưa biết làm sao.

Sau khi mirror và nối xong rồi. Khi đưa và 3D, đưa nó vào mặt Front, làm sao để chọn 1 đường làm gốc, rồi sau đó move các đường ngay phía sau, mỗi đường cách nhau 1 khoảng 1m chẳng hạn hả 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

Tuyệt vời ông mặt zời bác ơi :wub: .

Cảm ơn bác nhiều lắm hehe.

Còn 1 cái nữa, em cũng đang tìm hiểu, mà chưa biết làm sao.

Sau khi mirror và nối xong rồi. Khi đưa và 3D, đưa nó vào mặt Front, làm sao để chọn 1 đường làm gốc, rồi sau đó move các đường ngay phía sau, mỗi đường cách nhau 1 khoảng 1m chẳng hạn hả bác?

Cái này cũng đơn giản. Select những thằng pline cần move đi rôi dùng lệnh  move đi 1 khoảng d nà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

move từng polyline hay move được tất cả các polyline, từng cái 1 , cái gần gốc trước, cái xa gốc thì move sau hả bác? 

có cách nào move từng cái, theo thứ tự cách xa dần gốc tọa độ không bác? :D

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ái này cũng đơn giản. Select những thằng pline cần move đi rôi dùng lệnh  move đi 1 khoảng d nào đó. ^_^

 

Bác ơi.

Sao khi chạy lisp, nó Mirror, rồi join các đường màu đỏ trước, rồi đến màu xanh nhỉ.

Cũng không sao, nhưng khi em chạy list move các đường đã join, theo trục vuông góc, để mỗi đường cách nhau 1 khoảng 500, thì nó cũng move màu đỏ trước, rồi mới move màu xanh. 

Như vậy thứ tự và khoảng cách bị sai.

Làm sao để move theo đúng thứ tự, từ gần tới xa trục hả 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

Bác ơi.

Sao khi chạy lisp, nó Mirror, rồi join các đường màu đỏ trước, rồi đến màu xanh nhỉ.

Cũng không sao, nhưng khi em chạy list move các đường đã join, theo trục vuông góc, để mỗi đường cách nhau 1 khoảng 500, thì nó cũng move màu đỏ trước, rồi mới move màu xanh. 

Như vậy thứ tự và khoảng cách bị sai.

Làm sao để move theo đúng thứ tự, từ gần tới xa trục hả bác?

Cái này khoai. Đặt cho nó một quy luật nào đấy chẳng hạ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

Cái này khoai. Đặt cho nó một quy luật nào đấy chẳng hạn. ^_^

Nhưng mà theo cái lisp của bác, nó căn cứ vào cái gì, để nó mirror and join các đường màu đỏ trước, rồi lại màu xanh hả bác?

Em đã thay hết thành màu đỏ thì nó cũng theo thứ tự tương tự :mellow: .

Chẳng hạn mình dùng 1 đường vuông góc trục Y, cắt các đường polyline. 

Rồi sau đó mình dùng khoản cách từ các giao điểm, đến trục Y để xác định thứ tự thực hiện lệnh, như vậy có được không hả 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

Nhưng mà theo cái lisp của bác, nó căn cứ vào cái gì, để nó mirror and join các đường màu đỏ trước, rồi lại màu xanh hả bác?

Em đã thay hết thành màu đỏ thì nó cũng theo thứ tự tương tự :mellow: .

Chẳng hạn mình dùng 1 đường vuông góc trục Y, cắt các đường polyline. 

Rồi sau đó mình dùng khoản cách từ các giao điểm, đến trục Y để xác định thứ tự thực hiện lệnh, như vậy có được không hả bác?

Lisp mirror và join thì ko cần thứ tự gì mà nó auto theo select object.

 

Nếu dùng 1 đường // trục X cắt các đường để sắp theo thứ tự tọa độ X từ nhỏ đến lớn cũng đượ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

Lisp mirror và join thì ko cần thứ tự gì mà nó auto theo select object.

 

Nếu dùng 1 đường // trục X cắt các đường để sắp theo thứ tự tọa độ X từ nhỏ đến lớn cũng được ^_^

Bác ơi cái file của em đây, làm như nào hả bác?

 

Các frames nẳm trên mặt x0z, giờ move từng Frame (từ trong ra ngoài ) theo trục y, , mỗi đường cách nhau 500, thì làm như nào hả bác?

 

http://www.cadviet.com/upfiles/7/12799_frames_1.dwg

  • Vote giảm 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

Bác ơi cái file của em đây, làm như nào hả bác?

 

Các frames nẳm trên mặt x0z, giờ move từng Frame (từ trong ra ngoài ) theo trục y, , mỗi đường cách nhau 500, thì làm như nào hả bác?

 

http://www.cadviet.com/upfiles/7/12799_frames_1.dwg

Để nguyên Pline sau khi join trên mặt phẳng XoY. Chạy lisp mới chọn những pline trước sau đó chọn Line // trục X với điểm bắt đầu từ trục Y trở đi để tính 1 điểm cắt với pline thôi nhé. Sau khi move hết theo trục Z xuống cách 1 khoảng 500 thì xoay toàn bộ đối tượng sau nhé. Chúc ngon miệng ^_^

moveandjoin1.png

(defun LM:intersections	(ob1 ob2 mod / lst rtn)
  (if (and (vlax-method-applicable-p ob1 'intersectwith)
	   (vlax-method-applicable-p ob2 'intersectwith)
	   (setq lst (vlax-invoke ob1 'intersectwith ob2 mod))
      )
    (repeat (/ (length lst) 3)
      (setq rtn	(cons (list (car lst) (cadr lst) (caddr lst)) rtn)
	    lst	(cdddr lst)
      )
    )
  )
  (reverse rtn)
)
(vl-load-com)

(defun c:test2 ()
  (setq osm (getvar "osmode"))
  (setvar "osmode" 0)
  (command "undo" "be")
  (princ "\nChon doi tuong: ")
  (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (if (setq line_X (car (entsel "\nChon doan thang // X: ")))
	(progn
	  (setq	lst_e (vl-remove-if
			'listp
			(mapcar 'cadr (ssnamex ss))
		      )
	  )
	  (setq lst_pt nil)
	  (foreach e lst_e
	    (setq pt (LM:intersections
		       (vlax-ename->vla-object e)
		       (vlax-ename->vla-object line_X)
		       acextendnone
		     )
	    )
	    (setq lst_pt (cons (cons e (car pt)) lst_pt))
	  )
	  (vl-sort lst_pt '(lambda (e1 e2) (< (cadr e1) (cadr e2)))) ;
	  (setq n 500)
	  (foreach pl (cdr lst_pt)
	    (command "move"
		     (car pl)
		     ""
		     "0,0,0"
		     (strcat "0,0,-" (rtos n 2 0))
	    )
	    (setq n (+ n 500))
	  )
	)				;progn line_X
	(princ "\nBan da khong chon doan thang // X.")
      )					;if
    )					;progn ss
    (princ "\nBan da khong chon doi tuong.")
  )					;if

  (command "undo" "end")
  (setvar "osmode" osm)
  (princ)
)					;defun

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

 

Để nguyên Pline sau khi join trên mặt phẳng XoY. Chạy lisp mới chọn những pline trước sau đó chọn Line // trục X với điểm bắt đầu từ trục Y trở đi để tính 1 điểm cắt với pline thôi nhé. Sau khi move hết theo trục Z xuống cách 1 khoảng 500 thì xoay toàn bộ đối tượng sau nhé. Chúc ngon miệng ^_^

moveandjoin1.png

(defun LM:intersections	(ob1 ob2 mod / lst rtn)
  (if (and (vlax-method-applicable-p ob1 'intersectwith)
	   (vlax-method-applicable-p ob2 'intersectwith)
	   (setq lst (vlax-invoke ob1 'intersectwith ob2 mod))
      )
    (repeat (/ (length lst) 3)
      (setq rtn	(cons (list (car lst) (cadr lst) (caddr lst)) rtn)
	    lst	(cdddr lst)
      )
    )
  )
  (reverse rtn)
)
(vl-load-com)

(defun c:test2 ()
  (setq osm (getvar "osmode"))
  (setvar "osmode" 0)
  (command "undo" "be")
  (princ "\nChon doi tuong: ")
  (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (if (setq line_X (car (entsel "\nChon doan thang // X: ")))
	(progn
	  (setq	lst_e (vl-remove-if
			'listp
			(mapcar 'cadr (ssnamex ss))
		      )
	  )
	  (setq lst_pt nil)
	  (foreach e lst_e
	    (setq pt (LM:intersections
		       (vlax-ename->vla-object e)
		       (vlax-ename->vla-object line_X)
		       acextendnone
		     )
	    )
	    (setq lst_pt (cons (cons e (car pt)) lst_pt))
	  )
	  (vl-sort lst_pt '(lambda (e1 e2) (< (cadr e1) (cadr e2)))) ;
	  (setq n 500)
	  (foreach pl (cdr lst_pt)
	    (command "move"
		     (car pl)
		     ""
		     "0,0,0"
		     (strcat "0,0,-" (rtos n 2 0))
	    )
	    (setq n (+ n 500))
	  )
	)				;progn line_X
	(princ "\nBan da khong chon doan thang // X.")
      )					;if
    )					;progn ss
    (princ "\nBan da khong chon doi tuong.")
  )					;if

  (command "undo" "end")
  (setvar "osmode" osm)
  (princ)
)					;defun

Đại ca ơi.

ý em là move từng đường 1,không kể màu, vì thực thế cứ 4 đường màu đỏ, đến 1 đường màu xanh, đấy chỉ là hình thức đánh dấu thôi, chứ ý em không phải là move màu đỏ xong, rồi move màu xanh. 

Thay đổi thế nào để move theo độ tăng lên củatọa độ giao điểm của đường được chọn với các polylines.

 

Làm sao để chọn khoảng cách move đường trong mặt x0y theo 0z (hiện tại đang là 500) ạ

 

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

 

 

Để nguyên Pline sau khi join trên mặt phẳng XoY. Chạy lisp mới chọn những pline trước sau đó chọn Line // trục X với điểm bắt đầu từ trục Y trở đi để tính 1 điểm cắt với pline thôi nhé. Sau khi move hết theo trục Z xuống cách 1 khoảng 500 thì xoay toàn bộ đối tượng sau nhé. Chúc ngon miệng ^_^

moveandjoin1.png

(defun LM:intersections	(ob1 ob2 mod / lst rtn)
  (if (and (vlax-method-applicable-p ob1 'intersectwith)
	   (vlax-method-applicable-p ob2 'intersectwith)
	   (setq lst (vlax-invoke ob1 'intersectwith ob2 mod))
      )
    (repeat (/ (length lst) 3)
      (setq rtn	(cons (list (car lst) (cadr lst) (caddr lst)) rtn)
	    lst	(cdddr lst)
      )
    )
  )
  (reverse rtn)
)
(vl-load-com)

(defun c:test2 ()
  (setq osm (getvar "osmode"))
  (setvar "osmode" 0)
  (command "undo" "be")
  (princ "\nChon doi tuong: ")
  (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (if (setq line_X (car (entsel "\nChon doan thang // X: ")))
	(progn
	  (setq	lst_e (vl-remove-if
			'listp
			(mapcar 'cadr (ssnamex ss))
		      )
	  )
	  (setq lst_pt nil)
	  (foreach e lst_e
	    (setq pt (LM:intersections
		       (vlax-ename->vla-object e)
		       (vlax-ename->vla-object line_X)
		       acextendnone
		     )
	    )
	    (setq lst_pt (cons (cons e (car pt)) lst_pt))
	  )
	  (vl-sort lst_pt '(lambda (e1 e2) (< (cadr e1) (cadr e2)))) ;
	  (setq n 500)
	  (foreach pl (cdr lst_pt)
	    (command "move"
		     (car pl)
		     ""
		     "0,0,0"
		     (strcat "0,0,-" (rtos n 2 0))
	    )
	    (setq n (+ n 500))
	  )
	)				;progn line_X
	(princ "\nBan da khong chon doan thang // X.")
      )					;if
    )					;progn ss
    (princ "\nBan da khong chon doi tuong.")
  )					;if

  (command "undo" "end")
  (setvar "osmode" osm)
  (princ)
)					;defun

Đại ca ơi.

ý em là move từng đường 1,không kể màu, vì thực thế cứ 4 đường màu đỏ, đến 1 đường màu xanh, đấy chỉ là hình thức đánh dấu thôi, chứ ý em không phải là move màu đỏ xong, rồi move màu xanh. 

Thay đổi thế nào để move theo độ tăng lên củatọa độ giao điểm của đường được chọn với các polylines.

 

Làm sao để chọn khoảng cách move đường trong mặt x0y theo 0z (hiện tại đang là 500) ạ

 

 

Thay dòng này sẽ move theo thứ tự

(setq lst_pt(vl-sort lst_pt '(lambda (e1 e2) (< (cadr e1) (cadr e2)))))

Muốn nhập khoảng cách thì phải thêm dòng nhắc nhập thôi. ^_^

Untitled978d9.png

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

 

Quả Lisp thô sơ này chắc chạy ngon. Nhớ move chuẩn trục Y ở 0.0 nhé. ^_^

(defun c:test (/ ss n ss1)
  (setq ss (ssget))
  (setq n 0)
  (setq ss1 (ssadd))
  (repeat (sslength ss)
    (setq ss1 (ssadd (ssname ss n) ss1))    
    (command "mirror" ss1 "" "0,0" "0,1" "N" "")
    (setq ss1 (ssadd (entlast) ss1))
    (command ".PEDIT" "m" ss1 "" "j" "0.025" "" )
    (setq ss1 (ssadd))
    (setq n (1+ n))
    )
  (princ)
  )

Bác ơi.

Lisp này, chẳng hạn mình muốn chạy lệnh qua 1 đường tự chọn(điểm đầu, điểm cuối) chứ không mặc định qua trục,thì làm sao bác.

Em thêm cái đoạn đánh dấu đỏ, mà nó chỉ mirror 1 đường, không join, rồi dừng lại.

 

(defun c:minj (/ ss n ss1)

(setq ss (ssget))

(setq n 0)

(setq ss1 (ssadd))

(setq stap (getpoint "\nStart point of Mirror line (line may intersect every polyline only once!): "))

(setq endp (getpoint stap "\nEnd point of Mirror line: "))

(repeat (sslength ss)

(setq ss1 (ssadd (ssname ss n) ss1))

(command "mirror" ss1 "" "stap" "endp" "N" "")

(setq ss1 (ssadd (entlast) ss1))

(command ".PEDIT" "m" ss1 "" "j" "0.025" "" )

(setq ss1 (ssadd))

(setq n (1+ n))

)

(princ)

)

 

Bác xem giúp em với.

Thanks :blush:

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

Bác ơi.

Lisp này, chẳng hạn mình muốn chạy lệnh qua 1 đường tự chọn(điểm đầu, điểm cuối) chứ không mặc định qua trục,thì làm sao bác.

Em thêm cái đoạn đánh dấu đỏ, mà nó chỉ mirror 1 đường, không join, rồi dừng lại.

 

(defun c:minj (/ ss n ss1)

(setq ss (ssget))

(setq n 0)

(setq ss1 (ssadd))

(setq stap (getpoint "\nStart point of Mirror line (line may intersect every polyline only once!): "))

(setq endp (getpoint stap "\nEnd point of Mirror line: "))

(repeat (sslength ss)

(setq ss1 (ssadd (ssname ss n) ss1))

(command "mirror" ss1 "" "stap" "endp" "N" "")

(setq ss1 (ssadd (entlast) ss1))

(command ".PEDIT" "m" ss1 "" "j" "0.025" "" )

(setq ss1 (ssadd))

(setq n (1+ n))

)

(princ)

)

 

Bác xem giúp em với.

Thanks :blush:

Stap và endp là biến nên để trong câu lệnh ko có dấu ngoặc kép.

thay dòng này vào là ok: (command "mirror" ss1 "" "_none" stap "_none" endp "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  

×