Đến nội dung


Hình ảnh

đối tượng + command line


  • Please log in to reply
32 replies to this topic

#21 amateurday

amateurday

    biết lệnh break

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

Đã gửi 08 May 2009 - 11:10 PM


(setq mouse nil)
(while (/= (car mouse) 2)
(setq mouse (grread 0 15 2))
(if (= (car mouse) 3)
(progn
(setq p1 (mapcar '+ (cadr mouse) '(0.1 0.1))
p2 (mapcar '- (cadr mouse) '(0.1 0.1))
ent (ssget "c" p2 p1)
)
(if (and ent (assoc 1 (entget (ssname ent 0))))
(princ (strcat "\n" (Cdr (assoc 1 (entget (ssname ent 0))))))
)
)
)
)

cái này thực ra vẫn tốt mà.


thỉnh thoảng em pick 1:6 nó ra thế này
{\H0.75x;1:6} thay vì 1:6
  • 0

#22 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 08 May 2009 - 11:33 PM

thỉnh thoảng em pick 1:6 nó ra thế này
{\H0.75x;1:6} thay vì 1:6

Nhiều khả năng là vì đối tượng bạn pick là MTEXT chứ không phải TEXT.
  • 1

#23 amateurday

amateurday

    biết lệnh break

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

Đã gửi 08 May 2009 - 11:49 PM

Nhiều khả năng là vì đối tượng bạn pick là MTEXT chứ không phải TEXT.


hiện tại thì em cũng chỉ dùng code của bác tdvn, nhưng em thấy bác nataca có cách hay nên hỏi thêm, bây giờ lại thêm mtext với text nữa, em thì chưa gặp mtext, nhưng sau này không biết có gặp không, mong bác Hoành và các bác giúp làm cho hoàn thiện code trên được không ạ, chỉ cần pick là nó ra, pick trật thì như chưa pick, pick đuợc cả mtext và text luôn. cám ơn các bác nhé.
  • 0

#24 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 09 May 2009 - 12:04 AM

hiện tại thì em cũng chỉ dùng code của bác tdvn, nhưng em thấy bác nataca có cách hay nên hỏi thêm, bây giờ lại thêm mtext với text nữa, em thì chưa gặp mtext, nhưng sau này không biết có gặp không, mong bác Hoành và các bác giúp làm cho hoàn thiện code trên được không ạ, chỉ cần pick là nó ra, pick trật thì như chưa pick, pick đuợc cả mtext và text luôn. cám ơn các bác nhé.

Thực ra thì cũng có cách giải quyết được. Nhưng mà theo mình bài toán thực tế của bạn nếu đi theo hướng khác thì hay hơn. Bạn up file bản vẽ lên, trong file bản vẽ chỉ ra những text nào cần đưa ra bảng excel. Và file excel mẫu có thể hiện cách trình bày kết quả đưa ra. Như thế sẽ giải quyết bài toán tận gốc, giúp bạn tiết kiệm thời gian hơn.
  • 1

#25 amateurday

amateurday

    biết lệnh break

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

Đã gửi 09 May 2009 - 12:16 AM

hiện tại thì em mới chỉ dùng đến text thôi nên chưa có bản vẽ để up lên, để sau này nếu gặp thì nhờ các bác vậy. Cám ơn các bác rất nhiều.
  • 0

#26 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 09 May 2009 - 01:56 AM

Mấy hôm nay cũng hơi bận nên ít vào diễn đàn với lại không nhớ trong đề tài này mình có viết lisp nên không trả lời cho các bạn. Thành thật xin lỗi. Vấn đề này các bạn cũng đã giải quyết đc rồi tuy nhiên mình cũng gởi đoạn lisp do mình viết để các bạn tham khảo. Đoạn này mặc định là text, nếu là mtext hay các thứ khác và muốn kiểm tra loại đối tượng thì phải viết thêm tí nữa

