Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
* * * - - 3 Bình chọn

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


  • Please log in to reply
493 replies to this topic

#281 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 28 December 2010 - 12:01 PM

@Tue_VN: thanks bạn rất nhiều, xin hỏi còn cách lọc khác nữa không (dùng hàm lọc lấy thông số từ biến ss)

Bạn thử cái này
(defun laydt(ss kieu)
(acet-list-to-ss
(vl-remove-if '(lambda(x)
(null (wcmatch (acet-dxf 0 (entget x)) kieu)))
(acet-ss-to-list ss)
)
)
)
1. Tạo hàm con như trên
2.Tậo tập chọn ss
(setq ss (ssget))
Lấy tập ss1
(setq ss1 (Laydt ss "TEXT"))
Lấy tập ss2
(setq ss2 (Laydt ss "*LINE"))
Lấy tập ss3
(setq ss3 (Laydt ss "DIMENSION"))
  • 2

#282 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 28 December 2010 - 01:18 PM

thanks bạn, cách tạo hàm con như trên rất hay !!
  • 0

#283 doan_kt

doan_kt

    biết pan

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

Đã gửi 20 January 2011 - 09:33 PM

Vẫn theo cách thức như các bài trước, mời bạn chạy thử chương trình rồi ta bàn bạc tiếp. Lần này nhiều thứ lôi thôi hơn, ssg đã chuẩn bị sẵn, bạn chỉ việc copy toàn bộ thư mục Relax vào thư mục gốc của AutoCAD, sau đó appload file relax.lsp là xong. Nếu appload thành công sẽ xuất hiện menu có tên Relax ở vị trí thứ 10 (tính từ trái qua) giống như hình trên.
bác Hoành cho em hỏi cụ thể thư mục gốc nói ở trên là chỗ nào ko ạ, thanksss ( bài viết của Bác rất bổ ích ) ^^
  • 0

#284 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 708 (tốt)

Đã gửi 21 January 2011 - 08:19 PM

Vẫn theo cách thức như các bài trước, mời bạn chạy thử chương trình rồi ta bàn bạc tiếp. Lần này nhiều thứ lôi thôi hơn, ssg đã chuẩn bị sẵn, bạn chỉ việc copy toàn bộ thư mục Relax vào thư mục gốc của AutoCAD, sau đó appload file relax.lsp là xong. Nếu appload thành công sẽ xuất hiện menu có tên Relax ở vị trí thứ 10 (tính từ trái qua) giống như hình trên.
bác Hoành cho em hỏi cụ thể thư mục gốc nói ở trên là chỗ nào ko ạ, thanksss ( bài viết của Bác rất bổ ích ) ^^

Bác SSg chuyển sang dùng nick này à....
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#285 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 January 2011 - 11:20 PM

Bác SSg chuyển sang dùng nick này à....

Đâu, bạn ấy copy nguyên lời anh ssg đó mà bác ^^
  • 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


#286 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 914 Bài viết
Điểm đánh giá: 515 (tốt)

Đã gửi 12 February 2011 - 03:34 PM

Có cách nào để entmod 1 đối tuợng con của đối tuợng xref không nhỉ. chỉnh sửa nội dung 1 đối tuợng text chẳng hạn. đôi khi mình luời không muốn mở Xref editor :)
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#287 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 914 Bài viết
Điểm đánh giá: 515 (tốt)

Đã gửi 20 February 2011 - 11:23 PM

Thật mệt mỏi với hàm Command quá!
Các chương trình sử lý 1 khối luợng lớn các công việc bằng hàm Command không những gây chậm mà còn có nhuợc điểm rất khó chịu là khi chuơng trình chạy xong, muốn undo lại rất cực khổ, chờ dài cổ mới xong, ngoài ra còn kèm theo 1 loạt thông báo (Lisp Expression) ngứa mắt, đôi khi làm treo máy luôn. Biết vậy nhưng thỉnh thoảng vẫn fải dùng đến Command.
Các bác có cách nào khắc phục được vấn đề này không? hoặc chí ít là tắt cái dòng thông báo kia đi khi undo, chắc sẽ nhanh hơn chút xíu.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#288 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 708 (tốt)

