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  
trungkien_hatangdothi

(Yêu cầu) Xin lisp làm 1 đường thẳng song song với 1 đường thẳng đã chọn

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

Mình muốn nhờ các bác viết giúp mình 1 cái lisp như sau ạ:

 

Mình có 1 đường thẳng (Pline. line, Le...) giờ mình muốn cho nó song song với 1 đường thẳng có sẵn, nếu dùng lệnh al thì khá lâu vì phải chọn điển trên mỗi đường thẳng, giờ mình muốn chỉ cần 2 bước:

- B1: Chọn đường thẳng cần xoay (đường thẳng đc tạo bởi lệnh pline, line và le (mũi tên)) => enter

(với các đường Pline, line và Le được tạo bởi chỉ 1 đoạn duy nhất thì gốc xoay là trung điểm của đường đó, nếu tạo bởi nhiều đoạn thì sẽ có tùy chọn yêu cầu chọn đoạn cần xoay trên đường đó (gốc xoay vẫn là trung điểm) hoặc chọn điểm gốc cần xoay cho cả đường gồm nhiều đoạn)

-B2: Chọn 2 điểm trên đường gốc mà mình muốn đường pline, Le song song với nó , 2 điểm này thể hiện hướng mà mình muốn đường pline xoay theo hướng đó (giống khi chọn text với torient) =>enter

 

(Hoặc ở bước 1 có thể ngắn gọn hơn là khi chon pline, line hay Le thì cái đoạn trên đường pline, line, le mà khi mình click chọn sẽ chính là đoạn cần xoay luôn ạ)

 

Lisp này hiểu đơn giản giống như lệnh torient dùng cho text đó ạ

 

Các bác viết giúp mình với, nếu lisp này đã có trên diễn đàn thì nhờ mod cho xin link và xóa giúp mình topic đi, thank mod và các bác trướ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
Doan Van Ha    2.678

Mình muốn nhờ các bác viết giúp mình 1 cái lisp như sau ạ:

 

Mình có 1 đường thẳng (Pline. line, Le...) giờ mình muốn cho nó song song với 1 đường thẳng có sẵn, nếu dùng lệnh al thì khá lâu vì phải chọn điển trên mỗi đường thẳng, giờ mình muốn chỉ cần 2 bước:

- Chọn đường thẳng cần xoay (đường thẳng đc tạo bởi lệnh pline, line và le (mũi tên)) => enter

- Chọn đường gốc mà mình muốn đường ở trên song song với nó =>enter

 

Các bác viết giúp mình với ạ, nếu lisp này đã có trên diễn đàn thì nhờ mod cho xin link và xóa giúp mình topic đi ạ, thank mod và các bác trước ạ

Hình như còn thiếu 1 giả thiết: điểm gốc cần xoay?

  • Vote tăng 2

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
dovananh.xd    25

Lisp này tương đương với xoay đối tượng bất kỳ song song với đường thẳng cho trước phải không nhỉ?

  • 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
Doan Van Ha    2.678

Lisp này tương đương với xoay đối tượng bất kỳ song song với đường thẳng cho trước phải không nhỉ?

Chắc là đúng ý chủ topic rồi. Mà nếu như vậy thì thằng rotate làm được, chả cần lisp.

  • 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

Hình như còn thiếu 1 giả thiết: điểm gốc cần xoay?

ko cần điểm gốc bạn ạ, chỉ cần chọn 2 đường thẳng và nó song song nhau là đc, mình chỉ cần đơn giản thôi vì đang cần có ngay mà

 

 

Lisp này tương đương với xoay đối tượng bất kỳ song song với đường thẳng cho trước phải không nhỉ?

Đúng rồi đó bạn, ở đây mình nêu đối tượng cụ thể là 1 đường line, pline và Le luôn.

 

Chắc là đúng ý chủ topic rồi. Mà nếu như vậy thì thằng rotate làm được, chả cần lisp.

 

Ở đây mình muốn dùng lisp để thao tác nhanh hơn dùng rotate bạn ạ, giống như lệnh "torient" với text vậy, lệnh này sẽ giống hệt "torient" làm thế sẽ nhanh và chính xác hơn "rotate"

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

:D

Bạn ơi

- Đã xoay đối tượng thì phải có điểm gốc - dù muốn hay không

- Pline và Le có thể chứa nhiều đoạn

- Torient lấy điểm quay là tâm *Text (MC)

- Càng cần có ngay thì càng phải minh họa kỹ

  • Vote tăng 2

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

biggrin.png

Bạn ơi

- Đã xoay đối tượng thì phải có điểm gốc - dù muốn hay không

- Pline và Le có thể chứa nhiều đoạn

- Torient lấy điểm quay là tâm *Text (MC)

- Càng cần có ngay thì càng phải minh họa kỹ

 

thank bác, e hiểu ý bác nói rồi.E vừa edit lại yêu cầu ở #1 rồi bác ạ, lúc đầu chưa viết rõ ràng lắm.

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
duy782006    1.374

