Đến nội dung


Hình ảnh
- - - - -

[Help me] Cách lấy số liệu từ file txt


  • Please log in to reply
47 replies to this topic

#1 kedensau88

kedensau88

    biết vẽ circle

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

Đã gửi 20 November 2011 - 12:00 AM

Các anh ơi cho em hỏi cái này.Giả sử em muốn vẽ 1 thư viện hình chữ nhật với các số liệu có sẵn trong file txt này mà khi vẽ thì chỉ cần gõ lệnh "chunhat" sau đó chỉ cần nhập số loại hình chữ nhật (ví dụ: loại 1,2,3...) là nó ra luôn hình chữ nhật với các kích thước tương ứng đó.Vậy nhờ các anh viết dùm em 1 cái lisp như vậy dc ko ạ.
Em mới học lập trình lisp nên cũng còn chưa biết nhiều.
Cảm ơn các anh nhiều.
Hình đã gửi
  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 20 November 2011 - 11:14 AM

Các anh ơi cho em hỏi cái này.Giả sử em muốn vẽ 1 thư viện hình chữ nhật với các số liệu có sẵn trong file txt này mà khi vẽ thì chỉ cần gõ lệnh "chunhat" sau đó chỉ cần nhập số loại hình chữ nhật (ví dụ: loại 1,2,3...) là nó ra luôn hình chữ nhật với các kích thước tương ứng đó.Vậy nhờ các anh viết dùm em 1 cái lisp như vậy dc ko ạ.
Em mới học lập trình lisp nên cũng còn chưa biết nhiều.
Cảm ơn các anh nhiều.
Hình đã gửi

Đây bạn! Nhưng lần sau đừng làm "kẻ đến sau" nữa nhé!
P/S (13h 21/11/2011): đã bổ sung hàm (vl-load-com) còn thiếu.

;Doan Van Ha - CADViet.com
;Ve Rectangle theo file so lieu *.txt
(defun C:HA( / lst stt pt loai dai rong)
(vl-load-com)
(BAT_DAU)
(command "undo" "begin")
(acet-sysvar-set (list "osmode" 0 "cmdecho" 0))
(if (setq fn (getfiled "Chon file chua so lieu" "" "txt" 2))
(progn
(setq PR (open fn "r") RL (read-line PR))
(while (setq RL (read-line PR))
(setq lst (cons RL lst)))
(setq lst (reverse lst))
(close PR)))
(initget 7) (setq stt (getint "\nChon STT cua hinh chu nhat: "))
(initget 1) (setq pt (getpoint "\nPich diem goc trai duoi cua hinh chu nhat: "))
(foreach n lst
(setq loai (atoi (TRAI_STR n "\t")))
(setq dai (atof (GIUA_STR n "\t" "\t")))
(setq rong (atof (PHAI_STR (PHAI_STR n "\t") "\t")))
(if (= loai stt)
(command "rectangle" pt (polar (polar pt 0 dai) (/ pi 2) rong))))
(acet-sysvar-restore)
(command "undo" "end")
(KET_THUC)
(princ))
(defun FINDSTR (str sym / z find) (setq z 0) (while (and (/= find sym) (<= z (- (strlen str) (strlen sym)))) (setq z (1+ z)) (setq find (substr str z (strlen sym)))) (if (= find sym) z nil))
(defun TRAI_STR(str str1) (if (acet-str-find str1 str) (substr str 1 (- (acet-str-find str1 str) 1))))
(defun PHAI_STR(str str1) (if (TRAI_STR str str1) (substr str (+ 1 (strlen str1) (strlen (TRAI_STR str str1))))))
(defun GIUA_STR(str str1 str2) (if (PHAI_STR str str1) (TRAI_STR (PHAI_STR str str1) str2)))
(defun BAT_DAU()
(setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)))
(vla-StartUndoMark AcDoc)
(setq err *error* *error* KHI_LOI))
(defun KET_THUC()
(acet-sysvar-restore)
(vla-EndUndoMark AcDoc)
(setq *error* err))
(defun KHI_LOI(msg)
(acet-sysvar-restore)
(vla-EndUndoMark AcDoc)
(redraw)
(command "u")
(princ (strcat "\n" msg ", Reset System Variables\n"))
(setq *error* err))

  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 kedensau88

kedensau88

    biết vẽ circle

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

