Đến nội dung


Hình ảnh
- - - - -

List Tất Cả Layer, Teststyle, Dimstyle Trong Bản Vẽ Hiện Hành


  • Please log in to reply
5 replies to this topic

#1 mrphuocvie

mrphuocvie

    biết vẽ ellipse

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

Đã gửi 03 February 2016 - 08:26 AM

Chào Cadviet.com,

Mấy ngày nay mình loay hoay một vấn đề mà chưa biết cách giải quyết. Tìm kiếm trên mạng cũng chưa thấy.

Có 1 đoạn code của Lee Mac nhưng nó quá dài và cũng không biết đoạn code đó ở chỗ nào.

http://www.cadviet.c...numincv39_1.lsp

Mình muốn viết 1 đoạn code list tất cả các layer, textstyle, dimstyle để có thể chọn trực tiếp trong khi thao tác luôn chứ không phải set current nó rồi mới thực hiện lisp.

VD:

(defun c:ABC()

        …

        (initget "layer1 layer2 … layern") ;xuat hien tat ca layer trong ban ve de chon

                (initget "texstyle1 textstyle2 … textstylen") ;xuat hien tat ca textstyle trong ban ve de chon

                (initget "dimtyle1 dimstyle2 … dimstylen") ;xuat hien tat ca dimstyle trong ban ve de chon

        Command1

Command2

Commandn

)

Mong mọi người góp ý.

Cảm ơn!


  • -2

#2 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 03 February 2016 - 10:43 AM

Cái này viết theo kiểu của Duy. Cái này riêng layer thì cho cái layer hiện hành lên đầu danh sách (vì mục đích cá nhân của Duy) nên trong list layer sẽ có 2 dòng tên layer hiện hành do Duy cũng lười nên để thế.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Tao list chua bang mo ta
;;;Cu phap su dung (duy:taolist kieu) kieu gom co appid block dimstyle layer ltype style ucs view vport
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:taolist (kieu / kieu nl lkq)
(setq lkq'())
(setq nl (tblnext kieu T))
(while nl
(setq lkq (append lkq (list (cdr (assoc 2 nl)))))
(setq nl (tblnext kieu))
)
(cond
((= kieu "layer") (setq lstthem (list  (getvar "CLAYER"))) (setq lkq (append lstthem lkq)) )
((/= kieu "layer") )
)
lkq)

  • 0

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


#3 mrphuocvie

mrphuocvie

    biết vẽ ellipse

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

Đã gửi 03 February 2016 - 07:35 PM

 

Đây bạn!

(defun numinc:gettableitems ( table / a b )
 (while (setq a (tblnext table (null a)))
  (if
   (not
    (or (wcmatch (cdr (assoc 2 a)) "`**,*|*")
     (and (= "layer" (strcase table t))
      (= 4 (logand 4 (cdr (assoc 70 a)))))))
            (setq b (cons (cdr (assoc 2 a)) b))))
 (acad_strlsort b))
;EX1: (numinc:gettableitems "layer")
;EX2: (numinc:gettableitems "style")
;EX3: (numinc:gettableitems "dimstyle")

Cảm phiền anh hướng dẫn thêm xíu về cách sử dung đươc không ah.


  • -1

#4 mrphuocvie

mrphuocvie

    biết vẽ ellipse

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

Đã gửi 04 February 2016 - 10:05 PM

