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

Viết lisp theo yêu cầu [phần 2]

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

Cảm ơn bác Tue_NV nhé, song bác có thể chỉ giáo cho phần tùy chọn bắt điểm có nêu ở trên luôn nhé!

1- Lưu lai tùy chọn bắt điểm hiện tại.

2- Bật bắt điểm hiện tại là: điểm cuối và giao của các đường thẳng.

3- kết thúc sẽ khôi phục lại tùy chọn ban đầu.

 

hihi tiện thể cho hỏi các bác tí nữa nhé: Trên layout làm sao để lấy được biến scale của 1 cửa sổ nào đó, ví dụ có cửa sổ với tỷ lệ 1/50,

vậy làm thể nào để lấy được giá trị 50 đó để gán cho biến aa chẵng hạn.


; Doi voi mot so ket cau nhu cau tau, tru neo. Thuong co truong hop coc xien trong khong gian,
; Lisp nay giup ve nhanh mo hinh ket cau 3D ngay tren cua so 2D cua ACAD ma khong can phai biet ve trong 3D.
; (chi ve phan coc va dam ....)
; Lenh ve 	CS
; Huong dan 	HD

(defun c:cs()
(command "layer" "m" "Fram" "c" 2 "" "")
(princ "\n Lisp Ve coc khong gian - ung dung lap mo hinh cho SAP tu ACAD: Tvduc")
(setq
	Lu (getdist "\n Nhap chieu dai chiu uon:    ")
	m (getdist "\n Nhap do xien cua coc 1/m:    ")
)
	(while (< m 5)
		(alert"Ban oi! Do xien cua coc phai la so duong, va khong duoc xien qua 1/5,lam on nhap lai 

nhe!")
		; Tuy thuoc vao tung cong trinh cu the ma do xien cua coc co the vuot ngoai gia tri tren.  
		(setq m (getdist "\n Nhap lai do xien cua coc 1/m:    "))
	)
	(while (> m 10)
		(alert"Ban oi! Do xien cua coc nho hon 1/10 khong co y nghia, xem lai ket cau nhe!")  
		(setq m (getdist "\n Nhap lai do xien cua coc 1/m:    "))
	)
(setq
	a (getdist "\n Nhap goc xoay cua coc:    ")
)
	(while (or (< a -45)(> a 45))
		(alert"Ban oi! Góc xoay co gia tri tu -45 den +45 do^. thoi!  Lam on nhap lai nhe.")  
		(setq a (getdist "\n Coc xoay quan truc:   "))
		; Tuy thuoc tung bai toan cu the.
	)
(setq 		
	aa (getdist "\n Coc xoay quan truc:   ")
)
	(while (and (/= aa 1)(/= aa 2)(/= aa 3)(/= aa 4))
		(alert"Ban oi! Chieu duong truc x la truc 1,   Chieu duong truc y la truc 2,   Chieu am 

truc x la truc 3,   Chieu am truc y la truc 4!   Lam on nhap lai nhe.")  
		(setq aa (getdist "\n Coc xoay quan truc:   "))
	)
(setq
	a (+ (* (- aa 1) 90) a)
	xy (/ Lu m)
	x (* xy (cos (/ (* a pi) 180)))
	y (* xy (sin(/ (* a pi) 180)))
)
(while (setq p1 (getpoint "\n Vi tri dinh coc ?"))
	(if p1
		(progn
		(setq p2 (list (+ (car p1) x) (+ (cadr p1) y) (- 0 Lu)))
		(command "_line" p1 p2 "")
		)
	);if
);while

(princ "\n Can phai chuyen tat cac cac doi tuong dam ve Layer Fram")
)
(defun c:hd ()
(print "Chieu duong cua goc xoay nguoc chieu voi kim dong ho")
(print "Goc toa do la dinh coc")	
(print "Chieu duong truc x la truc 1")
(print "Chieu duong truc y la truc 2")
(print "Chieu am truc x la truc 3")
(print "Chieu am truc y la truc 4")
(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
Cảm ơn bác Tue_NV nhé, song bác có thể chỉ giáo cho phần tùy chọn bắt điểm có nêu ở trên luôn nhé!

1- Lưu lai tùy chọn bắt điểm hiện tại.

2- Bật bắt điểm hiện tại là: điểm cuối và giao của các đường thẳng.

3- kết thúc sẽ khôi phục lại tùy chọn ban đầu.

......

Bạn có thể làm theo những ý sau :

(defun c:cs()

(setq oldos (getvar "osmode")) ; Luu lai tuy chon bat diem hien tai

(setvar "osmode" 33) ; Bat bat diem hien tai : diem cuoi va giao cua cac duong thang

;;

;;

;; Phan Than cua Code

;;;

;

(setvar "osmode" oldos) ; Ket thuc va khoi phuc lai tuy chon ban dau

);end defun

 

Để biết bắt điểm điểm cuối và giao của các đường thẳng thì biến osmode nhận giá trị bao nhiêu thì trong CAD bạn cứ thiết lập chế độ bắt điểm điểm cuối và giao của các đường thẳng và gõ Osmode xem biến này nhận giá trị bằng bao nhiêu?

 

Mình góp ý với bạn 1 tí trong Code của bạn nhé :

-> Không nên sử dụng hàm getdist để nhập góc trong code cụ thể là :

(setq a (getdist "\n Nhap goc xoay cua coc: "))

-> Nên sử dụng hàm getangle để nhập góc -> Kết quả sẽ trả về radian : và trong hàm cos; sin thì bạn không cần phải chuyển sang Radian nữa

(setq a (getangle "\n Nhap goc xoay cua coc: "))

-> Nhập 45 sẽ trả lại kết quả 0.785398 (RAD)

  • Vote tăng 2

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

 

hihi tiện thể cho hỏi các bác tí nữa nhé: Trên layout làm sao để lấy được biến scale của 1 cửa sổ nào đó

.....................................

Bạn tham khảo Lisp sau :

(defun c:svp(/ ent dz Viewport)
 (if (/= (getvar "cvport") 1)
   (alert "\nChi co the chay tren khong gian giay (LAYOUT).")
   (progn (vl-load-com)
     (while
(not
  (and
    (setq ent (car (entsel "\nChon Viewport : ")))
    (or
      (= (cdr (assoc 0 (entget ent))) "VIEWPORT")
      (= (cdr (assoc 0 (entget (setq ent (cdr (assoc 330 (entget ent))))))) "VIEWPORT")
      )
    )
  )
(princ "\nkhong phai Viewport. Chon lai : ")
)
     (setq dz (getvar "dimzin"))
     (setvar "dimzin" 8 )
     (setq Viewport (vlax-Ename->Vla-Object ent)
    sc (vla-get-CustomScale Viewport))
     (alert (strcat "\nCustom Scale : " (rtos sc) " or " (strcat "1/" (rtos (/ 1 sc)))))
     (setvar "dimzin" dz )
     )
   )
 (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

Nhờ viết lisp:

trên bản vẽ có các điểm tọa độ, mỗi điểm có nhãn tên điểm và nhãn độ cao đi liền với point nhưng các point có độ cao z=0, muốn chuyển các point về độ cao đúng của nó một cách nhanh nhất.

Đây là file trước khi chuyển :

http://www.cadviet.com/upfiles/2/cogopoint1_1.rar

và đây là file sau khi chuyển:

http://www.cadviet.com/upfiles/2/cogopoint2.rar

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ờ viết lisp:

trên bản vẽ có các điểm tọa độ, mỗi điểm có nhãn tên điểm và nhãn độ cao đi liền với point nhưng các point có độ cao z=0, muốn chuyển các point về độ cao đúng của nó một cách nhanh nhất.

Đây là file trước khi chuyển :

http://www.cadviet.com/upfiles/2/cogopoint1_1.rar

và đây là file sau khi chuyển:

http://www.cadviet.com/upfiles/2/cogopoint2.rar

Chào tnmtpc

Bạn sử dụng Lisp này thử nhé :

(defun c:MPT(/ ss ss2 i j lis Z p p2 pkt ent L caoZ)
;copyright by Tue_NV
(setq ss (ssget "X" '((0 . "TEXT") (8 . "el"))) i 0 j 0 lis (list) Z (list))
(setq ss2 (ssget "X" '((0 . "POINT") )) )
(while (	(setq p (cdr(assoc 10 (entget (ssname ss i)))))
(setq lis (append lis 
		(list (list (round (car p) 3) (round (cadr p) 3)) )
	  )
)
(setq Z (append Z (list (caddr p)))
)
(setq i (1+ i))
)
(while (	(setq ent (ssname ss2 j))
(setq p2 (cdr(assoc 10 (entget ent))))
(setq pkt (list (round (car p2) 3) (round (cadr p2) 3)) )
(if (setq L (member pkt lis))
	(progn 
		(setq caoZ (nth (- (length lis) (length L)) Z) )
		(command "move" ent "" '(0 0 0) 
				        (list 0 0 caoZ)
		)
  	)
)
(setq j (1+ j))
)
)
;
(defun round(so tp)
(setvar "dimzin" 0)
(atof (rtos so 2 tp))
)

  • 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
Chào tnmtpc

Bạn sử dụng Lisp này thử nhé :

(defun c:MPT(/ ss ss2 i j lis Z p p2 pkt ent L caoZ)
;copyright by Tue_NV
(setq ss (ssget "X" '((0 . "TEXT") (8 . "el"))) i 0 j 0 lis (list) Z (list))
(setq ss2 (ssget "X" '((0 . "POINT") )) )
(while (< i (sslength ss))
(setq p (cdr(assoc 10 (entget (ssname ss i)))))
(setq lis (append lis 
		(list (list (round (car p) 3) (round (cadr p) 3)) )
	  )
)
(setq Z (append Z (list (caddr p)))
)
(setq i (1+ i))
)
(while (< j (sslength ss2))
(setq ent (ssname ss2 j))
(setq p2 (cdr(assoc 10 (entget ent))))
(setq pkt (list (round (car p2) 3) (round (cadr p2) 3)) )
(if (setq L (member pkt lis))
	(progn 
		(setq caoZ (nth (- (length lis) (length L)) Z) )
		(command "move" ent "" '(0 0 0) 
				        (list 0 0 caoZ)
		)
  	)
)
(setq j (1+ j))
)
)
;
(defun round(so tp)
(setvar "dimzin" 0)
(atof (rtos so 2 tp))
)

Cám ơn tue_NV nhiều lắm, đúng là cực nhanh, trúng ý mình rồi. Tue_NV có thể chỉnh sửa lại một chút để tiện cho người sử dụng thao tác, đề phòng trường hợp một point có hai text số khác nhau mà trong đó có một text không phải là giá trị độ cao. Cách thao tác như sau:

nhập lệnh->yêu cầu chọn lớp chứa các point bằng cách chọn một point trên bản vẽ-> yêu cầu chọn lớp chứa các text độ cao bằng cách chọn một text độ cao -> enter

Một lần nữa cám ơn tue_NV nhiề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
Cám ơn tue_NV nhiều lắm, đúng là cực nhanh, trúng ý mình rồi. Tue_NV có thể chỉnh sửa lại một chút để tiện cho người sử dụng thao tác, đề phòng trường hợp một point có hai text số khác nhau mà trong đó có một text không phải là giá trị độ cao. Cách thao tác như sau:

nhập lệnh->yêu cầu chọn lớp chứa các point bằng cách chọn một point trên bản vẽ-> yêu cầu chọn lớp chứa các text độ cao bằng cách chọn một text độ cao -> enter

Một lần nữa cám ơn tue_NV nhiều

Chào Tue và tnmtp,

1. Rất may là bản vẽ cogopoint1 của tnmtp có các tọa độ điểm chèn text trùng với tọa độ điểm chèn point (theo thành phần X và Y) nên lisp của Tue chạy đúng. Còn tọa độ điểm chèn text không trùng với tọa độ điểm chèn point (theo thành phần X và Y) thì lisp chạy sai ngay. Đây là trường hợp rất thường gặp, khi các bác trắc đạc dời text cao độ vì chúng nó đôi khi hay nằm gần kề nhau (dời ra cho thoáng ấy mà).

2. Ngoài ra, còn 2 trường hợp khác cũng không đúng sau khi dùng lisp MPT như sau:

- Nếu có point nào có cao độ khác 0.

- Nếu có text cao độ nào có cao độ Z khác với chữ số của chính nó, (ví dụ đối tượng text 15.10 có cao độ Z là 0.0)

Mong Tue_NV hoàn thiện thêm lisp nhé. Trân trọng!

  • 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
Chào Tue và tnmtp,

1. Rất may là bản vẽ cogopoint1 của tnmtp có các tọa độ điểm chèn text trùng với tọa độ điểm chèn point (theo thành phần X và Y) nên lisp của Tue chạy đúng. Còn tọa độ điểm chèn text không trùng với tọa độ điểm chèn point (theo thành phần X và Y) thì lisp chạy sai ngay. Đây là trường hợp rất thường gặp, khi các bác trắc đạc dời text cao độ vì chúng nó đôi khi hay nằm gần kề nhau (dời ra cho thoáng ấy mà).

2. Ngoài ra, còn 2 trường hợp khác cũng không đúng sau khi dùng lisp MPT như sau:

- Nếu có point nào có cao độ khác 0.

- Nếu có text cao độ nào có cao độ Z khác với chữ số của chính nó, (ví dụ đối tượng text 15.10 có cao độ Z là 0.0)

Mong Tue_NV hoàn thiện thêm lisp nhé. Trân trọng!

Rất cảm ơn bạn thiep đã góp ý

1. Tue_NV hoàn toàn đồng ý với điểm 1 mà thiep đã nêu. Và mình nghĩ rằng nếu để Lisp chạy đúng thì khoảng cách toạ độ điểm chèn Text và toạ độ điểm chèn point (theo phương X và phương Y) phải nhỏ hơn 1 số e do User định trước. Nếu không thì Lisp sẽ chạy không đúng vì bản vẽ của ta có rất nhiều Text và point). Mình sẽ chỉnh lại chổ này nếu các bạn đồng ý theo quan điểm này

 

"2. Ngoài ra, còn 2 trường hợp khác cũng không đúng sau khi dùng lisp MPT như sau:

- Nếu có point nào có cao độ khác 0." -> Cái này đồng ý với Thiep luôn. Tue_NV sẽ viết lại chổ này.

 

- Nếu có text cao độ nào có cao độ Z khác với chữ số của chính nó, (ví dụ đối tượng text 15.10 có cao độ Z là 0.0) : Tue_NV kiểm tra thấy Text 15.10 trong bản vẽ mà bạn tnmtpc gửi thì Text 15.10 có toạ độ điểm chèn của nó Z=15.10 chứ không phải là Z=0.00

 

Lisp của Tue_NV viết theo ý là toạ độ X,Y của point trùng với toạ độ X,Y của Text và move point có toạ độ Z=0 về toạ độ điểm chèn của Text, chứ không phải move về Z= chữ số của TEXT

 

-> Nay mình xin hoàn thành Lisp lại theo ý : toạ độ X,Y của point gần trùng với toạ độ X,Y của Text (khoảng chênh lệch = e) và move point có toạ độ Z=0 về toạ độ điểm chèn của Text

 

@ tnmtp : Bạn có thể nói rõ ý này của bạn được không? "Tue_NV có thể chỉnh sửa lại một chút để tiện cho người sử dụng thao tác, đề phòng trường hợp một point có hai text số khác nhau mà trong đó có một text không phải là giá trị độ cao."

Bạn có thể gửi file .dwg minh hoạ để dễ hiểu nhé.

 

Chào các bạn. Chúc vui vẻ.

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
Chào Tue và tnmtp,

1. Rất may là bản vẽ cogopoint1 của tnmtp có các tọa độ điểm chèn text trùng với tọa độ điểm chèn point (theo thành phần X và Y) nên lisp của Tue chạy đúng. Còn tọa độ điểm chèn text không trùng với tọa độ điểm chèn point (theo thành phần X và Y) thì lisp chạy sai ngay. Đây là trường hợp rất thường gặp, khi các bác trắc đạc dời text cao độ vì chúng nó đôi khi hay nằm gần kề nhau (dời ra cho thoáng ấy mà).

2. Ngoài ra, còn 2 trường hợp khác cũng không đúng sau khi dùng lisp MPT như sau:

- Nếu có point nào có cao độ khác 0.

- Nếu có text cao độ nào có cao độ Z khác với chữ số của chính nó, (ví dụ đối tượng text 15.10 có cao độ Z là 0.0)

Mong Tue_NV hoàn thiện thêm lisp nhé. Trân trọng!

Chào thiep

1. tọa độ điểm chèn text không trùng với tọa độ điểm chèn point

Đây là trường hợp rất thường gặp, khi các bác trắc đạc dời text cao độ vì chúng nó đôi khi hay nằm gần kề nhau (dời ra cho thoáng ấy mà).

-> t/hợp này rất khó xử lý vì khi đó xung quanh điểm chèn point có thể sẽ có 2 Text trở lên. Dựa trên cơ sở nào để quyết định (filter) Text nào là đúng.

Cách khắc phục nói chung là : các bác muốn thoáng thì chờ chạy LISP xong rồi hãy dời text cao độ.

 

2. Nếu có text cao độ nào có cao độ Z khác với chữ số của chính nó, (ví dụ đối tượng text 15.10 có cao độ Z là 0.0)

-> t/hợp này đuợc chia thành 2 nhánh : cập nhật theo cao độ TEXT hoặc cập nhật theo chữ số TEXT

 

Đây là Lisp cập nhật tọa độ điểm chèn point theo cao độ TEXT

(defun c:MPT(/ ds ent i insPt lay_Point lay_Txt lstPt lstZ lst_Point pt ss z)
 (if
   (and
     (setq ent (car (entsel "\nChon Point de lay Layer chua POINT : ")))
     (if (= (cdr (assoc 0 (entget ent))) "POINT")
(setq lay_Point (cdr(assoc 8 (entget ent))))
(setq lay_Point "*" ))
     (princ (strcat "==> Layer Point = "lay_Point))
     (setq ent (car (entsel "\nChon Text de lay Layer chua TEXT : ")))
     (if (= (cdr (assoc 0 (entget ent))) "TEXT")
(setq lay_Txt (cdr(assoc 8 (entget ent))))
(setq lay_Txt "*"))
     (princ (strcat "==> Layer Text = "lay_Txt))
     (princ "\n\t\t Chon doi tuong ... ")
     (setq ss (ssget (list (cons 0 "POINT,TEXT") (cons 8 (strcat lay_Point","lay_Txt))))
    i -1)
     )
   (progn      
     (repeat (sslength ss)
(setq ent (ssname ss (setq i (1+ i)) ))
(if (= (cdr (assoc 0 (entget ent))) "POINT")
  (setq lst_Point (cons ent lst_Point))
  (progn
    (setq insPt (cdr(assoc 10 (entget ent))))
    (setq lstPt (append lstPt (list (list (car insPt) (cadr insPt)) ) )	)
    (setq lstZ (append lstZ (list (caddr insPt))))
    )
  )
)
     (foreach ent lst_Point
(setq ds (entget ent)
      pt (cdr(assoc 10 ds))
      pt (list (car pt)(cadr pt)) )
(if (setq i (vl-position pt lstPt))
  (progn
    (setq z (nth i lstZ) )
    (setq ds (subst (cons 10 (append pt (list z))) (assoc 10 ds) ds))
    (entmod ds)
    )
  )
)
     )
   )
 (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 tue_NV nhiều lắm, đúng là cực nhanh, trúng ý mình rồi. Tue_NV có thể chỉnh sửa lại một chút để tiện cho người sử dụng thao tác, đề phòng trường hợp một point có hai text số khác nhau mà trong đó có một text không phải là giá trị độ cao.

Cách thao tác như sau:

nhập lệnh->yêu cầu chọn lớp chứa các point bằng cách chọn một point trên bản vẽ-> yêu cầu chọn lớp chứa các text độ cao bằng cách chọn một text độ cao -> enter

Một lần nữa cám ơn tue_NV nhiều

LISP của Tue_NV đã xét đến t/hợp này khi lọc Layer : (ssget "X" '((0 . "TEXT") (8 . "el")))

cụ thể layer của TEXT là "el".

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
Chào thiep

1. tọa độ điểm chèn text không trùng với tọa độ điểm chèn point

Đây là trường hợp rất thường gặp, khi các bác trắc đạc dời text cao độ vì chúng nó đôi khi hay nằm gần kề nhau (dời ra cho thoáng ấy mà).

-> t/hợp này rất khó xử lý vì khi đó xung quanh điểm chèn point có thể sẽ có 2 Text trở lên. Dựa trên cơ sở nào để quyết định (filter) Text nào là đúng.

Cách khắc phục nói chung là : các bác muốn thoáng thì chờ chạy LISP xong rồi hãy dời text cao độ.

Chào Gia_bach và Tue_NV,

Có 1 hàm tìm gần của bác Hoành rất hay, mà thiep đã sử dụng để nâng cấp lisp JD.lsp nối các điểm đường chuyền, bây giờ không nhớ nó nằm chỗ nào nữa. Đoạn mã như sau:

(defun timgan (p lst / dmin ppluu)

(foreach pp lst

(setq d (distance p (car pp)))

(if (or (not dmin) (> dmin d))

(setq dmin d

ppluu pp

)

)

)

(cdr ppluu)

)

trong đó:

- lst là list tọa độ các điểm chèn text. Dĩ nhiên cần phải lọc thêm text đó phải nằm trên lớp cao độ và phải là text số (trong bản vẽ của tmntpc là lớp el)

- p là 1 trong những tọa độ các point.

Như vậy, hàm này sẽ xác định được text cao độ nào gần với điểm p nhất. Sau đó dùng text cao độ này gán cho cao độ cho point.

Chúc các bạn thành công, hoàn thiện lisp chạy tốt.

  • 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ách khắc phục nói chung là : các bác muốn thoáng thì chờ chạy LISP xong rồi hãy dời text cao độ.

*Trường hợp phải kiu tới lisp để làm cái này thì bản vẽ đã qua nhiều tầng nhiều lớp rồi.

-Các chương trình phục vụ việc vẽ bản vẽ địa hình thì thường sau khi nhập số liệu hoặc nhận tệp số liệu từ máy đo đạc sẽ đưa ra màn hình bằng các đối tượng đặc biệt mà chương trình đó hiểu được và có khả năng chỉnh sửa cao: nghĩa là khi cần thay đổi gì nó cập nhật rất nhanh trên các kiểu đối tượng đó. Khi xuất ra bản vẽ cho mấy anh khác làm thì tùy theo tỉ lệ bản vẽ mà xuất ra các đối tượng cad hiểu được theo kích thước hợp lý lúc này tính linh hoạt sẽ mất đi bản vẽ theo mình gọi là đã chết lần 1 <_< .

-Thường thì các anh kiến trúc là tiếp xúc đầu tiên bản vẽ chết này và khi vẽ trên đó các đối tượng có cao độ z này làm ảnh hưởng đến việc vẽ nên các bác này tìm mọi cách cho nó phẳng lì ra nghĩa là tất cả các đối tượng có z=0 ráo trọi. Bản vẽ chết lần 2. :cheers: .

-Thường những anh quan tâm tới cao độ lại tiếp xúc với bản vẽ đã chết lần 2 này dùng các chương trình chuyên ngành. Mấy anh này nếu gặp bản vẽ chết lần 1 thì còn mần en được chứ chết lần 2 thì:

+Thực chất có chương trình sẽ nhận giá trị nhập vào là text thì mần thường.

+Gặp chương trình đòi giá trị nhập vào là point thì chỉ có dòm và kiu lisp.

*Bản thân mình hơi ớn việc đọc text sau đó sửa z cho point. Vì nếu trong quá trình đọc, chỉnh có sai xót thì có trời mới kiểm tra nổi (hông lẽ kiểm tra lại từng point :D hông khéo lại còn bị bắt đền).

*Tốt nhất nên lưu giữ cái bản vẽ chết lần 1 mà làm. Cực chẳng đã mới kiu lisp mà khi kiu tới thì nhờ viết thêm đoạn tréo ngoe là viết 1 text có giá trị của point sau khi đã chỉnh để có đường mà kiểm tra.

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 các bạn rẩt nhiều về sự quan tâm này, có một số ý mình nêu rõ hơn là: trong bản vẽ mẫu, các tên điểm t1, t2,...L8,L9.. đây là các "text chữ", gặp trường hợp tên điểm là 1,2,3... là Các "text số", sợ chương trình "đọc nhầm". Bản vẽ mẫu được tạo ra trên cơ sở nhập khẩu từ file ascii bằng lisp. Mình đang sưu tập một số lisp liên quan đến vẽ đường đồng mức, tạo bản đồ. các point giúp tạo ra lưới tam giác để nội suy bình đồ nhưng vì các point có z=0 nên bề mặt phẳng lì không có đường đồng mức nào được tạo ra cả. Lisp Gia-Bach giải quyết được vấn đề

Đúng như duy782006 sẽ có trường hợp bản vẽ "chết lần 2", tất cả Z đều =0, như vậy vấn đề cần đặt ra thêm là yêu cầu lisp chuyển Z các points về đúng giá trị nội dung của text chứ không phải giá trị thuộc tính Z của text (vì tất cả các Z của text đều bằng 0) , mong các bạn giúp thêm yêu cầu này để giải quyết gọn vấn đề.

Sau khi hoàn thành bộ sưu tập lisp về bản đồ, mình sẽ upload để các bạn làm trắc địa dùng chơi

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ấn đề cần đặt ra thêm là yêu cầu lisp chuyển Z các points về đúng giá trị nội dung của text chứ không phải giá trị thuộc tính Z của text (vì tất cả các Z của text đều bằng 0) , mong các bạn giúp thêm yêu cầu này để giải quyết gọn vấn đề.

......

Chào bạn tnmtpc'

Lisp này Tue_NV đã hoàn thiện lại theo yêu cầu của bạn nè. Thử nhé :

(defun c:MPT(/ ss ss2 i j lis Z Z1 Z2 p p2 pkt ent entp L caoZ lay_point
	lay_txt ename ans)
;copyright by Tue_NV
(command "undo" "be")

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon Point de lay Layer chua POINT : ")))
	      ))) "POINT")
(setq lay_Point (cdr(assoc 8 (entget ename))))
)

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon TEXT de lay Layer chua TEXT : ")))
	      ))) "TEXT")
(setq lay_Txt (cdr(assoc 8 (entget ename))))
)

(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 lay_txt))) 
i 0 j 0 lis (list) Z1 (list) Z2 (list))
(setq ss2 (ssget "X" (list (cons 0 "POINT") (cons 8 lay_Point))) )
(while (	(setq entp (entget (ssname ss i)) )
(setq p (cdr(assoc 10 entp)))
(setq lis (append lis 
		(list (list (round (car p) 3) (round (cadr p) 3)) )
	  )
)
(setq Z1 (append Z1 (list (caddr p))))
(if (setq chu (distof (cdr(assoc 1 entp)) 2))
	(setq Z2 (append Z2 (list chu)))
)
(setq i (1+ i))
)
(initget "ZT ZC")
  (setq ans (getkword 
	"\n Move Z point ve ZTEXT / Move Zpoint ve Z la chu so cua TEXT : "
))
(if (= ans "ZT") (setq Z Z1) (setq Z Z2))
(while (	(setq ent (ssname ss2 j))
(setq p2 (cdr(assoc 10 (entget ent))))
(setq pkt (list (round (car p2) 3) (round (cadr p2) 3)) )
(if (setq L (member pkt lis))
	(progn 
		(setq caoZ (nth (- (length lis) (length L)) Z) )
		(command "move" ent "" (list 0 0 (caddr p2)) 
				        (list 0 0 caoZ)
		)
  	)
)
(setq j (1+ j))
)
(command "undo" "end")
)
;
(defun round(so tp)
(setvar "dimzin" 0)
(atof (rtos so 2 tp))
)

 

Chào Gia_bach và Tue_NV,

Có 1 hàm tìm gần của bác Hoành rất hay, mà thiep đã sử dụng để nâng cấp lisp JD.lsp nối các điểm đường chuyền, bây giờ không nhớ nó nằm chỗ nào nữa. Đoạn mã như sau:

(defun timgan (p lst / dmin ppluu)

(foreach pp lst

(setq d (distance p (car pp)))

(if (or (not dmin) (> dmin d))

(setq dmin d

ppluu pp

)

)

)

(cdr ppluu)

)

trong đó:

- lst là list tọa độ các điểm chèn text. Dĩ nhiên cần phải lọc thêm text đó phải nằm trên lớp cao độ và phải là text số (trong bản vẽ của tmntpc là lớp el)

- p là 1 trong những tọa độ các point.

Như vậy, hàm này sẽ xác định được text cao độ nào gần với điểm p nhất. Sau đó dùng text cao độ này gán cho cao độ cho point.

Chúc các bạn thành công, hoàn thiện lisp chạy tốt.

Chào bạn thiep :

Nếu sử dụng hàm TIMGAN của bác Hoành trong trường hợp bài toán này có lẽ rằng không được. Vì như thế sẽ dễ gán nhầm cao độ của TEXT "hàng xóm" cho POINT lắm. :cheers:

Cảm ơn lời chúc của thiep. Thanks

  • Vote tăng 2

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
Chào bạn tnmtpc'

Lisp này Tue_NV đã hoàn thiện lại theo yêu cầu của bạn nè. Thử nhé :

(defun c:MPT(/ ss ss2 i j lis Z Z1 Z2 p p2 pkt ent entp L caoZ lay_point
	lay_txt ename ans)
;copyright by Tue_NV
(command "undo" "be")

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon Point de lay Layer chua POINT : ")))
	      ))) "POINT")
(setq lay_Point (cdr(assoc 8 (entget ename))))
)

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon TEXT de lay Layer chua TEXT : ")))
	      ))) "TEXT")
