Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
- - - - -

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


  • Please log in to reply
15 replies to this topic

#1 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 28 July 2017 - 10:23 AM

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.c...is_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!

 


  • 0

#2 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 28 July 2017 - 03:06 PM

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.c...s.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.c...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:


  • 0

#3 Bee

Bee

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 367 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 28 July 2017 - 03:57 PM

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.c...s.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.c...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)
  )

  • 0

#4 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 28 July 2017 - 04:31 PM

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?


  • 0

#5 Bee

Bee

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 367 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 28 July 2017 - 04:50 PM

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 đó. ^_^


  • 0

#6 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 30 July 2017 - 10:46 PM

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


  • 0

#7 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 02 August 2017 - 03:24 PM

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?


  • 0

#8 Bee

Bee

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 367 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 02 August 2017 - 04:59 PM

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


  • 0

#9 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 03 August 2017 - 09:48 AM

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?


  • 0

#10 Bee

Bee

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 367 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 03 August 2017 - 09:57 AM

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 ^_^


  • 0

#11 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 03 August 2017 - 12:23 PM

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.c...99_frames_1.dwg


  • -1

#12 Bee

Bee

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 367 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 03 August 2017 - 07:48 PM

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.c...99_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

  • 0

#13 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 04 August 2017 - 02:01 PM

 

Để 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) ạ

 


  • 0

#14 Bee

Bee

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 367 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 04 August 2017 - 04:58 PM

 

 

Để 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


  • 0

#15 saycaphe

saycaphe

    biết vẽ arc

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

Đã gửi 08 August 2017 - 09:03 AM

 

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:


  • 0

#16 Bee

Bee

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 367 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 08 August 2017 - 11:42 AM

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

^_^


  • 0