;20160204-GETSTYLE
;--------------------------------------------DIALOG-------------------------------------------------------
;getstyle : dialog { //dialog name
;	label = "Select Layer, Textstyle, Dimstyle" ; //give it a label
;		: column { 
;			: popup_list { //define list box
;						key = "sel_lyr"; //give it a name
;						label = "Select layer";
;						value = "0"; //initial value
;			} //end list
;			: popup_list { //define list box
;						key = "sel_tst"; //give it a name
;						label = "Select textstyle";
;						value = "0"; //initial value
;			} //end list
;			: popup_list { //define list box
;						key = "sel_dst"; //give it a name
;						label = "Select dimstyle";
;						value = "0"; //initial value
;			} //end list
;		} //end column
;	ok_cancel ; //predifined OK/Cancel 
;} //end dialog
;--------------------------------------------lISP-------------------------------------------------------
(defun C:GETSTYLE( / table_lyr table_tst table_dst lyrs tsts dsts);define funcion
	(setvar "cmdecho" 0);switch off command echo
	;Get list of all Layer
	(vlax-for lyr
		(vla-get-layers
			(vla-get-activedocument
				(vlax-get-acad-object)
			)
		)
		(setq table_lyr (cons (vla-get-name lyr) table_lyr))
	)
	;Get list of all Textstyles
	(vlax-for tst
		(vla-get-textstyles
			(vla-get-activedocument
				(vlax-get-acad-object)
			)
		)
		(setq table_tst (cons (vla-get-name tst) table_tst))
	)
	;Get list of all Dimstyles
	(vlax-for dst
		(vla-get-dimstyles
			(vla-get-activedocument
				(vlax-get-acad-object)
			)
		)
		(setq table_dst (cons (vla-get-name dst) table_dst))
	)
	(setq dcl_id (load_dialog "getstyle.dcl"))		;load dialogue
	(if (not (new_dialog "getstyle" dcl_id)			;check for errors
		)											;not
		(exit)										;if problem exit
	)												;if
	;Layer
	(set_tile "sel_lyr" "0")						;initilise list box
	(start_list "sel_lyr")							;start the list
	(mapcar 'add_list table_lyr)					;add the layer table_lyr
	(end_list)										;end the list
	;Textstyles
	(set_tile "sel_tst" "0")						;initilise list box
	(start_list "sel_tst")							;start the list
	(mapcar 'add_list table_tst)					;add the layer table_tst
	(end_list)										;end the list
	;Dimstyles
	(set_tile "sel_dst" "0")						;initilise list box
	(start_list "sel_dst")							;start the list
	(mapcar 'add_list table_dst)					;add the layer table_dst
	(end_list)										;end the list	
	;Action
	(action_tile "accept" "(setq ddiag 2)(Assign_value)(done_dialog)")
	(action_tile "cancel" "(setq ddiag 1)(done_dialog)")
	(start_dialog)									;Display the dialog box
	(unload_dialog dcl_id)							;Unload the dialog box
	(if(= ddiag 1)									;If the user pressed the Cancel button
		(princ "\n Cancelled!")
	)
	(if(= ddiag 2)									; If the user pressed the Okay button
		(progn
		  (alert (strcat "\nYou Selected Layer:" lyrs ",Textstyle: " tsts ",Dimstyle: " dsts))
		)
	);end if
	(princ)
);defun

	(defun Assign_value()
		;Layer
		(setq lyrs (nth (atoi (get_tile sel_lyr)) sel_lyr)) 
		;Textstyles
		(setq tsts (nth (atoi (get_tile sel_tst)) sel_tst)) 
		;Dimstyles
		(setq dsts (nth (atoi (get_tile sel_dst)) sel_dst))
	)

Xin lỗi, vì có thể vấn đề này hơi bi dư thừa cho nhiều người. Nhưng mình đang găp thắc mắc.

1.       Nhờ moi người sửa giúp đoan lisp trên.

2.       Chỉ ra lỗi của nó.

3.       Theo mình biết thì muốn có Dialog (hôp thoai) thì cần có 1 file .dcl để goi khi chay. Nhưng trong đoan lisp mình xem trên Lee Mac thì nó đươc tích hơp trong .lsp luôn. Vây, cách tao nó như thế nào. Có thể áp dung trong bài này luôn đươc không?

Xin cảm ơn!


  • -1

#5 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 05 February 2016 - 05:35 PM

Gửi bạn lsp đã sửa:

;;; GETSTYLE - SETSTYLE
(defun C:SS  (/ dcl_id ddiag dim dsts fname lay lst lyrs sty table_dst table_lyr table_tst tsts)
 (setvar "cmdecho" 0)
 ;;Get list of all Layer-Textstyle-Dimstyle
 (vlax-for lyr  (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
  (setq table_lyr (cons (vla-get-name lyr) table_lyr)))
 (vlax-for tst  (vla-get-textstyles (vla-get-activedocument (vlax-get-acad-object)))
  (setq table_tst (cons (vla-get-name tst) table_tst)))
 (vlax-for dst  (vla-get-dimstyles (vla-get-activedocument (vlax-get-acad-object)))
  (setq table_dst (cons (vla-get-name dst) table_dst)))
 ;; Get-current style
 (setq lst (mapcar 'getvar '("CLAYER" "TEXTSTYLE" "DIMSTYLE"))
       lay (itoa (vl-position (car lst) table_lyr))
       sty (itoa (vl-position (cadr lst) table_tst))
       dim (itoa (vl-position (caddr lst) table_dst)))
 ;; Create Dialog
 (create_dialog)
 ;; Load dialog
 (if (not (new_dialog "getstyle" (setq dcl_id (load_dialog fname))))
  (exit))
 ;;Layer
 (set_tile "sel_lyr" lay)
 (start_list "sel_lyr")
 (mapcar 'add_list table_lyr)
 (end_list)
 ;;Textstyles
 (set_tile "sel_tst" sty)
 (start_list "sel_tst")
 (mapcar 'add_list table_tst)
 (end_list)
 ;;Dimstyles
 (set_tile "sel_dst" dim)
 (start_list "sel_dst")
 (mapcar 'add_list table_dst)
 (end_list)
 ;;Action
 (action_tile "accept" "(setq ddiag 2)(Assign_value)(done_dialog)")
 (action_tile "cancel" "(setq ddiag 1)(done_dialog)")
 (start_dialog)
 (unload_dialog dcl_id)
 (if (= ddiag 1)
  (princ "\n Cancelled!"))
 (if (= ddiag 2)
  (progn (alert (strcat "\nYou Selected Layer: " lyrs ", Textstyle: " tsts ", Dimstyle: " dsts))))
 ;; Delete DCL
 (vl-file-delete fname)
 (princ))
;;;----------------
(defun Assign_value  ()
 (setq lyrs (nth (atoi (get_tile "sel_lyr")) table_lyr)
       tsts (nth (atoi (get_tile "sel_tst")) table_tst)
       dsts (nth (atoi (get_tile "sel_dst")) table_dst))
 (mapcar 'setvar '("CLAYER" "TEXTSTYLE") (list lyrs tsts))
 (vla-put-activeDimstyle (vla-get-ActiveDocument (vlax-get-acad-object))
                         (vla-item (vla-get-Dimstyles (vla-get-ActiveDocument (vlax-get-acad-object))) dsts)))
;;;----------------
(defun create_dialog  (/ lst-dia fn)
 (setq lst-dia (list "getstyle: dialog {" "label = \"Select Layer, Textstyle, Dimstyle\";"
                     ": column { "
                      ": popup_list {"
                       "key = \"sel_lyr\";
     label = \"Select layer\";
     }"
                      ": popup_list {" "key = \"sel_tst\";
     label = \"Select textstyle\";
     }"
                      ": popup_list {" "key = \"sel_dst\";
     label = \"Select dimstyle\";
     }" "}" "ok_cancel ;}"))
 (setq fname (vl-filename-mktemp "getstyle.dcl")
       fn    (open fname "w"))
 (foreach x lst-dia (write-line x fn))
 (close fn))

1. Như trên.

2. Lỗi trong file của bạn: ở hàm Assign_value -> (get_tile key), key ở đây nằm phải trong "", xem lsp đã sửa.

3. DCL nằm trong file .lsp:

+ Nguyên tắc chung:

- dùng lsp tạo ra 1 file DCL nằm đâu đó trong máy mà Cad tự tìm đến được và load khi cần.

- dùng xong thì lsp xóa DCL đi.

+ Tham khảo: http://www.afralisp....file-part-2.php


  • 0

#6 mrphuocvie

mrphuocvie

    biết vẽ ellipse

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

Đã gửi 06 February 2016 - 06:18 AM

Gửi bạn lsp đã sửa:

;;; GETSTYLE - SETSTYLE
(defun C:SS  (/ dcl_id ddiag dim dsts fname lay lst lyrs sty table_dst table_lyr table_tst tsts)
 (setvar "cmdecho" 0)
 ;;Get list of all Layer-Textstyle-Dimstyle
 (vlax-for lyr  (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
  (setq table_lyr (cons (vla-get-name lyr) table_lyr)))
 (vlax-for tst  (vla-get-textstyles (vla-get-activedocument (vlax-get-acad-object)))
  (setq table_tst (cons (vla-get-name tst) table_tst)))
 (vlax-for dst  (vla-get-dimstyles (vla-get-activedocument (vlax-get-acad-object)))
  (setq table_dst (cons (vla-get-name dst) table_dst)))
 ;; Get-current style
 (setq lst (mapcar 'getvar '("CLAYER" "TEXTSTYLE" "DIMSTYLE"))
       lay (itoa (vl-position (car lst) table_lyr))
       sty (itoa (vl-position (cadr lst) table_tst))
       dim (itoa (vl-position (caddr lst) table_dst)))
 ;; Create Dialog
 (create_dialog)
 ;; Load dialog
 (if (not (new_dialog "getstyle" (setq dcl_id (load_dialog fname))))
  (exit))
 ;;Layer
 (set_tile "sel_lyr" lay)
 (start_list "sel_lyr")
 (mapcar 'add_list table_lyr)
 (end_list)
 ;;Textstyles
 (set_tile "sel_tst" sty)
 (start_list "sel_tst")
 (mapcar 'add_list table_tst)
 (end_list)
 ;;Dimstyles
 (set_tile "sel_dst" dim)
 (start_list "sel_dst")
 (mapcar 'add_list table_dst)
 (end_list)
 ;;Action
 (action_tile "accept" "(setq ddiag 2)(Assign_value)(done_dialog)")
 (action_tile "cancel" "(setq ddiag 1)(done_dialog)")
 (start_dialog)
 (unload_dialog dcl_id)
 (if (= ddiag 1)
  (princ "\n Cancelled!"))
 (if (= ddiag 2)
  (progn (alert (strcat "\nYou Selected Layer: " lyrs ", Textstyle: " tsts ", Dimstyle: " dsts))))
 ;; Delete DCL
 (vl-file-delete fname)
 (princ))
;;;----------------
(defun Assign_value  ()
 (setq lyrs (nth (atoi (get_tile "sel_lyr")) table_lyr)
       tsts (nth (atoi (get_tile "sel_tst")) table_tst)
       dsts (nth (atoi (get_tile "sel_dst")) table_dst))
 (mapcar 'setvar '("CLAYER" "TEXTSTYLE") (list lyrs tsts))
 (vla-put-activeDimstyle (vla-get-ActiveDocument (vlax-get-acad-object))
                         (vla-item (vla-get-Dimstyles (vla-get-ActiveDocument (vlax-get-acad-object))) dsts)))
;;;----------------
(defun create_dialog  (/ lst-dia fn)
 (setq lst-dia (list "getstyle: dialog {" "label = \"Select Layer, Textstyle, Dimstyle\";"
                     ": column { "
                      ": popup_list {"
                       "key = \"sel_lyr\";
     label = \"Select layer\";
     }"
                      ": popup_list {" "key = \"sel_tst\";
     label = \"Select textstyle\";
     }"
                      ": popup_list {" "key = \"sel_dst\";
     label = \"Select dimstyle\";
     }" "}" "ok_cancel ;}"))
 (setq fname (vl-filename-mktemp "getstyle.dcl")
       fn    (open fname "w"))
 (foreach x lst-dia (write-line x fn))
 (close fn))

1. Như trên.

2. Lỗi trong file của bạn: ở hàm Assign_value -> (get_tile key), key ở đây nằm phải trong "", xem lsp đã sửa.

3. DCL nằm trong file .lsp:

+ Nguyên tắc chung:

- dùng lsp tạo ra 1 file DCL nằm đâu đó trong máy mà Cad tự tìm đến được và load khi cần.

- dùng xong thì lsp xóa DCL đi.

+ Tham khảo: http://www.afralisp....file-part-2.php

Cảm ơn anh rất nhiều!


  • 0