Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
hienngocloveyou

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

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

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

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
Doan Van Ha    2.676

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ố?

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

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
ketxu    2.649

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 :)

  • 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

Để 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)

)

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
Doan Van Ha    2.676

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

  • 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

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

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
Doan Van Ha    2.676

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?

  • 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

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.

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
ketxu    2.649

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

  • 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

(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

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
ketxu    2.649

:) 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

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

(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

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
Doan Van Ha    2.676

(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

  • 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

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


×