Đã gửi 21 November 2011 - 12:10 PM

Anh Hà ơi,sau khi em gõ lệnh HA xong thì nó báo lỗi thế này nè :
Command: ha ; error: no function definition: VLAX-GET-ACAD-OBJECT
  • 0

#4 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 21 November 2011 - 12:38 PM

Bạn thêm dòng (vl-load-com) vào đầu lisp
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 21 November 2011 - 01:56 PM

Chào anh Hà !
Tiện đây cho em hỏi luôn cái này với. Giả sử em muốn vẽ về đầu báo khói cho hệ thống báo cháy địa chỉ như sau: Em vẽ một đầu báo khói có tên là A1. Do số lượng đầu báo khói lớn nên em muốn cho tiện là khi em copy A1 thành bản mới thì đồng thời bảng copy đó có tên là A2, A3, A4... chẳng hạng, thì có lệnh gì làm được điều đó không ?


Có, viết được, và đã có! Nhưng bạn chưa trả lời trả vốn gì về cái lisp trước cả hè!
P/S: srr bạn vì tôi nhầm với chủ topic là kedensau88. Vấn đề bạn hỏi thì bạn có thể tìm trên CADViet này. Mà hỏi vấn đề khác thì nên qua đúng topic đó cho dễ theo dõi hơn bạn à!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#6 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 21 November 2011 - 02:03 PM

Anh Hà ơi,sau khi em gõ lệnh HA xong thì nó báo lỗi thế này nè : Command: ha ; error: no function definition: VLAX-GET-ACAD-OBJECT

Hề hề hề,
Hãy bổ sung (vl-load-com) vào đầu lisp.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#7 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 21 November 2011 - 02:06 PM

Có, viết là được, và đã có! Nhưng bạn chưa trả lời trả vốn gì về cái lisp trước cả hè!

Hề hề hề,
Bác này nhanh tay thiệt, nhưng mà bác nhầm đối tượng rùi, Bài post bác trích hổng phải của chủ thớt đâu....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#8 kedensau88

kedensau88

    biết vẽ circle

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

Đã gửi 22 November 2011 - 09:37 AM

Anh ơi,cho em hỏi,giả sử em có 1 chương trình vẽ hình chữ nhật như thế này,em muốn đưa chương trình này vào cái chương trình của anh để thay thế cho câu lệnh này :"(command "rectangle" pt (polar (polar pt 0 dai) (/ pi 2) rong))))" thì em phải thay như thế nào cho đúng ạ ?

(defun C:CHUNHAT(/ W H1 P1 P2 P3 P4 OldOS)
(setq
dai(getreal "\nChieu dai=")
rong(getreal "\nChieu rong=")
P1(getpoint "\n Diem chuan:")
P2(polar P1 0.0 dai)
P3(polar P2 (/ pi 2) rong)
P4(polar P3 pi dai)
)
(setq OldOs(getvar "osmode"))
(setvar "osmode" 0)
(command "line" P1 P2 P3 P4 "c")
(setvar "osmode" OldOs)
(princ)
)
  • 0

#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 22 November 2011 - 10:45 AM

Anh ơi,cho em hỏi,giả sử em có 1 chương trình vẽ hình chữ nhật như thế này,em muốn đưa chương trình này vào cái chương trình của anh để thay thế cho câu lệnh này :"(command "rectangle" pt (polar (polar pt 0 dai) (/ pi 2) rong))))" thì em phải thay như thế nào cho đúng ạ ?

(defun C:CHUNHAT(/ W H1 P1 P2 P3 P4 OldOS)
(setq
dai(getreal "\nChieu dai=")
rong(getreal "\nChieu rong=")
P1(getpoint "\n Diem chuan:")
P2(polar P1 0.0 dai)
P3(polar P2 (/ pi 2) rong)
P4(polar P3 pi dai)
)
(setq OldOs(getvar "osmode"))
(setvar "osmode" 0)
(command "line" P1 P2 P3 P4 "c")
(setvar "osmode" OldOs)
(princ)
)


Hình như bạn chưa thử chạy chương trình mà tôi viết thì phải. Bạn đang muốn tự động hoá. Tôi tự động hoá cho bạn. Có tự động hoá rồi thì bạn xoay lại thủ công. Chương trình của tôi cũng vẽ hình chữ nhật (bằng lệnh rectangle) như bạn (vẽ bằng lệnh line) mà thôi. Bạn cứ chạy thử đi xem có tiện không đã nhé!
Thân thương!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#10 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 22 November 2011 - 12:04 PM

