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ị

Thuần lisp cũng không sáng sủa gì Ket ạ. Nó vẫn Hecxa.

VD:

(setq PW (open "D:\\a.csv" "w"))

(princ (cdr (assoc 1 a)) PW)

(close PW)

Trong đó: a lấy được từ block_att: '((...) (1. "MẶT BẰ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

Lâu nay dùng cái lisp "zv0" mà không xem thuật toán của nó. Giờ xem lại thấy có mấy thắc mắc xin các bắc giải thích hộ cái.

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=2817
(defun c:ve0 ()
 (defun suadinhPl(thongtin / index doituong doituongmoi toado)
(setq
  doituong (assoc '38 thongtin)  
  doituongmoi (cons 38 0.)
)
(subst doituongmoi doituong thongtin)
 )
 (defun suadinh (thongtin / index doituong doituongmoi toado)
(setq thongtinmoi nil)
(foreach doituong thongtin
  (if (and (>= (car doituong) 10)
	(<= (car doituong) 36)
  )
(setq doituongmoi
	(list (car doituong)
(cadr doituong)
(caddr doituong)
0.0
	)
)
(setq doituongmoi doituong)
  )
  (setq thongtinmoi (append thongtinmoi (list doituongmoi)))
)
(setq thongtinmoi thongtinmoi)
 )
 (defun tendoituong (ssdt /)
(cdr (assoc '0 (entget ssdt)))
 )
;;---------------------------------------------
 (setq tapdoituong (ssget)
sodt  (sslength tapdoituong)
index  0
ta  (chr 8)
stxoa  (strcat ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta)
stxuly  "Xu ly duoc: "
ptcu  nil
 )
 (repeat sodt
(setq
  ssdt  (ssname tapdoituong index)
  pt (* (/ (* index 1.0) sodt) 100.0)
  index (1+ index)
)
(if (/= pt ptcu)
  (progn
(princ (strcat stxoa stxuly (rtos pt 2 0) "%"))
(setq ptcu pt)
  )
)
(if (or (= (tendoituong ssdt) "SPLINE")
 (= (tendoituong ssdt) "LINE") 
 (= (tendoituong ssdt) "CIRCLE")
 (= (tendoituong ssdt) "ARC")
 (= (tendoituong ssdt) "POLYLINE")
 (= (tendoituong ssdt) "ELLIPSE")
 (= (tendoituong ssdt) "TEXT")
 (= (tendoituong ssdt) "DIMENSION")
  (= (tendoituong ssdt) "ATTDEF")
 (= (tendoituong ssdt) "SOLID")
 (= (tendoituong ssdt) "INSERT")
 (= (tendoituong ssdt) "ATTRIB")
 (= (tendoituong ssdt) "HATCH")
)
  (progn
(setq thongtin (entget ssdt)
thongtin (suadinh thongtin)
)
(entmod thongtin)
  )
)
(if (= (tendoituong ssdt) "LWPOLYLINE")
  (progn
 (setq thongtin (entget ssdt)
thongtin (suadinhPL thongtin)   
)
(entmod thongtin)
  )
)
(princ)
 )
)

 

- Trường hợp đối tượng (ent) là đường LWPOLYLINE: đưa giá trị Z về 0 thì đổi (assoc 38 ent) về (38 . 0), nhưng sao mình xem (entget ent) không thấy nó đâu nhỉ.

- Còn các trường hợp còn lại:

(foreach doituong thongtin

(if (and (>= (car doituong) 10)

(<= (car doituong) 36)

)

có phải là tên các đối tượng sau không:

 

(if (or (= (tendoituong ssdt) "SPLINE")

(= (tendoituong ssdt) "LINE")

(= (tendoituong ssdt) "CIRCLE")

(= (tendoituong ssdt) "ARC")

(= (tendoituong ssdt) "POLYLINE")

(= (tendoituong ssdt) "ELLIPSE")

(= (tendoituong ssdt) "TEXT")

(= (tendoituong ssdt) "DIMENSION")

(= (tendoituong ssdt) "ATTDEF")

(= (tendoituong ssdt) "SOLID")

(= (tendoituong ssdt) "INSERT")

(= (tendoituong ssdt) "ATTRIB")

(= (tendoituong ssdt) "HATCH")

)

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). Lwpolyline có dxf 38. Bạn xem lại. Trường hợp khác thì bạn post bản vẽ lên xem nhé.

2). Đúng như bạn hỏi. Hàm (tendoituong ssdt) lấy kiểu đối tượng (LINE, ARC, HATCH...).

  • 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

1). Lwpolyline có dxf 38. Bạn xem lại. Trường hợp khác thì bạn post bản vẽ lên xem nhé.

2). Đúng như bạn hỏi. Hàm (tendoituong ssdt) lấy kiểu đối tượng (LINE, ARC, HATCH...).

Bạn có thể giải thích cho mình cái hàm con "suadinh" vớ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

Hàm này nhiều khả năng do bác Duy viết. Vậy, bác Duy đang online thì nhờ trả lời giùm cho nhanh vậy.

Về thuật toán thì mình đọc thấy cũng hiểu được, nhưng ý tưởng của nó thì chịu. Đành nhờ đích danh bác Duy nhà ta giải thích giùm vớ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

Thuần lisp cũng không sáng sủa gì Ket ạ. Nó vẫn Hecxa.

VD:

(setq PW (open "D:\\a.csv" "w"))

(princ (cdr (assoc 1 a)) PW)

(close PW)

Trong đó: a lấy được từ block_att: '((...) (1. "MẶT BẰNG") (...))

@bac Hạ : bác tìm hàm ghi file Unicode trong 4room mục Đố vui với lisp (phần bác đố khi load lisp bằng mà Unicode chứ k phải Ansi) xem có còn k, có lẽ là áp dụng được, còn không thì cái này sửa bên Excel cũng đơn giản quá 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

@bac Hạ : bác tìm hàm ghi file Unicode trong 4room mục Đố vui với lisp (phần bác đố khi load lisp bằng mà Unicode chứ k phải Ansi) xem có còn k, có lẽ là áp dụng được, còn không thì cái này sửa bên Excel cũng đơn giản quá mà ^^

1). Hôm qua có xem rồi, file còn đây, nhưng nghĩ là không được nên dừng. Nay Ket nhắc thì chắc phải xem xét lại.

2). Chuyển bên excel đơn giản ư? Sao bác không nghĩ ra lối nhỏ nào cả. Két chỉ giùm xem.

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 có thể giải thích cho mình cái hàm con "suadinh" với!

