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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

2 giờ trước, Duong Nhat Duy đã nói:

Các bạn cho mình hỏi:

Mình có đoạn code

  • cadvietlisp.lsp
    lisp help
  •  

(command "._BPOLY")
(while (> (getvar "CMDACTIVE") 0)
 (command pause)
 )

Lệnh BPOLY nó tạo 1 vài polyline, làm thế nào để lấy được thông tin các polyline đó, như dạng selection set chẳng hạn.

Mình cảm ơn !

Lưu lại entlast. Trước Rồi entnext để lấy.

(setq lastent (entlast))

(while (setq x (entnext lastent)) (setq lastent x))

(setq x nil))

(command "._BPOLY") (while (> (getvar "CMDACTIVE") 0) (command pause) )
(while  (setq lastent (entnext lastent)) (setq x (cons lastent x)))

  • 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
13 giờ trước, ngokiet đã nói:

Lưu lại entlast. Trước Rồi entnext để lấy.

(setq lastent (entlast))

(while (setq x (entnext lastent)) (setq lastent x))

(setq x nil))

(command "._BPOLY") (while (> (getvar "CMDACTIVE") 0) (command pause) )
(while  (setq lastent (entnext lastent)) (setq x (cons lastent x)))

Mình cảm ơn nhé, tiện bạn cho mình hỏi đoạn 

(setq lastent (entlast))

(while (setq x (entnext lastent)) (setq lastent x))

có ý nghĩa gì nhỉ, khi nào thì (entlast) không lấy được đối tượng sau cùng của bản vẽ

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 giờ} trướ}c, Duong Nhat Duy đã nói:

Mình cảm ơn nhé, tiện bạn cho mình hỏi đoạn 

(setq lastent (entlast))

(while (setq x (entnext lastent)) (setq lastent x))

có ý nghĩa gì nhỉ, khi nào thì (entlast) không lấy được đối tượng sau cùng của bản vẽ

Khi entlast là block có att. Có thể là 1 ent khác có ent con đọc bằng entnext. Mình chưa test hế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
Vào lúc 19/4/2020 tại 02:52, ngokiet đã nói:

Lưu lại entlast. Trước Rồi entnext để lấy.

(setq lastent (entlast))

(while (setq x (entnext lastent)) (setq lastent x))

(setq x nil))

(command "._BPOLY") (while (> (getvar "CMDACTIVE") 0) (command pause) )
(while  (setq lastent (entnext lastent)) (setq x (cons lastent x)))

Bạn cho mình hỏi thêm chút là làm sao để lấy được đống point nhập từ người dùng kia, hay là số, xâu đối với các hàm command khác ?

Mì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
9 giờ trước, Duong Nhat Duy đã nói:

Bạn cho mình hỏi thêm chút là làm sao để lấy được đống point nhập từ người dùng kia, hay là số, xâu đối với các hàm command khác ?

Mình cảm ơn !

Dùng initget và getpoint để nhận thông tin rồi mới truyền lại cho command bpoly.  Lúc đó bạn mới lưu được các điểm hay string nhập vào.

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
15 giờ trước, ngokiet đã nói:

Dùng initget và getpoint để nhận thông tin rồi mới truyền lại cho command bpoly.  Lúc đó bạn mới lưu được các điểm hay string nhập vào.

Nhưng mình muốn dùng trực tiếp trong BPOLY để cad nó hightlight cái đường bao đó bạn. Có cách nào khác không 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
8 phút trước, Duong Nhat Duy đã nói:

Nhưng mình muốn dùng trực tiếp trong BPOLY để cad nó hightlight cái đường bao đó bạn. Có cách nào khác không bạn ?

  (setq l1 (list))
  (command "._BPOLY")
  (while (> (getvar "CMDACTIVE") 0)
    (setq pt (getpoint))
    (setq l1 (append l1 (list pt)))
    (command pt)
  )

Cách này vẫn highlight đc mà bá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
Vào lúc 27/4/2020 tại 11:59, naturooo đã nói:

Xin hỏi các bác làm sao để viết hàm "write-line" vào một bản vẽ đang mở khác ạ!

Như vậy là bạn đã có thể dùng hàm Write-Line để viết vào file cad (*.dwg) chưa mở ?

 - nếu được thì file cad đó có còn mở đươc bằng AutoCAD 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
28 phút trước, Doan Nguyen Van đã nói:
  • cadvietlisp.lsp
    lisp help
  •  

  (setq l1 (list))
  (command "._BPOLY")
  (while (> (getvar "CMDACTIVE") 0)
    (setq pt (getpoint))
    (setq l1 (append l1 (list pt)))
    (command pt)
  )

Cách này vẫn highlight đc mà bác

Ủa vậy hở, tại mình hơi mù mờ cái thằng cmdactive nên chả biết nó làm gì trong đó nữa.

Cảm ơn bạn nhé !

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 giờ} trướ}c, gia_bach đã nói:

Như vậy là bạn đã có thể dùng hàm Write-Line để viết vào file cad (*.dwg) chưa mở ?

 - nếu được thì file cad đó có còn mở đươc bằng AutoCAD không ?

Xin lỗi em hỏi không rõ (vì kiến thức còn hạn chế). Ý em là khi mở file theo đường dẫn bằng .script và file .scr mà file đó đang mở rồi thì nó sẽ bị read-only và không nhập được lệnh bằng hàm "write-line" nữa. Vậy có cách nào file đang mở thì chọn luôn để thực thi hàm write-line không ạ hoặc cách nào đó giải quyết vấn đề read-only ạ? Cảm ơn bác!

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

xin hỏi mọi người, tôi muốn làm 1 lisp về chuyển layer hiện hành về layer của 1 đối tượng. 