Anh ơi,cho em hỏi,giả sử em có 1 chương trình vẽ hình chữ nhật như thế này,em muốn đưa chương trình này vào cái chương trình của anh để thay thế cho câu lệnh này :"(command "rectangle" pt (polar (polar pt 0 dai) (/ pi 2) rong))))" thì em phải thay như thế nào cho đúng ạ ?

(defun C:CHUNHAT(/ W H1 P1 P2 P3 P4 OldOS)
(setq
dai(getreal "\nChieu dai=")
rong(getreal "\nChieu rong=")
P1(getpoint "\n Diem chuan:")
P2(polar P1 0.0 dai)
P3(polar P2 (/ pi 2) rong)
P4(polar P3 pi dai)
)
(setq OldOs(getvar "osmode"))
(setvar "osmode" 0)
(command "line" P1 P2 P3 P4 "c")
(setvar "osmode" OldOs)
(princ)
)

Hề hề hề,
Thay thế nào cho đúng ư???
Hoàn toàn không đơn giản như bạn nghĩ vì mỗi người viết lisp có một tư duy khác nhau. Từ cách đặt tên biến tới việc đặt các loại biến toàn cục và cục bộ. Nếu bạn chưa hiểu hết về những vấn đề này mà cứ thay lung tung vào cho nó khoái thì cái việc thay thế ấy sẽ hại bạn đó. Ngay cả việc lựa chọn thuật toán để hoàn thành nhiệm vụ của lisp cũng có nhiều phương án lắm chứ không phải lisp nào cũng giống nhau đâu, tùy vào cách tư duy của người làm lisp. Có thể có những lisp có chung đầu vào và đầu ra nhưng cách xử lý trong lisp lại hoàn toàn khác nhau. Vì thế hãy cẩn trọng.
Cách tốt nhất là bạn hãy nên sử dụng các lisp sưu tầm này độc lập với nhau cho tới khi bạn có đủ khả năng đọc và hiểu được nội dung của từng câu lệnh có trong lisp. Khi đó hãy nghĩ đến việc ghép các lisp để dùng bạn ạ.
Việc ghép lisp trước hết bạn cần phải hiểu về các biến được sử dụng trong các lisp đó và phải đồng nhất các biến này đã. Sau đó mới nói chuyện tới việc vận dụng từng câu lệnh cho phù hợp bạn ạ.

Trừ phi chính tác giả của lisp là người tiến hành ghép, còn nói chung đây là việc hoàn toàn không ngon ăn tí nào.

Hề hề hề, vài lời khó nghe, mong bạn chớ giận.
Hề hề hề....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#11 kedensau88

kedensau88

    biết vẽ circle

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

Đã gửi 22 November 2011 - 12:13 PM

Hình như bạn chưa thử chạy chương trình mà tôi viết thì phải. Bạn đang muốn tự động hoá. Tôi tự động hoá cho bạn. Có tự động hoá rồi thì bạn xoay lại thủ công. Chương trình của tôi cũng vẽ hình chữ nhật (bằng lệnh rectangle) như bạn (vẽ bằng lệnh line) mà thôi. Bạn cứ chạy thử đi xem có tiện không đã nhé!
Thân thương!

Vâng,em đã chạy chuơng trình của anh rồi.
Đúng là rất tiện lơi nhưng tại vì em mới học lisp nên chưong trình của anh em ko dc hiểu cho lắm.
Em muốn nhờ anh sửa lại chuơng trình vẫn vẽ theo kiểu chỉ cần nhập loại hình chữ nhật nhưng không dùng lệnh rectangle mà vẽ theo kiểu thủ công để em có thể dựa vào đây viết 1 số chuơng trình khác tuơng tự ạ.Vì đây là hình chữ nhật nên mới dùng dc lệnh Rectangle luôn,còn nếu có những hình có hình dạng khác thì em không biết làm thế nào ạ.
Cảm ơn anh nhiều.
  • 0

#12 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 22 November 2011 - 01:43 PM