Xem qua thì thấy hàm này bác OP viết dài và rườm rà quá, có lẽ viết từ lâu rồi ^^

Hàm sửa đỉnh có chức năng chuyển tất cả cao độ thành 0.0

 

Bạn nên biết là mã dxf từ 10 -> 39 có kiểu là 3D point, tức là tọa độ

 

 

 

;Hàm sửa đỉnh, đối số là entity data (thong tin)

(defun suadinh (thongtin / index doituong doituongmoi toado)

;Khởi tạo biến thông tin mới là 1 list trống

(setq thongtinmoi nil)

;Duyệt qua từng sub-list của entity data (cái mà bạn dùng entget để lấy)

(foreach doituong thongtin

;Nếu mã dxf <= 10 <= 36 thì ...

(if (and (>= (car doituong) 10)

(<= (car doituong) 36)

)

;thay giá trị thứ 3 của mã Dxf này bằng giá trị 0.0 (tọa độ 3D thì cái thứ 3 là cao độ Z)

(setq doituongmoi

(list (car doituong) ;Dxf

(cadr doituong) ;X

(caddr doituong) ;Y

0.0 ;Z

)

)

;Nếu không thì giữ nguyên

(setq doituongmoi doituong)

)

;Thông tin của đối tượng mới sẽ bằng thông tin của các mã dxf không thuộc 10-36 + thông tin đã sửa

(setq thongtinmoi (append thongtinmoi (list doituongmoi)))

)

;Gọi lại giá trị

(setq thongtinmoi thongtinmoi)

)

  • 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

1). Hôm qua có xem rồi, file còn đây, nhưng nghĩ là không được nên dừng. Nay Ket nhắc thì chắc phải xem xét lại.

2). Chuyển bên excel đơn giản ư? Sao bác không nghĩ ra lối nhỏ nào cả. Két chỉ giùm xem.

Marco replace thôi bác ơi , code viết cũng như cái lisp bác đã viết thô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

Hàm này nhiều khả năng do bác Duy viết. Vậy, bác Duy đang online thì nhờ trả lời giùm cho nhanh vậy.

Cái ve0 này chính xác là của bác Hoành viết thời sinh viên chứ không phải mình.

  • 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

Mình cũng nhớ mơ màng là của bác Hoành, vì trong đó có phần đếm %, nhưng mà được bác Duy trả lời cũng OK. Cuối cùng thì "like this" cho Ketxu, hơi lòng vòng tý thế mà hay!