(setq lay_Txt (cdr(assoc 8 (entget ename))))
)

(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 lay_txt))) 
i 0 j 0 lis (list) Z1 (list) Z2 (list))
(setq ss2 (ssget "X" (list (cons 0 "POINT") (cons 8 lay_Point))) )
(while (< i (sslength ss))
(setq entp (entget (ssname ss i)) )
(setq p (cdr(assoc 10 entp)))
(setq lis (append lis 
		(list (list (round (car p) 3) (round (cadr p) 3)) )
	  )
)
(setq Z1 (append Z1 (list (caddr p))))
(if (setq chu (distof (cdr(assoc 1 entp)) 2))
	(setq Z2 (append Z2 (list chu)))
)
(setq i (1+ i))
)
(initget "ZT ZC")
  (setq ans (getkword 
	"\n Move Z point ve ZTEXT / Move Zpoint ve Z la chu so cua TEXT : "
))
(if (= ans "ZT") (setq Z Z1) (setq Z Z2))
(while (< j (sslength ss2))
(setq ent (ssname ss2 j))
(setq p2 (cdr(assoc 10 (entget ent))))
(setq pkt (list (round (car p2) 3) (round (cadr p2) 3)) )
(if (setq L (member pkt lis))
	(progn 
		(setq caoZ (nth (- (length lis) (length L)) Z) )
		(command "move" ent "" (list 0 0 (caddr p2)) 
				        (list 0 0 caoZ)
		)
  	)
)
(setq j (1+ j))
)
(command "undo" "end")
)
;
(defun round(so tp)
(setvar "dimzin" 0)
(atof (rtos so 2 tp))
)