(setq kt T)
(initget 128)
(while (and kt (setq p (getpoint "\nPick : ")))
(cond
((listp p)
(if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))
)
((= (type p) 'STR) (setq kt nil))
(T (setq kt nil))
)
(initget 128)
)
(princ)
  • 2

#27 amateurday

amateurday

    biết lệnh break

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

Đã gửi 09 May 2009 - 08:52 PM

Mấy hôm nay cũng hơi bận nên ít vào diễn đàn với lại không nhớ trong đề tài này mình có viết lisp nên không trả lời cho các bạn. Thành thật xin lỗi. Vấn đề này các bạn cũng đã giải quyết đc rồi tuy nhiên mình cũng gởi đoạn lisp do mình viết để các bạn tham khảo. Đoạn này mặc định là text, nếu là mtext hay các thứ khác và muốn kiểm tra loại đối tượng thì phải viết thêm tí nữa

(setq kt T)
(initget 128)
(while (and kt (setq p (getpoint "\nPick : ")))
(cond
((listp p)
(if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))
)
((= (type p) 'STR) (setq kt nil))
(T (setq kt nil))
)
(initget 128)
)
(princ)



bác tdvn thật nhiệt tình, em thử rồi nên góp ý chút ít:
-lisp của bác nataca hay ở chỗ khi mình pick điểm thì nó không hiện chữ pick ở đầu, điều này có lợi khi muốn copy sang excel. cái này hay.
-lisp của bác nataca lại pick điểm khó trúng hơn của bác tdvn, có lẽ do 1 người dùng ô vuông, 1 người dùng chữ thập để pick điểm. cái này hay.
-lisp của bác nataca khi pick trật thì xem như không pick (vì cad không thực hiện lệnh nào hết), cái này cũng hay.
-file em up lên các bác xem thử, cùng là mtext mà sao pick 2 cái lại ra khác nhau
http://www.cadviet.c...s/Drawing_5.dwg

2 lisp của 2 bác mà kết hợp được như thế thì tiện nhiều lắm. thank các bác
  • 0

#28 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 09 May 2009 - 09:15 PM

bác tdvn thật nhiệt tình, em thử rồi nên góp ý chút ít:
-lisp của bác nataca hay ở chỗ khi mình pick điểm thì nó không hiện chữ pick ở đầu, điều này có lợi khi muốn copy sang excel. cái này hay.
-lisp của bác nataca lại pick điểm khó trúng hơn của bác tdvn, có lẽ do 1 người dùng ô vuông, 1 người dùng chữ thập để pick điểm. cái này hay.
-lisp của bác nataca khi pick trật thì xem như không pick (vì cad không thực hiện lệnh nào hết), cái này cũng hay.
-file em up lên các bác xem thử, cùng là mtext mà sao pick 2 cái lại ra khác nhau
http://www.cadviet.c...s/Drawing_5.dwg

2 lisp của 2 bác mà kết hợp được như thế thì tiện nhiều lắm. thank các bác

Muốn không hiện chữ Pick, bạn chỉ cần sửa (getpoint "\nPick : ") thành (getpoint)
và chữ "princ" thành "print" trong đoạn (if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))
Tuy nhiên, muốn copy sang excel, có nhiều cách hay hơn như có bạn đã đề cập
  • 0

#29 amateurday

amateurday

    biết lệnh break

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

Đã gửi 09 May 2009 - 10:07 PM

Muốn không hiện chữ Pick, bạn chỉ cần sửa (getpoint "\nPick : ") thành (getpoint)
và chữ "princ" thành "print" trong đoạn (if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))
Tuy nhiên, muốn copy sang excel, có nhiều cách hay hơn như có bạn đã đề cập


thế thì bây giờ nó lại thêm dấu "" nữa, có bỏ được không bác, với lại file em up lên, với 2 chuỗi 1:1.5 , vậy pick 2 chuỗi kết quả lại khác nhau, bác thử xem hộ em cái. em thì toàn dùng cách này để lấy ký tự qua excel thôi, em chưa biết cách nào khác, em thấy cái này cũng tiện rồi nên không tìm cách khác.
  • 0

#30 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 09 May 2009 - 10:26 PM

thế thì bây giờ nó lại thêm dấu "" nữa, có bỏ được không bác, với lại file em up lên, với 2 chuỗi 1:1.5 , vậy pick 2 chuỗi kết quả lại khác nhau, bác thử xem hộ em cái. em thì toàn dùng cách này để lấy ký tự qua excel thôi, em chưa biết cách nào khác, em thấy cái này cũng tiện rồi nên không tìm cách khác.

