Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
19 replies to this topic

#1 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 13 September 2011 - 11:26 PM

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

#2 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 14 September 2011 - 09:14 AM

cái này sao bạn ko tạo block cho dể quản lý và chỉnh sửa nè!
  • 1
Hình đã gửi

#3 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 14 September 2011 - 01:12 PM

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

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 14 September 2011 - 03:15 PM

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ề.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 14 September 2011 - 04:06 PM

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
  • 2
Hình đã gửi

#6 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 14 September 2011 - 04:09 PM

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à!
  • 0

#7 thichhoabinh

thichhoabinh

    biết vẽ circle

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

Đã gửi 14 September 2011 - 05:30 PM

Một đống đối tượng, ít ra thì bạn cũng phải biết cách chỉ định điểm gốc để quay chứ làm hàng loạt làm sao nếu không biết điểm gốc :o
  • 1

#8 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 14 September 2011 - 06:30 PM

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

#9 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 14 September 2011 - 06:39 PM

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 ^^
  • 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 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 14 September 2011 - 08:01 PM

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

#11 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 14 September 2011 - 08:13 PM

Ở đây em up file thực tế em làm lên, các bac xem va nghiên cứu giúp em với nhé
http://www.cadviet.c.../file_mau_1.dwg
  • 0

#12 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 14 September 2011 - 11:00 PM

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.
  • 1
Clear sky!

MF Rock collection.

#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 15 September 2011 - 06:50 AM

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

#14 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 15 September 2011 - 09:28 AM

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

#15 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 15 September 2011 - 09:52 AM

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

  • 3

#16 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 15 September 2011 - 10:07 AM

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

#17 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 15 September 2011 - 10:25 AM

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

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


#18 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 15 September 2011 - 10:42 AM

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

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


#19 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 15 September 2011 - 01:02 PM

Em biết là nhấn Like this rồi nhưng không hiểu sao nhấn mãi không được các bác ạ!
  • 0

#20 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 16 September 2011 - 11:07 AM

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
  • 0
Clear sky!

MF Rock collection.