Đến nội dung


Hình ảnh
* * * - - 3 Bình chọn

Hướng dẫn lập trình Lisp


  • Please log in to reply
497 replies to this topic

#421 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 23 April 2012 - 02:47 PM

Bản vẽ mình đưa lên là minh hoạ cho bình đồ duỗi thẳng của 1 tuyến đường.
Trong đó bao gồm các dữ liệu sau: Chiều dài của tuyến, các giao cắt, kết cấu vỉa hè trên từng đoạn, biển báo giao thông, sơn kẻ vạch, hệ thống thoát nước, cây xanh, trụ điện, điện chiếu sáng, ....
Mình phải xây dựng cho từng đoạn 100m, 200 và tối đa là 500m cho mỗi tờ A3, mục đích để cập nhật dữ liệu trên bằng tay trên giấy A3 (vì trong quá trình quản lý các dữ liệu trên sẽ liên tục thay đổi). Sau đó mới vẽ lại trên bản vẽ Cad gốc sau mỗi 6 tháng 1 lần.
Với số liệu rất nhiều (vì quản lý rất nhiều tuyến) do đó việc cập nhật thủ công vào Cad rất mất thời gian và công sức.
Đồng thời các dữ liệu này còn phục vụ cho việc trích xuất để thống kê, báo cáo khi cần thiết.
Do đó mình nhờ các anh có phương pháp nào cập nhật các số liệu như: cây xanh, trụ điện, biển báo, hệ thống thoát nước ... từ bảng thống kê trên Excel qua Cad nhanh hơn không? Nếu được thì các bạn hướng dẫn phương pháp trích xuất số liệu ngược lại?
Thanks
File ví dụ: http://www.cadviet.c...05390_vi_du.rar

Hề hề hề,
1/- Bạn gửi bản vẽ cad2010 nên mình không mở được để tham khảo. Bạn có thể gửi lại bản vẽ ở dạng Cad2004 được không???
2/- Việc lấy số liệu từ bản vẽ để nhập sang file Excel và ngược lại là hoàn toàn có thể với điều kiện bạn phải tổ chức bản vẽ cho thật khoa học và thống nhất mới được. bạn ạ. Tỹ như các số liệu trên cùng một cột của Excel thì trên bản vẽ CAd sẽ cùng trên một layer hay cùng một màu săc chẳng hạn....
3/- Việc trích xuất và nhập dữ liệu vào CAd hoàn toàn có thể dùng lisp để giải quyết tuy rằng lisp không phải là biện pháp duy nhất và tối ưu nhất.
Hề hề hề,
Vài thiển ý với bạn, nếu không hài lòng xin đừng giận....
Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#422 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 April 2012 - 04:01 PM

@thongtcc : topic hướng dẫn lập trình dành cho mem hỏi về các vấn đề trong code, nên nếu bạn đưa ra 1 project to vậy chắc khó có đáp án :)
Về việc chuyển đối qua lại dữ liệu giữa CAD <-> Excel thì mình khuyên bạn không nên nghĩ tới Lisp, vì công việc lúc đó sẽ khó hơn các ngôn ngữ khác rất nhiều
  • 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


#423 thonggtcc

thonggtcc

    biết zoom

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

Đã gửi 23 April 2012 - 04:51 PM

Vì mình không rành về lisp và lập trình nên mình mới mạo muội đưa bài toán của mình lên đây để các anh em tham khảo và có ý kiến đóng góp giúp. Có thể vấn đề mình đặt ra không phải là bài toán đơn giải quyết 1, 2 vấn đề mà bao gồm rất nhiều vấn đề phức tạp khác mà mình không biết (do không biết tí gì về lập trình mà).
Nếu quá phức tạp thì các cao thủ CadViet có thể chia ra nhiều vấn đề nhỏ và tìm lời giải cho từng cái một thì có thể khả thi hơn.
Xin lỗi vì mình quên Save as về Cad 2004 & Office 2003.
Link mới: http://www.cadviet.c...390_vi_du_1.rar
  • 0

#424 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 April 2012 - 05:34 PM

Chí ít cũng phải có quy luật làm việc , quy luật sắp xếp đối tượng... Diễn đàn có nhiều người không theo ngnhf của bạn (vd mình), nhìn vô hoa mắt liền, chưa kể các thứ râu ria k nằm trong quá trình xử lý nữa. Theo mình để dễ hiểu hơn, bạn nên paste cái số liệu Excel thẳng vào CAD, rồi chỉ ra số nào lấy từ đâu, nguyên tắc là gì....
Dù sao cũng phải nói 1 điều là vấn đề của bạn cực khó :)
  • 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


