Chuyển đến nội dung
Diễn đàn CADViet
Chutuyen

(Yêu Cầu) lisp copy nội dung text trong một loạt dimenson...

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

ý tưởng của minh là viết đoạn lisp có tác dụng là lọc lấy phần text của tất cả các kích thước m chọn, mong các cao thủ giúp đỡ....thank

  • Vote giảm 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

Lọc xong rồi làm gì nữa bạn???

Bạn phải ghi rõ yêu cầu để các anh chị khác hình dung được và khi đó mới giúp đỡ bạn được chứ

Theo yêu cầu của bạn thì chỉ cần lấy cặp (assoc 42 ) của đối tượng Dimension là đượ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

lọc xong paste vao mot noi nào đấy minh thích ấy? thank b Tr.CongSon lan nưa?

À,vậy thì thuật toán thế này đúng không

  1. Chọn đối tượng Dim-->Sau đó lấy text dim (chú ý dim đã bị Edit thì mã dxf 1 nhé)
  2. Chèn Text Dim vào text hoặcDim nào đó
  3. Lặp lại thao tác trên với Dim khá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

ý em đơn gian hơn a, tức như lênh copy ấy
- chọn đối tượng Dim sau đó lấy text dán bất kì vào chỗ nào nếu minh thích k0 cần chèn vào đâu ạ?

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 đơn gian hơn a, tức như lênh copy ấy

- chọn đối tượng Dim sau đó lấy text dán bất kì vào chỗ nào nếu minh thích k0 cần chèn vào đâu ạ?

Hi vọng đúng ý bạn,do không rõ rang về chiều cao text,textstyle khi xuất ra nên mình lấy theo Dimstyle hiện hành

