Chuyển đến nội dung
Diễn đàn CADViet
Học AutoCAD Online cùng CADViet
TrNghia.Do

[HELP] NHỜ SỬA LISP CHÈN BLOCK THEO FILE DCL

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

9 phút trước, quocmanh04tt đã nói:

Đọc tức thời chứ! Vì theo hướng đi đã nói ở trên, là tạo thư mục chứa thư viện, các file dwg là do người dùng tự chép vào thư viện thì làm sao mà lưu sẵn được.

Theo mình hiểu là lisp sẽ đọc dữ liệu block tương ứng với tên đc chọn ở box 3 sau đó chuyển thành file ảnh ah ?

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
6 phút trước, TrNghia.Do đã nói:

Theo mình hiểu là lisp sẽ đọc dữ liệu block tương ứng với tên đc chọn ở box 3 sau đó chuyển thành file ảnh ah ?

Đúng vậy.

@duy782006: Tìm kiếm với từ khóa: LM:BlockPreview

P/s: Với Hatch, *Text không preview đượ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
3 phút trước, quocmanh04tt đã nói:

Đúng vậy.

@duy782006: Tìm kiếm với từ khóa: LM:BlockPreview

P/s: Với Hatch, *Text không preview được

Phiên bản cải tiến này thân thiện , trực quan hơn lúc ban đầu nhiều, mình thích :))

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
23 giờ trước, quocmanh04tt đã nói:

Khoe bản mới!

CTV-1.jpg

Nếu được cho mình xin file CTV phiên bản 2 này nhé, mình đang dùng phiên bản 1 của bạn thấy rất thích :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
22 giờ trước, TrNghia.Do đã nói:

Nếu được cho mình xin file CTV phiên bản 2 này nhé, mình đang dùng phiên bản 1 của bạn thấy rất thích :p

Đang hoàn thiện vài tính năng bổ sung và bẫy lỗi. Khi nào xong mình sẽ đưa lê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
Vào lúc 12/29/2017 tại 10:47, quocmanh04tt đã nói:

Đúng vậy.

@duy782006: Tìm kiếm với từ khóa: LM:BlockPreview

P/s: Với Hatch, *Text không preview được

Cái LM:BlockPreview là Preview block có sẳn trong bản vẽ, mình thay bằng đường dẩn file không được. quocmanh04tt chơi kiểu gì, chèn nó vào file hiện hành rồi Preview hay có chơi kiểu khác.

  • Like 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
10 giờ trước, duy782006 đã nói:

Cái LM:BlockPreview là Preview block có sẳn trong bản vẽ, mình thay bằng đường dẩn file không được. quocmanh04tt chơi kiểu gì, chèn nó vào file hiện hành rồi Preview hay có chơi kiểu khác.

1. Cái tên của hàm đã nói lên chức năng của nó.

2. Mr Duy biết lisp mà! Đọc qua nội dung của nó thì biết cách thức làm việc của hàm chứ! Nếu cung cấp cho nó 1 đường dẫn thì làm sao nó biết được các đối tượng trong đó được...

Có 2 cách:

a. Chèn file đó vào file hiện hành sau đó preview

b. Mở file đó lên (mở âm thầm thì dùng DBX) - cách này thì phải sửa hàm BlockPreview cho phù hợp.

  • 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
Vào lúc 25/12/2017 tại 13:41, quocmanh04tt đã nói:

Của bạn chỉ cần sửa chút xíu là được:


