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

[Yêu cầu] Viết lisp xử lý số liệu từ .txt vào trong cad

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

Em có một bài toán như sau :

 

Em có 1 file txt : có 5 cột từ H1 – H5 .

File đính kèm : http://www.cadviet.c...108091_h1h5.txt

Yêu cầu đặt ra là viết 1 lisp thực hiện như sau :

 

 

79d7d682adeda3d29cd5ac7114e1eb55_45847380.20120608083652.700x0.jpg

 

Trình tự lisp mong muốn:

Nhập số liệu từ file text :

 

Khoảng cách giữa các H1-H2 :

 

Khoảng cách giữa các H2-H3 :

 

Khoảng cách giữa các H3-H4 :

 

Khoảng cách giữa các H4-H5 :

Chọn điểm đặt cho dòng text :

Kết quả thu được là hàng text từ H1- H5 cách nhau 1 khoảng đã nhập được nhập vào trong bản cad.

5ced68a7fe375e92c86b0f1afd82b12f_45847381.20120608085042.700x0.jpg

 

Giả sử trong file số liệu .txt ban đầu của em có 100 dòng tương ứng với 100 lần nhập thì lisp tự động hỏi dòng lệnh :

Chọn điểm đặt dòng text 1:

Chọn điểm đặt dòng text 2:

......

Chọn điểm đặt dòng text 100

 

 

Em đang cần gấp. Mong các bác giúp đỡ ạ!

 

 

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ẳng hiểu nội dung chi mà lặp đi lặp lại, đã lấy từ số liệu rồi thì để nó chèn 1 lượt hết luôn, còn nhập khoảng cách h1-h2,h2-h3...với pick điểm đặt làm gì nữa bạn :o File có 10000 dòng chắc bạn làm tới sá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ẳng hiểu nội dung chi mà lặp đi lặp lại, đã lấy từ số liệu rồi thì để nó chèn 1 lượt hết luôn, còn nhập khoảng cách h1-h2,h2-h3...với pick điểm đặt làm gì nữa bạn :o File có 10000 dòng chắc bạn làm tới sáng :(

 

Nghĩa là như thế nào hả bác ketxu? ý bác là lập thành 1 bảng luôn đúng không? Nhưng ý em là các mỗi một dòng ấy em sẽ chèn vào từng mặt cắt ngang . Nếu lập bảng thì em cũng phải copy tới sáng thật. Em cũng đang cần gấp . Mong bác chỉ giáo ạ!

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ập số liệu từ file text :

Khoảng cách giữa các H1-H2 :

Khoảng cách giữa các H2-H3 :

Khoảng cách giữa các H3-H4 :

Khoảng cách giữa các H4-H5 :

Chọn điểm đặt cho dòng text :

Kết quả thu được là hàng text từ H1- H5 cách nhau 1 khoảng đã nhập được nhập vào trong bản cad.

File đính kèm :

http://www.cadviet.c...091_yeu_cau.dwg

 

 

Đoạn này để làm gì đây, khi mà mình đã lấy dữ liệu từ file txt ?????

Kết quả xuất ra chỉ là hàng H1,H2...H5 hay là cả số liệu phía trên và Line kẻ ???

 

 

 

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

Đoạn này để làm gì đây, khi mà mình đã lấy dữ liệu từ file txt ?????

Kết quả xuất ra chỉ là hàng H1,H2...H5 hay là cả số liệu phía trên và Line kẻ ???

[/left][/left]

 

Chỉ lấy số liệu giá trị text thôi ạ... Cái line kẻ và cái chữ H1-H5 là em ghi minh họa ạ .

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 hỏi 2 lần rồi, cái đoạn bạn ghi như dòng promt kia dùng để làm gì, khi mà các số liệu đấy đã lấy ra từ txt.

Nếu chỉ đơn thuần là tạo text thì yêu cầu của bạn không có vấn đề gì khó cả. Giờ mình ra công trường, lúc về chưa ai viết giúp bạn thì mình viết

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 hỏi 2 lần rồi, cái đoạn bạn ghi như dòng promt kia dùng để làm gì, khi mà các số liệu đấy đã lấy ra từ txt.

Nếu chỉ đơn thuần là tạo text thì yêu cầu của bạn không có vấn đề gì khó cả. Giờ mình ra công trường, lúc về chưa ai viết giúp bạn thì mình viết

 

Huhu. e tối trí chưa hiểu ý bác Ketxu lắm. Bác cứ viết xem ý bác có giống ý em không ạ. 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

Chán bạn quá. Phần trình tự Lisp mong muốn tại sao lại có phần nhập khoảng cách H1-> H2, H2->H3 ... khi mà khoảng cách này đã lấy tương ứng ở file Txt ??????

Người viết chỉ viết khi đầy đủ dữ liệu cần biết, có ai ngồi không viết xong nộp bài chờ sửa đâu bạ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

Chán bạn quá. Phần trình tự Lisp mong muốn tại sao lại có phần nhập khoảng cách H1-> H2, H2->H3 ... khi mà khoảng cách này đã lấy tương ứng ở file Txt ??????

Người viết chỉ viết khi đầy đủ dữ liệu cần biết, có ai ngồi không viết xong nộp bài chờ sửa đâu bạn :)

 

