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

[Yêu cầu] - Lisp tự động tạo thư viện mẫu Hatch

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

Chào các bác, lâu lắm mới đụng đến CAD, mình có một nhu cầu như thế này chắc cũng nhiều người cần nên post ý tưởng xem có bác nào hứng thú thì triển nhé.

Chiều nay mình nhận được bản vẽ thiết kế kiến trúc của đối tác tư vấn, mấy ông này chơi toàn mẫu hatch lạ không có sẵn trong thư viện custom hatch nên chỉ hiển thị chứ không chỉnh sửa được.

Mình nhớ trước đây khi nghiên cứu để viết mấy hàm con entmake object thì cấu trúc code dxf của đối tượng hatch có các thông tin sau:

1. Tên pattern (mẫu hatch) của đối tượng hatch.

2. Giá trị mô tả toàn bộ tập hợp vector cấu tạo ra mẫu pattern của đối tượng hatch.

Như chúng ta đã biết (có thể một số bác không biết), thư viện pattern của hatch được đặt trong 1 file đặt trong thư mục support của cad (tên gì mình cũng quên rồi, post bài này bằng máy tính ở nhà không có Cad các bác thông cảm) . Nó lưu giữ 2 thông tin mình nêu trên và được tải vào cad khi khởi động.

Như vậy với 1 mẫu hatch lạ từ một bản vẽ lạ, ta có thể thu được thông tin của pattern mà mẫu hatch đó sử dụng để cập nhật vào thư viện của mình. Việc cập nhật này cho phép chúng ta làm được 2 việc:

1 là có thể thực hiện thao tác Edit bất cứ đối tượng hatch nào. kể cả là mẫu hatch lạ.

2 là có thêm đồ để chơi cho bằng anh bằng em.

 

Ý tưởng thì như vậy. Triển khai thì chỉ đơn giản là nhúng thêm 1 đoạn code vào lệnh Hatchedit như sau: đọc mã DXF của đối tượng hatch -> kiểm tra xem tên pattern đã có trong thư viện chưa -> Nếu chưa thì đọc code cấu tạo vector của nó -> ghi thông tin thu được vào file thư viện -> load lại file thư viện -> tiếp tục thực hiện lệnh hatch edit như bình thường.

Mình chỉ nêu ý tưởng và hóng thôi chứ giờ không viết nổi. Thank các bác đã đọc đến đây :D

 

 

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

Ý tưởng hay nhưng ketxu cũng chỉ đạt gạch hóng, vì dạo này nhiều thứ đập vào mặt quá ^^

  • Like 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ề, ý tưởng nào của mềnh mà lai hông hay :D
Cũng từ nguyên lý cơ bản để viết lisp này, các bác có thể phát triển một lệnh cài đặt thư viện mẫu hatch thường dùng của mình rồi nhúng luôn trong lisp. Mỗi lần cài đặt lại Autocad chỉ cần gõ 1 lệnh là nó khởi tạo cho các bác thư viện mà không cần copy thủ công nữa.

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

Thường thì thư việc hatch mới người dùng thường để 1 folder riêng rồi cài đặt trong Option để dùng được bộ hatch đó. Nên chúng ta cũng không nhất thiết phải cầu kỳ can thiệp vào file gốc của Cad làm gì. Do đó theo em thì nên dùng cách này:

- Với hatch có sẵn mà ko có file pat, thì chỉ cần lisp xuất hatch đó ra file pat, rồi copy vào thư mục các mẫu hatch thường dùng của mình, khởi động lại cad là dùng vô tư :)

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
Kịp thời}}, Thaistreetz cho biết:

....

Mình nhớ trước đây khi nghiên cứu để viết mấy hàm con entmake object thì cấu trúc code dxf của đối tượng hatch có các thông tin sau:

1. Tên pattern (mẫu hatch) của đối tượng hatch.

2. Giá trị mô tả toàn bộ tập hợp vector cấu tạo ra mẫu pattern của đối tượng hatch.

