Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
nqt266

[Yêu cầu]Lập lisp quay đối tượng

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

Em có 1 vấn đề này mà từ trước tới giờ cứ phải làm thủ công suốt, đó là vấn đề có một tập hợp các đối tượng giống nhau được gắn trên một đường line, bây giờ chỉ cần một lệnh , chọn đối tượng và nhập góc cần quay vào là các đối tượng sẽ quay quanh gốc là chân đường line đó. Em cứ phải quay từng cái 1, vất vả quá, mong các bác bớt chút thời gian xem xét và giúp đỡ em với

Em xin chân thành cảm ơn các bác.

Chúc cả nhà mạnh khoẻ

Đây là file đính kèm của em: http://www.cadviet.com/upfiles/3/file_2.dwg

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 chắc không làm san nền nên bác không gặp đối tượng kiểu này, nó là từ phần mềm chạy ra dạng như thế, giờ em muốn chỉnh bản in mà, nên phải quay, mà trước giờ toàn rote tay thôi, vất vả quá, các bác xem giúp em với ạ

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 có 1 vấn đề này mà từ trước tới giờ cứ phải làm thủ công suốt, đó là vấn đề có một tập hợp các đối tượng giống nhau được gắn trên một đường line, bây giờ chỉ cần một lệnh , chọn đối tượng và nhập góc cần quay vào là các đối tượng sẽ quay quanh gốc là chân đường line đó. Em cứ phải quay từng cái 1, vất vả quá, mong các bác bớt chút thời gian xem xét và giúp đỡ em với

Em xin chân thành cảm ơn các bác.

Chúc cả nhà mạnh khoẻ

Đây là file đính kèm của em: http://www.cadviet.c...es/3/file_2.dwg

Hề hề hề,

Bạn nên nhóm các đối tượng trong một nhóm thành block với điểm chèn là cái điểm gốc mà bạn sẽ quay sau này. Như vậy bài toán sẽ đơn giản hơn là cách làm của bạn hiện tại.

Với cách làm cỉua bạn như hiện nay, không thể quay đồng thời tất cả các đối tượng một lần được mà phải quay từng nóm đối tượng theo các tâm quay khác nhau..

Việc xác định các tâm quay này không hề dễ do bạn không biết cấu tạo của mỗi một nhóm đối tượng ra sao và cách lập các nhóm đối tượng này.

Hề hề hề.

  • 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

Hề hề hề,

Bạn nên nhóm các đối tượng trong một nhóm thành block với điểm chèn là cái điểm gốc mà bạn sẽ quay sau này. Như vậy bài toán sẽ đơn giản hơn là cách làm của bạn hiện tại.

Với cách làm cỉua bạn như hiện nay, không thể quay đồng thời tất cả các đối tượng một lần được mà phải quay từng nóm đối tượng theo các tâm quay khác nhau..

Việc xác định các tâm quay này không hề dễ do bạn không biết cấu tạo của mỗi một nhóm đối tượng ra sao và cách lập các nhóm đối tượng này.

Hề hề hề.

Bác nói đúng là nên block lại, nhưng block lại khi mình bắt đầu tạo ra các dt thôi, còn như yêu cầu của bạn ấy là file được xuất từ chương trình khác nên nó sẵn vậy rồi.

Bác cao tay có thể viết lisp giúp bạn ấy theo hướng: chọn đối tượng thì chọn từng nhóm, xong rồi chọn điểm chèn để quay cho nhóm đầu tiên, các nhóm sau dựa vào vị trí tương đối của nhóm đầu tiên so với điểm chèn mà lisp suy ra điểm chèn cho từng nhóm tương ứng.

Em gà nên ko viết dc nhưng theo suy nghĩ của em thì các bác thừa sức ấy chứ. hehhehe

  • 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

Vấn đề là em chạy phần mềm thiết kế nó ra như thế, giờ phải quay mà cứ thủ công thì to tay lắm, các bác trên diễn đàn cùng nhau bàn bạc xem có cách nào rút gọn công sức giúp em với

Thank cả nhà!

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 hãy tìm và đưa lên các file mà bác đã từng gặp mà có sự khác nhau đặc trưng. Trường hợp của bạn chỉ có thể lập trình dựa vào đặc trưng của dữ liệu thôi. Do đó bác hãy đưa lên thêm nữa để người lập trình có thể lường hết các TH có thể xảy ra.

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

Trường hợp của bạn chủ Topic đơn giản nhất là viết 1 lệnh rotate có ghi nhớ góc quay cho lần sau, vài dòng là OK, còn việc chọn đối tượng và gốc thì bạn vẫn nên làm thủ công là hay nhất :) Bạn muốn chọn 1 tập nhiều tập đối tượng với quy luật không rõ ràng, chỉ suy luận qua cũng biết là húc vào đá rồ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