#425 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 12 May 2012 - 11:20 AM

các bác cho em hỏi có hàm nào chuyển string thành list không? hoặc các bác xem giúp em code này. em muốn giá trị trả về của đoạn code là biến kq.

(defun str-list (str)
(setq dai(strlen str))
(setq i 0)
(repeat dai
(if (= (substr str i 1) " ")
(progn
(setq i 0)
(setq kq (append kq (list phantu)))
)
(strcat phantu (strcat phantu (substr str i 1)))
)
(1+ i)
)
)

  • 0

#426 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 May 2012 - 12:30 PM

các bác cho em hỏi có hàm nào chuyển string thành list không? hoặc các bác xem giúp em code này. em muốn giá trị trả về của đoạn code là biến kq.


(defun str-list (str)
(setq dai(strlen str))
(setq i 0)
(repeat dai
(if (= (substr str i 1) " ")
(progn
(setq i 0)
(setq kq (append kq (list phantu)))
)
(strcat phantu (strcat phantu (substr str i 1)))
)
(1+ i)
)
)

Bạn hỏi tối nghĩa quá. String thành list thì có hàm vl-string->list.
CÒn theo cái lisp của bạn thì mình hiểu là chuyển string thành list các string bằng 1 ký tự phân cách.
=> code :

(defun Str->lst ( str del / pos )
(vl-remove ""
(if (setq pos (vl-string-search del str))
(cons (substr str 1 pos) (Str->lst (substr str (+ pos 1 (strlen del))) del))
(list str)
)
)
)
Sử dụng :
(str->lst string ký_tự_phân_cách)
Ví dụ :
(str->lst "abc 123 456 " " ")
Trả về : ("abc" "123" "456")

-2 : muốn hàm con trả về kết quả biến nào nào thì trước dấu ngoặc cuối cùng ghi tên biến đó ra.
Ví dụ : (defun tong (a b / c)(setq c (+ a B)) c) (tất nhiên tùy trường hợp)
  • 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


#427 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 12 May 2012 - 02:55 PM

Bạn hỏi tối nghĩa quá. String thành list thì có hàm vl-string->list.
CÒn theo cái lisp của bạn thì mình hiểu là chuyển string thành list các string bằng 1 ký tự phân cách.
=> code :


(defun Str->lst ( str del / pos )
(vl-remove ""
(if (setq pos (vl-string-search del str))
(cons (substr str 1 pos) (Str->lst (substr str (+ pos 1 (strlen del))) del))
(list str)
)
)
)
Sử dụng :
(str->lst string ký_tự_phân_cách)
Ví dụ :
(str->lst "abc 123 456 " " ")
Trả về : ("abc" "123" "456")

-2 : muốn hàm con trả về kết quả biến nào nào thì trước dấu ngoặc cuối cùng ghi tên biến đó ra.
Ví dụ : (defun tong (a b / c)(setq c (+ a B)) c) (tất nhiên tùy trường hợp)

Bác thông cảm nhé! Tui không biết mới hỏi mà. Bác làm hay lắm nhưng cho tui hỏi thêm nhé:
1. Tui muốn kết quả trả về là: (abc 123 456) (không có dấu nháy trên) có được không?..
2. Tui chưa hiểu đoạn code này: (Str->lst (substr str (+ pos 1 (strlen del))) del) bác giải thích cho tui nhé: có phải bác lặp bằng cách dùng hàm con trong chính hàm con đó không?
Thanks!
  • 0

#428 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 May 2012 - 03:46 PM

1. Nó còn phụ thuộc vào yêu cầu của bạn. Tách 1 string ra thành list các string nhỏ thì đương nhiên, là 1 string nó sẽ có dấu "". Nếu bạn muốn nó trả về như trên thì abc sẽ không còn là 1 string, mà là 1 tên biến ABC. Bạn hiểu ý mình không ?
Muốn làm thì bạn thêm đoạn này :
(mapcar 'read
trước dòng (vl-remove ""....) và thêm 1 dấu ) ở cuối hàm.

2. Cấu trúc này gọi là đệ quy, nếu bạn đã từng đọc 1 ngôn ngữ lập trình nào đó thì sẽ thấy khái niệm này :). Nói nôm na gần như bạn nói : gọi hàm trong chính thân hà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


#429 hamster2102

hamster2102

    biết lệnh copy

  • Advance Member
  • PipPipPip
  • 111 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 21 July 2012 - 01:52 PM