Bác viết bài cũng nhiều rồi. "Pline và Le có thể chứa nhiều đoạn" thì bác làm nào. Ra đề bài phải nghĩ cách làm thủ công thì mọi người mới viết lisp dựa trên cái cách thủ công ấy.

  • 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

Bác viết bài cũng nhiều rồi. "Pline và Le có thể chứa nhiều đoạn" thì bác làm nào. Ra đề bài phải nghĩ cách làm thủ công thì mọi người mới viết lisp dựa trên cái cách thủ công ấy.

sorry mọi người, e đã edit lại chi tiết ở bài viết rôi , do vội quá nên viết chưa được rõ ràng, bác đọc lại #1 để làm giúp e nhé

 

thank các bác đã góp ý nhé, e viết chưa đc rõ ràng có gì các bác cứ gó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
ketxu    2.653

Quick code cho bạn :

(defun c:xoay(/ ST:Geom-Entity-Box-Fast mau Selset tmp)
(vl-load-com)
(defun ST:Geom-Entity-Box-Fast (vla-obj /   ll lr ur ul rt)  
(vla-getboundingbox vla-obj 'll 'ur)
(cons (mapcar '(lambda (x y) (* (+ x y) 0.5)) (setq ll (vlax-safearray->list ll))(setq ur (vlax-safearray->list ur))) (angle ll ur))
)
(if (and     (princ "\nChon doi tuong mau :")
  		 (setq mau (ST:Geom-Entity-Box-Fast (vlax-ename->vla-object (ssname (ssget ":S" (list (cons 0 "*LINE,LEADER"))) 0))))
  		 (princ "\nChon cac doi tuong can quay :")
  		 (ssget (list (cons 0 "*LINE,LEADER")))
  		 (setq SelSet (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
   )
   (vlax-for object Selset
  	 (vla-rotate object (vlax-3d-point (car (setq tmp (ST:Geom-Entity-Box-Fast object)))) (- (cdr mau)(cdr  tmp)))
   )
   (vla-delete Selset)
)
)

 

Nếu muốn dùng cho tất cả các đối tượng (k riêng gì Pline, Line, Leader thì bạn xóa tất cả dòng này trong lisp đi

(list (cons 0 "*LINE,LEADER"))

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

Quick code cho bạn :

(defun c:xoay(/ ST:Geom-Entity-Box-Fast mau Selset tmp)
(vl-load-com)
(defun ST:Geom-Entity-Box-Fast (vla-obj /   ll lr ur ul rt)  
(vla-getboundingbox vla-obj 'll 'ur)
(cons (mapcar '(lambda (x y) (* (+ x y) 0.5)) (setq ll (vlax-safearray->list ll))(setq ur (vlax-safearray->list ur))) (angle ll ur))
)
(if (and 	(princ "\nChon doi tuong mau :")
           (setq mau (ST:Geom-Entity-Box-Fast (vlax-ename->vla-object (ssname (ssget ":S" (list (cons 0 "*LINE,LEADER"))) 0))))
           (princ "\nChon cac doi tuong can quay :")
           (ssget (list (cons 0 "*LINE,LEADER")))
           (setq SelSet (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
   )
   (vlax-for object Selset
       (vla-rotate object (vlax-3d-point (car (setq tmp (ST:Geom-Entity-Box-Fast object)))) (- (cdr mau)(cdr  tmp)))
   )
   (vla-delete Selset)
)
)

 

Nếu muốn dùng cho tất cả các đối tượng (k riêng gì Pline, Line, Leader thì bạn xóa tất cả dòng này trong lisp đi

(list (cons 0 "*LINE,LEADER"))

 

- Thank bác kẹt xu nhé (ko hiểu sao ko like this được), đúng cái lisp e cần, đơn giản gọn nhẹ mà rất nhanh, bác có thể giúp e thêm chút nữa được ko

+ ở đây khi e làm với đường Le , vì nó có mũi tên nên có lúc sau khi hoàn thành lệnh thì chiều mũi tên xoay ko đúng như mình muốn, bác chèn giúp e thêm vào khi dùng lệnh này với Le (mũi tên) thì sẽ có thêm tùy chọn chọn 2 điểm trên đường mẫu để xác định hướng mũi tên ạ.

  • 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

Rất tiếc là mình không hiểu ý bạn, cũng chưa hiểu lúc nào là không như ý smile.png

 

smile.png Lisp này của bác đã giải quyết được vấn đề của e đang cần rồi bác ạ

 

Vừa rồi e ko để ý đến đối tượng e chọn , đã ok rồi bác ạ

 

( Muốn bấm vào cái " like this" của bác nhưng mà thấy báo là quá số lần,hic)

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

Có 2 chỗ có dòng đó, bạn phải bỏ cả 2 chỗ đi

Bác ketxu ơi, em xóa 2 dòng có chữ (list (cons 0 "*LINE,LEADER")) nhưng khi quay 2 đối tượng là Text và mũi tên thì chỉ đúng với mũi tên còn Text cũng quay nhưng không song song với đối tượng được chọn. Bác coi giúp em với!

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

À, giờ mình đã hiểu ý bạn. Mình nói có thể sử dụng với các loại khác - không có nghĩa là áp dụng sẽ theo ý muốn chủ quan. Lisp trên sở dĩ lấy đường chéo của đường bao ảo (1 hình chữ nhật) của đối tượng làm cơ sở quay, nên nhiều trường hợp tất lẽ nó k đúng ý bạn :)

Update thêm cái Text hoặc Le :

(defun c:xoay(/ ST:Geom-Entity-Box-Fast mau Selset tmp)
(vl-load-com)
(defun ST:Geom-Entity-Box-Fast (vla-obj /   ll lr ur ul rt) 
(vla-getboundingbox vla-obj 'll 'ur)
(cons (mapcar '(lambda (x y) (* (+ x y) 0.5)) (setq ll (vlax-safearray->list ll))(setq ur (vlax-safearray->list ur))) (angle ll ur))
)
(if (and 	(princ "\nChon doi tuong mau :")
 	(setq mau (ST:Geom-Entity-Box-Fast (vlax-ename->vla-object (ssname (ssget ":S" ) 0))))
 	(princ "\nChon cac doi tuong can quay :")
 	(ssget)
 	(setq SelSet (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
)
(vlax-for object Selset
 (setq typ (vla-get-ObjectName object))
	(vla-rotate object (vlax-3d-point (car (setq tmp (ST:Geom-Entity-Box-Fast object))))
 (-  (cdr mau)
  (cond  ((wcmatch typ "AcDb*Text")
 	(vla-get-Rotation object))
	((wcmatch typ "AcDb*Leader")
 	(angle
  	(car (setq tmp ((lambda(key lst / l )
    	(foreach x lst (if (= key (car x))(setq l (cons (cdr x) l))))
    	(reverse l)
      	) 10 (entget (vlax-vla-object->ename object))))
  	)
  	(last tmp)
 	)
	)
	(T (cdr  tmp))
  )
 )
)
)
(vla-delete Selset)
)
)

  • 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
vuminhchau    1

ồ đúng ý em rối đó, chạy được rồi và quay mũi tên song song rồi nhưng còn 1 chút nữa là nó lại bị quay ngược mũi tên 180độ, bác chỉnh giúp nó quay song song thôi chứ không phải lật ngược lại. cảm ơn rất 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

Tùy thuộc vào đối tượng mẫu bạn chọn là Line hay Pline hay cái j. Bạn gói gọn lại yêu cầu đi :)

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

các bác ơi, có ai có thể giúp em sửa lisp của bác kẹt xu để cái mũi tên chỉ đường nó không bị quay ngược 180 độ như hình trên không ạ!

rất xin lỗi vì ngày lễ vẫn làm phiề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
Tue_NV    3.841

các bác ơi, có ai có thể giúp em sửa lisp của bác kẹt xu để cái mũi tên chỉ đường nó không bị quay ngược 180 độ như hình trên không ạ!

rất xin lỗi vì ngày lễ vẫn làm phiền các bác.

Sửa lại 1 tí cho bạn đây :

(defun c:xoay(/ ST:Geom-Entity-Box-Fast mau Selset tmp)
(vl-load-com)
(defun ST:Geom-Entity-Box-Fast (vla-obj /   ll lr ur ul rt)
(vla-getboundingbox vla-obj 'll 'ur)
(cons (mapcar '(lambda (x y) (* (+ x y) 0.5)) (setq ll (vlax-safearray->list ll))(setq ur (vlax-safearray->list ur))) (angle ll ur))
)
(if (and     (princ "\nChon doi tuong mau :")
     (setq mau (ST:Geom-Entity-Box-Fast (vlax-ename->vla-object (ssname (ssget ":S" ) 0))))
     (princ "\nChon cac doi tuong can quay :")
     (ssget)
     (setq SelSet (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
   )
   (vlax-for object Selset
 (setq typ (vla-get-ObjectName object))
 (vla-rotate object (vlax-3d-point (car (setq tmp (ST:Geom-Entity-Box-Fast object))))
 (-  (cdr mau)
  (cond  ((wcmatch typ "AcDb*Text")
     (vla-get-Rotation object))
 ((wcmatch typ "AcDb*Leader")
     (angle
 	 (car  (setq tmp (reverse ((lambda(key lst / l )
	 (foreach x lst (if (= key (car x))(setq l (cons (cdr x) l))))
	 (reverse l)
 		 ) 10 (entget (vlax-vla-object->ename object)))))
 	 )
 	 (last tmp)
     )
 )
 (T (cdr  tmp))
  )
 )
)
   )
   (vla-delete Selset)
)
)

Edit : Sửa lại code theo ý bạn vuminhchau

Chỉnh sửa theo Tue_NV
Sửa lại code theo ý bạn vuminhchau
  • 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

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  

×