Chuyển đến nội dung
Diễn đàn CADViet
ssg

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

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

Cho em hỏi cái thuộc tính của nội dung text là gì ạ, vd em có 1 chữ A, 1 chữ B, em muốn thay đổi chữ B thành A thì nó là thuộc tính gì

Mã dxf của nội dung text là 1 bạn ạ. Đoạn dưới là dùng chọn 1 đối tượng TEXT và chỉnh nội dung nó thành noidung

(setq dddsn (entsel "\nChon text chinh noi dung"))
(while
(or
  (null dddsn)
  (/= "TEXT" (cdr (assoc 0 (entget (car dddsn)))))
)
(princ "\nDoi tuong khong phai la text! Chon lai")
(setq dddsn (entsel "\nChon text chinh noi dung"))
)

      	(setq DTDTTsn (car dddsn))
      	(setq DTMs (entget DTDTTsn))
      	(setq DTMs (subst (cons 1 "noidung") (assoc 1 DTMs) DTMs))
      	(entmod DTMs)

  • 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

Cho em hỏi cái thuộc tính của nội dung text là gì ạ, vd em có 1 chữ A, 1 chữ B, em muốn thay đổi chữ B thành A thì nó là thuộc tính gì

Bạn đọc thêm file này của bác ssg

Xâm nhập kho cơ sở dữ liệu của AutoCAD

http://www.cadviet.com/forum/index.php?showtopic=1980

  • 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

(setq pt2 (getpoint "\n Chon diem chen: "))
(command "._insert" "D:\\Hien\\DWG\\2C30030.dwg" pt2 1 1 0 )

Cho em hỏi nếu bản vẽ đã có thư viện block sẵn, thì chèn block như thế nào mà ko cần link đường dẫn. Nhu trên mình bỏ link D:\\Hien\\DWG\\2C30030.dwg đi thay bằng tên của block là 2C30030, sao nó ko hiểu, và cho hỏi thêm là thư viện block nó nằm ở đâ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

(setq pt2 (getpoint "\n Chon diem chen: "))
(command "._insert" "D:\\Hien\\DWG\\2C30030.dwg" pt2 1 1 0 )

Cho em hỏi nếu bản vẽ đã có thư viện block sẵn, thì chèn block như thế nào mà ko cần link đường dẫn. Nhu trên mình bỏ link D:\\Hien\\DWG\\2C30030.dwg đi thay bằng tên của block là 2C30030, sao nó ko hiểu, và cho hỏi thêm là thư viện block nó nằm ở đâu ạ

Nằm trong Support Search Path file là được. Hoặc nó nằm trong bản vẽ 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

(setq pt2 (getpoint "\n Chon diem chen: "))
(command "._insert" "D:\\Hien\\DWG\\2C30030.dwg" pt2 1 1 0 )

Cho em hỏi nếu bản vẽ đã có thư viện block sẵn, thì chèn block như thế nào mà ko cần link đường dẫn. Nhu trên mình bỏ link D:\\Hien\\DWG\\2C30030.dwg đi thay bằng tên của block là 2C30030, sao nó ko hiểu, và cho hỏi thêm là thư viện block nó nằm ở đâu ạ

Muốn chèn block không kèm path thì hoặc:

1). Bạn đưa các file block này vào trong thư mục hiện hành.

2). Bạn add Path của thư mục chứa bolck vào Support File Search Path

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

Hiện mình có 1 bài toán như sau nhưng chưa biết cách giải quyết, mong các cao thủ CadViet giúp đỡ:

Bản vẽ mình có các block. Mỗi block quy định một kiểu dữ liệu đầu vào. Các dữ liệu này được thông kê bằng tay và lập từ bảng excel sau đó cập nhật vào bản vẽ theo lý trình, số hiệu ....

Vấn đề khó khăn ở chỗ: Việc thống kê các số liệu này rất nhiều, nếu nhập thủ công vào bản vẽ sẽ mất rất nhiều thời gian.

Vậy nhờ các cao thủ hướng dẫn cách tự động lấy số liệu trong Excel và vẽ theo mẫu đã định sẵn.

Bản vẽ đính kèm: http://www.cadviet.com/upfiles/3/105390_hoang_dieu.dwg

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

Hiện mình có 1 bài toán như sau nhưng chưa biết cách giải quyết, mong các cao thủ CadViet giúp đỡ:

Bản vẽ mình có các block. Mỗi block quy định một kiểu dữ liệu đầu vào. Các dữ liệu này được thông kê bằng tay và lập từ bảng excel sau đó cập nhật vào bản vẽ theo lý trình, số hiệu ....

Vấn đề khó khăn ở chỗ: Việc thống kê các số liệu này rất nhiều, nếu nhập thủ công vào bản vẽ sẽ mất rất nhiều thời gian.

Vậy nhờ các cao thủ hướng dẫn cách tự động lấy số liệu trong Excel và vẽ theo mẫu đã định sẵn.

Bản vẽ đính kèm: http://www.cadviet.c..._hoang_dieu.dwg

Bạn upload file Excel lên và mô tả kỹ hơn nhé!

Nhìn file dwg không hiểu ý bạn ra sao cả?

 

P/S: Chắc bạn đang ở Đà Nẵng phải 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

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.com/upfiles/3/105390_vi_du.rar

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

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.

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

@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

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

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.com/upfiles/3/105390_vi_du_1.rar

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

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

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

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

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!

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

  • 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ờ 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)
)

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

  • 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

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

  • 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

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

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

  • 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

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 ạ

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

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.

  • 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

×