Vâng,em đã chạy chuơng trình của anh rồi.
Đúng là rất tiện lơi nhưng tại vì em mới học lisp nên chưong trình của anh em ko dc hiểu cho lắm.
Em muốn nhờ anh sửa lại chuơng trình vẫn vẽ theo kiểu chỉ cần nhập loại hình chữ nhật nhưng không dùng lệnh rectangle mà vẽ theo kiểu thủ công để em có thể dựa vào đây viết 1 số chuơng trình khác tuơng tự ạ.Vì đây là hình chữ nhật nên mới dùng dc lệnh Rectangle luôn,còn nếu có những hình có hình dạng khác thì em không biết làm thế nào ạ.
Cảm ơn anh nhiều.

Nếu nhằm mục đích như thế, thì đây!

;Doan Van Ha - CADViet.com
;Ve rectangle theo file so lieu *.txt
(defun C:HA( / lst stt pt loai dai rong)
(command "undo" "begin")
(acet-sysvar-set (list "osmode" 0 "cmdecho" 0))
(if (or fn (setq fn (getfiled "Chon file chua so lieu" "" "txt" 2)))
(progn
(setq PR (open fn "r") RL (read-line PR))
(while (setq RL (read-line PR))
(setq lst (cons RL lst)))
(setq lst (reverse lst))
(close PR)))
(initget 7) (setq stt (getint "\nChon STT cua hinh chu nhat: "))
(initget 1) (setq p1 (getpoint "\nPich diem goc trai duoi cua hinh chu nhat: "))
(foreach n lst
(setq loai (atoi (TRAI_STR n "\t")))
(setq dai (atof (GIUA_STR n "\t" "\t")))
(setq rong (atof (PHAI_STR (PHAI_STR n "\t") "\t")))
(if (= loai stt)
(progn
(setq p2 (polar p1 0 dai) p3 (polar p2 (/ pi 2) rong) p4 (polar p3 pi dai))
(command "line" p1 p2 p3 p4 "c"))))
; (command "rectangle" p1 (polar (polar p1 0 dai) (/ pi 2) rong))))
(acet-sysvar-restore)
(command "undo" "end")
(princ))
;-----
(defun FINDSTR (str sym / z find) (setq z 0) (while (and (/= find sym) (<= z (- (strlen str) (strlen sym)))) (setq z (1+ z)) (setq find (substr str z (strlen sym)))) (if (= find sym) z nil))
(defun TRAI_STR(str str1) (if (acet-str-find str1 str) (substr str 1 (- (acet-str-find str1 str) 1))))
(defun PHAI_STR(str str1) (if (TRAI_STR str str1) (substr str (+ 1 (strlen str1) (strlen (TRAI_STR str str1))))))
(defun GIUA_STR(str str1 str2) (if (PHAI_STR str str1) (TRAI_STR (PHAI_STR str str1) str2)))

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#13 kedensau88

kedensau88

    biết vẽ circle

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

Đã gửi 22 November 2011 - 11:40 PM

Em đã chạy được chuơng trình rồi.Anh cho em hỏi thêm cái này nữa:
- Giả sử nếu có từ nhiều biến (4 biến trở lên) thì phải khai báo kiểu gì ạ?
- Làm thế nào để khi mình chạy thì chuơng trình tự động chọn file txt luôn được ko ạ,chứ mỗi lần chạy lệnh lại phải chọn file txt em thấy cũng hơi bất tiện.
Mong anh giúp đỡ em.
Em làm phiền anh nhiều quá,mong anh thông cảm cho em với nha.
Em cảm ơn anh nhiều ạ.Chúc anh luôn vui vẻ!!!
  • 0

#14 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 23 November 2011 - 08:51 AM

Em đã chạy được chuơng trình rồi.Anh cho em hỏi thêm cái này nữa:
- Giả sử nếu có từ nhiều biến (4 biến trở lên) thì phải khai báo kiểu gì ạ?
- Làm thế nào để khi mình chạy thì chuơng trình tự động chọn file txt luôn được ko ạ,chứ mỗi lần chạy lệnh lại phải chọn file txt em thấy cũng hơi bất tiện.
Mong anh giúp đỡ em.
Em làm phiền anh nhiều quá,mong anh thông cảm cho em với nha.
Em cảm ơn anh nhiều ạ.Chúc anh luôn vui vẻ!!!

