Đến nội dung


Hình ảnh
- - - - -

[Giúp đỡ] Lisp vẽ trục


  • Please log in to reply
14 replies to this topic

#1 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 10 April 2012 - 06:24 PM

Em đang viết lisp vẽ nhanh trục mặt bằng móng cho Nhà thép, em đang bí chỗ hàm nào xử lý chuỗi nhập vào cho nó hiểu là các khoảng Bay của công trình vậy ạ
vd: yeu cau nhập span: 2@2000,3000,...
Dùng hàm nào để xử lý các khoảng 2 lần 2000 1 khoảng 3000.
Anh chị nào có lisp vẽ trục thì gửi em tham khảo với. Chân thành cám ơn
  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 10 April 2012 - 08:41 PM

Em đang viết lisp vẽ nhanh trục mặt bằng móng cho Nhà thép, em đang bí chỗ hàm nào xử lý chuỗi nhập vào cho nó hiểu là các khoảng Bay của công trình vậy ạ
vd: yeu cau nhập span: 2@2000,3000,...
Dùng hàm nào để xử lý các khoảng 2 lần 2000 1 khoảng 3000.
Anh chị nào có lisp vẽ trục thì gửi em tham khảo với. Chân thành cám ơn

Không có hàm lisp nào sẵn hết! Bạn phải nói rõ cách nhập của bạn, trong đó thể hiện từng yếu tố?
  • 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.


#3 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 07:43 AM

Cách nhập của mình là: yêu cầu nhập các khoảng offset cũng chính là các trục công trình theo 1 chuỗi string
vd: nhập theo chuỗi 2@2000,3000 => offset ra 2 đoạn 2000 1 đoạn 3000. Mình ko biết dùng hàm nào để trích xuất dữ liệu theo dạng đó
Mong các bạn tư vấn. Thanks
  • 0

#4 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 April 2012 - 08:09 AM

Bạn cần hàm substr, vl-string-search để giải quyết vấn đề.
Đầu tiên tách các đoạn phân cách nhau bằng dấu , trước. Sau đó ở mỗi đoạn lại kiểm tra có @ hay không :)
  • 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


#5 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 08:26 AM

Để mình thử xem, mà sau khi tách ra thì sao nhỉ, thông cảm mình yếu thuật toán T_T. Như cái code mình thử vẽ 1 đoạn thẳng và offset đoạn thẳng vừa tạo nhưng máy ko hiểu. Bạn xem giúp mình

(defun c:dt ()
(setq p1 (getpoint "\n chon diem bat dau"))
(setq L (getint "\n nhap chieu dai: "))
(setq L1 (command "line" p1 (list (+ (car p1) L) (cadr p1)) ""))
(command "offset" 200 L1 (list (car p1) (+ (cadr p1) 2)) "")
(princ)
)
  • 0

#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 08:30 AM

Để mình thử xem, mà sau khi tách ra thì sao nhỉ, thông cảm mình yếu thuật toán T_T. Như cái code mình thử vẽ 1 đoạn thẳng và offset đoạn thẳng vừa tạo nhưng máy ko hiểu. Bạn xem giúp mình

(defun c:dt ()
(setq p1 (getpoint "\n chon diem bat dau"))
(setq L (getint "\n nhap chieu dai: "))
(setq L1 (command "line" p1 (list (+ (car p1) L) (cadr p1)) ""))
(command "offset" 200 L1 (list (car p1) (+ (cadr p1) 2)) "")
(princ)
)

Hàm command trả về nil => L1=nil => không thể offset.
Bạn thay command bởi entmakex để lấy kết quả Line trả về sau lệnh vẽ line.
Hoặc thay L1 bởi (entlast) nếu vẫn muốn dùng command để tạo line.
  • 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.


#7 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 08:42 AM

ok được rồi, cám ơn bạn. Mình hỏi thêm tý là khi mình vẽ Line1, dùng lệnh nào để gán cho nó là 1 đối tượng tên A để
gọi ra sử dụng cho các lần sau?? Còn về vấn đề nhập chuỗi kia mình vẫn chưa hiểu vl-string-search thì mình hiểu rồi để tìm ra các dấu "," nhưng còn substr nếu là 1 chuoi dài thì thật khó để tách ra, bạn xem có cách nào giai quyết ko
  • 0

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 09:00 AM

ok được rồi, cám ơn bạn. Mình hỏi thêm tý là khi mình vẽ Line1, dùng lệnh nào để gán cho nó là 1 đối tượng tên A để
gọi ra sử dụng cho các lần sau?? Còn về vấn đề nhập chuỗi kia mình vẫn chưa hiểu vl-string-search thì mình hiểu rồi để tìm ra các dấu "," nhưng còn substr nếu là 1 chuoi dài thì thật khó để tách ra, bạn xem có cách nào giai quyết ko

1).
(command "line" p1 (list (+ (car p1) L) (cadr p1)) "")
(setq A (entlast))
2).
VD bạn đưa ra quá đặc thù nên hơi khó nói. Chẳng hạn bạn muốn offset 3 đoạn 2000, 2 đoạn 1000, 4 đoạn 5000 v.v... thì nhập chuỗi như thế nào?
  • 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.