Chào bạn thiep :

Nếu sử dụng hàm TIMGAN của bác Hoành trong trường hợp bài toán này có lẽ rằng không được. Vì như thế sẽ dễ gán nhầm cao độ của TEXT "hàng xóm" cho POINT lắm. :cheers:

Cảm ơn lời chúc của thiep. Thanks

Vấn đề đã được giải quyết, cám ơn Tue_NV và các bạn rất nhiề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
Chào bạn chandatn,

Tất cả các đối tượng trong Cad đều được quản lý bởi các mã DXF của chúng. Để xem các mã DXF của một đối tượng bạn sử dụng hàm (entget(car(entsel))) và chọn đối tượng muốn xem.

Để hiểu được các mã này bạn nên tìm hiểu kỹ trong phần hướng dẫn Help của CAD.

Việc hiểu các mã này không quá khó, chỉ cần bạn lưu tâm thì sau một thời gian ngắn bạn sẽ rõ. Việc thuộc các mã này sẽ giúp bạn thuận lợi hơn khi sử dụng nhưng không nhất thiết phải thuộc đâu bạn ạ. Nó khá nhiều và bạn chỉ cần nhớ vài cái chính hay dùng, còn đâu thì mỗi khi cần dùng bạn có thể mở Help ra để tham khảo lại cũng nhanh thôi.

