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, Doan Nguyen Van đã nói:

Các hàm Vl- đều bị như thế, bác thay bằng (cdr (assoc 1 (entget (ent))) để lấy chữ có tiếng việt 

 

2 giờ trước, Doan Van Ha đã nói:

Chơi với unicode thì đừng chơi với vl/vla/vlax, vì mấy chú visualisp xử lý unicode rất có vấn đề.

ờ ha, vậy mà chả nghĩ ra, cảm ơn các 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

Các bác cho em hỏi 1 xíu!

Có cách nào để co cụm lại dòng lisp cho gọn được không ạ? Em cảm ơn nhiều!

Ví dụ:

(defun MakeLayer_ (name colour /)
  (if (null (tblsearch "LAYER" name))
    (entmake
      (list
    '(0 . "LAYER")
    '(100 . "AcDbSymbolTableRecord")
    '(100 . "AcDbLayerTableRecord")
    '(70 . 0)
    (cons 2 name)
    (cons 62 colour)
      )
    )
  )
)

 

thành

(defun MakeLayer_ (name colour /)  (if (null (tblsearch "LAYER" name))    (entmake      (list    '(0 . "LAYER")    '(100 . "AcDbSymbolTableRecord")    '(100 . "AcDbLayerTableRecord")    '(70 . 0)    (cons 2 name)    (cons 62 colour)      )    )  ))

 

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
26 phút trước, thanhduan2407 đã nói:

Các bác cho em hỏi 1 xíu!

Có cách nào để co cụm lại dòng lisp cho gọn được không ạ? Em cảm ơn nhiều!

Ví dụ:

  • cadvietlisp.lsp
    lisp help
  •  

(defun MakeLayer_ (name colour /)
  (if (null (tblsearch "LAYER" name))
    (entmake
      (list
    '(0 . "LAYER")
    '(100 . "AcDbSymbolTableRecord")
    '(100 . "AcDbLayerTableRecord")
    '(70 . 0)
    (cons 2 name)
    (cons 62 colour)
      )
    )
  )
)

thành

  • cadvietlisp.lsp
    lisp help
  •  

(defun MakeLayer_ (name colour /)  (if (null (tblsearch "LAYER" name))    (entmake      (list    '(0 . "LAYER")    '(100 . "AcDbSymbolTableRecord")    '(100 . "AcDbLayerTableRecord")    '(70 . 0)    (cons 2 name)    (cons 62 colour)      )    )  ))

 

Nén Lsp:
http://web2.airmail.net/terrycad/LISP/LspCom.lsp

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

Tuyệt vời quá bác ạ! Đúng là cháu thật may mắn được biết bác. Hii

Chúc bác @Doan Van Ha buổi tối nhiều niềm 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
8 phút trước, thanhduan2407 đã nói:

Tuyệt vời quá bác ạ! Đúng là cháu thật may mắn được biết bác. Hii

Chúc bác @Doan Van Ha buổi tối nhiều niềm vui!

Thế mà chả bao giờ thấy mời nhậ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ừa xong, Doan Van Ha đã nói:

Thế mà chả bao giờ thấy mời nhậu (?)

Hic. Bác ở xa quá! Đợt bác ra HN cháu lại đang đi đo đạc. Ketxu mấy lần í ới mà chưa ngồi dc bác ạ. Hẹn bác dịp nào bác ra HN 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

Tôi chưa  từng dùng hàm IF trong field nhưng tin rằng các hàm khác viết trong công thức field được thì chắc IF cũng được.

Tham khảo 1 lisp có dùng hàm trong field:

 

Cong_Text.lsp

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

Tôi chưa  từng dùng hàm IF trong field nhưng tin rằng các hàm khác viết trong công thức field được thì chắc IF cũng được.

Tham khảo 1 lisp có dùng hàm trong field:

 

Cong_Text.lsp

 

21 phút trước, quocmanh04tt đã nói:

Cảm ơn các 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

$ là viết trong DIESEL mà. Field tham khảo thêm vài kiểu nè:

;----- Here is the field expression for "-150 mtext" (do not use word wrap for it!).
;(setq fieldExp (strcat "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId " (rtos (vla-get-objectid len)2 0) ">%).TextString>%-150) " "\\f \"%lu2%pr0\">%"))
;----- Here is the field code for "weight mtext" (do not use word wrap for it!)
;(setq fieldExp (strcat "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId " (rtos (vla-get-objectid qty)2 0)">%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId "(itoa (vla-get-objectid reb)) ">%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId " (rtos (vla-get-objectid mtxObj1) 2 0) ">%).TextString>%*0.001) \\f \"%lu2%pr1\">%"))
;(setq fieldExp (strcat "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid qty)) " >%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid reb)) ">%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid len)) ">%).TextString>%-150)*0.001) \\f \"%lu2%pr1\">%"))
 

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