nhờ anh em kiểm tra dùm lisp BMI em viết và chỉ cho em chỗ sai với, nếu em sai nhiều quá thì cho em hướng và một số bi kíp liên quan để thực hiện. Em mới làm quen với lisp thôi và chưa đọc được nhiều mong các bác đừng cười kẻo em tự kỷ. Xin cám ơn anh em nhiều


;;; kiem tra BMI
;;; hamster2102
(defun c: bmi (/w h chiso )
(princ "\nChuc ban may man")
(setq
H (getreal "\nChieu cao cua ban bao nhieu: h = ")
W (getreal "\nCan nang cua ban bao nhieu: w=")
)
(setq h2 (* h h))
(setq chiso (/ w h2))
(princ "\nChi so BMI cua ban la")
(princ chiso)
(if (< chiso 18) (princ "\nBo xuong kho cua ban can phai cho an uong day du han che tu suong"))
(if (and (>= chiso 18) (< chiso 25)) (princ "\nBan hang chuan khong can chinh sua thi vo tu"))
(if (and (>= chiso 25) (< chiso 30))(princ "\nChuc mung ban beo phi do 1 can an nhieu hon de len do 2"))
(if (and (>= chiso 30) (< chiso 35))(princ "\nChuc mung ban beo phi do 2 can an nhieu hon de len do 3"))
(if (>= chiso 35) (princ "\nOh yeah! Chuc mung ban da dat dinh cao phong do beo khoe beo dep beo nhu heo roi"))
(princ "\nChuc ban mot ngay vui ve")
(princ)
)

  • 0
Nếu biết rằng em đã lấy chồng
Anh mừng biết mấy em biết không
Bao năm quen biết, bao năm mệt
Tính ra cũng khổ mấy năm ròng

#430 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 21 July 2012 - 04:01 PM

nhờ anh em kiểm tra dùm lisp BMI em viết và chỉ cho em chỗ sai với, nếu em sai nhiều quá thì cho em hướng và một số bi kíp liên quan để thực hiện. Em mới làm quen với lisp thôi và chưa đọc được nhiều mong các bác đừng cười kẻo em tự kỷ. Xin cám ơn anh em nhiều


;;; kiem tra BMI
;;; hamster2102
(defun c: bmi (/w h chiso )
(princ "\nChuc ban may man")
(setq
H (getreal "\nChieu cao cua ban bao nhieu: h = ")
W (getreal "\nCan nang cua ban bao nhieu: w=")
)
(setq h2 (* h h))
(setq chiso (/ w h2))
(princ "\nChi so BMI cua ban la")
(princ chiso)
(if (< chiso 18) (princ "\nBo xuong kho cua ban can phai cho an uong day du han che tu suong"))
(if (and (>= chiso 18) (< chiso 25)) (princ "\nBan hang chuan khong can chinh sua thi vo tu"))
(if (and (>= chiso 25) (< chiso 30))(princ "\nChuc mung ban beo phi do 1 can an nhieu hon de len do 2"))
(if (and (>= chiso 30) (< chiso 35))(princ "\nChuc mung ban beo phi do 2 can an nhieu hon de len do 3"))
(if (>= chiso 35) (princ "\nOh yeah! Chuc mung ban da dat dinh cao phong do beo khoe beo dep beo nhu heo roi"))
(princ "\nChuc ban mot ngay vui ve")
(princ)
)

Code trên bị mỗi cái lỗi ở chổ :
(defun c: bmi (/w h chiso )
Chắc bạn tự xử được
  • 1

#431 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 July 2012 - 04:41 PM

Sau đấy bạn đọc kỹ lại hàm <,>, hàm cond, bạn sẽ viết lại được lisp này ngắn và hay hơn nữa ^^
  • 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


#432 hmt

hmt

    biết lệnh scale

  • Members
  • PipPipPip
  • 146 Bài viết
Điểm đánh giá: -11 (hơi kém)

Đã gửi 01 December 2012 - 11:39 PM

các bác giải thích cho e dòng này đc ko ạ , e ko hiểu lắm @@ hàm polar và cách tính tọa độ của cái này trong cad ?

(setq
p1 (getpoint "\nDiem chuan: ")
p2 (polar p1 0.0 W)
p3 (polar p2 (/ pi 2) H1)
p4 (polar p3 pi W)
p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))
  • 0

#433 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 02 December 2012 - 07:46 AM

