Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
41 replies to this topic

#1 Chutuyen

Chutuyen

    biết vẽ circle

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

Đã gửi 19 May 2015 - 10:05 PM

ý 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


  • -1

#2 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 19 May 2015 - 10:50 PM

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


  • 0

#3 Chutuyen

Chutuyen

    biết vẽ circle

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

Đã gửi 20 May 2015 - 07:50 AM

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


  • -1

#4 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 May 2015 - 08:04 AM

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

  • 0

#5 Chutuyen

Chutuyen

    biết vẽ circle

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

Đã gửi 20 May 2015 - 08:21 AM

ý 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 ạ?


  • 0

#6 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 May 2015 - 01:32 PM

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


  • 1

#7 Chutuyen

Chutuyen

    biết vẽ circle

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

Đã gửi 20 May 2015 - 04:20 PM

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 ạ


  • 0

#8 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 May 2015 - 04:58 PM

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!


  • 0

#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 20 May 2015 - 05:56 PM

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


  • 1

#10 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 May 2015 - 07:02 PM

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.


  • 0

#11 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 May 2015 - 07:16 PM

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)

)


  • 0

#12 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 20 May 2015 - 09:17 PM

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

 

 

Bạn chưa xét tới Trường hợp dim làm tròn như Trường hợp này:

http://www.cadviet.c.../4/4652_dim.dwg


  • 0

#13 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 20 May 2015 - 10:24 PM

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
 


  • 0

#14 snowman.hms

snowman.hms

    biết vẽ ellipse

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

Đã gửi 21 May 2015 - 01:01 AM

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

  • 0

#15 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 25 May 2015 - 02:24 PM

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


  • 0

#16 snowman.hms

snowman.hms

    biết vẽ ellipse

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

Đã gửi 25 May 2015 - 11:01 PM

(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! ***|;

  • 0

#17 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 26 May 2015 - 08:23 AM

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.


  • 0

#18 snowman.hms

snowman.hms

    biết vẽ ellipse

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

Đã gửi 26 May 2015 - 08:58 AM

(ssget pt ....)
  • 1

#19 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 26 May 2015 - 10:14 AM

(ssget pt ....)

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. 


  • -1

#20 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 26 May 2015 - 10:31 AM

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

  • 1