Đã gửi 20 February 2011 - 11:38 PM

Thật mệt mỏi với hàm Command quá!
Các chương trình sử lý 1 khối luợng lớn các công việc bằng hàm Command không những gây chậm mà còn có nhuợc điểm rất khó chịu là khi chuơng trình chạy xong, muốn undo lại rất cực khổ, chờ dài cổ mới xong, ngoài ra còn kèm theo 1 loạt thông báo (Lisp Expression) ngứa mắt, đôi khi làm treo máy luôn. Biết vậy nhưng thỉnh thoảng vẫn fải dùng đến Command.
Các bác có cách nào khắc phục được vấn đề này không? hoặc chí ít là tắt cái dòng thông báo kia đi khi undo, chắc sẽ nhanh hơn chút xíu.

Ơ sao bác không dùng hàm bẫy lỗi và set undo điểm đầu -> cuối cho nó đỡ khổ.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#289 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 914 Bài viết
Điểm đánh giá: 515 (tốt)

Đã gửi 21 February 2011 - 02:38 PM

có lẽ phamngoctukts chưa hiểu điều mình nói.
bạn viết code như thế này.
(defun C:test nil
(command "undo" "begin")
.... làm 1 việc gì đó khoảng 5000 lần bằng hàm command. (viết 1 nội dung text ra màn hình chẳng hạn)
(command "undo" "end") (princ))

rồi sau khi chạy lệnh test bạn thử undo lại xem. mời bạn ngồi chờ <_<
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#290 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 403 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 26 February 2011 - 08:23 AM

Mình muốn làm tròn tọa độ đỉnh của một polyline có sẵn trên bản vẽ về 2 số lẽ nhưng chưa biết cách nào. Bạn nào biết hướng dẫn cho mình hoặc chỉ mình trang nào đề cập vđ này. Mình tìm kg thấy. Cám ơn các bạn
  • 0

#291 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 914 Bài viết
Điểm đánh giá: 515 (tốt)

Đã gửi 27 February 2011 - 12:27 AM

1 cách đơn giản là bác chuyển các giá trị đó thành chuỗi bằng hàm rtos rồi lại chuyển nguợc lại thành số thực.
(atof (rtos x 2 2))
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#292 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 403 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 27 February 2011 - 09:22 AM

1 cách đơn giản là bác chuyển các giá trị đó thành chuỗi bằng hàm rtos rồi lại chuyển nguợc lại thành số thực.
(atof (rtos x 2 2))