Muốn không có """" bạn thay thề đoạn (if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))
thành (if (setq n (nentselp p)) (princ (strcat "\n" (Cdr (assoc 1 (entget (car n)))))))

Còn cách chuyển text qua file như bác là quá thủ công. Người ta có thể chuyển qua file dạng text một lúc tất cà các text bạn chọn, mỗi text trên một dòng hoặc muốn theo thứ tự như bác chọn từng đối tượng cũng đc nhưng viết lisp còn dễ hơn cái bác muốn hiện nay. Trên diễn đàn này đã có xử lý về vấn đề này rồi

Mình đã xem cái file của bạn. Hai mtext của bạn là 2 chuỗi có dữ liệu khác nhau, bạn xem đoạn màu đỏ :

Select object: ((-1 . <Entity name: 4007b410>) (0 . "MTEXT") (330 . <Entity
name: 40079cf8>) (5 . "152") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"0") (100 . "AcDbMText") (10 24.501 24.0719 0.0) (40 . 10.0) (41 . 62.3505) (71
. 1) (72 . 5) (1 . "{\\H0.75x;1:1.5}") (7 . "Standard") (210 0.0 0.0 1.0) (11
0.824469 0.565908 0.0) (42 . 20.0) (43 . 10.0) (50 . 0.601534) (73 . 1) (44 .
1.0))

Select object: ((-1 . <Entity name: 4007b418>) (0 . "MTEXT") (330 . <Entity
name: 40079cf8>) (5 . "153") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"0") (100 . "AcDbMText") (10 203.771 24.7784 0.0) (40 . 7.5) (41 . 62.3505) (71
. 3) (72 . 5) (1 . "1:1.5") (7 . "Standard") (210 0.0 0.0 1.0) (11 0.828738
-0.559637 0.0) (42 . 20.0) (43 . 7.5) (50 . 5.68924) (73 . 1) (44 . 1.0))

Bạn thấy lisp cho 2 kết quả khác nhau là đúng rồi vì thực tế hai mtext của bạn nó khác nhau.
Việc hai đối tượng mtext có dữ liệu khác nhau nhưng nhìn thấy trên màn hình giống nhau thì mình không rõ lắm, vì công việc của mình không dùng mtext nên không hiểu sâu lắm. Có thể các bạn trên diễn đàn hiểu rõ về mtext sẽ trả lời cho bạn.
  • 0

#31 amateurday

amateurday

    biết lệnh break

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

Đã gửi 09 May 2009 - 11:27 PM

Muốn không có """" bạn thay thề đoạn (if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))
thành (if (setq n (nentselp p)) (princ (strcat "\n" (Cdr (assoc 1 (entget (car n)))))))
Cái file của bạn mình chưa xem đc vì mình đang ở trên máy chỉ có cad2002 thôi. Khoảng hơn 11h thì mình sẽ xem cái file đó cho bác.
Còn cách chuyển text qua file như bác là quá thủ công. Người ta có thể chuyển qua file dạng text một lúc tất cà các text bạn chọn, mỗi text trên một dòng hoặc muốn theo thứ tự như bác chọn từng đối tượng cũng đc nhưng viết lisp còn dễ hơn cái bác muốn hiện nay. Trên diễn đàn này đã có xử lý về vấn đề này rồi


tại vì em mới biết lisp gần đây thôi, em cũng chưa học được nên phải làm thủ công thế. bác có thể chỉ cho em bài viết nào liên quan về vấn đề này không. cám ơn bác nhiều
  • 0

#32 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 09 May 2009 - 11:37 PM

tại vì em mới biết lisp gần đây thôi, em cũng chưa học được nên phải làm thủ công thế. bác có thể chỉ cho em bài viết nào liên quan về vấn đề này không. cám ơn bác nhiều

Mình vừa tìm đc đoạn code này. Có thể còn nhiều nữa.
;TEXTOUT.LSP By: Jeffery P. Sanders
;This program gets text from an AutoCAD drawing and writes it to a text file.

