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  
dungkaka89

[Yêu cầu] viết 1 lisp dropdown Layer như sau.

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

dungkaka89    0

dropdown Layer. Chủ đề này e đã nêu trong mục Thắc mắc . có bác bảo em viết bên Lisp này nên e mạo muội đưa nó sang đây. nếu ko đúng các bác thông cảm.

E có dùng Lisp đổi layer hiện hành bằng cách chọn màu nhưng nhiều lúc e thấy vẫn phải dùng đến List Layer (dropdown Layer) sổ cái thanh layer xuống có danh sách các Layer đưa 1 đôi tượng riêng lẻ về 1 layer mà mình muốn (khác layer hiện hành). Trường hợp trên bản vẽ chưa có layer đó chưa thể dùng MA được.

em tìm nhiều cách để làm việc này nhưng không thành công. Hoặc có thể có cách hay hơn mà em chưa biết. Mong các bác chỉ giáo. và xem xét viết cho e cái Lisp như yêu cầu. 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
ketxu    2.652

Mình chỉ có cách này. Bạn thử xem có dùng được không. Sổ danh sách chuẩn của CAD thì chịu r ^^

 

(defun Table (s / d r)
(while (setq d (tblnext s (null d)))
(setq r (cons (cdr (assoc 2 d)) r))
)
)
(defun LM:ListBox ( title data multiple / file tmp dch return )
 ;; © Lee Mac 2011

 (cond
   (
     (not
       (and (setq file (open (setq tmp (vl-filename-mktemp nil nil ".dcl")) "w"))
         (write-line
           (strcat "listbox : dialog { label = \"" title
             "\"; spacer; : list_box { key = \"list\"; multiple_select = "
             (if multiple "true" "false") "; } spacer; ok_cancel;}"
           )
           file
         )
         (not (close file)) (< 0 (setq dch (load_dialog tmp))) (new_dialog "listbox" dch)
       )
     )
   )
   (
     t     
     (start_list "list")
     (mapcar 'add_list data) (end_list)

     (setq return (set_tile "list" "0"))
     (action_tile "list" "(setq return $value)")

     (setq return
       (if (= 1 (start_dialog))
         (mapcar '(lambda ( x ) (nth x data)) (read (strcat "(" return ")")))
       )
     )          
   )
 )

 (if (< 0 dch) (unload_dialog dch))
 (if (setq tmp (findfile tmp)) (vl-file-delete tmp))

 return
)

Sử dụng :

(LM:listbox "Select a layer: " (table "layer") T), trả về tên Layer chọ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
gia_bach    1.442

dropdown Layer. Chủ đề này e đã nêu trong mục Thắc mắc . có bác bảo em viết bên Lisp này nên e mạo muội đưa nó sang đây. nếu ko đúng các bác thông cảm.

E có dùng Lisp đổi layer hiện hành bằng cách chọn màu nhưng nhiều lúc e thấy vẫn phải dùng đến List Layer (dropdown Layer) sổ cái thanh layer xuống có danh sách các Layer đưa 1 đôi tượng riêng lẻ về 1 layer mà mình muốn (khác layer hiện hành). Trường hợp trên bản vẽ chưa có layer đó chưa thể dùng MA được.

em tìm nhiều cách để làm việc này nhưng không thành công. Hoặc có thể có cách hay hơn mà em chưa biết. Mong các bác chỉ giáo. và xem xét viết cho e cái Lisp như yêu cầu. cảm ơn các bác

Chưa rõ khái niệm "dropdown" của bạn là sao?

Đây là 1 dropdown theo ý tui.

dropdown.jpg

 

Code tham khảo : (từ Cad 2006 mới có chức năng này.)

(defun c:SelectLay(/ cur_var d str1 str2 tmp tmplay)   
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1)
   (progn
     (or newlayer (setq newlayer (getvar "Clayer")))
     (setq str1  "" str2  "")
     (while (setq tbl (tblnext "Layer" (null tbl)))
(setq tmp (cdr (assoc 2 tbl))
      str1 (strcat  str1 "/" tmp )
      str2 (strcat  str2 " " tmp )))      
     (setq str1 (substr str1 2)
    str2 (substr str2 2))

     (setq cur_var (mapcar 'getvar '("DYNMODE" "DYNPROMPT")))
     (mapcar 'setvar '("DYNMODE" "DYNPROMPT") '(1 1))
     (initget str2)
     (setq tmpLay (getkword (strcat "\nChon Layer [" str1 " ] <"(princ newlayer)">: ") ))
     (and tmpLay (setq newlayer tmpLay))
     (mapcar 'setvar '("DYNMODE" "DYNPROMPT") cur_var)

     (alert (strcat "Ban chon Layer [" newlayer "]."))
     (princ newlayer))
   (alert "Cad khong ho tro dropdown."))  
 (princ)  )

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

Cảm ơn bac Gia_bach. e làm được rồi. cái lisp của bác hay đấy. Cho em hỏi thêm làm sao để đổi lệnh trong Lisp được, em muốn đổi Selectlay thành phím F4 thì làm thế nào. Cảm ơn bác

Cái Lisp của ketxu lệnh dài quá. không nhớ được. cái bảng hiện ra thì quá nhỏ. nếu nhiều layer thì chọn cũng khó khăn hơn. sửa lại chút đ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
ketxu    2.652

Cảm ơn bac Gia_bach. e làm được rồi. cái lisp của bác hay đấy. Cho em hỏi thêm làm sao để đổi lệnh trong Lisp được, em muốn đổi Selectlay thành phím F4 thì làm thế nào. Cảm ơn bác

Cái Lisp của ketxu lệnh dài quá. không nhớ được. cái bảng hiện ra thì quá nhỏ. nếu nhiều layer thì chọn cũng khó khăn hơn. sửa lại chút đi.

Chứng tỏ bạn chưa hiểu chút gì về lisp cả, thật khó khăn để mình trình bày ý tưởng :) Mình xin rút lui ^^

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

