Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
duongthanh85

Rắc rối lấy nội dung text từ đối tượng text được chọn bởi chuột

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

Em đang làm 1 hàm có chức năng đơn giản như sau:

 

Dùng chuột chọn 1 đối tượng text, lưu nội dung text vào 1 file text.

 

Đây là hàm em viết và không thành công.

 

(defun C:Gtxt()												;define a program name
(setq fname(getstring "\n Enter a valid file name: "))  
(setq f(open fname "a"))			;open the file in write mode
(setq sel (entsel "\nHay chon doi tuong: "))
(write-line sel f)								;close the while statement
  )

 

 

Em mới bắt đầu học, mong mọi người hướng dẫn em làm hàm này. Em 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

Em có nhờ giúp làm 1 lisp như trong bài này

 

Các huynh cho đệ 1 lisp như sau:

- Tạo 1 file text tên là C:\Ketqua.txt nếu chưa có; ghi ở chế độ ghi thêm (thêm dòng vào nội dung có sẵn).

- Chọn đối tượng text thứ nhất, ghi giá trị text này vào file C:\Ketqua.txt và thêm dấu TAB (chưa xuống dòng).

- Chọn đối tượng text thứ 2, ghi giá trị text thứ 2 này vào cùng dòng với giá trị text thứ nhất và thêm dấu TAB.

- Chọn 1 loạt đối tượng là Line, Pline... ghi tổng giá trị chiều dài và xuống dòng (gọi hàm tính tổng chiều dài các đường- Lisp trên cadviet).

 

Mỗi lần thực hiện lệnh lại ghi thêm 1 dòng.

 

VD:

có 02 đối tượng text là "Diem 1" và "Diem 2", giữa 2 đối tượng text này có vài đường thẳng.

Khi gõ lệnh như trên sẽ ghi thêm vào file text 1 dòng như sau:

Diem 1 Diem 2 128.5

 

Mong các huynh giúp đỡ, đệ đã đọc thử bài liên kết Acad và Txt cũng như mã nguồn lisp tính tổng các đối tượng được chọn rồi như vẫn không làm được.

 

Sau đó em làm được open/write vào file nhưng lỗi text. Bây giờ sau khi google về các hàm string em đã làm ra thành quả. Tuy nhiên kết quả chưa đúng mong muốn lắm:

Thay vì ghi thông số theo định dạng:

Điểm đầu (Tab) điểm thứ 2 (tab) chiều dài tổng

 

Thì em đang ghi kiểu:

Điểm đầu

Điểm thứ 2

Chiều dài tổng

------

 

Trong đó "------" là ký tự em dùng tạm để phân biệt các lần lấy dữ liệu. Em đã cố gắng join các thông số vào chung bằng hàm STRCAT nhưng toàn lỗi. Nay em đưa lisp lên mong các huynh giúp đỡ để ghi kết quả vào file đúng định dạng mong muốn (mỗi lần thực hiện chỉ ghi thêm 1 dòng vào file text).

(trong lisp này em có sử dụng lisp tính tổng chiều dài của CadViet và đổi tên hàm để đỡ trùng khi sử dụng, dù hàm này em không định nghĩa C:

xin chân thành cảm ơn tác giả Lisp tính tổng chiều dài).

 

 