Bạn có thể tham khảo các bài hướng dẫn lập trình lisp có trên diễn đàn và thực hành dần dần sẽ quen thôi, đừng ngại nếu gặp phải khó khăn. Bất cứ khi nào bạn cần đều có thể post yêu cầu của bạn lên mọi người sẽ hỗ trợ. Tuy nhiên việc bạn hiểu và ứng dụng được lisp vào trong côg việc sẽ giúp bạn làm chủ công việc của mình và chủ động hơn nhiều bạn ạ.

Chúc bạn thành công.

 

Trước tiên mình cám ơn các bạn đã chỉ gúp. Thực tình mình đọc các mã của cad nhưng không hiểu gì! Mình muốn lọc các block có thuộc tính trong tập hợp các đối tượng được chọn để dùng lệnh "burst" cho nhanh mà không biết mã của nó nên không thực tập nổi. Mong các bạn chỉ bảo thêm! Mình chân thành 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
Trước tiên mình cám ơn các bạn đã chỉ gúp. Thực tình mình đọc các mã của cad nhưng không hiểu gì! Mình muốn lọc các block có thuộc tính trong tập hợp các đối tượng được chọn để dùng lệnh "burst" cho nhanh mà không biết mã của nó nên không thực tập nổi. Mong các bạn chỉ bảo thêm! Mình chân thành cám ơn!

