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  
tkd247

[Nhờ chỉnh sửa] Lisp arm (array kết hợp với move)

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

tkd247    2

Gửi các bạn trong diễn đàn Cad Việt,

Mình có viết 1 lisp arm với nội dung tương tự lệnh array trong cad nhưng thuận tiện hơn nhờ nhập số liệu từ bàn phím. Mình muốn cải tiến cho nó kết hợp với lệnh move các đối tượng vừa tạo ra theo yêu cầu của mình (Các bạn xem thêm hình minh họa). Vì vậy nhờ các bạn chỉnh sửa lại code giúp mình nhé.

Mình gửi kèm lisp

http://www.cadviet.com/upfiles/3/101944_arm_1.lsp

và hình minh họa để các bạn tham khảo.

http://www.cadviet.com/upfiles/3/101944_minh_hoa_lisp_arm_1.dwg

Rất mong được giúp đỡ,

Tkd247

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

Bạn đã viết đến đấy rồi thì cố nốt 1 chút nữa thôi :)

Đầu tiên bạn search các hàm con sau :

- Viết 1 hàm lấy boundingbox của đối tượng (trên CV có rồi)

- Viết 1 hàm lấy boundingbox của tập đối tượng (cũng có rồi)

- Viết 1 hàm collect toàn bộ đối tượng sau đối tượng e (có rồi)

- VIết hàm lấy trung điểm của 2 điểm (cũng có luôn rồi)

 

THứ tự thực hiện :

- Lấy ename của đối tượng e cuối cùng (entlast)

- Copy đoạn mã của bạn vào dưới

- Dùng hàm collect để lấy toàn bộ đối tượng sinh ra sau khi thực hiện array (sinh ra sau e) và cons thêm đối tượng chọn vào list ename này

- Lấy boundingbox toàn bộ tập đối tượng mới sinh

- Lấy trung điểm của 2 cạnh chéo boundingbox

- THực hiện lệnh move từ trung điểm này tới trung điểm chọn từ 2 cạnh chéo HCN

- Xong ^^

- Có gì khó khăn bạn cứ hỏi :D

  • 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
ketxu    2.652

Ngoài ra, để giải quyết nhu cầu cụ thể, rõ ràng bài toán của bạn giống việc tính toán và chèn BLock hơn, nếu đi theo hướng chọn đối tượng, chọn HCN, sau đó bạn tính ra được cụ thể từng điểm chèn của Block và chèn vào đó, lúc đó code sẽ ngắn hơn 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
vuongviva    2

Bạn đã viết đến đấy rồi thì cố nốt 1 chút nữa thôi :)

Đầu tiên bạn search các hàm con sau :

- Viết 1 hàm lấy boundingbox của đối tượng (trên CV có rồi)

- Viết 1 hàm lấy boundingbox của tập đối tượng (cũng có rồi)

- Viết 1 hàm collect toàn bộ đối tượng sau đối tượng e (có rồi)

- VIết hàm lấy trung điểm của 2 điểm (cũng có luôn rồi)

 

THứ tự thực hiện :

- Lấy ename của đối tượng e cuối cùng (entlast)

- Copy đoạn mã của bạn vào dưới

- Dùng hàm collect để lấy toàn bộ đối tượng sinh ra sau khi thực hiện array (sinh ra sau e) và cons thêm đối tượng chọn vào list ename này

- Lấy boundingbox toàn bộ tập đối tượng mới sinh

- Lấy trung điểm của 2 cạnh chéo boundingbox

- THực hiện lệnh move từ trung điểm này tới trung điểm chọn từ 2 cạnh chéo HCN

- Xong ^^

- Có gì khó khăn bạn cứ hỏi :D

Bạn làm luôn rồi up lên cho mọi người được ko?Mình thấy lisp này cũng hay áp dụng.Thanks.

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
phamthanhbinh    3.123

Bạn làm luôn rồi up lên cho mọi người được ko?Mình thấy lisp này cũng hay áp dụng.Thanks.

 

Bạn làm luôn rồi up lên cho mọi người được ko?Mình thấy lisp này cũng hay áp dụng.Thanks.

Hề hề hề,

Làm thì được thôi, nhưng luôn thì cứ phải từ từ vì hổng phải bác ấy chỉ có một việc ngồi viết lisp theo yêu cầu đâu. Hãy chịu khó nhẫn nại chờ một chút.

Hề hề hề....

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

Bạn làm luôn rồi up lên cho mọi người được ko?Mình thấy lisp này cũng hay áp dụng.Thanks.