Câu 1: bạn có thể nói rõ hơn, tôi chưa hiểu ý bạn?
Câu 2: đã sửa cho bạn ở trên.
Thân thương!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#15 kedensau88

kedensau88

    biết vẽ circle

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

Đã gửi 23 November 2011 - 08:58 AM

Câu 1: bạn có thể nói rõ hơn, tôi chưa hiểu ý bạn?
Thân thương!

Chương trình em đưa cho anh chỉ có 2 biến là "dài" và "rộng"
Nếu một chương trình có nhiều biến hơn thì phải khai báo làm sao ạ ???
Thanks!!!!!
  • 0

#16 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 23 November 2011 - 09:33 AM

Chương trình em đưa cho anh chỉ có 2 biến là "dài" và "rộng"
Nếu một chương trình có nhiều biến hơn thì phải khai báo làm sao ạ ???
Thanks!!!!!

Bạn chú ý kẻo nhầm: topic này viết lisp theo y/c chứ không phải giải thích code lisp. Nếu tiện thì bạn sang bên topic Cùng nhau học lisp hoặc Hỏi về lisp thì tiện hơn, kẻo lạc đề dễ bị các Mod xoá lắm đấy. Riêng trường hợp này tôi trả lời cho bạn như sau:
Bài toán của bạn hiện đang có 3 biến (chứ không phải 2) là stt, dài, rộng. Khi lấy kết quả từng dòng sang lisp thì 3 biến này nằm trong 1 string, được cách nhau bởi từng "\t". Do đó nếu có n biến thì bạn dùng vòng lặp n lần để lấy từng giá trị bên trái của "\t" là được. Không biết khả năng code lisp của bạn ngang đâu nên hơi khó giải thích. Nếu cần, tôi có thể làm cho bạn 1 ví dụ, nhưng bạn phải cho biết các biến mà bạn lấy ra là để làm gì, nhằm tôi có thể đưa vào chương trình.
Thân thương!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#17 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 23 November 2011 - 10:00 AM