Cảm ơn các bác đã bàn luận rất sôi nổi về vấn đề của em, như bác TRUNGAMY muốn em đưa ra các file mà có sự khác nhau đặc trưng thì thực ra vấn đề em gặp tất cả đều có thế thôi ạ, đều phải quay như thế tại gốc của nó mà trước giờ em toàn tay to. giờ thấy oải quá nên đưa lên diễn đàn nhờ anh em giúp đỡ. Mong anh em tiếp tục bàn luận để tìm giải pháp tối ưu nhất cho bài toán của em với ạ, có thể không hoàn toàn được nhưng đạt 80% thì cũng là tuyệt rồi

Cảm ơn cả nhà mình

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

Mỗi tập đối tượng có 3 text và 3 đường thẳng có quy luật rõ ràng.

Như vậy nếu CHỈ chọn đúng và nhiều các đối tượng cần thiết thì dư sức tách ra thành từng nhóm riêng biệt và biết luôn điểm quay của từng tập con.

Còn góc quay thì có thể nhập vào hoặc xác định thông qua đường bao ở châ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

Bạn nqt sử dụng Code này thử nhé :


(defun c:xolt(/ goc ngon s angmau ang leng d1 d2 d3 d4)
(setq Lay "HATCH")
(setq s  (car (entsel "Pick vao doi tuong chan Line mau :")))
(setq angmau (angle (acet-dxf 10 (entget s)) (acet-dxf 11 (entget s))))
(setq ang (acet-rtod (getangle "\n Nhap goc quay :")))

(setq leng (vlax-curve-getendparam s) )

(ACET-ERROR-INIT (LIST (LIST "OSMODE" 0) T))
(foreach x (acet-ss-to-list (ssget (list (cons 0 "LINE") (cons 8 Lay))) )
(setq y (entget x))
(setq goc (acet-dxf 10 y))
(setq ngon (acet-dxf 11 y))
  (if (equal (angle goc ngon) angmau 0.001)
    (Progn
(setq d1 (polar (vlax-curve-getpointatdist x (/ leng 10.0)) (+ angmau (/ pi 2.0)) (/ leng 7.0)  ) 
    d2 (polar (vlax-curve-getpointatdist x (/ leng 10.0)) (+ angmau (/ pi -2.0)) (/ leng 7.0) )
    d3 (polar (vlax-curve-getpointatdist x (/ leng 1.20)) (+ angmau (/ pi -2.0)) (/ leng 7.0) )
    d4 (polar (vlax-curve-getpointatdist x (/ leng 1.20)) (+ angmau (/ pi 2.0)) (/ leng 7.0) ) 
)
(command "rotate" (ssget "cp" (list d1 d2 d3 d4) 
(list (cons 0 "LINE,TEXT") (cons 8 Lay))
) ""
goc ang)
    )
  )
)

(ACET-ERROR-RESTORE)
)

- Cách sử dụng :

1. Lisp hỏi "Pick vao doi tuong chan Line mau :" Bạn chọn chân đường Line mẫu (tức là chọn 1 đường Line mẫu nằm giữa Text màu đỏ và Text màu trắng)

2. Nhập góc quay. Ví dụ trong hình của bạn post lên là 28.3874 độ. Chú ý số lẻ thập phân để Lisp quay cho đẹp

3. Dựa vào Line mẫu ở trên, Lisp sẽ hỏi bạn chọn các kiểu Line giống y như thế đã quay

-> Lisp sẽ giải quyết vấn đề của bạn

Chúc buổi sáng tốt là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

Cảm ơn các bác, cảm ơn bác Tue_NV, đoạn lisp của bác rất hay, nhưng em thấy có 1 vấn đề là lisp chỉ thực hiện được với layer "Hatch", khi đổi layer thì không thực hiện được nữa. Ý em là em muốn đổi các đường line mẫu thành riêng 1 layer rồi layiso layer đó lên để chọn được nhiều đường line mẫu 1 lúc thì lisp lại không thực hiện được. Bác Tuệ và các bác cùng xem xét tiếp giúp em nhé

Cảm ơn cả nhà

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ảm ơn các bác, cảm ơn bác Tue_NV, đoạn lisp của bác rất hay, nhưng em thấy có 1 vấn đề là lisp chỉ thực hiện được với layer "Hatch", khi đổi layer thì không thực hiện được nữa. Ý em là em muốn đổi các đường line mẫu thành riêng 1 layer rồi layiso layer đó lên để chọn được nhiều đường line mẫu 1 lúc thì lisp lại không thực hiện được. Bác Tuệ và các bác cùng xem xét tiếp giúp em nhé

Cảm ơn cả nhà