Chào bạn chandatn,

Việc đọc và hiểu được các mã DXF của tất cả các đối tượng trong CAD là một việc khá chua đấy. Bạn cần kiên trì và tìm hiểu dần dần chứ đừng ham biết hết ngay một lúc. Mưa dầm thấm đất bạn ạ.

Về các mã DXF của một block, bạn có thể tham khảo ở đây:

((-1 . ) (0 . "INSERT") (330 . ) (5 . "85F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "DELAMINATION") (100 . "AcDbBlockReference") (66 . 1) (2 . "Atl17") (10 5237.78 4923.46 0.0) (41 . 20.0) (42 . 20.0) (43 . 20.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

 

Bạn lưu ý các mã sau:

- mã DXF số 0 là mã chỉ kiểu loại đối tượng trong CAD. Với block thì mã này luôn có giá trị là "INSERT" tức (0 . "INSERT")

- mã DXF số 8 là mã chỉ tên lớp chứa đối tượng trong CAD. Ở đây cái Block của bạn nằm trên lớp "DELAMINATION". tức là (8 . "DELAMINATION")

- mã DXF số 66 là mã chỉ đối tượng có hay không có các thuộc tính đi kèm. Khi mã này bằng 1 thì đối tượng có thuộc tính kèm theo và khi nó bằng 0 hay không có thì đối tượng không có thuộc tính đi kèm bạn ạ. Bạn lưu ý rằng mã 66 này chỉ dùng với các đối tượng có thể mang các thuộc tính thôi bạn nhé.

Trong ví dụ ở trên mã DXF 66 là (66 . 1) có nghĩa cái block này có thuộc tính đi kèm bạn ạ.

 

Như vậy để lọc các block có chứa thuộc tính trên bản vẽ bạn có thể dùng hàm ssget kết hợp với các danh sách lọc như sau:

(setq ss (ssget "x" '(( 0 . "INSERT") (66 . 1))))

Tập chọn ss sẽ bao gồm tất cả các đối tượng là block chứa thuộc tính trên bản vẽ của bạn. Sau đó bạn muốn mổ muốn thiến thế nào đối với các đối tượng trong tập chọn này là tùy ý bạn.

Chúc bạn thành công.

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
Chào bạn tnmtpc'

Lisp này Tue_NV đã hoàn thiện lại theo yêu cầu của bạn nè. Thử nhé :

(defun c:MPT(/ ss ss2 i j lis Z Z1 Z2 p p2 pkt ent entp L caoZ lay_point
	lay_txt ename ans)
;copyright by Tue_NV
(command "undo" "be")

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon Point de lay Layer chua POINT : ")))
	      ))) "POINT")
(setq lay_Point (cdr(assoc 8 (entget ename))))
)

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon TEXT de lay Layer chua TEXT : ")))
	      ))) "TEXT")