....

Thai co thể gửi đường link tham khảo hàm con trên được khô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

Em chưa viết hàm con trích xuất các thông tin này bác ạ. Khi nghiên cứu code dxf của đối tượng hatch em thấy kết quả trả về có cái thì phức tạp dài lê thê, có cái thì rất ngắn và không phụ thuộc vào hình dạng của đối tượng hatch. Khi đó em lờ mờ đoán cái đoạn dài hay ngắn đó có thể chính là mô tả cấu tạo của pattern. sau đó em mởi file thư viện của hatch và một số file custom hatch thì thấy các file này có nội dung như trong dxf mô tả. Từ đó em mới có khẳng định như trên.
Tuy nhiên lúc đó chưa nghĩ đến có thể ứng dụng vào việc gì nên chỉ hiểu rồi để đó thôi. Giờ mới nảy sinh ra ý tưởng khi mà vấp phải bản vẽ lạ

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
Kịp thời}}, conghoa cho biết:

Thường thì thư việc hatch mới người dùng thường để 1 folder riêng rồi cài đặt trong Option để dùng được bộ hatch đó. Nên chúng ta cũng không nhất thiết phải cầu kỳ can thiệp vào file gốc của Cad làm gì. Do đó theo em thì nên dùng cách này:

- Với hatch có sẵn mà ko có file pat, thì chỉ cần lisp xuất hatch đó ra file pat, rồi copy vào thư mục các mẫu hatch thường dùng của mình, khởi động lại cad là dùng vô tư :)

Cái này tùy thuộc vào nhu cầu của mỗi người mà chủ động điều chỉnh cho phù hợp thôi. Mình thì xây dựng toàn bộ ứng dụng lisp của mình theo project và build thành 1 file fas duy nhất. trong đó có mọi lệnh, ứng dụng, tiện ích, thư viện layer, thư viện block, thư viện dimstyte, textstyle, khung bản vẽ... mà mình cần. đồng thời bao gồm cả 1 lệnh setup để tạo môi trường làm việc quen thuộc và 1 lệnh hoàn trả môi trường làm việc như trước khi setup. Lưu nó lên mây hoặc vào điện thoại, tiện khi làm việc ở máy tính khác, và cũng đỡ mất thời gian mỗi khi cài lại autocad. Ý tưởng của mình được vẽ ra theo hướng này :D

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ác cao thủ trở thành "CU THẢO" hết cả rồi...! Hãy tìm kiếm với từ khóa GETPAT.lsp, người ta viết từ năm 2001. Còn chế biến ntn cho phù hợp thì tùy cá nhân.

;|

GETPAT.LSP (c) 2001 Tee Square Graphics
    Version 1.01b - 1/22/2002
    
This routine may be used to extract hatch pattern data
from existing drawings when the .pat file containing
the original information is not available.

After loading the file in the usual manner, type the
command GETPAT at the AutoCAD Command: prompt, select
any (non-SOLID) hatch object, and the pattern information
will be written to a .pat file having the same name as
the pattern (e.g., pattern information for the hatch
pattern WOODS will be written to WOODS.PAT.

Ver. 1.01b includes two small fixex to eliminate "Bad 
Argument" LISP errors when run with certain installations
of AutoCAD 2000+.

|;

(defun C:GETPAT (/ cmde hat elst rotn hnam temp xofs yofs what
                   temp outf flin angl tmp1 tmp2 xvec yvec)
  (setq cmde (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (while (not (setq hat (entsel "\nSelect hatch: "))))
  (setq elst (entget (car hat)))
  (if (= (cdr (assoc 0 elst)) "HATCH")
    (progn
      (setq rotn (* 180 (/ (cdr (assoc 52 elst)) pi))
            hnam (cdr (assoc 2 elst))
            hscl (cdr (assoc 41 elst))
      )

;; The following nine lines may optionally be omitted.
;; Their purpose is to create a temporary "clone" of the
;; selected hatch with a 0 deg. rotation angle, in case
;; the hatch object specified a rotation angle. If these
;; lines are omitted, the current rotation of the selected
;; hatch will become the "0" deg. rotation for the extracted
;; pattern definition.
      (if (not (zerop rotn))
        (progn
          (setq temp elst)
          (entmake temp)
          (command "_.rotate" (entlast) "" (cdr (assoc 10 temp))(- rotn))
          (setq elst (entget (entlast)))
          (entdel (entlast))
        )
      )
;; End of optional code.

      (setq xofs (cdr (assoc 43 elst))
            yofs (cdr (assoc 44 elst))
            elst (member (assoc 53 elst) elst)
      )
      (setq outf (strcat hnam ".pat"))
      (if (findfile outf)
        (progn
          (initget "Overwrite Append")
          (setq what (getkword (strcat "\n" outf " already exists; Overwrite/Append? ")))
        )
      )
      (setq outf (open outf (if (= what "Append") "a" "w"))
            flin (strcat "*" hnam)
      )
      (foreach x elst
        (cond
          ((= (car x) 53)
            (write-line flin outf)
            (setq angl (cdr x)
                  flin (trim (angtos angl 0 7))
            )
          )
          ((= (car x) 43)
            (setq flin (strcat flin ", " (trim (rtos (/ (- (cdr x) xofs) hscl) 2 7))))
          )
          ((= (car x) 44)
            (setq flin (strcat flin "," (trim (rtos (/ (- (cdr x) yofs) hscl) 2 7))))
          )
          ((= (car x) 45)
            (setq tmp1 (cdr x))
          )
          ((= (car x) 46)
            (setq tmp2 (cdr x)
                  xvec (/ (+ (* tmp1 (cos angl))(* tmp2 (sin angl))) hscl)
                  yvec (/ (- (* tmp2 (cos angl))(* tmp1 (sin angl))) hscl)
                  flin (strcat flin ", " (trim (rtos xvec 2 7)) "," (trim (rtos yvec 2 7)))
            )
          )
          ((= (car x) 49)
            (setq flin (strcat flin ", " (trim (rtos (/ (cdr x) hscl) 2 7))))
          )
          ((= (car x) 98)
            (write-line flin outf)
          )
          (T nil)
        )
      )
      (write-line "" outf)
      (close outf)
      (alert (strcat hnam " pattern definition written to " hnam ".PAT"))
    )
    (alert "Selected object not a HATCH.")
  )
  (setvar "cmdecho" cmde)
  (princ)
)
(defun trim (x / n)
  (setq n (strlen x))
  (while (= (substr x n 1) "0")
    (setq n (1- n)
          x (substr x 1 n)
    )
  )
  (if (= (substr x n 1) ".")
    (setq x (substr x 1 (1- n)))
  )
  x
)
(alert
  (strcat "GETPAT.LSP (c) 2003 Tee Square Graphics\n"
          "          Type GETPAT to start"
  )
)
(princ)
  • Like 2
  • 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ào lúc 1/10/2017 tại 17:20, quocmanh04tt đã nói:

Các cao thủ trở thành "CU THẢO" hết cả rồi...! Hãy tìm kiếm với từ khóa GETPAT.lsp, người ta viết từ năm 2001. Còn chế biến ntn cho phù hợp thì tùy cá nhân.


;|

GETPAT.LSP (c) 2001 Tee Square Graphics
    Version 1.01b - 1/22/2002
    
This routine may be used to extract hatch pattern data
from existing drawings when the .pat file containing
the original information is not available.

After loading the file in the usual manner, type the
command GETPAT at the AutoCAD Command: prompt, select
any (non-SOLID) hatch object, and the pattern information
will be written to a .pat file having the same name as
the pattern (e.g., pattern information for the hatch
pattern WOODS will be written to WOODS.PAT.

Ver. 1.01b includes two small fixex to eliminate "Bad 
Argument" LISP errors when run with certain installations
of AutoCAD 2000+.

|;

(defun C:GETPAT (/ cmde hat elst rotn hnam temp xofs yofs what
                   temp outf flin angl tmp1 tmp2 xvec yvec)
  (setq cmde (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (while (not (setq hat (entsel "\nSelect hatch: "))))
  (setq elst (entget (car hat)))
  (if (= (cdr (assoc 0 elst)) "HATCH")
    (progn
      (setq rotn (* 180 (/ (cdr (assoc 52 elst)) pi))
            hnam (cdr (assoc 2 elst))
            hscl (cdr (assoc 41 elst))
      )

;; The following nine lines may optionally be omitted.
;; Their purpose is to create a temporary "clone" of the
;; selected hatch with a 0 deg. rotation angle, in case
;; the hatch object specified a rotation angle. If these
;; lines are omitted, the current rotation of the selected
;; hatch will become the "0" deg. rotation for the extracted
;; pattern definition.
      (if (not (zerop rotn))
        (progn
          (setq temp elst)
          (entmake temp)
          (command "_.rotate" (entlast) "" (cdr (assoc 10 temp))(- rotn))
          (setq elst (entget (entlast)))
          (entdel (entlast))
        )
      )
;; End of optional code.

      (setq xofs (cdr (assoc 43 elst))
            yofs (cdr (assoc 44 elst))
            elst (member (assoc 53 elst) elst)
      )
      (setq outf (strcat hnam ".pat"))
      (if (findfile outf)
        (progn
          (initget "Overwrite Append")
          (setq what (getkword (strcat "\n" outf " already exists; Overwrite/Append? ")))
        )
      )
      (setq outf (open outf (if (= what "Append") "a" "w"))
            flin (strcat "*" hnam)
      )
      (foreach x elst
        (cond
          ((= (car x) 53)
            (write-line flin outf)
            (setq angl (cdr x)
                  flin (trim (angtos angl 0 7))
            )
          )
          ((= (car x) 43)
            (setq flin (strcat flin ", " (trim (rtos (/ (- (cdr x) xofs) hscl) 2 7))))
          )
          ((= (car x) 44)
            (setq flin (strcat flin "," (trim (rtos (/ (- (cdr x) yofs) hscl) 2 7))))
          )
          ((= (car x) 45)
            (setq tmp1 (cdr x))
          )
          ((= (car x) 46)
            (setq tmp2 (cdr x)
                  xvec (/ (+ (* tmp1 (cos angl))(* tmp2 (sin angl))) hscl)
                  yvec (/ (- (* tmp2 (cos angl))(* tmp1 (sin angl))) hscl)
                  flin (strcat flin ", " (trim (rtos xvec 2 7)) "," (trim (rtos yvec 2 7)))
            )
          )
          ((= (car x) 49)
            (setq flin (strcat flin ", " (trim (rtos (/ (cdr x) hscl) 2 7))))
          )
          ((= (car x) 98)
            (write-line flin outf)
          )
          (T nil)
        )
      )
      (write-line "" outf)
      (close outf)
      (alert (strcat hnam " pattern definition written to " hnam ".PAT"))
    )
    (alert "Selected object not a HATCH.")
  )
  (setvar "cmdecho" cmde)
  (princ)
)
(defun trim (x / n)
  (setq n (strlen x))
  (while (= (substr x n 1) "0")
    (setq n (1- n)
          x (substr x 1 n)
    )
  )
  (if (= (substr x n 1) ".")
    (setq x (substr x 1 (1- n)))
  )
  x
)
(alert
  (strcat "GETPAT.LSP (c) 2003 Tee Square Graphics\n"
          "          Type GETPAT to start"
  )
)
(princ)

Sau khi thực hiện nó báo vậy là nó lưu file pat vào đâu bạn nhỉ

image.png.6d470156bed83dd18e8f04cd277826d9.png

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  

×