#9 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 09:03 AM

Nhập chuỗi như vậy nè bạn: 2000,3000,4000,... cách nhau dấu "," , còn cái @ khi nếu có nhìu khoảng giống nhau thì @ cho gọn. Nếu string quá dài mình nghĩ substr ko hiểu quả mấy T_T
P/s: như bạn nói thì nhập dạng vậy nè : 3@2000,2@1000,4@5000.
  • 0

#10 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 April 2012 - 09:12 AM

ok được rồi, cám ơn bạn. Mình hỏi thêm tý là khi mình vẽ Line1, dùng lệnh nào để gán cho nó là 1 đối tượng tên A để
gọi ra sử dụng cho các lần sau?? Còn về vấn đề nhập chuỗi kia mình vẫn chưa hiểu vl-string-search thì mình hiểu rồi để tìm ra các dấu "," nhưng còn substr nếu là 1 chuoi dài thì thật khó để tách ra, bạn xem có cách nào giai quyết ko

Bạn phải dùng hàm while hoặc Đệ quy để tách tất cả ra.
Sơ đồ cụ thể như sau :
Giả sử string nhập vào đặt cho biến str
- 1: Tạo 1 list trống lst
(setq lst nil)
- 2: Tìm trong chuỗi string nhập vào, nếu thấy vị trí có dấu , (vl-string-search) thì lấy tất cả các ký tự từ đầu chuỗi đến ký tự trước dấu , (substr)
cho vào list trống lst (cons hoặc append)
- 3 : Đặt lại biến str bằng chuỗi ban đầu và cắt đi đoạn ta vừa tách ra (substr). Sau đó quay lại bước 2
(bước 2 và 3 nằm trong 1 hàm while)
Cuối cùng bạn sẽ thu được 1 list dạng như ("2@3000" "3@1000" "4000"...)
Xử lý với từng đối tượng trong list lst để kẻ Line nữa là xong

Hãy hình dung công việc 1 cách từ từ, thấy hàm nào mới thì bật Help đọc, bạn sẽ thấy thuật toán nó không hề khó đâu. Theo mình nếu bắt đầu thì bạn nên dùng while và tạo 1 list tạm
  • 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


#11 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 09:18 AM

ok, để mình thử xem sao, cám ơn bạn đã tư vấn mình nha ^_^
  • 0

#12 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 09:35 AM

(defun c:dt1 ()
(setq N 1 TXT "lap trinh AutoLISP")
(while
(and
(/= " " (substr TXT N 1))
(/ = (strlen TXT) N)
)
(setq N (1+N))
)
(setq WORD1 (substr TXT 1 (1- N))
))
Đây là lisp của sách Thầy Lộc về kiếm và trích dữ liệu ra, nhưng mà mình đọc hoài ko hiểu N 1 ban đầu là gì, bạn có thể giải thích mình từng dòng ko T_T
  • 0

#13 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 April 2012 - 09:44 AM

:) Thầy Lộc đọc từng ký tự 1. Ví dụ trong 1 chuỗi "abcdef,abcdef" thì chương trình sẽ đi kiểm tra ký tự thứ 1 "a", ký tự thứ 2 "b", thứ 3... thứ ... hết dãy. Thằng nào không là dấu " " thì giữ nguyên, là dấu " " thì tính là 1 từ mới. N chính là biến tăng đại diện cho ký tự kiểm tra. Bạn có thể hiểu sự khác nhau giữa việc kiểm tra từng ký tự - và nhảy ngay đến ký tự đạt yêu cầu trong ví dụ này và phương pháp mình nêu chứ ?
P/s : những câu hỏi này bạn nên đặt ở mục Hỏi về Lập trình hoặc Cùng nhau học Lisp. Thân
  • 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


#14 hienngocloveyou

hienngocloveyou

    biết vẽ line

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

Đã gửi 11 April 2012 - 10:11 AM

(setq N 1 TXT "lap trinh AutoLISP")
(while
(and
(/= " " (substr TXT N 1))
(/ = (strlen TXT) N)
)
(setq N (1+N))
)
(setq WORD1 (substr TXT 1 (1- N)))
Bạn check dùm mình cái code này với, mình nhập trực tiếp trong cad thì bị lỗi error: bad argument type: numberp: #<SUBR @0c1274e8
Mò hoài ko hiểu lỗi gì T_T
  • 0

#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 10:18 AM

(setq N 1 TXT "lap trinh AutoLISP")
(while
(and
(/= " " (substr TXT N 1))
(/ = (strlen TXT) N)
)
(setq N (1+N))
)
(setq WORD1 (substr TXT 1 (1- N)))
Bạn check dùm mình cái code này với, mình nhập trực tiếp trong cad thì bị lỗi error: bad argument type: numberp: #<SUBR @0c1274e8
Mò hoài ko hiểu lỗi gì T_T

1). /=
2). 1+ N
  • 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.