Nếu đã dùng acet bác ĐVH nên dùng (vl-remove "" (acet-str-to-list "\t" str)) để tách biến (hoặc thay "\t" bằng (chr 9), " ", (chr 32)
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 23 November 2011 - 10:20 AM

Nếu đã dùng acet bác ĐVH nên dùng (vl-remove "" (acet-str-to-list "\t" str)) để tách biến (hoặc thay "\t" bằng (chr 9), " ", (chr 32)

Cám ơn Ket! Thực ra mấy cái thằng TRAI, PHAI, GIUA này viết thừ thời... chống Pháp (R14), nên giờ hoà bình rồi lôi ra xài cho nhanh vậy mà.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#19 kedensau88

kedensau88

    biết vẽ circle

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

Đã gửi 23 November 2011 - 12:20 PM

Bạn chú ý kẻo nhầm: topic này viết lisp theo y/c chứ không phải giải thích code lisp. Nếu tiện thì bạn sang bên topic Cùng nhau học lisp hoặc Hỏi về lisp thì tiện hơn, kẻo lạc đề dễ bị các Mod xoá lắm đấy. Riêng trường hợp này tôi trả lời cho bạn như sau:
Bài toán của bạn hiện đang có 3 biến (chứ không phải 2) là stt, dài, rộng. Khi lấy kết quả từng dòng sang lisp thì 3 biến này nằm trong 1 string, được cách nhau bởi từng "\t". Do đó nếu có n biến thì bạn dùng vòng lặp n lần để lấy từng giá trị bên trái của "\t" là được. Không biết khả năng code lisp của bạn ngang đâu nên hơi khó giải thích. Nếu cần, tôi có thể làm cho bạn 1 ví dụ, nhưng bạn phải cho biết các biến mà bạn lấy ra là để làm gì, nhằm tôi có thể đưa vào chương trình.
Thân thương!


Em có 1 ví dụ vẽ cái hình này,anh có thể viết cho em 1 cái lisp để vẽ hình này tuơng tự như cái lisp vẽ hình chữ nhật ở trên được không ạ ,trong file txt sẽ chứa số liệu của "Loại hình,D,X,G,tsmall,WT,T1,A,r1,C,D1"
Cảm ơn anh nhiều nhiều.
Cho em xin lỗi nếu làm phiền anh nhiều quá nha.^^
Hình đã gửi
Còn đây là cái chuơng trình thủ công em viết cho nó :

(defun C:FLA(/ D X G tsmall WT T1 A r1 C D1 OldOS)
(setq
D(getreal "\nOutside Diameter: D=")
X(getreal "\nDiameter at Base of Hub: X=")
G(getreal "\nO.D of Raised Face: G=")
tsmall(getreal "\nThickness: tsmall=")
WT(getreal "\nWall Thickness: WT=")
T1(getreal "\nLength Thru Hub : T1=")
A(getreal "\nDiameter of Hub at Bevel: A=")
r1(getreal "\nRadius of Fillet: r1=")
C(getreal "\nBolt Circle Diameter: C=")
D1(getreal "\nDiameter of Holes: D1=")
P1(getpoint "\n Start Point:")
P2(polar P1 pi G)
P3(polar P2 (* pi 1.5) 6.35)
P4(polar P3 pi (/(- D G) 2))
P5(polar P4 (* pi 1.5) tsmall)
P6(polar P5 0.0 (/(- D X) 2))
P7 (list (+ (car P6) (/ (- X A) 2)) (- (cadr P6) (- T1 tsmall)) (caddr p6))
P8(polar P7 0.0 A)
P9(list (+ (car P8) (/ (- X A) 2)) (+ (cadr P8) (- T1 tsmall)) (caddr p8))
P10(polar P9 0.0 (/(- D X) 2))
P11(polar P10 (/ pi 2) tsmall)
P12(polar P11 pi (/(- D G) 2))
P13(polar P1 pi (/(- G (- A (* WT 2))) 2))
P14(polar P13 (* pi 1.5) (+ T1 6.35))
P15(polar P13 pi (- A (* WT 2)))
P16(polar P15 (* pi 1.5) (+ T1 6.35))
P17(polar P3 pi (/(- C G D1) 2))
P18(polar P17 (* pi 1.5) tsmall)
P19(polar P17 pi D1)
P20(polar P19 (* pi 1.5) tsmall)
P21(polar P12 0.0 (/(- C G D1) 2))
P22(polar P21 (* pi 1.5) tsmall)
P23(polar P21 0.0 D1)
P24(polar P23 (* pi 1.5) tsmall)
P25(list (- (car P24) (/ D1 2)) (- (cadr P24) 10) (caddr p24))
P26(polar P25 (* pi 0.5) (+ tsmall 20))
P27(list (- (car P8) (/ A 2)) (- (cadr P8) 15) (caddr p8))
P28(polar P27 (* pi 0.5) (+ T1 36.35))
P29(list (- (car P18) (/ D1 2)) (- (cadr P18) 10) (caddr p18))
P30(polar P29 (* pi 0.5) (+ tsmall 20))
)
(setq OldOs(getvar "osmode"))
(setvar "osmode" 0)
(COMMAND "LAYER" "M" "3" "C" "3" "" "L" "CONTINUOUS" "" "")
(command "line" P1 P2 P3 P4 P5 "")
(command "line" P5 P6 "")
(setq A1 (entlast))
(command "line" P6 P7 "")
(setq B1 (entlast))
(command "line" P7 P8 "")
(command "line" P8 P9 "")
(setq C1 (entlast))
(command "line" P9 P10 "")
(setq D1 (entlast))
(command "line" P10 P11 P12 p1 "")
(command "line" P13 P14"")
(command "line" P15 P16"")
(command "line" P17 P18"")
(command "line" P19 P20"")
(command "line" P21 P22"")
(command "line" P23 P24"")
(COMMAND "LAYER" "M" "1" "C" "1" "" "L" "CENTER2" "" "")
(command "line" P25 P26"")
(command "line" P27 P28"")
(command "line" P29 P30"")
(command "fillet" "r" r1 "" "fillet" A1 B1 )
(command "fillet" "" "fillet" C1 D1 )
(command "zoom" "w" P26 P29)
(setvar "osmode" OldOs)
(princ)
)

  • 0

#20 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 23 November 2011 - 01:44 PM

....
[/code]

Chú tham khảo, cái gì cần thiết a ghi trong file hết rồi. Code vẽ lấy nguyên si của chú, đúng sai gì chú tự chịu :)

(defun c:test (/ PR RL lst)
;Dat ten file mac dinh
;Neu trong may k co ten file mac dinh, CT yeu cau chon file
(or (setq fn (findfile "Nhap ten file mac dinh vao day"))
(setq fn (getfiled "Chon file chua so lieu" "" "txt" 2)))
;Doc du lieu tu file, xu ly
(if fn
(progn ; Neu doc duoc file fn nay
(setq PR (open fn "r") RL (read-line PR))
(while (setq RL (read-line PR))
(setq RL (read (strcat "(" RL ")"))
lst (append lst (list (list (car RL)(cdr RL))))
)
)
(close PR)
;Lay Type
(setq typ (getint "\nType :"))
;Ve
(if (assoc typ lst)
(apply 'draw (cadr (assoc typ lst)))
(and (princ "\nMissed Type")(exit))
)
)
(princ "\nMissed File")
)
)

;Phan nay tro di la cua chu, tu chu chinh sua :
(defun draw ( D X G tsmall WT T1 A r1 C D1 / OldOS P1) ;Nho set tat ca bien P1 -> 30 o day
(setq P1(getpoint "\n Start Point:")
P2(polar P1 pi G)
P3(polar P2 (* pi 1.5) 6.35)
P4(polar P3 pi (/(- D G) 2))
P5(polar P4 (* pi 1.5) tsmall)
P6(polar P5 0.0 (/(- D X) 2))
P7 (list (+ (car P6) (/ (- X A) 2)) (- (cadr P6) (- T1 tsmall)) (caddr p6))
P8(polar P7 0.0 A)
P9(list (+ (car P8) (/ (- X A) 2)) (+ (cadr P8) (- T1 tsmall)) (caddr p8))
P10(polar P9 0.0 (/(- D X) 2))
P11(polar P10 (/ pi 2) tsmall)
P12(polar P11 pi (/(- D G) 2))
P13(polar P1 pi (/(- G (- A (* WT 2))) 2))
P14(polar P13 (* pi 1.5) (+ T1 6.35))
P15(polar P13 pi (- A (* WT 2)))
P16(polar P15 (* pi 1.5) (+ T1 6.35))
P17(polar P3 pi (/(- C G D1) 2))
P18(polar P17 (* pi 1.5) tsmall)
P19(polar P17 pi D1)
P20(polar P19 (* pi 1.5) tsmall)
P21(polar P12 0.0 (/(- C G D1) 2))
P22(polar P21 (* pi 1.5) tsmall)
P23(polar P21 0.0 D1)
P24(polar P23 (* pi 1.5) tsmall)
P25(list (- (car P24) (/ D1 2)) (- (cadr P24) 10) (caddr p24))
P26(polar P25 (* pi 0.5) (+ tsmall 20))
P27(list (- (car P8) (/ A 2)) (- (cadr P8) 15) (caddr p8))
P28(polar P27 (* pi 0.5) (+ T1 36.35))
P29(list (- (car P18) (/ D1 2)) (- (cadr P18) 10) (caddr p18))
P30(polar P29 (* pi 0.5) (+ tsmall 20))
)
(setq OldOs(getvar "osmode"))
(setvar "osmode" 0)
(COMMAND "LAYER" "M" "3" "C" "3" "" "L" "CONTINUOUS" "" "")
(command "line" P1 P2 P3 P4 P5 "")
(command "line" P5 P6 "")
(setq A1 (entlast))
(command "line" P6 P7 "")
(setq B1 (entlast))
(command "line" P7 P8 "")
(command "line" P8 P9 "")
(setq C1 (entlast))
(command "line" P9 P10 "")
(setq D1 (entlast))
(command "line" P10 P11 P12 p1 "")
(command "line" P13 P14 "")
(command "line" P15 P16 "")
(command "line" P17 P18 "")
(command "line" P19 P20 "")
(command "line" P21 P22 "")
(command "line" P23 P24 "")
(COMMAND "LAYER" "M" "1" "C" "1" "" "L" "CENTER2" "" "")
(command "line" P25 P26 "")
(command "line" P27 P28 "")
(command "line" P29 P30 "")
(command "fillet" "r" r1 "" "fillet" A1 B1 )
(command "fillet" "" "fillet" C1 D1 )
(command "zoom" "w" P26 P29)
(setvar "osmode" OldOs)
(princ)
)

  • 3

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC