Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
12 replies to this topic

#1 dungkaka89

dungkaka89

    biết pan

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

Đã gửi 10 June 2011 - 12:14 AM

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

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 10 June 2011 - 12:24 AM

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


#3 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 10 June 2011 - 12:47 PM

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

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

  • 1

#4 dungkaka89

dungkaka89

    biết pan

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

Đã gửi 13 June 2011 - 12:12 AM

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

#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 June 2011 - 06:35 AM

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


#6 dungkaka89

dungkaka89

    biết pan

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

Đã gửi 15 June 2011 - 11:00 PM

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.
Hình đã gửi
sau đó thì
Hình đã gửi

Cảm ơn bác
  • 0

#7 thuphong

thuphong

    biết vẽ circle

  • Members
  • PipPip
  • 34 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 16 June 2011 - 10:38 AM

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

#8 hugo007

hugo007

    biết lệnh erase

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

Đã gửi 16 June 2011 - 09:33 PM

Chưa rõ khái niệm "dropdown" của bạn là sao?
Đây là 1 dropdown theo ý tui.
Hình đã gửi

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

#9 congchivo

congchivo

    biết vẽ line

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

Đã gửi 12 November 2011 - 03:16 PM

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

#10 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 106 (tàm tạm)

Đã gửi 12 November 2011 - 08:11 PM

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

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#11 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 November 2011 - 09:00 PM

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


#12 congchivo

congchivo

    biết vẽ line

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

Đã gửi 13 November 2011 - 09:30 AM

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

#13 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 13 November 2011 - 09:41 AM

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

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D