Nhờ Bác Gia_bach xem lại giùm.

cái Dropdow layer của em như sau.

cái Lisp bác cho em thì e sổ layer được rùi. nhưng e muốn chuyển layer hiện hành sang layer khác trong cái danh sách layer đó thì không chọn được. Nó hiện 1 cái thông báo chọn 1 layer khác. nhưng không chuyển sang layer đó đc.

chuyenlayer.jpg

sau đó thì

khongchuyendc.jpg

 

Cảm ơn 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
thuphong    18

Bạn muốn chọn Layer thì sao bạn không dùng cái dropdow có sẵn của CAD, có chậm đâu bạn? Còn vẫn nếu muốn dùng Lisp của Bác Gia_Bach thì xin mạn phép Bác ( :rolleyes: )bạn thêm dòng sau vào CODE của Bác í:

(command "-layer" "s" newlayer "")

Dòng này thêm vào trước (hay sau) dòng :(princ newlayer)

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

Chưa rõ khái niệm "dropdown" của bạn là sao?

Đây là 1 dropdown theo ý tui.

dropdown.jpg

 

Code tham khảo : (từ Cad 2006 mới có chức năng này.)

(defun c:SelectLay(/ cur_var d str1 str2 tmp tmplay)   
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1)
   (progn
     (or newlayer (setq newlayer (getvar "Clayer")))
     (setq str1  "" str2  "")
     (while (setq tbl (tblnext "Layer" (null tbl)))
(setq tmp (cdr (assoc 2 tbl))
      str1 (strcat  str1 "/" tmp )
      str2 (strcat  str2 " " tmp )))      
     (setq str1 (substr str1 2)
    str2 (substr str2 2))

     (setq cur_var (mapcar 'getvar '("DYNMODE" "DYNPROMPT")))
     (mapcar 'setvar '("DYNMODE" "DYNPROMPT") '(1 1))
     (initget str2)
     (setq tmpLay (getkword (strcat "\nChon Layer [" str1 " ] <"(princ newlayer)">: ") ))
     (and tmpLay (setq newlayer tmpLay))
     (mapcar 'setvar '("DYNMODE" "DYNPROMPT") cur_var)

     (alert (strcat "Ban chon Layer [" newlayer "]."))
     (princ newlayer))
   (alert "Cad khong ho tro dropdown."))  
 (princ)  )

Nhờ các bác chỉnh lại lisp này cho hiện sổ danh sách bên Dimension style giùm e.Sao tên layer e đặt là S01.FDGG thì nó không hiểu.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
congchivo    1

bac ketxu oiii, em có cái này muốn hỏi bác và nờ bác giúp, nhờ bác viết hộ em cái lisp chọn đối tượng của 1 lớp layer trong bản vẽ hiện hành rất nhiều layer, mình dùng lệnh fi trong cad cũng thấy hơi lâu , mình muốn nhờ bác viết một lisp khi chọn 1 đối tượng thuộc 1 layer thì tất cả lớp layer đó được chọn. mình cảm ơn bác nhiều. địa chỉ mail của em là congchivo@gmail.com .

em chân thành cảm ơn bác trướ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
hochoaivandot    108

bac ketxu oiii, em có cái này muốn hỏi bác và nờ bác giúp, nhờ bác viết hộ em cái lisp chọn đối tượng của 1 lớp layer trong bản vẽ hiện hành rất nhiều layer, mình dùng lệnh fi trong cad cũng thấy hơi lâu , mình muốn nhờ bác viết một lisp khi chọn 1 đối tượng thuộc 1 layer thì tất cả lớp layer đó được chọn. mình cảm ơn bác nhiều. địa chỉ mail của em là congchivo@gmail.com .

em chân thành cảm ơn bác trước....

Thay vì yêu cầu Lisp từ chuyên gia Lisp ketxu, bạn hãy nghiên cứu lệnh SSX trong công cụ Express sẵn có của Autodesk.

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

bac ketxu oiii, em có cái này muốn hỏi bác và nờ bác giúp, nhờ bác viết hộ em cái lisp chọn đối tượng của 1 lớp layer trong bản vẽ hiện hành rất nhiều layer, mình dùng lệnh fi trong cad cũng thấy hơi lâu , mình muốn nhờ bác viết một lisp khi chọn 1 đối tượng thuộc 1 layer thì tất cả lớp layer đó được chọn. mình cảm ơn bác nhiều. địa chỉ mail của em là congchivo@gmail.com .

em chân thành cảm ơn bác trước....

(defun c:Sal () (sssetfirst nil (ssget "_X" (list (assoc 8 (entget (car (entsel "\nChon doi tuong mau : ")))))))(princ))

Bạn không nên nhờ viết lisp trong 1 topic khác, và cũng k nên chỉ đích danh tên 1 ai đó nếu vấn đề đó không quá đặc biệt.

Lisp bạn cần có rất nhiều trên 4room, hi vọng lần sau bạn search trước khi hỏ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
duy782006    1.374

cảm ơn anh ketxu lần sau em sẽ rút kinh nghiệm, em cảm ơn anh rất nhiều

do em kiếm hoài mà không thấy may quá gặp anh

Nói chung cảm ơn nhiều hay cảm ơn rất nhiều cũng ko bằng nhấn nút Like this như vậy ko rác diển đàn mà còn cho thấy bạn có quan tâm tới sân chơi mình tham gia.

  • 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  

×