Dạ vâng thế cũng được ạ.Bỏ khoảng cách H1-H2 H2-H3... đ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

Mà 5 H thì chỉ có 4 cột thôi bạn ạ. Lên 5 cột thì thành đến H6 mất

 

Em đoán bác ketxu không hiểu ý em rồi.

 

Ý em là như thế này nhé. Cái giá trị text mà trong file .txt là giá trị cần thể hiện lên (chứ đây không phải là khoảng cách ạ), cột H1 dòng 1 giá trị text là 1,58 , cột H2 dòng 1 giá trị text là 1,61 ..... vì thế nên em mới cần nhập khoảng cách giữa các cột ạ ( 5 cột thì có 4 khoảng cách) . Chỉ cần thể hiện giá trị text lên 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

Trùi bạn giải thích hơi khó hiểu và càng giải thích càng dối.

Để mình tóm tắt lại cho bác Ketxu và các bạn khác xem sao nhé.

Nếu chưa đúng bạn comment thêm (và các bác khác than ôi đừng ném đá).

B1: Có 1 file text như bạn nói, nhưng trong file k có sẵn khoảng cách các điểm, khoảng cách đó sẽ có trên bản vẽ để bạn nhập từng điểm một

Với mỗi mặt cắt ngang bạn sẽ phải nhập khoảng cách 4 lần và điểm đặt 1 lần

B2: Chạy lisp thì sẽ read file text cho bạn (file này chỉ là text cao độ),

Chạy từng hàng, một hàng bạn nhập khoảng cách 4 lần, và điểm đặt 1 lần như đã nói

Cách này thủ công thật, chỉ bớt được tí gian bạn nhập text còn lại thì cũng oải

Mình thấy bạn nên yêu gửi file và mong muốn đầy đủ hơn để ae có thể giúp bạn một phương án khả quan hơn

Đúng ý bạn muốn diễn đạt chưa nào

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 đoán bác ketxu không hiểu ý em rồi.

 

Ý em là như thế này nhé. Cái giá trị text mà trong file .txt là giá trị cần thể hiện lên (chứ đây không phải là khoảng cách ạ), cột H1 dòng 1 giá trị text là 1,58 , cột H2 dòng 1 giá trị text là 1,61 ..... vì thế nên em mới cần nhập khoảng cách giữa các cột ạ ( 5 cột thì có 4 khoảng cách) . Chỉ cần thể hiện giá trị text lên thôi ạ!

Viết xong rồi, đang định post lên - Đọc bài này của bạn phát bực!!! Mà đến cái hình minh họa cũng sai. Khoảng cách thì nó phải nằm giữa 2 text! Lại viết lại. Lần sau mong bạn giải thích đơn giản và chính xác những gì bạn cần, kẻo mất thời gian của bạ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ùi bạn giải thích hơi khó hiểu và càng giải thích càng dối.

Để mình tóm tắt lại cho bác Ketxu và các bạn khác xem sao nhé.