(setq lay_Txt (cdr(assoc 8 (entget ename))))
)

(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 lay_txt))) 
i 0 j 0 lis (list) Z1 (list) Z2 (list))
(setq ss2 (ssget "X" (list (cons 0 "POINT") (cons 8 lay_Point))) )
(while (< i (sslength ss))
(setq entp (entget (ssname ss i)) )
(setq p (cdr(assoc 10 entp)))
(setq lis (append lis 
		(list (list (round (car p) 3) (round (cadr p) 3)) )
	  )
)
(setq Z1 (append Z1 (list (caddr p))))
(if (setq chu (distof (cdr(assoc 1 entp)) 2))
	(setq Z2 (append Z2 (list chu)))
)
(setq i (1+ i))
)
(initget "ZT ZC")
  (setq ans (getkword 
	"\n Move Z point ve ZTEXT / Move Zpoint ve Z la chu so cua TEXT : "
))
(if (= ans "ZT") (setq Z Z1) (setq Z Z2))
(while (< j (sslength ss2))
(setq ent (ssname ss2 j))
(setq p2 (cdr(assoc 10 (entget ent))))
(setq pkt (list (round (car p2) 3) (round (cadr p2) 3)) )
(if (setq L (member pkt lis))
	(progn 
		(setq caoZ (nth (- (length lis) (length L)) Z) )
		(command "move" ent "" (list 0 0 (caddr p2)) 
				        (list 0 0 caoZ)
		)
  	)
)
(setq j (1+ j))
)
(command "undo" "end")
)
;
(defun round(so tp)
(setvar "dimzin" 0)
(atof (rtos so 2 tp))
)