Bạn làm chuyên ngành j mà hay áp dụng lisp này :)

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
phamthanhbinh    3.123
Bạn làm luôn rồi up lên cho mọi người được ko?Mình thấy lisp này cũng hay áp dụng.Thanks.

Hề hề hề,

Luôn thì luôn đây. Tuy nhiên mình không phải là bác ketxu nên mình chỉ luôn được đến thế này. Cái vụ chọn điểm nguồn và điểm đích của việc move mình để cho người dùng chọn bằng tay cho nó ...... khỏi phải nghĩ. Bởi vì theo mình nghĩ thì như thế có khi lại thuận lợi cho nhiều người dùng hơn, Cái yệu cầu của chủ thớt là điểm nguồn phải là tâm của nhóm đối tượng và điểm đích là tâm của một HCN khác mà mình thì chả biết cái HCN ây của chủ thớt ở đâu nên cứ làm thế này đã. Nếu chủ thớt không khoái có thể tự chỉnh lại lisp cho nó vuông được mà.

Hề hề hề

Luôn đây:


(defun *error* (msg)
  (setvar "osmode" 0)
  (princ "\n you lost it - homer")
  (princ)
)
(defun C:ARM ()
  (setvar "cmdecho" 0)
  (setq SSET (ssget))

        (if (not *COL)(setq *COL 1))
        (princ "\n number of columns <||||>:<")
        (princ *COL)
        (setq COL (getint ">  "))
        (if (not COL)(setq COL *COL)(setq *COL COL))

        (if (not *COLD)(setq *COLD 1))
        (princ "\n column distance <| | | |>:<")
        (princ *COLD)
        (setq COLD (getint ">  "))
        (if (not COLD)(setq COLD *COLD)(setq *COLD COLD))

        (if (not *ROW)(setq *ROW 1))
        (princ "\n number of rows <---->:<")
        (princ *ROW)
        (setq ROW (getint ">  "))
        (if (not ROW)(setq ROW *ROW)(setq *ROW ROW))

        (if (not *ROWD)(setq *ROWD 1))
        (princ "\n row distance <- - - ->:<")
        (princ *ROWD)
        (setq ROWD (getint ">  "))
        (if (not ROWD)(setq ROWD *ROWD)(setq *ROWD ROWD))

        (setq ent (entlast))         
        (command "array" SSET "" "R" ROW COL ROWD COLD)
        (While ent
        (setq ent (entnext ent))
        (if ent (setq sset (ssadd ent sset)))
        )
        (command "move" sset "" (setq p1 (getpoint "\n Chon diem goc")) (getpoint p1 "\n Chon diem dich"))
        (princ)     
)

 

Chúc mọi người luôn vui vẻ.

Chỉnh sửa theo phamthanhbinh
Chỉnh sửa do codebox bị chập mạch.
  • 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
phamthanhbinh    3.123
Bạn làm luôn rồi up lên cho mọi người được ko?Mình thấy lisp này cũng hay áp dụng.Thanks.

Hề hề hề,

Tiện tay gửi luôn các bạn hai hàm con dùng để lấy tâm nhóm đối tượng (getcen ....) và lấy tâm của một đối tượng (getcen1.... ) để các bạn tiện bề sử dụng.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun getcen (ss / pt)
(setq pt (mapcar  '(lambda (x) (/ x  2)) (mapcar  '+ (car (acet-ss-zoom-extents ss)) (cadr (acet-ss-zoom-extents ss)))))
pt
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun getcen1 (en /pt)
(setq pt (mapcar '(lambda (x) (/ x 2)) (mapcar '+ (car (acet-ent-geomextents en)) (cadr (acet-ent-geomextents en)))))
pt
)

Với hai hàm con con này, hy vọng rằng chủ thớt sẽ biết cách đưa nó vào trong lisp trên để xài cho trúng ý đò của chủ thớt.

Hề hề hề,...

Chỉnh sửa theo phamthanhbinh
Sửa lại do cái codebox bị chập cheng
  • 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
tkd247    2

Gửi bạn Ketxu,

Cám ơn các gợi ý của bạn, để thực hiện được hết các ý tưởng của bạn chắc mình còn phải nghiên cứu thêm nhiều. Hiện nay mình mới tập viết 1 số lisp cơ bản để giảm thiểu thao tác thôi.

Gửi bạn Phamthanhbinh,

Cám ơn bạn rất nhiều vì đã hỗ trợ code. Trên cơ sở gợi ý của bạn mình đã hoàn thiện lisp theo đúng ý mình. Mình gửi lại lisp để bạn nào quan tâm có thể lấy sử dụng.

http://www.cadviet.com/upfiles/3/101944_arm_3.lsp

Tkd247

  • 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  

×