Hàm polar là hàm xác định tọa độ 1 điểm theo 1 điểm cho trước trong hệ tọa độ cầu (khác với hệ tọa độ Đề các).
Để xác định điểm trong hệ tọa độ cầu cần biết:
- Điểm chuẩn p1 (điểm gốc).
- Góc hợp bởi p1p2 với trục X.
- Khoảng cách p1p2 (hay gọi là bán kính).
Như vậy:
(setq p2 (polar p1 (/ pi 6) 100)
Nghĩa là:
Lấy điểm p2 bằng cách: từ p1 vẽ góc 30 độ, trên đường thẳng này lấy điểm p2 cách p1 khoảng cách 100.
Chắc bạn hiểu?
  • 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.


#434 hmt

hmt

    biết lệnh scale

  • Members
  • PipPipPip
  • 146 Bài viết
Điểm đánh giá: -11 (hơi kém)

Đã gửi 02 December 2012 - 09:28 AM

thank bác , e đã hiểu như vậy ở đây điểm p1 là điểm chuẩn,bác cho e hỏi thêm là khi e load lisp NHA.lsp xong và nhập xong các thông số thì đến bước nhập điểm chuẩn. ở đây hàm getpoint này cho phép nhập tọa độ từ bàn phím và có thể pick bằng chuột lên 1 vị trí bất kì trên màn hình phải ko ạ? dòng :
p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2)) có thể dịch là ntn ạ
  • 0

#435 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 02 December 2012 - 09:36 AM

thank bác , e đã hiểu như vậy ở đây điểm p1 là điểm chuẩn,bác cho e hỏi thêm là khi e load lisp NHA.lsp xong và nhập xong các thông số thì đến bước nhập điểm chuẩn. ở đây hàm getpoint này cho phép nhập tọa độ từ bàn phím và có thể pick bằng chuột lên 1 vị trí bất kì trên màn hình phải ko ạ? dòng :
p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2)) có thể dịch là ntn ạ

1). Có thể pick điểm trên màn hình hoặc nhập x,y từ bàn phím. Cái này bạn có thể thử chứ cần gì phải hỏi.
2). p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))
có nghĩa là điểm p5 là 1 điểm được xác định bằng list của x và y, trong đó x=(car p4)+(/ w 2) và y=(cadrp4)+H2.
  • 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.


#436 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 December 2012 - 09:48 AM

Hàm polar là hàm xác định tọa độ 1 điểm theo 1 điểm cho trước trong hệ tọa độ cầu (khác với hệ tọa độ Đề các).
Để xác định điểm trong hệ tọa độ cầu cần biết:
- Điểm chuẩn p1 (điểm gốc).
- Góc hợp bởi p1p2 với trục X.
- Khoảng cách p1p2 (hay gọi là bán kính).
.....

Hệ toạ độ này là hệ toạ độ cực mới đúng bác ơi.
  • 2

#437 hmt

hmt

    biết lệnh scale

  • Members
  • PipPipPip
  • 146 Bài viết
Điểm đánh giá: -11 (hơi kém)

Đã gửi 02 December 2012 - 10:33 AM

thank 2 bác :D e đã hiểu ạ rất mong đc sự chỉ dạy tận tình của các bác :D
  • 0

#438 hmt

hmt

    biết lệnh scale

  • Members
  • PipPipPip
  • 146 Bài viết
Điểm đánh giá: -11 (hơi kém)

Đã gửi 02 December 2012 - 12:13 PM

mọi ng cho e hỏi dòng này nữa ạ
(command "line" p1 p2 p3 p4 "c")
(command "line" p3 p5 p4 "")
ở đây là dòng thực thi lệnh vẽ xong e ko hiểu thế nào? vẽ bằng đối tượng line qua các điểm p1 p2 p3 p4 thế cái "c" này là gì ạ
  • 0

#439 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 02 December 2012 - 12:17 PM

Cái "c" nghĩa là "close", nghĩa là đóng về điểm đầu tiên.
Cái "" nghĩa là "enter", nghĩa là vẽ đến đó thì dừng.
  • 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.


#440 hmt

hmt

    biết lệnh scale

  • Members
  • PipPipPip
  • 146 Bài viết
Điểm đánh giá: -11 (hơi kém)

Đã gửi 02 December 2012 - 12:36 PM

e thử thực hành với 1 cái lisp đơn giản là vẽ hình vuông cấu trúc như lisp vẽ nhà mà cad toàn báo thiếu đối số error: too few arguments


(defun C:vhv(/a b p1 p2 p3 p4 )
;;;Nhap so lieu
(setq
a(getreal"\nchieu dai a=")
b(getreal"\nchieu rong b=")
p1(getpoint"\ndiem chuan: ")
;;;Tinh toa do
p2(polar p1 0.0 a)
p3(polar p2 (/pi 2) b )
p4(polar p3 pi a)
)
;;;ve hinh vuong
(comand "line" p1 p2 p3 p4"c")
)

vậy chỗ này e thiếu chỗ nào ạ ?
  • 0