Chào bạn thiep :

Nếu sử dụng hàm TIMGAN của bác Hoành trong trường hợp bài toán này có lẽ rằng không được. Vì như thế sẽ dễ gán nhầm cao độ của TEXT "hàng xóm" cho POINT lắm. :cheers:

Cảm ơn lời chúc của thiep. Thanks

Chào Tue_NV, vẫn có thể được, bằng cách trước hết "san bằng" độ cao của tất cả text cao độ và point về mặt phẳng 0.0 Sau đó tạo mã duyệt từng point tìm text cao độ gần nó nhất bằng cách sử dụng hàm timgan. Sau đó nâng cả text độ cao và point lên độ cao của nội dung text số. Sau đó .... OK

Không cần hỏi "\n Move Z point ve ZTEXT / Move Zpoint ve Z la chu so cua TEXT : " vì chỉ 1 điều kiện ZC là OK rồi.

  • 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
Chào Tue_NV, vẫn có thể được, bằng cách trước hết "san bằng" độ cao của tất cả text cao độ và point về mặt phẳng 0.0 Sau đó tạo mã duyệt từng point tìm text cao độ gần nó nhất bằng cách sử dụng hàm timgan. Sau đó nâng cả text độ cao và point lên độ cao của nội dung text số. Sau đó .... OK

Không cần hỏi "\n Move Z point ve ZTEXT / Move Zpoint ve Z la chu so cua TEXT : " vì chỉ 1 điều kiện ZC là OK rồi.

Chào thiep

Nếu thiep sử dụng từ "san bằng" thì bài toán trở nên đúng đắn. Còn nếu không sử dụng từ "san bằng" thì point rất dễ nhận cao độ Z là Text của thằng "hàng xóm". Lisp TIMGAN của bác Hoành không thể áp dụng đúng trong trường hợp của bài toán không gian 3D trong trường hợp này. Phải nhờ tới điều kiện "san bằng để giải quyết.

Tuy nhiên, nếu mà "san bằng" như vậy thì không thể Move các point về cao độ của điểm chèn Text được vì cao độ của điểm chèn Text và điểm chèn Point được đưa về mặt phẳng 0.0 rồi

 

Đây là Lisp mà Tue_NV viết theo ý của thiep :

1. "San bằng" độ cao của tất cả text cao độ và point về mặt phẳng 0.0

2. Sử dụng hàm TIMGAN để tìm Text gần point nhất (vì có thể giữa point và Text có khoảng hở nhất định nào đó)

3. Dựa vào nội dung của Text số : đây là độ cao -> theo ý của thiep : nâng cả text độ cao và point lên độ cao của nội dung text số

Cảm ơn thiep đã gợi ý cho Tue_NV hoàn thành code này. Nếu có gì chưa đúng lắm các bạn có thể góp ý để mình chỉnh sửa lại. Thanks

 

@ tnmtpc : Theo Tue_NV suy luận thì trước khi sử dụng Lisp mà Tue_NV đã viết thì bạn đã sử dụng cái Lisp di chuyển các text sao cho điểm chèn text trùng các point tương ứng rồi, để cho các point và Text trùng nhau rồi, phải không bạn tnmtpc? -> Cái Lisp đó cũng chính là bản chất của Lisp TIMGAN đấy.

 

Đây là code mà Tue_NV đã viết lại theo ý kiến của bạn thiep

(defun c:MPT(/ ss ss2 i j lis p p2 textgan entextgan Ztextgan ent entp 
	lay_point lay_txt)
;copyright by Tue_NV
(command "undo" "be")

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon Point de lay Layer chua POINT : ")))
	      ))) "POINT")
(setq lay_Point (cdr(assoc 8 (entget ename))))
)

(if (= (cdr (assoc 0 (entget 
(setq ename (car (entsel "\nChon TEXT de lay Layer chua TEXT : ")))
	      ))) "TEXT")
(setq lay_Txt (cdr(assoc 8 (entget ename))))
)

(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 lay_txt))) 
i 0 j 0 lis (list) )
(setq ss2 (ssget "X" (list (cons 0 "POINT") (cons 8 lay_Point))) )
(ZO ss) (ZO ss2)

