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

#261 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

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

Đã gửi 04 September 2010 - 10:46 PM

Biến hệ thống nào cho biết cad đang mở bao nhiêu bv vậy các bạn
  • 0

#262 master_worse

master_worse

    biết lệnh offset

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

Đã gửi 05 September 2010 - 09:28 AM

Biến hệ thống nào cho biết cad đang mở bao nhiêu bv vậy các bạn

Biến hệ thống thì không biết, nhưng có cái này (vla-get-count (vla-get-documents(vlax-get-acad-object))).

tạo 1 list các bản vẽ dang mở
-----------------------------------------------------------------------------------------------------------

(setq doc (vla-get-documents (vlax-get-acad-object))
num (vla-get-count doc)
i -1
) ;_ end setq
(repeat num (setq i (1+ i)) (setq names (cons (vla-get-path (vla-item doc i)) names)))
(setq names (reverse names))

-----------------------------------------------------------------------------------------------------------
nếu muốn chì lấy tên file không thì sửa ...(vla-get-path ... thành ...(vla-get-name ...

Bài viết đã được chỉnh sửa nội dung bởi master_worse: 05 September 2010 - 10:29 AM

  • 2

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#263 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 15 September 2010 - 08:03 AM

1- Bạn lọc lấy DXF 10 trong data của nó là xong ngay.
2- Xin chia sẻ một chút kinh nghiệm "vọc" lisp của ssg. Không riêng gì leader, mà với bất cứ đối tượng nào, ssg có sẵn 1 "lá bùa" vẫn load thường trực:

(defun C:EG( )(setq e (car (entsel)))(textscr)(setq d (entget e)))
..............

Tương tự lá bùa của bác SSG,
LISP dxf cung cấp các giá trị của mã DXF duới dạng hộp thoại.
Hình đã gửi
(defun c:dxf (/ ent Sel DataList)
(defun Dialog_Show (lst / dxfdcl fn dxf_id)
(setq dxfdcl (vl-filename-mktemp "DXF_Val.tmp")
fn (open dxfdcl "w"))
(foreach item (list
"DXF_VALUE : dialog { label = \"DXF Value\";"
" : list_box { key = \"lstKey\"; height = 25; width = 70; tabs = 4; }"
" ok_only; }")
(princ item fn) )
(close fn)
(setq dxf_id (load_dialog dxfdcl))
(if (not (if dxfXY (new_dialog "DXF_VALUE" dxf_id "" dxfXY)(new_dialog "DXF_VALUE" dxf_id)))
(progn (prompt "\nDynamic Dialogue Extraction Failed.")(exit)))
(start_list "lstKey" 3) (mapcar 'add_list lst) (end_list)
(action_tile "accept" "(setq dxfXY (done_dialog))")
(start_dialog)
(unload_dialog dxf_id)
(vl-file-delete dxfdcl)
(princ))
;main
(if (setq Sel (entsel) ent (car sel))
(Dialog_Show
(mapcar
'(lambda (x / tempType)
(if (and
(equal (type (cdr x)) 'ENAME)
(setq tempType (cdr (assoc 0 (entget (cdr x))))))
(strcat (vl-princ-to-string (car x)) "\t\t" (vl-princ-to-string (cdr x)) " [ " tempType " ]")
(strcat (vl-princ-to-string (car x)) "\t\t" (vl-princ-to-string (cdr x)) ) ) )
(setq DataList (entget Ent '("*"))) ) ))
(princ))

  • 5

#264 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 September 2010 - 10:51 PM

Tuyệt vời,nhìn cái bảng thấy sinh động và trực quan hơn hẳ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


#265 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 19 September 2010 - 11:25 PM

Tương tự lá bùa của bác SSG,
LISP dxf cung cấp các giá trị của mã DXF duới dạng hộp thoại.
Hình đã gửi

Có 2 nhuợc điểm bác ạ.
- Ta không thể copy giá trị từ hộp thoại thông báo. (cái này em rất hay dùng trong quá trình viết code)
- Với các mã DXF có giá trị hiển thị thành 1 chuỗi dài vuợt quá phạm vi chiều ngang của hộp thoại sẽ không hiển thị đuợc hết. (Cái này thuờng gặp ở các đối tuợng chứa dữ liệu mở rộng xdata, mã -3)
Em dùng thế này cho đơn giản mà tiện dụng :undecided:

(defun c:tra (/ i E LST)
(setq E (entsel) LST (entget(car E) '("*")) i 0)
(repeat (length LST)
(print (nth i LST))
(setq i (1+ i))
)
(textscr) (princ)
);end


  • 0

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


#266 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 September 2010 - 11:38 PM

Em cũng viết 1 "lá bùa" cho mình. hehe, sai lầm chết người của em chính từ "lá bùa lởm" này :bigsmile:

Cảm ơn anh nhé :undecided:

Mình mới đọc bài này,vẫn chưa hiểu lá bùa này ...lởm ở chỗ nào :bigsmile:(
  • 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


#267 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 19 September 2010 - 11:48 PM

Mình mới đọc bài này,vẫn chưa hiểu lá bùa này ...lởm ở chỗ nào :undecided:(

bạn thử nó với 1 leader hay polyline hoặc 1 số đối tuợng fức khác sẽ hiểu
  • 0

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


#268 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 10:09 PM

À,với pl thì nó có hơi bị...dài ^^ Có phải không ạ
  • 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


#269 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 21 September 2010 - 07:44 AM

À,với pl thì nó có hơi bị...dài ^^ Có phải không ạ

Không fải :(
  • 0

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


#270 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 September 2010 - 08:10 AM

Không fải :(

Thế thì nó..lởm ở chỗ nào ạ :( Ngố quá nên chưa hiểu ra^^
Ví dụ với 1 pl thì thấy :...

(-1 . )
(0 . "LWPOLYLINE")
(330 . )
(5 . "4C9A2")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "KCVN-PLOT")
(100 . "AcDbPolyline")
(90 . 4)
(70 . 0)
(43 . 0.0)
(38 . 0.0)
(39 . 0.0)
(10 -331.23 -892.16)
(40 . 0.0)
(41 . 0.0)
(42 . 0.0)
(10 -626.941 -459.887)
(40 . 0.0)
(41 . 0.0)
(42 . 0.0)
(10 -338.443 -423.865)
(40 . 0.0)
(41 . 0.0)
(42 . 0.0)
(10 -223.044 -567.956)
(40 . 0.0)
(41 . 0.0)
(42 . 0.0)
(210 0.0 0.0 1.0)

  • 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


#271 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 23 September 2010 - 04:57 PM

Ai sửa giúp e đoạn code này với
E nghi nó hỏng chỗ lấy tâm của đg tròn:

;; free lisp from cadviet.com
(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun c:vidu (/ ten tam bk i p1 p2 p3 p4 )
(setq ss (ssget '((0 . "circle"))))
(setq i 0)
(while (< i (sslength ss))
   (setq ten (ssname ss i))
tam (cdr (assoc 10 ss))
bk (cdr (assoc 40 ss))
p1 (polar tam 0.0 (+ bk 75))
p2 (polar tam pi (+ bk 75))
p3 (polar p2 (/ pi 2) (+ bk 75 ))
p4 (polar p1 (/ (* pi 3) 2 ) (+ bk 75 ))
;(setvar "clayer" "manh")
(BatDauVe)
(command "CIRCLE" tam (+ bk 50))
;;;----------
;(setvar "clayer" "thay")
(command "RECTANG" p3 p4)
(KetThucVe)
 (setq i (1+ i))
);_ end while
);_ end defun

  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#272 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 23 September 2010 - 05:06 PM

Ai sửa giúp e đoạn code này với
E nghi nó hỏng chỗ lấy tâm của đg tròn:

;; free lisp from cadviet.com
(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun c:vidu (/ ten tam bk i p1 p2 p3 p4 )
(setq ss (ssget '((0 . "circle"))))
(setq i 0)
(while (< i (sslength ss))
   (setq ten (ssname ss i))
tam (cdr (assoc 10 ss))
bk (cdr (assoc 40 ss))
p1 (polar tam 0.0 (+ bk 75))
p2 (polar tam pi (+ bk 75))
p3 (polar p2 (/ pi 2) (+ bk 75 ))
p4 (polar p1 (/ (* pi 3) 2 ) (+ bk 75 ))
;(setvar "clayer" "manh")
(BatDauVe)
(command "CIRCLE" tam (+ bk 50))
;;;----------
;(setvar "clayer" "thay")
(command "RECTANG" p3 p4)
(KetThucVe)
 (setq i (1+ i))
);_ end while
);_ end defun

Không những hỏng chổ lấy tâm mà còn hỏng chổ lấy bán kính nữa
Dấu ngoặc đóng chưa đúng
Tue_NV sửa lại :

(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun c:vidu (/ ten tam bk i p1 p2 p3 p4 )
(setq ss (ssget '((0 . "circle"))))
(setq i 0)
(while (< i (sslength ss))
   (setq ten (ssname ss i)
tam (cdr (assoc 10 (entget ten)))
bk (cdr (assoc 40 (entget ten)))
p1 (polar tam 0.0 (+ bk 75))
p2 (polar tam pi (+ bk 75))
p3 (polar p2 (/ pi 2) (+ bk 75 ))
p4 (polar p1 (/ (* pi 3) 2 ) (+ bk 75 ))
)

;(setvar "clayer" "manh")
(BatDauVe)
(command "CIRCLE" tam (+ bk 50))
;;;----------
;(setvar "clayer" "thay")
(command "RECTANG" p3 p4)
(KetThucVe)
 (setq i (1+ i))
);_ end while
);_ end defun

  • 0

#273 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 23 September 2010 - 06:23 PM

hi hi cảm ơn bác tue nhé.
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#274 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 23 September 2010 - 08:18 PM

Thế thì nó..lởm ở chỗ nào ạ :( Ngố quá nên chưa hiểu ra^^
Ví dụ với 1 pl thì thấy :...

À, đây là kết quả của lá bùa mới. còn lá bùa cũ mình post trong bài #239 mới là lởm. mình tuởng bạn hỏi về bài đó
  • 0

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


#275 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 September 2010 - 09:56 PM

À e hiểu rồi.Đoạn code cũ mã dxf 10 lấy đúng 1 giá trị ^^
  • 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


#276 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 24 September 2010 - 12:02 AM

Cũng cái líp trên nhưng khi mình thêm hàn IF để chia trường hợp thì nó lại báo lỗi
Select objects: Specify opposite corner: 3 found
Select objects: ; error: bad argument type: 2D/3D point: nil

Các bác giúp e xem nó bị làm sao vơi nhé. Thank!!!

;; free lisp from cadviet.com

(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun LayDiem() p1 (polar tam 0.0 (+ bk k))
p2 (polar tam pi (+ bk k))
p3 (polar p2 (/ pi 2) (+ bk k))
p4 (polar p1 (/ (* pi 3) 2 ) (+ bk k)))
(defun c:ct (/ ten tam bk i p1 p2 p3 p4 k )
(setq ss (ssget '((0 . "circle"))))
(setq i 0)
(while (< i (sslength ss))
   (setq ten (ssname ss i)
tam (cdr (assoc 10 (entget ten)))
bk (cdr (assoc 40 (entget ten))))
(if (>= bk 300)
(setq k 75)
)
(if (and (< bk 300) (> bk 100))
(setq k 50))

(if (<= bk 100)
(setq k 25)
)
(LayDiem)
(BatDauVe)
(command "CIRCLE" tam (+ bk k))
(command "RECTANG" p3 p4)
(KetThucVe)
 (setq i (1+ i))
);_ end while
);_ end defun

  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#277 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 24 September 2010 - 08:07 AM

Cũng cái líp trên nhưng khi mình thêm hàn IF để chia trường hợp thì nó lại báo lỗi
Select objects: Specify opposite corner: 3 found
Select objects: ; error: bad argument type: 2D/3D point: nil

Các bác giúp e xem nó bị làm sao vơi nhé. Thank!!!

;; free lisp from cadviet.com

(defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
(defun KetThucVe() (setvar "osmode" OldOs) (princ))
(defun LayDiem() p1 (polar tam 0.0 (+ bk k))
p2 (polar tam pi (+ bk k))
p3 (polar p2 (/ pi 2) (+ bk k))
p4 (polar p1 (/ (* pi 3) 2 ) (+ bk k)))
(defun c:ct (/ ten tam bk i p1 p2 p3 p4 k )
(setq ss (ssget '((0 . "circle"))))
(setq i 0)
(while (< i (sslength ss))
   (setq ten (ssname ss i)
tam (cdr (assoc 10 (entget ten)))
bk (cdr (assoc 40 (entget ten))))
(if (>= bk 300)
(setq k 75)
)
(if (and (< bk 300) (> bk 100))
(setq k 50))

(if (<= bk 100)
(setq k 25)
)
(LayDiem)
(BatDauVe)
(command "CIRCLE" tam (+ bk k))
(command "RECTANG" p3 p4)
(KetThucVe)
 (setq i (1+ i))
);_ end while
);_ end defun

Bạn bất cẩn quá. Bạn bị lỗi ở dòng này :
(defun LayDiem() p1 (polar tam 0.0 (+ bk k))
Hy vọng bạn tìm ra lỗi. :(
Bạn không cần thiết phải viết bài viết như này :

hi hi cảm ơn bác tue nhé.

Chỉ cần tick Thanks là được
  • 1

#278 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 24 September 2010 - 10:39 PM

Mình có câu hỏi như vậy. Nếu trong lisp có đoạn code sau:

		(initget "C K") ;;;Init keywords
(setq ans (getkword "\nBan co muon... [C/K] :")) ;;;Get answer from user
(if (= ans "C") (Command ,,,,,))


khi chạy líp nó bắt mình nhập C hoặc K nhưng chỉ thấy có hàm if cho C mà không có hàm if dùng cho K. Vậy có phải là khi mình không nhập gì mà ấn ENTER hoặc Space luôn thì nó tự nhận giá trị là K luôn à ????.
Thank!!!!
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#279 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 30 September 2010 - 05:56 PM

Mình có câu hỏi như vậy. Nếu trong lisp có đoạn code sau:

		(initget "C K") ;;;Init keywords
(setq ans (getkword "\nBan co muon... [C/K] :")) ;;;Get answer from user
(if (= ans "C") (Command ,,,,,))


khi chạy líp nó bắt mình nhập C hoặc K nhưng chỉ thấy có hàm if cho C mà không có hàm if dùng cho K. Vậy có phải là khi mình không nhập gì mà ấn ENTER hoặc Space luôn thì nó tự nhận giá trị là K luôn à ????.
Thank!!!!

Khi bạn nhập giá trị enter hay space thì nó sẽ bỏ qua dòng lệnh getkword khi đó ans nhận giá trị nil. (Tương ứng với K)
  • 1
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#280 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 10 October 2010 - 01:28 PM

Các bác ơi em dùng cái lisp lấy DXF để xem điểm chèn của một block mà thế nào nó bị lệch so với xem ở Properties :cheers:( Block tạo mới thì đúng nhưng đây là Block có sẵn trên bản vẽ (mà bản vẽ thì em nhận từ người khác :cheers: , có bác nào bít tại sao không ah?
  • 0