Trở lại vấn đề mình hỏi.

Nếu là Lwpolyline thì tọa độ Z được lưu là (38 . z) đơn giản hơn các trường hợp khác phải là (DXF x y z) phải không ketxu?

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

Đúng rồi. Bạn có thể tìm 1 lisp quick flatten ketxu post lên lâu lâu rồi, cơ chế sẽ đơn giản hơn chỉnh sửa dxf này 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

Tiếp theo câu hỏi ở bài #1325:

Tôi vừa tìm được đoạn VBScript hướng dẫn cách read/write 1 file. Tôi đã có thể đọc 1 file unicode này, sau đó lấy số liệu đó để ghi ra 1 file unicode khác bằng lisp rồi. Nhưng chưa thể ghi 1 đoạn unicode (được lấy từ Block_Att hay Text trên bản vẽ chẳng hạn) ra 1 file unicode được. Bác nào biết VB, có thể giúp tôi chuyển từ VB qua LSP như link này hướng dẫn không? Thanks!

http://msdn.microsof...12a5kbt(v=vs.85).aspx

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 trích xuất values của block attributes, viết bằng tiếng Việt Unicode, nhưng:

- Khi xuất ra trên cad thì nó vẫn ra tiếng Việt như đã ghi trong values (VD: "MẶT BẰNG").

- Còn khi xuất ra file (xls, csv) thì nó chuyển thành unicode hexa (VD: "M\U+1EB6T B\U+1EB0NG"). Ai biết cách để nó vẫn giữ nguyên tiếng Việt mà không đổi qua hecxa xin chỉ giùm. Thanks!

P/S: hình như bác Gia_bach rành cái này. Mà vừa test thử "Exblk.vlx" (phiên bản mới nhất) của bác cũng bị như vậy.

 

...

Nhưng chưa thể ghi 1 đoạn unicode (được lấy từ Block_Att hay Text trên bản vẽ chẳng hạn) ra 1 file unicode được. Bác nào biết VB, có thể giúp tôi chuyển từ VB qua LSP như link này hướng dẫn không? Thanks!

http://msdn.microsof...12a5kbt(v=vs.85).aspx

Vấn đề do LISP hỗ trợ bảng mã UNICODE rất kém.

Không biết các phiên bản Cad đời mới có tốt hơn không ?!

...

2). Chuyển bên excel đơn giản ư? Sao bác không nghĩ ra lối nhỏ nào cả. Két chỉ giùm xem.

Tham khảo cách của Hoành : http://www.cadviet.c...ndpost&p=101241

  • 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

Bác thử cái scripting Wsh convert bên VBA bác vừa request xem sao, ketxu chưa test, hy vọng là được ^^

(defun t2f (f lst / o) ;lst : list data
(if (setq f (findfile f))
(progn (setq
o (vlax-invoke
(vlax-invoke
 	(vlax-create-object "Scripting.FileSystemObject")
 	"GetFile" f)
 	"OpenAsTextStream" 2 -1)
)
(foreach line lst (vlax-invoke o "WriteLine" line))
(vlax-invoke o "Close")
(vlax-release-object o)          
)))

  • 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

Bó tay Ket ơi! Mất 2 ngày ròng nhưng đành chịu. Lisp của Ket cũng chỉ ra dạng Hecxa thôi.

Ghi 1 file Unicode sang 1 file Unicode khác thì làm được.

Nhưng ghi 1 dòng Unicode lấy ra từ đối tượng cad (Text, Att,...) sang file thì vẫn là Hecxa thôi. Dù sao cũng thank Ket.

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ác dùng chính xác Autolisp và hàm trên chưa ạ ? Hay vẫn VL ? Hoặc có thể đó là cách AutoCAD lưu dữ liệu vào clipboard 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ám ơn Ket vẫn đau đáu chủ đề này. Bác đã làm lisp như sau (trong đó block_att có những att viết bằng Vietnamse Unicode), và chỉ chọn 1 att trong block:

(defun C:HA(/ lst)
(setq lst (cons (cdr (assoc 1 (entget (car (nentsel))))) lst))
(t2f "D:\\HA.txt" lst))
(defun t2f (f lst / o) ;lst : list data
(if (setq f (findfile f))
 (progn
  (setq o (vlax-invoke (vlax-invoke (vlax-create-object "Scripting.FileSystemObject") "GetFile" f) "OpenAsTextStream" 2 0))
  (foreach line lst
   (vlax-invoke o "WriteLine" line))
  (vlax-invoke o "Close")
  (vlax-release-object 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

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


×