(Defun C:tdd (/ fname txt selset count nme oldtx)
 (setq fname (getstring "\nGhi ten file luu ket qua: "))
 (setq txt (open fname "a"))		;open file, assign symbol
 (setq selset (ssget))					;get selection set
 (setq count 0)						;set count to zero
 (if (/= selset nil)
	 (while (< count (sslength selset));while count < # of lines
			(setq nme (ssname selset count));extract text string
			(setq oldtx (cdr (assoc 1 (entget nme))))
			(write-line oldtx txt)		;write string to file
			(setq count (1+ count))	;go to next line
	 );end while
(close txt)								;close file
);end C:tdd


;; ----------------Lisp tong chieu cadviet--------------------------

(defun add_mline ()
(foreach e_record_sub e_record
(cond ((= 10 (car e_record_sub))
(setq pt1 (cdr e_record_sub)
mline_len 0.0
)
)
((= 11 (car e_record_sub))
(setq pt2 (cdr e_record_sub)
mline_len (+ mline_len (distance pt2 pt1))
pt1 pt2
)
)
)
)
(setq tot_len (+ tot_len mline_len))
(ssdel e_name ss)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun tgt (/ tot_len ss e_name e_record e_type)
(princ "\nCADViet.com (c) 2007")
(setq tot_len 0.0)
(setq ss (ssget))
(if (null ss)
(exit)
)
(while (> (sslength ss) 0)
(setq e_name (ssname ss 0))
(setq e_record (entget e_name))
(setq e_type (cdr (assoc '0 e_record)))
(cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
(command "lengthen" e_name "")
(setq tot_len (+ tot_len (getvar "PERIMETER")))
(ssdel e_name ss)
)
((wcmatch e_type "MLINE") (add_mline))
(e_type (ssdel e_name ss))
)
)
(prompt (strcat "\nTotal length is: " (rtos tot_len 2 2)))
(write-line (rtos tot_len 2 2) txt)
(princ)
)
(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
Em có nhờ giúp làm 1 lisp như trong bài này

Sau đó em làm được open/write vào file nhưng lỗi text. Bây giờ sau khi google về các hàm string em đã làm ra thành quả. Tuy nhiên kết quả chưa đúng mong muốn lắm:

Thay vì ghi thông số theo định dạng:

Thì em đang ghi kiểu:

Trong đó "------" là ký tự em dùng tạm để phân biệt các lần lấy dữ liệu. Em đã cố gắng join các thông số vào chung bằng hàm STRCAT nhưng toàn lỗi. Nay em đưa lisp lên mong các huynh giúp đỡ để ghi kết quả vào file đúng định dạng mong muốn (mỗi lần thực hiện chỉ ghi thêm 1 dòng vào file text).

(trong lisp này em có sử dụng lisp tính tổng chiều dài của CadViet và đổi tên hàm để đỡ trùng khi sử dụng, dù hàm này em không định nghĩa C:

xin chân thành cảm ơn tác giả Lisp tính tổng chiều dài).

(Defun C:tdd (/ fname txt selset count nme oldtx)
 (setq fname (getstring "\nGhi ten file luu ket qua: "))
 (setq txt (open fname "a"))			;open file, assign symbol
 (setq selset (ssget))						;get selection set
 (setq count 0)							;set count to zero
 (if (/= selset nil)
	 (while (< count (sslength selset))	;while count < # of lines
			(setq nme (ssname selset count));extract text string
			(setq oldtx (cdr (assoc 1 (entget nme))))
			(write-line oldtx txt)			;write string to file
			(setq count (1+ count))		;go to next line
	 );end while
 );end if
 (tgt)
 (write-line "---" txt)
(close txt)									;close file
);end C:tdd
;; ----------------Lisp tong chieu cadviet--------------------------

(defun add_mline ()
(foreach e_record_sub e_record
(cond ((= 10 (car e_record_sub))
(setq pt1 (cdr e_record_sub)
mline_len 0.0
)
)
((= 11 (car e_record_sub))
(setq pt2 (cdr e_record_sub)
mline_len (+ mline_len (distance pt2 pt1))
pt1 pt2
)
)
)
)
(setq tot_len (+ tot_len mline_len))
(ssdel e_name ss)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun tgt (/ tot_len ss e_name e_record e_type)
(princ "\nCADViet.com © 2007")
(setq tot_len 0.0)
(setq ss (ssget))
(if (null ss)
(exit)
)
(while (> (sslength ss) 0)
(setq e_name (ssname ss 0))
(setq e_record (entget e_name))
(setq e_type (cdr (assoc '0 e_record)))
(cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
(command "lengthen" e_name "")
(setq tot_len (+ tot_len (getvar "PERIMETER")))
(ssdel e_name ss)
)
((wcmatch e_type "MLINE") (add_mline))
(e_type (ssdel e_name ss))
)
)
(prompt (strcat "\nTotal length is: " (rtos tot_len 2 2)))
(write-line (rtos tot_len 2 2) txt)
(princ)
)
(princ)

 

Bạn thay dòng (write-line oldtx txt) trong lệnh c:tdd

bằng dòng (princ (strcat oldtx "\t") txt) là xong .

  • 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

Thanks huynh Gia bach và huynh Q288. Mình đã giải quyết vấn đề mỹ mãn và áp dụng vào công việc rất tốt.

 

Đây là lisp huynh Gia Bach giúp, lisp này vừa đúng bài toán đặt ra; lisp mình viết và huynh Q288 đã chỉnh trên kia có khả năng ứng dụng rộng hơn.

Mình post vào đây cho liên tục.

(Defun C:tdd (/ fname obj1 obj2 txt1 txt2 ss len)
(setq fname "C:\\Ketqua.txt" )
(if (setq fname (open fname "a"));open file
(progn
(while
(and
(setq obj1 (entsel "\nChon text thu nhat :"))
(setq obj2 (entsel "\nChon text thu hai :"))
(princ "\nChon doi tuong do chieu dai :")
(setq ss (ssget))
)
(setq txt1 (cdr (assoc 1 (entget (car obj1))))
txt2 (cdr (assoc 1 (entget (car obj2))))
(if (and txt1 txt2 len)
(write-line (strcat txt1 "\t" txt2 "\t" (rtos len)) fname) )
)
(close fname);close file
)
)
(princ)
)
;; ---------------- Lisp chieu dai MLine --------------------------
(defun mllength (mline / entl a dist plst)
(cond ((= (type mline) 'ENAME)
(setq entl (entget mline)
a 0
dist 0
)
(foreach n entl
(if (member (car n) '(10 11))
(setq plst (cons (cdr n) plst))
)
)
(repeat (1- (length plst))
(setq dist (+ dist (distance (nth a plst) (nth (1+ a) plst)))
a (1+ a))
)
)
)
(setq mlst plst)
dist
)
;; ---------------- Lisp tong chieu dai --------------------------
(defun totalLen (ss / e e_type len)
(setq len 0)
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(setq e_type (cdr (assoc 0 (entget e))))
(cond
((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE" )
(setq len (+ len (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))) )
((wcmatch e_type "MLINE")
(setq len (+ len (mllength e))))
( t nil)
)
)
len
)

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
Ko biết cái lisp trên dùng thế nào???? :blink:

Nó cứ bắt chọn hết cái này đến cái nọ rồi ....tắt :s_big: :blink:

 

nó ghi kết quả ra file Ketqua.txt ở 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

Khi bạn phải làm thuyết minh cho 1 đề án thiết kế đường dây hoặc cáp ngầm là bạn sẽ biết tác dụng của nó. Nếu khối lượng ít thì không sao, khi khối lượng lên tầm vài trăm đoạn thì vừa đo bản vẽ vừa tính toán nhân hệ số rồi viết thuyết minh theo form sẽ là công việc nhàm chán và rất mệt.

 

Tất nhiên mình nghĩ còn nhiều ứng dụng khác. Quan trọng hơn đây là bước đầu mình bước vào Lisp.

 

Qua việc dùng mình lại...hay dùng Lisp huynh Gia Bạch hơn Lisp mình viết; ít phải gõ dấu cách hơn, chỉ pick chuột thôi, nhanh hơn nhiều lần Lisp mình viết. Mình đã sửa lại để mỗi lần dùng mình xuất ra 1 tên file khác nhau trong cùng thư mục bản vẽ. Tiện lợi hơn khi thuyết minh với vài loại dây hoặc cáp hoặc mương cáp.

 

PS:

- Lisp này dùng kèm 1 macro mình viết riêng cho mục đích thuyết minh. Đọc lần lượt từng dữ liệu và chêm vào vị trí tương ứng trong đoạn thuyết minh form lập sẵn.

- Lisp này cũng dùng tạo bảng tổng kết, chỉ việc open bằng excel là xong.

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
Đăng nhập để thực hiện theo  

×