Nếu chưa đúng bạn comment thêm (và các bác khác than ôi đừng ném đá).

B1: Có 1 file text như bạn nói, nhưng trong file k có sẵn khoảng cách các điểm, khoảng cách đó sẽ có trên bản vẽ để bạn nhập từng điểm một

Với mỗi mặt cắt ngang bạn sẽ phải nhập khoảng cách 4 lần và điểm đặt 1 lần

B2: Chạy lisp thì sẽ read file text cho bạn (file này chỉ là text cao độ),

Chạy từng hàng, một hàng bạn nhập khoảng cách 4 lần, và điểm đặt 1 lần như đã nói

Cách này thủ công thật, chỉ bớt được tí gian bạn nhập text còn lại thì cũng oải

Mình thấy bạn nên yêu gửi file và mong muốn đầy đủ hơn để ae có thể giúp bạn một phương án khả quan hơn

Đúng ý bạn muốn diễn đạt chưa nào

 

Đúng rồi đấy ạ . Em phải vẽ gần 3000 cái mặt cắt hoàn công của mấy tháng trời .Mong các bác chỉ giáo giúp em ạ108091_20120608_110259.jpg

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

 

 

Viết xong rồi, đang định post lên - Đọc bài này của bạn phát bực!!! Mà đến cái hình minh họa cũng sai. Khoảng cách thì nó phải nằm giữa 2 text! Lại viết lại. Lần sau mong bạn giải thích đơn giản và chính xác những gì bạn cần, kẻo mất thời gian của bạn !!!

 

Em xin lỗi vì không biết cách diễn đạt . Mong bác thông cảm và giúp đỡ ạ!

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úc bạn thành công.