Cách làm tròn số thực thì mình biết rồi, nhưng cách truy xuất đỉnh của polyline line, lưu vào biến, làm tròn rồi cập nhật lại vào polyline thì mình chưa rõ.
Mình tìm được hàm lấy tọa độ đỉnh trên cadviet
(setq en (ssname (ssget '((0 . "LWPOLYLINE"))) 0) lstp (ACET-GEOM-VERTEX-LIST en))
nhưng hàm này chỉ chạy trên cad đời cao, mình vẫn sd cad2002 thì nó kg chạy, bạn nào biết hàm khác thấp hơn thì chỉ cho mình với. Mình vẫn chưa tìm đc hàm cập nhật lại vào polyline.
  • 0

#293 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 914 Bài viết
Điểm đánh giá: 515 (tốt)

Đã gửi 27 February 2011 - 12:31 PM

Không biết cad2002 có Visual Lisp chưa nhỉ.
bác thử cái này để lấy list toạ độ LWpolyline xem

(defun get-vertex-lwpline (e/ iv L)
(setq iv -1 L '())
(repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq iv (1+ iv) L (append L (list (vlax-curve-getPointAtParam e iv))))))
nếu vẫn không đuợc thì đành chơi cái này vậy - autolisp nên chạy dc với mọi bản cad
(defun get-vertex-lwpline (e / lstpt)
(setq lstpt '())
(foreach x (entget e)
(if (= (car x) 10) (setq lstpt (append (list (cdr x)) lstpt)))) lstpt)
Làm tròn tọa độ về 2 chữ số

(mapcar '(lambda (x1) (mapcar '(lambda (x2) (atof(rtos x2 2 2))) x1)) (get-vertex-lwpline (car(entsel))))
Còn việc cập nhật list point đã được làm tròn cho đường pline mình nghĩ là đơn giản thôi mà.
từ record của pline, bác loại bỏ mọi fần tử có mã DXF 10, 40, 41, 42, 91 rồi chèn các điểm point mới vào vị trí sau mã 39. entmod với record mới này là ok
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#294 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 27 February 2011 - 01:27 PM

Không biết cad2002 có Visual Lisp chưa nhỉ.
bác thử cái này để lấy list toạ độ LWpolyline xem


(defun get-vertex-lwpline (e/ iv L)
(setq iv -1 L '())
(repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq iv (1+ iv) L (append L (list (vlax-curve-getPointAtParam e iv))))))
nếu vẫn không đuợc thì đành chơi cái này vậy - autolisp nên chạy dc với mọi bản cad
(defun get-vertex-lwpline (e / lstpt)
(setq lstpt '())
(foreach x (entget e)
(if (= (car x) 10) (setq lstpt (append (list (cdr x)) lstpt)))) lstpt)
Làm tròn tọa độ về 2 chữ số

(mapcar '(lambda (x1) (mapcar '(lambda (x2) (atof(rtos x2 2 2))) x1)) (get-vertex-lwpline (car(entsel))))
Còn việc cập nhật list point đã được làm tròn cho đường pline mình nghĩ là đơn giản thôi mà.
từ record của pline, bác loại bỏ mọi fần tử có mã DXF 10, 40, 41, 42, 91 rồi chèn các điểm point mới vào vị trí sau mã 39. entmod với record mới này là ok

Bạn coi lại nhé :
(rtos -618.003 2 2) -> "-618.00" -> ok. Nhưng (atof "-618.00") -> -618.0 (Không đúng)
Ngoài ra, cần phải thiết lập biến Dimzin=0 :rolleyes:
  • 0

#295 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 914 Bài viết
Điểm đánh giá: 515 (tốt)

Đã gửi 27 February 2011 - 05:59 PM

Bạn coi lại nhé :
(rtos -618.003 2 2) -> "-618.00" -> ok. Nhưng (atof "-618.00") -> -618.0 (Không đúng)
Ngoài ra, cần phải thiết lập biến Dimzin=0 :rolleyes:

Chúng ta đang bàn đến việc làm tròn số, không fải về việc thể hiện 1 số duới dạng chuỗi như thế nào bạn ạ.
[round 618.003 ; 2] = 618.00 = 618.0 = 618.000000000000000000000000000000000000000 = 618
vì thế chả cần biến Dimzin làm gì.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#296 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 403 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 27 February 2011 - 09:43 PM

Không biết cad2002 có Visual Lisp chưa nhỉ.
bác thử cái này để lấy list toạ độ LWpolyline xem


(defun get-vertex-lwpline (e/ iv L)
(setq iv -1 L '())
(repeat (fix (1+ (vlax-curve-getEndParam e)))
(setq iv (1+ iv) L (append L (list (vlax-curve-getPointAtParam e iv))))))
nếu vẫn không đuợc thì đành chơi cái này vậy - autolisp nên chạy dc với mọi bản cad
(defun get-vertex-lwpline (e / lstpt)
(setq lstpt '())
(foreach x (entget e)
(if (= (car x) 10) (setq lstpt (append (list (cdr x)) lstpt)))) lstpt)
Làm tròn tọa độ về 2 chữ số

(mapcar '(lambda (x1) (mapcar '(lambda (x2) (atof(rtos x2 2 2))) x1)) (get-vertex-lwpline (car(entsel))))
Còn việc cập nhật list point đã được làm tròn cho đường pline mình nghĩ là đơn giản thôi mà.
từ record của pline, bác loại bỏ mọi fần tử có mã DXF 10, 40, 41, 42, 91 rồi chèn các điểm point mới vào vị trí sau mã 39. entmod với record mới này là ok

cad2002 có vl rồi nhưng chắc nó chưa có hàm ACET-GEOM-VERTEX-LIS
Việc sd hàm entmod với cod 10 trong trường hợp polyline mình nghỉ kg đc vì hàm assoc chỉ trả về cặp dữ liệu có cod 10 đầu tiên thôi trong khi đó dữ liệu của polyline có nhiều cặp có cod 10. Kg biết mình có nhầm lẫn gì kg
  • 0

#297 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 27 February 2011 - 10:50 PM

cad2002 có vl rồi nhưng chắc nó chưa có hàm ACET-GEOM-VERTEX-LIS
Việc sd hàm entmod với cod 10 trong trường hợp polyline mình nghỉ kg đc vì hàm assoc chỉ trả về cặp dữ liệu có cod 10 đầu tiên thôi trong khi đó dữ liệu của polyline có nhiều cặp có cod 10. Kg biết mình có nhầm lẫn gì kg

Theo thiển ý của mình, bạn có thể làm như thế này xem sao:
- Duyệt từng phần tử trong danh sách record đối tượng (hàm foreach).
- Nếu phần tử nào có (= 10 (car pt)) thì thay X,Y,Z của nó bằng x,y,z [trong đó x=(atof (rtos X 2 2))]
  • 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.


#298 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 February 2011 - 12:01 AM

Chắc cũng k cần list point ra đâu bạn TRUNGNGAMY ạ.
Với LWPlolyline thì :
(defun c:test()
(defun round(x)(atof (rtos x 2 2)))
(foreach x (setq ent (entget (car(entsel))))
(if (= (car x) 10)
(entmod (setq ent(subst (list 10 (round (cadr x))(round (caddr x))) x ent)))
)
)
)
P/S : nick bạn làm mình nhớ VLTK quá ^^
  • 2

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


#299 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 403 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 28 February 2011 - 04:08 AM

Chắc cũng k cần list point ra đâu bạn TRUNGNGAMY ạ.
Với LWPlolyline thì :

(defun c:test()
(defun round(x)(atof (rtos x 2 2)))
(foreach x (setq ent (entget (car(entsel))))
(if (= (car x) 10)
(entmod (setq ent(subst (list 10 (round (cadr x))(round (caddr x))) x ent)))
)
)
)
P/S : nick bạn làm mình nhớ VLTK quá ^^

Cám ơn bạn. Mình lập trình autolíp đã lâu nhưng kg nghĩ ra cú pháp lạ và hay như vậy. Có lẽ cái kiến thức cũ kỹ của mình đã lỗi thời rồi.
(Nick của mình của mình kg liên quan gì đến VLTK đâu ạ)
  • 0

#300 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1453 Bài viết
Điểm đánh giá: 1434 (rất tốt)

Đã gửi 28 February 2011 - 08:14 AM

Mình muốn làm tròn tọa độ đỉnh của một polyline có sẵn trên bản vẽ về 2 số lẽ nhưng chưa biết cách nào. Bạn nào biết hướng dẫn cho mình hoặc chỉ mình trang nào đề cập vđ này. Mình tìm kg thấy. Cám ơn các bạn

Một yêu cầu khá là "ngộ" !


Chắc cũng k cần list point ra đâu bạn TRUNGNGAMY ạ.
Với LWPlolyline thì :

(defun c:test()
(defun round(x)(atof (rtos x 2 2)))
(foreach x (setq ent (entget (car(entsel))))
(if (= (car x) 10)
(entmod (setq ent(subst (list 10 (round (cadr x))(round (caddr x))) x ent)))
)
)
)
P/S : nick bạn làm mình nhớ VLTK quá ^^

Đại cao thủ xuất hiện.
Bái phục ! Bái phục !
  • 0