(while (	(setq entp (entget (ssname ss i)) )
(setq p (cdr(assoc 10 entp)))
(setq lis (append lis (list p) )
)

(setq i (1+ i))
)

(while (	(setq ent (ssname ss2 j))
(setq p2 (cdr(assoc 10 (entget ent))))
(setq textgan (ssget "X" 
		(list 
		(cons 0 "TEXT") 
		(cons 8 lay_txt)
		 (cons 10 (timgan p2 lis)) 
		))) 
(setq entextgan (ssname textgan 0))
(if (distof 
	(cdr(assoc 1 (entget entextgan) )) 2)
	(setq Ztextgan 
	   (distof (cdr(assoc 1 (entget entextgan) )) 2)
	)
	(setq Ztextgan 0.0)
)
	(command "move" ent entextgan "" (list 0 0 (caddr p2)) 
				(list 0 0 Ztextgan)
	)
(setq j (1+ j))
)
(command "undo" "end")
)
;
(defun round(so tp)
(setvar "dimzin" 0)
(atof (rtos so 2 tp))
)
;
(defun ZO(ss / i ent po)
(setq i 0)
(while (		(setq ent (entget(ssname ss i)))
	(setq po (cdr(assoc 10 ent)))
	(entmod (subst (list 10 (car po) (cadr po) 0.0) 
			(assoc 10 ent) ent
		)
	)
	(setq i (1+ i))
)
)
;
(defun timgan	(p lst / dmin ppluu)
      (foreach pp lst
        (setq d (distance p pp))
        (if (or (not dmin) (> dmin d))
  	(setq dmin d
  	      ppluu pp
  	)
        )
      )
     ppluu
)

  • Vote tăng 3

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

mình đang cần gấp 1 lisp như thế này, mong mọi người giúp đỡ.

 

Trong file bình đồ có nhiều Text (ko có Mtext) , mỗi text ghi cao 1 trình bằng số , vd: 1.34 ; 0.25 ..v....v....

Mình đang cần lisp chuyển các text đó thành số và xuất ra thành 1 cột trong excel để có thể tính tổng và lấy trung bình của các số đó. Có khoảng 3000 text như thế :cheers:

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
mình đang cần gấp 1 lisp như thế này, mong mọi người giúp đỡ.

 

Trong file bình đồ có nhiều Text (ko có Mtext) , mỗi text ghi cao 1 trình bằng số , vd: 1.34 ; 0.25 ..v....v....

Mình đang cần lisp chuyển các text đó thành số và xuất ra thành 1 cột trong excel để có thể tính tổng và lấy trung bình của các số đó. Có khoảng 3000 text như thế :cheers:

 

Bạn dùng thử LISP, nhưng chỉ xuất ra file TXT nhưng bạn cũng có thể mở bằng Excel và lấy giá trị cột Z (cột thứ tư) là cái bạn cần, xin chia sẽ với bạn (mình hay dùng cái này để sài với Nova.............)

;=================================

(DEFUN C:XUATTEXT(/ DIM_OLD THOP SSTHOP INDEX path_file file_write TOLIST VALUE_TEXT CORN_TEXT STT L_POINT STR_KQ )

(alert "DNPP_say: TIEN ICH TRICH XUAT DIEM TEXT.....DUNG IMPORT TRONG NOVA

------------------------------------------------------------------Email: DoanNhut@gmail.com------------------")

(SETQ DIM_OLD (GETVAR "DIMZIN"))

(SETVAR "DIMZIN" 0)

(SETQ THOP (SSGET '((-4 . "")))

SSTHOP (SSLENGTH THOP)

INDEX 0

)

 

;----------------------------------------------------CHON NOI LUU FILE

 

(setq path_file (getfiled "DNPP_say: Chon noi luu file Export >>>>>>>>>>>>>>" "DNPP_DATA" "txt" 1))

(setq file_write (open path_file "w"))

 

;-----------------------------------------------------------------

 

(WHILE (< INDEX SSTHOP)

;--------------------------------------LAY GIA TRI TEXT

(SETQ TOLIST (ENTGET (SSNAME THOP INDEX))

VALUE_TEXT (CDR (ASSOC 1 TOLIST))

)

;--------------------------------------LAY TOA DO TEXT

(IF (= (CADR (ASSOC 11 TOLIST)) 0)

(SETQ CORN_TEXT (CDR (ASSOC 10 TOLIST)))

(SETQ CORN_TEXT (CDR (ASSOC 11 TOLIST)))

)

 

 

;--------------------------------------XULY DATA

(SETQ STT (ITOA (+ 1 INDEX)))

(SETQ L_POINT (LIST (CAR CORN_TEXT) (CADR CORN_TEXT) (ATOF VALUE_TEXT)))

(SETQ STR_KQ

(STRCAT

STT

"\t"

(RTOS (CAR CORN_TEXT) 2 4)

"\t"

(RTOS (CADR CORN_TEXT) 2 4)

"\t"

VALUE_TEXT

)

)

;----------------------------------------LUU FILE

(write-line STR_KQ file_write)

(SETQ INDEX (+ 1 INDEX))

);END WHILE

(close file_write)

(SETVAR "DIMZIN" DIM_OLD)

(PRINC "\n----------0-------- Cong cu xuat TEXT____Created by DoanNhut ----------0--------")

(PRINC)

)

;=======================

Hy vọng bạn dùng được. Hình như diễn đàn có lỗi. Bạn tải cái này:

http://www.cadviet.com/upfiles/2/ut08_xaak...le_xuattext.lsp

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 đang cần gấp 1 lisp như thế này, mong mọi người giúp đỡ : Nếu bác nào là dân XD thì đều biết việc đánh tọa độ , tên cọc rất mất công . Vì thế , nếu có 1 lisp dùng để đánh tên cọc và ghi ra tọa độ của cọc (point) đó thì rất tiện dụng . Thx .

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

bạn ơi mình dùng không được, đánh chữ xuattext máy nó báo lỗi

 

đây là file của mình

 

http://www.fileden.com/files/2008/5/29/1934594/Htrang.dwg

 

(text màu xanh)

 

bạn xuất ra được file text thì gửi cho mình luôn nhé :cheers:

 

Mình chỉ cần tính tổng các text trong đó thôi.

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
bạn ơi mình dùng không được, đánh chữ xuattext máy nó báo lỗi

 

đây là file của mình

 

http://www.fileden.com/files/2008/5/29/1934594/Htrang.dwg

 

(text màu xanh)

 

bạn xuất ra được file text thì gửi cho mình luôn nhé :cheers:

 

Mình chỉ cần tính tổng các text trong đó thôi.

 

LÍP chạy bình thwờng mà, bạn copy đường LINK phía dưới là được, đây là file TXT và XLS mình đã chuyển và đây là cái bạn cần:

http://www.cadviet.com/upfiles/2/xuattext.rar

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
bạn ơi mình dùng không được, đánh chữ xuattext máy nó báo lỗi

 

đây là file của mình

 

http://www.fileden.com/files/2008/5/29/1934594/Htrang.dwg

 

(text màu xanh)

 

bạn xuất ra được file text thì gửi cho mình luôn nhé :cheers:

 

Mình chỉ cần tính tổng các text trong đó thôi.

Nếu bạn chỉ cần tính tổng các text (hay cộng, trừ, nhân chia), không cần thiết phải đưa các Text ra file (Text, Excell ...)

 

Bạn tham khảo List cộng, trừ, nhân chia của q288

http://www.cadviet.com/forum/index.php?sho...ost&p=65050

 

hay Lisp cộng trừ nhân chia text, giá trị trung bình cộng các text của q288

http://www.cadviet.com/forum/index.php?sho...ost&p=65338

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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×