(defun c:itext(/ blk *tH* lstDis lstDisX lstVal fn mLstPnt rl i j p mtext)(vl-load-com)
(setq blk (vla-get-block (vla-get-activelayout(vla-get-activedocument (vlax-get-acad-object)))))
(setq *tH* 1)
(cond
((setq fn (getfiled "Chon file so lieu" "" "txt" 8))
 (defun mtext (str p blk h / obj)
  (vla-put-AttachmentPoint (setq obj (vla-addmtext blk (vlax-3d-point p) h str)) 4)
  (vla-put-rotation obj (* pi 0.5))  
 )
 (defun mLstPnt (p lstDisX lstVal)  
  (mapcar '(lambda(y z)(mtext y z blk *tH*))
lstVal
(cons p (mapcar '(lambda(x)(setq p (cons (+ (car p) x) (cdr p)))) lstDisX))  
  )
 )

(setq fn (open fn "r"))
(while (setq rl (read-line fn))
 (setq  i 1 j 0
p (getpoint (strcat "\nDiem dat Text dong thu "(itoa (setq j (1+ j)))" :"))
lstVal (mapcar 'vl-princ-to-string (read (strcat "(" rl ")")))
lstDisX
(reverse
 	(repeat (1- (length lstVal))
  	(setq lstDis (cons (getdist (strcat "\nKhoang cach tu cot H" (itoa i) "-> H" (itoa (setq i (1+ i))) ":")) lstDis))
 	)
)
 )
 (mLstPnt p lstDisX lstVal)
 (setq lstDis '())
)
(close fn)
)
)
)

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úc bạn thành công.
 (defun c:itext(/ blk *tH* lstDis lstDisX lstVal fn mLstPnt rl i j p mtext)(vl-load-com) (setq blk (vla-get-block (vla-get-activelayout(vla-get-activedocument (vlax-get-acad-object))))) (setq *tH* 1) (cond ((setq fn (getfiled "Chon file so lieu" "" "txt" 8)) (defun mtext (str p blk h / obj) (vla-put-AttachmentPoint (setq obj (vla-addmtext blk (vlax-3d-point p) h str)) 4) (vla-put-rotation obj (* pi 0.5)) ) (defun mLstPnt (p lstDisX lstVal) (mapcar '(lambda(y z)(mtext y z blk *tH*)) lstVal (cons p (mapcar '(lambda(x)(setq p (cons (+ (car p) x) (cdr p)))) lstDisX)) ) ) (setq fn (open fn "r")) (while (setq rl (read-line fn)) (setq i 1 j 0 p (getpoint (strcat "\nDiem dat Text dong thu "(itoa (setq j (1+ j)))" :")) lstVal (mapcar 'vl-princ-to-string (read (strcat "(" rl ")"))) lstDisX (reverse (repeat (1- (length lstVal)) (setq lstDis (cons (getdist (strcat "\nKhoang cach tu cot H" (itoa i) "-> H" (itoa (setq i (1+ i))) ":")) lstDis)) ) ) ) (mLstPnt p lstDisX lstVal) (setq lstDis '()) ) (close fn) ) ) ) 

 

Em cảm ơn bác Ketxu. Lisp của bác gặp 3 vấn đề như sau :

1.Em chót nhập sai 1 khoảng cách dẫn tới sai toàn bộ những cái về sau.Lại phải nhập lại từ đầu.

2. Có thể làm cách nào để hiện giá trị H1 của dòng tiếp theo được không ạ? Cứ mãi là vòng lặp " chọn điểm đặt dòng 1" thì em không biết là tới đâu rồi ạ.

3. Em muốn nhớ giá trị khoảng cách của lần nhập trước có được không ạ

Mong bác giúp đỡ ạ

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 xin lỗi vì không biết cách diễn đạt . Mong bác thông cảm và giúp đỡ ạ!

Hề hề hề,

Thông như thông điếu rồi đây:


(defun Separate (S sym / i L ch)
(setq i 0 L nil)
(while (< i (strlen S))
     (setq i (1+ i) ch (substr S i 1))
     (if (= ch sym) (progn
(setq
L (append L (list (substr S 1 (- i 1))))
S (substr S (1+ i) (- (strlen S) i))
i 0
)
     ))
)
(append L (list S))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:nht (/ k1 k2 k3 k4 kcl kc fn f str ans txl p i oldos)
(setq oldos (getvar  "osmode" ))
(setvar "osmode" 0)
(command "undo" "be")
(setq k1 (getreal "\n Nhap khoang cach thu nhat: ")
         k2 (getreal "\n Nhap khoang cach thu hai: ")
         k3 (getreal "\n Nhap khoang cach thu ba: ")
         k4 (getreal "\n Nhap khoang cach thu tu: ")
         k5 (getreal "\n Nhap khoang cach thu nam: ")
         k6 (Getreal "\n Nhap khoang cach thu sau: ")
         k7 (getreal "\n Nhap khoang cach thu bay: ")
         k8 (getreal "\n Nhap khoang cach thu tam: ")
         k9 (getreal "\n Nhap khoang cach thu chin: ")
         kcl (list 0 k1 k2 k3 k4 k5 k6 k7 k8 k9)
)

(setq  fn (getfiled "Select Data File" "" "txt" 0)
           f (open fn "r")
           k 1
)
(while (and (/= (setq str (read-line f)) nil)
         (= (strcase (setq ans (getstring (strcat "\n Ban dang o dong du lieu thu " (rtos k 2 0) ".  Ban muon tiep tuc <y or n>: ")))) "Y") )
       (setq txl (separate str "\t")
                 p (getpoint  "\n Chon diem bat dau nhap text ")
          		i 0
          		kc 0 )
       (foreach s txl
          		(setq kc (+ kc (nth i kcl)))
          		(command "text" (list (+ (car p) kc) (cadr p) ) 2 90 s)
          		(setq i (1+ i))
       )
       (setq k (1+ k))
)
(close f)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Chúc bạn vui.

  • 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

 

Em cảm ơn bác Ketxu. Lisp của bác gặp 3 vấn đề như sau :

1.Em chót nhập sai 1 khoảng cách dẫn tới sai toàn bộ những cái về sau.Lại phải nhập lại từ đầu.

2. Có thể làm cách nào để hiện giá trị H1 của dòng tiếp theo được không ạ? Cứ mãi là vòng lặp " chọn điểm đặt dòng 1" thì em không biết là tới đâu rồi ạ.

3. Em muốn nhớ giá trị khoảng cách của lần nhập trước có được không ạ

Mong bác giúp đỡ ạ

Theo mình Nova có thể giúp bạ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

Theo mình Nova có thể giúp bạn ?

Em không cài được trên win 7 32 bit. em không có cad 2005 bản chuẩn nữa. toàn bản key gen không General đượ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ề hề hề,

Thông như thông điếu rồi đây:


(defun Separate (S sym / i L ch)
(setq i 0 L nil)
(while (< i (strlen S))
     (setq i (1+ i) ch (substr S i 1))
     (if (= ch sym) (progn
(setq
	L (append L (list (substr S 1 (- i 1))))
	S (substr S (1+ i) (- (strlen S) i))
	i 0
)
     ))
)
(append L (list S))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:nht (/ k1 k2 k3 k4 kcl kc fn f str ans txl p i oldos)
(setq oldos (getvar  "osmode" ))
(setvar "osmode" 0)
(command "undo" "be")
(setq k1 (getreal "\n Nhap khoang cach thu nhat: ")
         k2 (getreal "\n Nhap khoang cach thu hai: ")
         k3 (getreal "\n Nhap khoang cach thu ba: ")
         k4 (getreal "\n Nhap khoang cach thu tu: ")
         kcl (list 0 k1 k2 k3 k4)
)

(setq  fn (getfiled "Select Data File" "" "txt" 0)
           f (open fn "r")
)
(while (and (/= (setq str (read-line f)) nil) (= (strcase (setq ans (getstring "\n Ban muon tiep tuc <y or n>: "))) "Y"))
       (setq txl (separate str "\t")
                 p (getpoint  "\n Chon diem bat dau nhap text ")
              	i 0
              	kc 0 )
       (foreach s txl
              	(setq kc (+ kc (nth i kcl)))
              	(command "text" (list (+ (car p) kc) (cadr p) ) 2 90 s)
              	(setq i (1+ i))
       )
)
(close f)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Chúc bạn vui.

 

Em thử lisp của bác được mỗi một dòng là báo lỗi "​; error: Function cancelled"

Lisp của bác viết cho 5H , nếu em có 6H thì lỗi ngay . làm sao có thể linh động như của bác Ket xu được thì tốt ạ

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ảm ơn bác Ketxu. Lisp của bác gặp 3 vấn đề như sau :

1.Em chót nhập sai 1 khoảng cách dẫn tới sai toàn bộ những cái về sau.Lại phải nhập lại từ đầu.

2. Có thể làm cách nào để hiện giá trị H1 của dòng tiếp theo được không ạ? Cứ mãi là vòng lặp " chọn điểm đặt dòng 1" thì em không biết là tới đâu rồi ạ.

3. Em muốn nhớ giá trị khoảng cách của lần nhập trước có được không ạ

Mong bác giúp đỡ ạ

1. Làm theo yêu cầu của bạn thôi.

2. Dòng này mình đặt j 0 nhầm chỗ, bạn cho lên phía cùng hàng với (open fn "r") là được

3. Có, nhưng bạn không yêu cầ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

1. Làm theo yêu cầu của bạn thôi.

2. Dòng này mình đặt j 0 nhầm chỗ, bạn cho lên phía cùng hàng với (open fn "r") là được

3. Có, nhưng bạn không yêu cầu

 

Em xử lý được vấn đề thứ 2 rồi . Anh giúp em xử lý vấn đề thứ 3 được khô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

 

Em thử lisp của bác được mỗi một dòng là báo lỗi "​; error: Function cancelled"

Lisp của bác viết cho 5H , nếu em có 6H thì lỗi ngay . làm sao có thể linh động như của bác Ket xu được thì tốt ạ

Hề hề hề,

Muốn 6 thì có 6 ngay, nhưng vấn đề là bạn cần tối đa bao nhiêu cột để làm một thể. Mười cột nhé. Bổ sung vào lisp 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ề hề hề,

Muốn 6 thì có 6 ngay, nhưng vấn đề là bạn cần tối đa bao nhiêu cột để làm một thể. Mười cột nhé. Bổ sung vào lisp cũ.

 

Tối đa 10 cột cũng đượ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
Đăng nhập để thực hiện theo  

×