Trong cad có lệnh -layer --> Set --> chọn đối tượng --> cad chuyển layer về layer đối tượng.

lisp như sau: 

(defun c:11 (/ ss1) (setq ss1 (ssget)) (command "-layer" "s" "" ss1 ""))

Không biết lỗi chỗ nào mà lúc thực hiện thì cad báo lỗi, trong khi cũng dòng lisp tương tự thế này đối với các lệnh khác thì lại được

Nhờ các bác chỉ hộ lỗi sai

Cám ơn 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
1 giờ} trướ}c, nhimret đã nói:

xin hỏi mọi người, tôi muốn làm 1 lisp về chuyển layer hiện hành về layer của 1 đối tượng. 

Trong cad có lệnh -layer --> Set --> chọn đối tượng --> cad chuyển layer về layer đối tượng.

lisp như sau: 


(defun c:11 (/ ss1) (setq ss1 (ssget)) (command "-layer" "s" "" ss1 ""))

Không biết lỗi chỗ nào mà lúc thực hiện thì cad báo lỗi, trong khi cũng dòng lisp tương tự thế này đối với các lệnh khác thì lại được

Nhờ các bác chỉ hộ lỗi sai

Cám ơn nhiều.

 

Bạn thử dòng này xem

(defun c:11 (/ ss1) (setq ss1 (cdr(assoc 8 (entget (car (entsel "select object:")))))) (command "-layer" "S"  ss1 ""))

  • Like 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
42 phút trước, Biet ve CAD đã nói:

Bạn thử dòng này xem

(defun c:11 (/ ss1) (setq ss1 (cdr(assoc 8 (entget (car (entsel "select object:")))))) (command "-layer" "S"  ss1 ""))

cám ơn bác. đã ngon rồ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ạn cho mình hỏi chút:

Mình có đoạn code:

(setq ss (ssget "ALL" (list (cons 410 (vla-get-Name (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object))))))))

Khi dùng thử ở 1 layout bất kỳ hay trắng tinh mới tạo thì nó luôn ra 1 cái MV ẩn, xóa không được. Vậy cho mình hỏi có cách nào xóa hay phân biệt những thằng MV đó với cái MV khác không ? Mình cảm ơn !

Screenshot_1.png

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ào lúc 29/4/2020 tại 11:18, naturooo đã nói:

Xin lỗi em hỏi không rõ (vì kiến thức còn hạn chế). Ý em là khi mở file theo đường dẫn bằng .script và file .scr mà file đó đang mở rồi thì nó sẽ bị read-only và không nhập được lệnh bằng hàm "write-line" nữa. Vậy có cách nào file đang mở thì chọn luôn để thực thi hàm write-line không ạ hoặc cách nào đó giải quyết vấn đề read-only ạ? Cảm ơn bác!

Done! Đã giải quyết được bằng cách dùng Doslib. :D

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

Làm thế nào để check 1 drawing là new?

Khi mở 1 bản vẽ, làm thế nào để check bản vẽ đó là new, nghĩa là bản vẽ mới hoàn toàn, không có bất cứ thứ gì do user đã tác động lên 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
32 phút trước, Doan Van Ha đã nói:

Làm thế nào để check 1 drawing là new?

Khi mở 1 bản vẽ, làm thế nào để check bản vẽ đó là new, nghĩa là bản vẽ mới hoàn toàn, không có bất cứ thứ gì do user đã tác động lên nó?

Bác kiểm tra biến hệ thống DBMOD, new drawing có DBMOD=0.

  • Like 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
51 phút trước, naturooo đã nói:

Làm thế nào để chọn tất cả các đối tượng nằm trong viewport đang active bằng lisp ạ?

Nè bạn!

https://lispbox.wordpress.com/2015/05/05/selecting-objects-within-viewport-and-copy-it-to-clipboard-by-selecting-a-ps-viewport/

  • 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
39 phút trước, Doan Van Ha đã nói:

Em thử mà chưa hiểu nó hoạt động thế nào bác ạ. Cũng k thấy báo lỗi gì.

Mục đích em muốn chế lại lisp này, thay cho đoạn "(getkword "\nPress <ENTER> to go to next viewport")" để nó duyệt qua các viewport rồi chọn các đối tượng trong viewport đấy để up text, up dim theo đúng tỉ lệ của viewport ạ!

;;; Cycle Through Viewports (05-VI-2012)
(defun c:CTV( / oldCmdEcho listVPorts itemVPort )
(vl-load-com)
(setq oldCmdEcho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(if (/= (getvar "CTAB") "Model")
 (progn
  (setq listVPorts (vl-sort (vports) '(lambda(v1 v2) (< (car v1) (car v2)))))
  (if (> (length listVPorts) 1)
   (progn
    (command "_MSPACE")
    (foreach itemVPort (cdr listVPorts)
     (setvar "CVPORT" (car itemVPort))
     (getkword "\nPress <ENTER> to go to next viewport")
    )
    (command "_PSPACE")
   )
   (prompt "\nThere are no viewports defined in this Layout!")
  )
 )
 (prompt "\nThis routine works only in Layout!")
)

(setvar "CMDECHO" oldCmdEcho)
(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

Chọn các đối tượng trong 1 viewport thì dùng hàm (vpsel "W") hoặc  (vpsel "C") của lisp, sau đó chọn viewport thì các đối tượng bên trong nó được chọ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
15 phút trước, Doan Van Ha đã nói:

Chọn các đối tượng trong 1 viewport thì dùng hàm (vpsel "W") hoặc  (vpsel "C") của lisp, sau đó chọn viewport thì các đối tượng bên trong nó được chọn.

Em thử thì nó chỉ active được viewport chứ chưa chọn được các đối tượng nằm trong viewport đấy bác ạ.

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

×