Mỗi lần quay được với 1 Line mẫu thôi bạn. Các đối tượng chọn với Line mẫu sẽ được quay.

Bạn chú ý rằng vì các Text có cùng Layer với Line mẫu trong bản vẽ bạn upload

nên mình sử dụng Layer của Text cùng với Layer của Line mẫu.

Lisp chỉnh theo ý bạn đây :


(defun c:xolt(/ goc ngon s angmau ang leng d1 d2 d3 d4)
(setq s (car (entsel "Pick vao doi tuong chan Line mau :")))
(setq angmau (angle (acet-dxf 10 (entget s)) (acet-dxf 11 (entget s))))
(setq ang (acet-rtod (getangle "\n Nhap goc quay :")))

(setq leng (vlax-curve-getendparam s) )


(ACET-ERROR-INIT (LIST (LIST "OSMODE" 0) T))
(foreach x (acet-ss-to-list (ssget (list (cons 0 "LINE") (assoc 8 (entget s)))) )
(setq y (entget x))
(setq goc (acet-dxf 10 y))
(setq ngon (acet-dxf 11 y))
  (if (equal (angle goc ngon) angmau 0.001)
    (Progn
(setq d1 (polar (vlax-curve-getpointatdist x (/ leng 10.0)) (+ angmau (/ pi 2.0)) (/ leng 7.0)  ) 
    d2 (polar (vlax-curve-getpointatdist x (/ leng 10.0)) (+ angmau (/ pi -2.0)) (/ leng 7.0) )
    d3 (polar (vlax-curve-getpointatdist x (/ leng 1.20)) (+ angmau (/ pi -2.0)) (/ leng 7.0) )
    d4 (polar (vlax-curve-getpointatdist x (/ leng 1.20)) (+ angmau (/ pi 2.0)) (/ leng 7.0) ) 
)
(command "rotate" (ssget "cp" (list d1 d2 d3 d4) 
(list (cons 0 "LINE,TEXT") (assoc 8 (entget s)))
) ""
goc ang)
    )
  )
)

(ACET-ERROR-RESTORE)
)

  • Vote tăng 3

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 tuyệt vời! Như vậy là bài toán của em đã được giải quyết. Xin cảm ơn anh em, cảm ơn bác Tuệ nhiều

Chúc anh em khoẻ, công việc tốt và luôn có những ý tưởng tuyệt vời để công việc của anh em mình được tốt 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

Rất tuyệt vời! Như vậy là bài toán của em đã được giải quyết. Xin cảm ơn anh em, cảm ơn bác Tuệ nhiều

Chúc anh em khoẻ, công việc tốt và luôn có những ý tưởng tuyệt vời để công việc của anh em mình được tốt hơn.

Theo dõi chủ đề của bạn tôi thấy có rất nhiều người quan tâm. Bạn cám ơn thì tốt rồi, đồng thời nên nhấn nút "Like this" ở góc phải dưới của mỗi bài viết để cám ơn bằng "hiện vật" cho họ nữa thì càng tốt hơn. Góp ý vậy.

Thân thương!

  • 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 tuyệt vời! Như vậy là bài toán của em đã được giải quyết. Xin cảm ơn anh em, cảm ơn bác Tuệ nhiều

Chúc anh em khoẻ, công việc tốt và luôn có những ý tưởng tuyệt vời để công việc của anh em mình được tốt hơn.

Bạn nên nhấn Thank cho bác Tuệ vì thời gian và công sức bỏ ra để viết lisp cho bạn :)

@bác Tuệ : đọc code của bác (e chưa test được) em thấy có 2 điểm cần chú ý với nqt266 :

- SSget có làm việc với đối tượng đã "tắt đèn" sau lệnh layiso (ý bạn nqt266) ?

- Tập chọn

(ssget 'cp' (list d1 d2 d3 d4) (list (cons 0 'LINE,TEXT') (assoc 8 (entget s))))

tiềm ẩn nhiều nguy hiểm nếu có các đối tượng nằm lảng vảng khu d1,d2,d3,d4 ^^ Nên chăng 1 vài phát kiểm tra nữa

 

Dù sao thì theo yêu cầu cá biệt của bạn nqt266 có lẽ quá thơm rồi. Cám ơn bác :)

  • 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

Mình cũng góp vui một tí với chương trình của mình: http://www.mediafire...322fdncyewgrfut

 

Chương trình cho phép:

- Mỗi lần có thể chọn nhiều đối tượng, mỗi lần nên chọn cỡ 10 tập là được, càng chọn nhiều càng chậm.

- Chọn theo window, các đối tượng thừa sẽ không được tính đến

- Tự xác định tập và điểm quay của tập đó.

- Xem trước các thay đổi tương ứng với góc nhập và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

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  

×