(defun c:CD (/ htxt sel txtdim) ;;Coppy gia tri dim

(command "undo" "BE")

(setvar "cmdecho" 0)

(setq sel (entget (car (entsel "\n Select Dim:")))

txtdim (rtos(cdr(assoc 42 sel)) 2 0)

htxt (* (getvar "DIMTXT") (getvar "DIMSCALE")));chcao text

(command "text" (getpoint"\nChon Diem dat Text:") htxt 0 txtdim )

(setvar "cmdecho" 1)

(command "undo" "End")

(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

Cám ơn a nhe! gần đúng ý em... nếu muốn copy nhiều Dim một lúc thì làm thế nào ạ? còn chiều cao text,textstyle thế nào cũng dk ạ

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ám ơn a nhe! gần đúng ý em... nếu muốn copy nhiều Dim một lúc thì làm thế nào ạ? còn chiều cao text,textstyle thế nào cũng dk ạ[/size]

Em đang học Lisp thì nên học them các hàm ssget,while sẽ thực hiện được

Cứ mò thử xem,không được thì cứ post đoạn code lên mấy anh chị trên diễn đàn sẽ giúp,sẵn tiện cho mình học hỏi theo luôn

vì Mình cũng mới học lisp nên trình cũng còn kém lắm^^

Với bài toán bạn nêu có thể làm theo các bước sau:

  • Đầu tiên chon các Dim (tham khảo thêm hàm ssget để chon tập đối tượng)
  • Sau đó duyệt qua từng phần tử (dùng hàm foreach hoặc while,repeate... )rồi thực hiện các bước như code lúc nãy mình post

Có gì cứ post code lên anh em sẽ xem  giúp cho!

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

Lisp bạn Tr. CongSon viết chưa tính tới trường hợp Dim bị làm tròn...........

Anh Tue_NV có thể giải thích rõ hơn được không ạ???

Phải xét đến trường hợp Dim bị edit  ( xét mã (dxf 1) nữa ) phải không anh.

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

Như vậy đúng Không a Tue_NV

Lisp em toàn học mót nên chắc còn lủng củng lắm^^ Mong anh sửa chữa ,chỉ bảo them.

(defun c:CD (/ htxt sel txtdim) ;;Coppy gia tri dim
(setvar "cmdecho" 0)
(command "undo" "BE")
(setq htxt (* (getvar "DIMTXT") (getvar "DIMSCALE")));chcao text
(while (setq sel (entget (car (entsel "\n Select Dim:"))))
(if (/= (setq dxf1 (cdr (assoc 1 sel))) "")
(setq txtdim dxf1)
(setq txtdim (rtos(cdr(assoc 42 sel)) 2 0))
)
(command "text" (getpoint"\nChon Diem dat Text:") htxt 0 txtdim )
)
(setvar "cmdecho" 1)

(command "undo" "End")

(princ)

)

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ậy trường hợp này a Tue_NV có thể code thêm 1 đoạn cho em học hỏi với ạ

Vì em dùng(rtos) thì nó làm fix xuống chứ ko làm tròn lên được.hic
 

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

(defun c:test (/ ent str _StringSubst _sel)
(vl-load-com)
(defun _StringSubst (new old str / inc len)
(setq len (strlen new)
inc 0
)
(while (setq inc (vl-string-search old str inc))
(setq str (vl-string-subst new old str inc)
inc (+ inc len)
)
)
str
)
(defun _sel (/ ent enx str)
(while
(progn
(setvar 'errno 0)
(setq ent (nentsel "\nSelect a Dimension Text..."))
(cond
((= 7 (getvar 'errno)) (princ "\nMissed, try again."))
((= 'ename (type (car ent)))
(if
(and (wcmatch (cdr (assoc 0 (setq enx (entget (car ent)))))
"*TEXT"
)
(= 4 (length ent))
(wcmatch
(cdr
(assoc 0 (entget (car (cadddr ent))))
)
"*DIMENSION"
)
)
(progn (setq str (cdr (assoc 1 enx)))
nil
)
(princ "\nInvalid object selected.")
)
)

)
)
)
str
)
(if (setq str (_sel))
(progn
(setq str (_StringSubst "" "\\A1;" str))
(princ (strcat "\nThe Dimension' Value is: " str)))
(princ "\nNo object selected!")
)

(princ)
)

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

Lisp của a snowman.hms  rất hay nhưng có cái bất tiện ở chỗ ,user phải pick trúng đối tượng textdim thì mới thoải mãn^^

Còn nếu pick đường linedim thì chịu^^

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

(defun c:test (/ e s p)
(while (setq s (LM:UnFormat (_sel "\nSelect a Dimension :") nil))
(or (and (setq p (car (entsel "\nSelect a Text/Mtext or <Point> :")))
(wcmatch (cdr (assoc 0 (entget p))) "*TEXT")
)
(setq p (cadr (grread t 15 0)))
)
(if (listp p)
(_text p s)
(progn (setq e (entget p))
(entmod (subst (cons 1 s) (assoc 1 e) e))
(entupd (cdr (assoc -1 e)))
)
)
)
(princ)
)
(defun _text (pt str)
(entmakex (list (cons 0 "TEXT")
(cons 1 str)
(cons 10 pt)
(cons 40 (getvar 'textsize))
)
)
)
(defun _Sel (msg / en el dstr dblk)
(while
(progn (setvar 'ERRNO 0)
(setq en (car (entsel msg)))
(cond
((= 7 (getvar 'ERRNO))
(princ "\n--> Missed, Try again.")
)
((eq 'ENAME (type en))
(if (wcmatch (cdr (assoc 0 (setq el (entget en))))
"*DIMENSION"
)
(progn
(if (setq dblk (tblobjname "BLOCK" (cdr (assoc 2 el))))
(while (and (setq dblk (entnext dblk)) (not dstr))
(if (eq "MTEXT" (cdr (assoc 0 (setq el (entget dblk)))))
(setq dstr (cdr (assoc 1 el)))
)
)
)
nil
)
(princ "\n--> Invalid Object Selected.")
)
)
)
)
)
dstr
)
;;-------------------=={ UnFormat String }==------------------;;
;; ;;
;; Returns a string with all MText formatting codes removed. ;;
;;------------------------------------------------------------;;
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;;
;;------------------------------------------------------------;;
;; Arguments: ;;
;; str - String to Process ;;
;; mtx - MText Flag (T if string is for use in MText) ;;
;;------------------------------------------------------------;;
;; Returns: String with formatting codes removed ;;
;;------------------------------------------------------------;;

(defun LM:UnFormat ( str mtx / _replace rx )

(defun _replace ( new old str )
(vlax-put-property rx 'pattern old)
(vlax-invoke rx 'replace str new)
)
(if (setq rx (vlax-get-or-create-object "VBScript.RegExp"))
(progn
(setq str
(vl-catch-all-apply
(function
(lambda ( )
(vlax-put-property rx 'global actrue)
(vlax-put-property rx 'multiline actrue)
(vlax-put-property rx 'ignorecase acfalse)
(foreach pair
'(
("\032" . "\\\\\\\\")
(" " . "\\\\P|\\n|\\t")
("$1" . "\\\\(\\\\[ACcFfHLlOopQTW])|\\\\[ACcFfHLlOopQTW][^\\\\;]*;|\\\\[ACcFfHLlOopQTW]")
("$1$2/$3" . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
("$1$2" . "\\\\(\\\\S)|[\\\\](})|}")
("$1" . "[\\\\]({)|{")
)
(setq str (_replace (car pair) (cdr pair) str))
)
(if mtx
(_replace "\\\\" "\032" (_replace "\\$1$2$3" "(\\\\[ACcFfHLlOoPpQSTW])|({)|(})" str))
(_replace "\\" "\032" str)
)
)
)
)
)
(vlax-release-object rx)
(if (null (vl-catch-all-error-p str))
str
)
)
)
)
(vl-load-com)
;|«Visual LISP© Format Options»
(70 2 1 2 nil "_eof " 100 9 0 0 1 T T T T)
;*** DO NOT add text below the comment! ***|;

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 bác cho tui hỏi chút nhé: tôi muốn dùng lisp để chọn đối tượng có một tọa độ biết trước viết code như thế nào vậy các bác. Xin cảm ơ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

nhưng tại đó có nhiều đối tượng tôi chỉ muốn chọn 1 đối tượng thui bác ơi. 

Hình như theo mình được biết thì (ssget point)  thì chỉ chon được đối tượng vẽ sau cùng thôi^^

Nếu bạn muốn chỉ chọn 1 đối tượng thì Đối tượng cần lấy phải có gì đặc biệt so với các đối tượng khác ,có 2 cách^ :

  1. Kết hợp tham số Filter-List cho hàm ssget
  2. Dùng vòng lặp (while,foreach,repeat ..) lọc qua từng đối tượng rồi chon đối tượng cần^^
  • 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

 

Hình như theo mình được biết thì (ssget point)  thì chỉ chon được đối tượng vẽ sau cùng thôi^^

Nếu bạn muốn chỉ chọn 1 đối tượng thì Đối tượng cần lấy phải có gì đặc biệt so với các đối tượng khác ,có 2 cách^ :

  1. Kết hợp tham số Filter-List cho hàm ssget
  2. Dùng vòng lặp (while,foreach,repeat ..) lọc qua từng đối tượng rồi chon đối tượng cần^^

 

Vậy tức là không dùng tham số  Filter-List cho hàm (ssget point) đượ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

 

Hình như theo mình được biết thì (ssget point)  thì chỉ chon được đối tượng vẽ sau cùng thôi^^

Nếu bạn muốn chỉ chọn 1 đối tượng thì Đối tượng cần lấy phải có gì đặc biệt so với các đối tượng khác ,có 2 cách^ :

  1. Kết hợp tham số Filter-List cho hàm ssget
  2. Dùng vòng lặp (while,foreach,repeat ..) lọc qua từng đối tượng rồi chon đối tượng cần^

Tôi viết thế này là khôn được phải không? (ssget point '((8 ."file 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ôi viết thế này là khôn được phải không? (ssget point '((8 ."file 1")))

Point ở đây là tọa độ điểm bạn ạ ,cấu trúc lệnh (ssget <point> Filter-List)

Ex: (ssget '(120 100 0) '((8 . "file 1")))

Bạn chú ý : mã dxf 8 là Layer name 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
(setq p (getpoint "\nSelect object...")
      s (ssget "_C" p p '((0 . "LINE"))))

cảm ơn bạn. mình làm đã đạt yêu cầu rồi. còn vấn đề này mình nhờ nữa nhé. mình có 1 biến x khi chạy lisp yêu cầu nhập vào. nhưng khi lần sau dùng lệnh lại mình muốn ấn enter bỏ qua và muốn dùng lại giá trị đã sử dụng lệnh trước đó còn nếu muốn thay giá trị thì nhập vào nó sẽ thay giá trị khá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

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

×