;define program - listing your variable names here
; resets them to nil after the program finishes
(defun C:TEXTOUT(/ lts ernote filen fil eset en enlist cntr)

;turn echo off
(setvar "cmdecho" 0)

;get ltscale (Note: ltscale should always equal dimscale)
(setq lts(getvar "ltscale"))

;set the exit note to successful
(setq ernote "\n....TextOut Complete.")

;use dialog box to set file name / the 1 allows
;the user to type in a new file name
;the "txt" sets the default to be "*.txt"
(setq filen
(getfiled "Type or Select Text File Name" "" "txt" 1)
)

;open file to write
(if (setq fil(open filen "w"))

;progn necessary for multiple statements inside an if statement
(progn

;if ssget returns a valid selection set
(if (setq eset(ssget))

;progn necessary for multiple statements inside an if statement
(progn

;set the entity counter to zero [the first entity in a set is zero]
(setq cntr 0)

;step through each entity in the selection set
(while (< cntr (sslength eset))

;get the entity name indexed by cntr
(setq en(ssname eset cntr))

;get the DXF group codes for the entity
(setq enlist(entget en))

;check the group code 0 to see if entity type = TEXT
(if(= "TEXT" (cdr(assoc 0 enlist)))

;progn necessary for multiple statements inside an if statement
(progn

;get the text string from the entity's DXF Group Code 1
(setq str(cdr(assoc 1 enlist)))

;print the string to the command line
(princ (strcat "\nOutput To File: " str))

;print the string to the file
(princ (strcat "\n" str) fil)

);close the if progn

);close the if statement

;increment the counter to get the next entity
(setq cntr(+ cntr 1))

);close the while loop

;close the text file
(close fil)

);close the if progn

;set the exit note as an error
(setq ernote "\nError - No Entities Selected.")

); close the if statement

);close the if progn

;set the exit note to be an error
(setq ernote (strcat "\nError - Could not create File: " filen))

);close the if statement

;turn the command echo back on
(setvar "cmdecho" 1)

;print the exit note to the command line
(princ ernote)

;clear the command line
(princ "\n ")

;supress last echo
(princ)

);close the program

  • 1

#33 amateurday

amateurday

    biết lệnh break

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

Đã gửi 10 May 2009 - 12:45 AM

Mình vừa tìm đc đoạn code này. Có thể còn nhiều nữa.

;TEXTOUT.LSP By: Jeffery P. Sanders
;This program gets text from an AutoCAD drawing and writes it to a text file.

;define program - listing your variable names here
; resets them to nil after the program finishes
(defun C:TEXTOUT(/ lts ernote filen fil eset en enlist cntr)

;turn echo off
(setvar "cmdecho" 0)

;get ltscale (Note: ltscale should always equal dimscale)
(setq lts(getvar "ltscale"))

;set the exit note to successful
(setq ernote "\n....TextOut Complete.")

;use dialog box to set file name / the 1 allows
;the user to type in a new file name
;the "txt" sets the default to be "*.txt"
(setq filen
(getfiled "Type or Select Text File Name" "" "txt" 1)
)

;open file to write
(if (setq fil(open filen "w"))

;progn necessary for multiple statements inside an if statement
(progn

;if ssget returns a valid selection set
(if (setq eset(ssget))

;progn necessary for multiple statements inside an if statement
(progn

;set the entity counter to zero [the first entity in a set is zero]
(setq cntr 0)

;step through each entity in the selection set
(while (< cntr (sslength eset))

;get the entity name indexed by cntr
(setq en(ssname eset cntr))

;get the DXF group codes for the entity
(setq enlist(entget en))

;check the group code 0 to see if entity type = TEXT
(if(= "TEXT" (cdr(assoc 0 enlist)))

;progn necessary for multiple statements inside an if statement
(progn

;get the text string from the entity's DXF Group Code 1
(setq str(cdr(assoc 1 enlist)))

;print the string to the command line
(princ (strcat "\nOutput To File: " str))

;print the string to the file
(princ (strcat "\n" str) fil)

);close the if progn

);close the if statement

;increment the counter to get the next entity
(setq cntr(+ cntr 1))

);close the while loop

;close the text file
(close fil)

);close the if progn

;set the exit note as an error
(setq ernote "\nError - No Entities Selected.")

); close the if statement

);close the if progn

;set the exit note to be an error
(setq ernote (strcat "\nError - Could not create File: " filen))

);close the if statement

;turn the command echo back on
(setvar "cmdecho" 1)

;print the exit note to the command line
(princ ernote)

;clear the command line
(princ "\n ")

;supress last echo
(princ)

);close the program



cái này hay thật bác à. chọn rất nhanh. thank bác. bác còn cái nào up lên nữa nhé
  • 0