$ là viết trong DIESEL mà. Field tham khảo thêm vài kiểu nè:

;----- Here is the field expression for "-150 mtext" (do not use word wrap for it!).
;(setq fieldExp (strcat "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId " (rtos (vla-get-objectid len)2 0) ">%).TextString>%-150) " "\\f \"%lu2%pr0\">%"))
;----- Here is the field code for "weight mtext" (do not use word wrap for it!)
;(setq fieldExp (strcat "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId " (rtos (vla-get-objectid qty)2 0)">%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId "(itoa (vla-get-objectid reb)) ">%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId " (rtos (vla-get-objectid mtxObj1) 2 0) ">%).TextString>%*0.001) \\f \"%lu2%pr1\">%"))
;(setq fieldExp (strcat "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid qty)) " >%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid reb)) ">%).TextString>%*%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid len)) ">%).TextString>%-150)*0.001) \\f \"%lu2%pr1\">%"))
 

Bác ơi cái này là lisp mà, với cả trong này cũng ko thấy có cấu trúc hàm gì cả. Bây h e muốn viết trực tiếp vào field thì phải làm sao, ôi bối rối quá :(.

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ớ mường tượng hình như đã có lần vào ở đâu đó để lấy tên của tất cả biến môi trường (Environment) kèm value của nó, mà giờ quên mất(?)

Có ai biết nhờ chỉ giùm với, 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 giờ trước, Doan Van Ha đã nói:

Nhớ mường tượng hình như đã có lần vào ở đâu đó để lấy tên của tất cả biến môi trường (Environment) kèm value của nó, mà giờ quên mất(?)

Có ai biết nhờ chỉ giùm với, thanks!

 

 

Lệnh sysvdlg hả? Trong express tools

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
16 phút trước, ngokiet đã nói:

https://www.afralisp.net/archive/lisp/enviro.htm

 cái này có được không hỏi. ?

Thanks, cái này tôi cũng đã có. Ý tôi muốn lấy tất cả biến cùng Value của nó. Nó từ cad2004. Không biết Cad current và biến do người dùng đặt thêm

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 1 chút ạ!

Em dùng Win 10, 64 bit. Em dùng lisp để rename hoặc copy ở Ổ C: mà các file không có động tĩnh gì?

Về cấu trúc  vl-file-rename và vl-file-copy đều rất ổn. Phải chăng cần can thiệp về Permission cho phép tạo file hoặc đổi tên file?

Bản thân em rename bằng tay, sau khi kết thúc thì máy tính cũng hỏi Yes or No.

Mong nhờ các bác cho em sáng dạ thêm chút ạ. Hic hic

 

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

Hình như nó hỏi kiểu báo cho bạn biết có chương trình muốn sửa đổi file hay không?

Cái này dùng để bảo vệ dữ liệu chống thay đổi trái phép của windows. Muốn ko hỏi thì phải tắt Uac đi.

Tìm hiểu thêm về UAC trên Google nhé.

Cảm ơn bác nhiều!

Em sẽ nghiên cứu thêm ít nữa. Chưa thấy có tác dụng dù em làm thủ công nó vẫn hỏ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 1 chút!

Em có các hàm:

defun ham1(x1 x2 / ); defun ham2(x1 x2 / ); defun ham3(x1 x2 / ); defun ham4(x1 x2 / ),....

Em đang làm 1 cái tuỳ chọn.

  (if (null *Style*)
    (setq *Style* "TDTP")
  )
  (initget "TDTP DTTP TPDT PTDT")
  (if (setq Style (getkword
               (strcat "\nB\U+1EA1n mu\U+1ED1n \U+0111\U+00E1nh s\U+1ED1 hi\U+1EC7u theo ki\U+1EC3u n\U+00E0o?
               [TDTP - Tr\U+00EAn D\U+01B0\U+1EDBi - Tr\U+00E1i Ph\U+1EA3i /
               DTTP - D\U+01B0\U+1EDBi Tr\U+00EAn - Tr\U+00E1i Ph\U+1EA3i /
               TPDT - Tr\U+00E1i Ph\U+1EA3i - D\U+01B0\U+1EDBi Tr\U+00EAn /
               PTDT - Ph\U+1EA3i Tr\U+00E1i - D\U+01B0\U+1EDBi Tr\U+00EAn]
               <"
                   *Style*
                   ">: "
               )
             )
      )
    (setq *Style* Style)
  )

Em muốn làm cái tuỳ chọn như này nhưng sẽ là sai. Nhờ các bác chỉ dẫn dùm với ạ

(cond
    ((= Style "TDTP")
     (setq Choose Ham1)
    )
    ((= Style "DTTP")
     (setq Choose Ham2)
    )
    ((= Style "TPDT")
     (setq Choose Ham3)
    )
    ((= Style "PTDT")
     (setq Choose Ham4)
    )
  )

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

Nó!


(defun C:AB()
 (initget "TDTP DTTP TPDT PTDT")
 (setq a (getkword (strcat "\nB\U+1EA1n mu\U+1ED1n \U+0111\U+00E1nh s\U+1ED1 hi\U+1EC7u theo ki\U+1EC3u n\U+00E0o?[TDTP - Tr\U+00EAn D\U+01B0\U+1EDBi - Tr\U+00E1i Ph\U+1EA3i /
               DTTP - D\U+01B0\U+1EDBi Tr\U+00EAn - Tr\U+00E1i Ph\U+1EA3i /
               TPDT - Tr\U+00E1i ?Ph\U+1EA?3i - D\U+01B0\U+1EDBi Tr\U+00EAn /
               PTDT - Ph\U+1EA3i Tr\U+00E1i - ?D\U+01B0\U+1EDB?i Tr\U+00EAn]?")))
 (cond
  ((= a "TDTP") (Ham1 3 5))               
  ((= a "DTTP") (Ham2 3 5))               
  ((= a "TPDT") (Ham3 3 5))               
  ((= a "PTDT") (Ham4 3 5))))
(defun Ham1 (x1 x2)
 (+ x1 x2))
(defun Ham2 (x1 x2)
 (- x1 x2))

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

Nó!

 


(defun C:AB()
 (initget "TDTP DTTP TPDT PTDT")
 (setq a (getkword (strcat "\nB\U+1EA1n mu\U+1ED1n \U+0111\U+00E1nh s\U+1ED1 hi\U+1EC7u theo ki\U+1EC3u n\U+00E0o?[TDTP - Tr\U+00EAn D\U+01B0\U+1EDBi - Tr\U+00E1i Ph\U+1EA3i /
               DTTP - D\U+01B0\U+1EDBi Tr\U+00EAn - Tr\U+00E1i Ph\U+1EA3i /
               TPDT - Tr\U+00E1i ?Ph\U+1EA?3i - D\U+01B0\U+1EDBi Tr\U+00EAn /
               PTDT - Ph\U+1EA3i Tr\U+00E1i - ?D\U+01B0\U+1EDB?i Tr\U+00EAn]?")))
 (cond
  ((= a "TDTP") (Ham1 3 5))               
  ((= a "DTTP") (Ham2 3 5))               
  ((= a "TPDT") (Ham3 3 5))               
  ((= a "PTDT") (Ham4 3 5))))
(defun Ham1 (x1 x2)
 (+ x1 x2))
(defun Ham2 (x1 x2)
 (- x1 x2))

 

Dạ, cái x1 và x2 chưa xác định bác ạ!

Cháu đang muốn xác định hàm phù hợp với lựa chọn bác ạ! Cháu không muốn lặp lại hàm.

 

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
2 phút trước, thanhduan2407 đã nói:

Dạ, cái x1 và x2 chưa xác định bác ạ!

Cháu đang muốn xác định hàm phù hợp với lựa chọn bác ạ! Cháu không muốn lặp lại hàm.

 

Khi biến (x1, x2...) chưa xác định mà muốn dùng ham1, ham2... thì không thể viết kiểu đó.

Phải viết là (defun C:ham1()...

Khi đó >> (cond ((= a (C:ham1))...

 

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

Khi biến (x1, x2...) chưa xác định mà muốn dùng ham1, ham2... thì không thể viết kiểu đó.

Phải viết là (defun C:ham1()...

Khi đó >> (cond ((= a (C:ham1))...

 

Dạ. Cháu cảm ơn bác. Cháu hiểu cách ấy 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

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

×