;;;Three List Tile Dependency Example  -  Lee Mac
;;;Requires ListTileDependency.lsp to be loaded.
(defun c:vd5  (/ *error* dch dcl des lst dwg_name lst_name)
  (defun *error*  (msg)
    (if (= 'file (type des))
      (close des))
    (if (< 0 dch)
      (unload_dialog dch))
    (if (and (= 'str (type dcl)) (findfile dcl))
      (vl-file-delete dcl))
    (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")))
      (princ (strcat "\nError: " msg)))
    (princ))
  (setq lst '(("TBS35"
               ("TBS35-30" ("TBS35-30-1" "TBS35-30-3" "TBS35-30-5"))
               ("TBS35-35" ("TBS35-35-1" "TBS35-35-3" "TBS35-35-5"))
               ("TBS35-40" ("TBS35-40-1" "TBS35-40-3" "TBS35-40-5")))
              ("TBS45"
               ("TBS45-40" ("TBS45-40-1" "TBS35-40-3" "TBS35-40-5"))
               ("TBS45-50" ("TBS45-50-1" "TBS35-50-3" "TBS35-50-5"))
               ("TBS45-75" ("TBS45-75-1" "TBS35-75-3" "TBS35-75-5")))))
  (if (and (setq dcl (vl-filename-mktemp "tmp.dcl"))
           (setq des (open dcl "w"))
           (foreach str  '("lbx : list_box" "{" "    alignment = centered;"
                           "    fixed_width = true;" "    fixed_height = true;" "    width = 25;"
                           "    height = 10;" "}" "test : dialog" "{"
                           "    label = \"TAPPER BLOCK SETS - TBS\";" "    spacer;"
                           "    : boxed_row" "    {" "        : lbx { key = \"lb0\";}"
                           "        : lbx { key = \"lb1\";}" "        : lbx { key = \"lb2\";}"
                           "    }" "    spacer;" "    ok_cancel;" "}")
             (write-line str des))
           (not (setq des (close des)))
           (< 0 (setq dch (load_dialog dcl)))
           (new_dialog "test" dch))
    (progn (or ##rtn## (setq ##rtn## '(0 0 0)))
           (LM:dcld:action '("lb0" "lb1" "lb2") 'lst '##rtn##)
           (if (= 1 (start_dialog))
             (progn (setq lst_name (LM:dcld:getitems ##rtn## lst)
                          dwg_name (last lst_name))
                    (insert_blk dwg_name))
             (princ "\n*Cancel*"))))
  (*error* nil)
  (princ))
;;; HAM INSERT ***
(defun insert_blk  (name / path)
  (setq path "E:/Nghia_AutoLisp 2012/DCL/Tapper block sets TBS/")
  (if (not (tblsearch "BLOCK" name))
    (setq name (strcat path name ".dwg")))
  (command "_.insert" name pause "" "" ""))
;;;*******************************************
;; DCL List-Tile Dependency  -  Lee Mac
;; Configures action_tile statements for the list of keys to enabled dependency between the DCL tiles.
;; key     - [lst] List of DCL tile keys in order of dependency
;; lst-sym - [sym] Quoted variable containing list data
;; rtn-sym - [sym] Quoted variable containing initial selection indexes
(defun LM:dcld:action  (key lst-sym rtn-sym)
  (defun LM:dcld:addlist  (key lst)
    (start_list key)
    (foreach itm lst (add_list itm))
    (end_list))
  (defun LM:dcld:getlists  (idx lst)
    (if (cdr idx)
      (cons (mapcar 'car lst) (LM:dcld:getlists (cdr idx) (cdr (nth (car idx) lst))))
      lst))
  (defun LM:substnth  (itm idx lst)
    (if lst
      (if (zerop idx)
        (cons itm (cdr lst))
        (cons (car lst) (LM:substnth itm (1- idx) (cdr lst))))))
  (defun LM:dcld:actions  (key lst-sym rtn-sym lvl / fun)
    (setq fun
           (if (cdr key)
             (list 'lambda
                   '(val lst / tmp)
                   (list 'setq
                         rtn-sym
                         (list 'LM:substnth '(atoi val) lvl rtn-sym)
                         'tmp
                         (list 'LM:dcld:getlists rtn-sym 'lst))
                   (list 'LM:dcld:addlist (cadr key) (list 'nth (1+ lvl) 'tmp))
                   (list 'if
                         (list '<=
                               (list 'length (list 'nth (1+ lvl) 'tmp))
                               (list 'nth (1+ lvl) rtn-sym))
                         (list 'setq rtn-sym (list 'LM:substnth 0 (1+ lvl) rtn-sym)))
                   (list (LM:dcld:actions (cdr key) lst-sym rtn-sym (1+ lvl))
                         (list 'set_tile (cadr key) (list 'itoa (list 'nth (1+ lvl) rtn-sym)))
                         'lst))
             (list 'lambda
                   '(val lst)
                   (list 'setq rtn-sym (list 'LM:substnth '(atoi val) lvl rtn-sym)))))
    (action_tile (car key) (vl-prin1-to-string (list fun '$value lst-sym)))
    fun)
  (mapcar 'LM:dcld:addlist key (LM:dcld:getlists (eval rtn-sym) (eval lst-sym)))
  ((eval (LM:dcld:actions key lst-sym rtn-sym 0)) (set_tile (car key) (itoa (car (eval rtn-sym))))
                                                  (eval lst-sym))
  (princ))
;; DCL List-Tile Dependency  -  Get Items  -  Lee Mac
;; Returns a list of the items selected from each dependent list tile.
;; idx - [lst] List of selection indexes
;; lst - [lst] List data
(defun LM:dcld:getitems  (idx lst / tmp)
  (if (cdr idx)
    (cons (car (setq tmp (nth (car idx) lst)))
          (LM:dcld:getitems (cdr idx) (cdr tmp)))
    (list (nth (car idx) (car lst)))))

 

Mình có dựa vào đoạn code bạn sửa để tạo ra file lisp có 4 list box như sau :  Orings ORP.lsp

Mình muốn cải tiến lisp này một chút như sau:

1.JPG.f014fb69a1b891dd7dec429e25e20ee9.JPG

-  Khi chọn dòng "hình chiếu bằng"  lisp sẽ insert block theo tên tương ứng theo dạng như sau:

(defun insert_1(/ p1)
(setq p1 (getpoint "Press point:"))
(command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu bang/name.dwg" p1 "" "" "")
(command "change" "l" "" "p" "la" "Bolts - Dowel Pins" "")
)

 

2.JPG.fa03e82de85204dcd4b61e9bf0c4539e.JPG

 

  Khi chọn dòng "hình chiếu cạnh"  lisp sẽ insert block theo tên tương ứng theo dạng như sau:

(defun insert_2 (/ p2 p3)
(setq p2 (getpoint "center point:"))
(setq p3 (getpoint "direction:"))
(command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu canh/name.dwg" p2 "" "" p3)
(command "rotate" "l" "" p1 "90")
(command "_.Explode" "l")
)

Nhờ bạn xem giúp có cách nào làm được như ý kiến trên của mình ko?

Thanks bạ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
10 giờ trước, TrNghia.Do đã nói:

Mình có dựa vào đoạn code bạn sửa để tạo ra file lisp có 4 list box như sau :  Orings ORP.lsp

Mình muốn cải tiến lisp này một chút như sau:

1.JPG.f014fb69a1b891dd7dec429e25e20ee9.JPG

-  Khi chọn dòng "hình chiếu bằng"  lisp sẽ insert block theo tên tương ứng theo dạng như sau:

(defun insert_1(/ p1)
(setq p1 (getpoint "Press point:"))
(command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu bang/name.dwg" p1 "" "" "")
(command "change" "l" "" "p" "la" "Bolts - Dowel Pins" "")
)

 

2.JPG.fa03e82de85204dcd4b61e9bf0c4539e.JPG

 

  Khi chọn dòng "hình chiếu cạnh"  lisp sẽ insert block theo tên tương ứng theo dạng như sau:

(defun insert_2 (/ p2 p3)
(setq p2 (getpoint "center point:"))
(setq p3 (getpoint "direction:"))
(command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu canh/name.dwg" p2 "" "" p3)
(command "rotate" "l" "" p1 "90")
(command "_.Explode" "l")
)

Nhờ bạn xem giúp có cách nào làm được như ý kiến trên của mình ko?

Thanks bạn!

Có cách,  nhưng mà cứ chạy theo mãi thì mệt 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
10 giờ trước, quocmanh04tt đã nói:

Có cách,  nhưng mà cứ chạy theo mãi thì mệt lắm .

Hì hì....Cố giúp mình nốt lần này thôi :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

Tự viết quách cái rẽ nhánh điều kiện là vị trí của list thứ hai là được mà. Nhờ chi cho mệ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
48 phút trước, duy782006 đã nói:

Tự viết quách cái rẽ nhánh điều kiện là vị trí của list thứ hai là được mà. Nhờ chi cho mệt!

Hix...Bác nói nặng lời quá. Nếu biết viết thì mình đã chả dám phiền bạn ý giú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

Thấy bạn sửa lisp được tưởng biết hàm điều kiện thôi chứ có gì mà nặng.

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
25 phút trước, TrNghia.Do đã nói:

Hix...Bác nói nặng lời quá. Nếu biết viết thì mình đã chả dám phiền bạn ý giúp :(

Có tinh thần học hỏi là tốt, diễn đàn rất khuyến khích điều này. Tuy nhiên thì bạn nên học 1 cách căn bản , chứ không nên "ăn xổi ở thì" không gốc cũng chẳng ngọn. Điều đó làm người trả lời mất nhiều thời gian , và không hứng thú trả lời cho lắm.

Vậy căn bản học ở đâu?, Bạn sẽ cần 1 cuốn sách : Lên diễn đàn hoặc Google gõ :" Lập trình thiết kế với Auto Lisp và VisuaLisp " của  tác giả Nguyễn Hữu Lộc. Sách này hướng dẫn dễ hiểu và căn bản. 

Mong bạn sẽ có những câu hỏi chọn lọc 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

Trong lisp này thì vị trí được chọn của list thứ 2 được lấy như sau
(cadr ##rat##).

Từ đó bạn viết hàm rẽ nhánh (lưu ý vị trí list được đánh số từ 0 chứ không phải từ 1 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
3 giờ trước, TrNghia.Do đã nói:

Hì hì....Cố giúp mình nốt lần này thôi :p

Đơn giản thế này thôi:

1. Ở hàm chính:

Sửa

(setq alpha_name (LM:dcld:getitems ##rat## alpha)
           dwg_name   (last alpha_name))

Thành thế này: 

(setq alpha_name (LM:dcld:getitems ##rat## alpha)
           dwg_name   (strcat (cadr alpha_name) "/" (last alpha_name)))

2. Hàm: insert_orc

Đặt lại Path => (setq path "E:/Nghia_AutoLisp 2012/")

3. Xong rồi...!

  • 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
4 giờ trước, Danh Cong đã nói:

Có tinh thần học hỏi là tốt, diễn đàn rất khuyến khích điều này. Tuy nhiên thì bạn nên học 1 cách căn bản , chứ không nên "ăn xổi ở thì" không gốc cũng chẳng ngọn. Điều đó làm người trả lời mất nhiều thời gian , và không hứng thú trả lời cho lắm.

Vậy căn bản học ở đâu?, Bạn sẽ cần 1 cuốn sách : Lên diễn đàn hoặc Google gõ :" Lập trình thiết kế với Auto Lisp và VisuaLisp " của  tác giả Nguyễn Hữu Lộc. Sách này hướng dẫn dễ hiểu và căn bản. 

Mong bạn sẽ có những câu hỏi chọn lọc hơn.

Em xin tiếp thu ý kiến của bác, cũng tại em cũng học ở mức vọc vạch thôi chứ cũng chưa hiểu căn bản gì cả :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
4 giờ trước, quocmanh04tt đã nói:

Đơn giản thế này thôi:

1. Ở hàm chính:

Sửa

(setq alpha_name (LM:dcld:getitems ##rat## alpha)
           dwg_name   (last alpha_name))

Thành thế này: 

(setq alpha_name (LM:dcld:getitems ##rat## alpha)
           dwg_name   (strcat (cadr alpha_name) "/" (last alpha_name)))

2. Hàm: insert_orc

Đặt lại Path => (setq path "E:/Nghia_AutoLisp 2012/")

3. Xong rồi...!

Cái này chỉ giải quyết được 1 phần của bài toán thôi bạn , mình muốn với hình chiếu bằng thì chỉ cần chọn 1 điểm thì sẽ chèn block .

Còn với hình chiếu cạnh sẽ chọn 2 điểm nhằm chọn hướng để insert block cơ.

Nhờ bạn xem lại giúp, mình đã trình bày rõ 2 cách chèn rồi đấy.

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
8 phút trước, TrNghia.Do đã nói:

Cái này chỉ giải quyết được 1 phần của bài toán thôi bạn , mình muốn với hình chiếu bằng thì chỉ cần chọn 1 điểm thì sẽ chèn block .

Còn với hình chiếu cạnh sẽ chọn 2 điểm nhằm chọn hướng để insert block cơ.

Nhờ bạn xem lại giúp, mình đã trình bày rõ 2 cách chèn rồi đấy.

Thanks !

1. À ra vậy, mình không để ý đến hàm chèn block, mà chỉ để ý đến đường dẫn đến file.

2. Command chèn Block ở hàm thứ hai, cái cuối cùng là góc xoay chứ không phải là điểm (p2).

Sửa như sau:

(defun insert_2   (/ ang p2 p3)
  (and (setq p2 (getpoint "center point:"))
       (setq p3 (getpoint "direction:" p2))
       (setq ang (angle p2 p3))
       (command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu canh/name.dwg" p2 "" "" (angtos ang))
       (command "_.Explode" "l")))

Đường dẫn theo như bài trướ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
13 phút trước, quocmanh04tt đã nói:

1. À ra vậy, mình không để ý đến hàm chèn block, mà chỉ để ý đến đường dẫn đến file.

2. Command chèn Block ở hàm thứ hai, cái cuối cùng là góc xoay chứ không phải là điểm (p2).

Sửa như sau:

(defun insert_2   (/ ang p2 p3)
  (and (setq p2 (getpoint "center point:"))
       (setq p3 (getpoint "direction:" p2))
       (setq ang (angle p2 p3))
       (command "insert" "E:/Nghia_AutoLisp 2012/Hinh chieu canh/name.dwg" p2 "" "" (angtos ang))
       (command "_.Explode" "l")))

Đường dẫn theo như bài trước nhé!

Cái này mình chưa hiểu lắm :

1. Ý mình muốn là với mỗi đường dẫn sẽ có hàm chèn block riêng khác nhau ý.

       - Duong dan "hinh chieu bang"  là chen truc tiep luon

       - Duong dan "hinh chieu canh" la chen theo 1 diem va goc xoay 

 

2. Đoạn code bạn mới viết theo mình hiểu là sửa cấu trúc lệnh của việc insert block theo điểm và góc cho mình.

Mình chưa hiểu nó liên quan gì đến "đường dẫn" mà bạn nói phía bài trc 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

Chán bạn quá!

 

(defun insert_2  (name / ang p2 p3 path)
  (setq path "E:/Nghia_AutoLisp 2012/")
  (if (not (tblsearch "BLOCK" name))
    (setq name (strcat path name ".dwg")))
  (if (setq p2 (getpoint "center point:"))
    (if (and (eq "Hinh chieu canh" (cadr alpha_name))
             (setq p3 (getpoint "direction:" p2))
             (setq ang (angle p2 p3)))
      (command "insert" name p2 "" "" (angtos ang) "_.Explode" "l")
      (command "insert" name p2 "" "" "" "_.Explode" "l"))))

 

Nhớ là name theo hướng dẫn sửa lisp ở trê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

Bạn biết hàm cond không.

 

nếu (cadr ###rat###) bằng 0 thì thực hiện kiểu này nếu bằng 1 thì kiểu kia. Nói từ sáng mà chịu khó xí thì xong 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
5 phút trước, duy782006 đã nói:

Bạn biết hàm cond không.

 

nếu (cadr ###rat###) bằng 0 thì thực hiện kiểu này nếu bằng 1 thì kiểu kia. Nói từ sáng mà chịu khó xí thì xong rồi.

Khổ mình ko biết mà, mình mới chỉ tập tọe mấy lệnh cơ bản và chỉ mới dừng ở mức viết các lệnh đơn giản liên quan đến mã lệnh có sẵn của cad thô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
10 phút trước, quocmanh04tt đã nói:

Chán bạn quá!

 

(defun insert_2  (name / ang p2 p3 path)
  (setq path "E:/Nghia_AutoLisp 2012/")
  (if (not (tblsearch "BLOCK" name))
    (setq name (strcat path name ".dwg")))
  (if (setq p2 (getpoint "center point:"))
    (if (and (eq "Hinh chieu canh" (cadr alpha_name))
             (setq p3 (getpoint "direction:" p2))
             (setq ang (angle p2 p3)))
      (command "insert" name p2 "" "" (angtos ang) "_.Explode" "l")
      (command "insert" name p2 "" "" "" "_.Explode" "l"))))

 

Nhớ là name theo hướng dẫn sửa lisp ở trên.

Hình như anh em đang không hiểu ý của nhau. Nếu như mình thay đoạn lisp trên vào thay thế hàm insert_orc thì chỉ có tác dụng thay đổi cách chèn cho toàn bộ thôi chứ. Cái mình muốn là có rẽ nhánh giữa 2 lựa chọn "hình chiếu bằng " và "hình chiếu cạnh"  cơ. Ứng với mỗi lựa chọn là 1 hàm insert riêng biệ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

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

×