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ị

File ACADTAM.LIN của bạn phải nằm trong Support file Search Path

 

Command: cn

Chon doi tuong can chuyen sang kieu net khac :

Select objects: Specify opposite corner: 1 found

 

Select objects:

Bosong: < ByLayer > : bosong

...

....

Hy vọng bạn làm được

Mình vẩn không tạo nét được khi đã làm hết các yêu cầu theo bạn hướng dẫn.

Nhờ bạn giúp

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 vẩn không tạo nét được khi đã làm hết các yêu cầu theo bạn hướng dẫn.

Nhờ bạn giúp

Khaosat làm lại lần nữa thử xem :

Giải nén file này :

http://www.cadviet.com/upfiles/3/support.rar

Copy file ACADTAM.LIN vào Support file Search Path của CAD

Các đường dẫn của Support file Search Path ở đây :

support.jpg

Apload file cn.lsp -> gõ lệnh cn để bắt đầu

 

Chạy xong -> Xem đường của đối tượng đã đổi chưa? Xem lại tỉ lệ Ltscale đã hợp lý chưa?

Đường đã hiển thị chưa?

 

Chúc thành công :iluvyousmiley:

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
Khaosat làm lại lần nữa thử xem :

Giải nén file này :

http://www.cadviet.com/upfiles/3/support.rar

Copy file ACADTAM.LIN vào Support file Search Path của CAD

Các đường dẫn của Support file Search Path ở đây :

support.jpg

Apload file cn.lsp -> gõ lệnh cn để bắt đầu

 

Chạy xong -> Xem đường của đối tượng đã đổi chưa? Xem lại tỉ lệ Ltscale đã hợp lý chưa?

Đường đã hiển thị chưa?

 

Chúc thành công :iluvyousmiley:

Mình làm được rồi Bạn ơi, Cám ơn nha.

ĐƯỜNG NÉT THƯA QUÁ, Nhưng mà mình cảm thấy mởi lần chuyển nét thì phải đánh lệnh dài thế sao bạn, có cách nào khác cho nó tắt được không ?

Mình làm thế này và có kí hiệu tắt như "" Lien Khuat Truc Gach Vien Ao Cham CCham CGach Bosong ""

Mong được bạn hướng dẫ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

Mọi người mình hỏi là về khả năng làm việc với file txt của Lisp :

Nếu có 1 file ghi số liệu ví dụ như sau :

1

2

3

4

Mình có thể ghi thêm vào để có file kết quả kiểu như :

1 a

2 b

3 c

4 d....

ko nhỉ?

;------------------------------------------------------------------------

He, tiện thể hỏi mọi người luôn về vấn đề này nữa :

Mình dùng một lisp tính diện tích có bản chất nằm ở lệnh Boudary, nhưng có hai lỗi gặp phải :

1- Khi pick 1 điểm trong vùng thì không thấy xuất hiện đường bao và diện tích đo được ko chính xác

2- Pick chọn nhầm đường bao mong muốn

Các cao thủ giải thích nguyên nhân hộ mình 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
Mọi người mình hỏi là về khả năng làm việc với file txt của Lisp :

Nếu có 1 file ghi số liệu ví dụ như sau :

1

2

3

4

Mình có thể ghi thêm vào để có file kết quả kiểu như :

1 a

2 b

3 c

4 d....

ko nhỉ?

;------------------------------------------------------------------------

Tue_NV rất bận nên đưa ra gợi ý. Bạn tự hoàn thành

1-> Mở file .txt -> sử dụng hàm open

2-> Dùng hàm readline để đọc từng dòng 1. Đọc cho đến khi nào không đọc được nữa thì thôi. Đọc đến dòng cuối cùng là hàm readLine trả về NIL. Qua mỗi dòng nối chuỗi của dòng đó với kí tự tăng dần (a, b, c.....)

3. Sau khi nối chuỗi rồi, đưa nó vào 1 List L duy nhất

4. Dùng hàm Foreach duyệt qua các phần tử trong List L và ghi đè lên file .txt (sử dụng hàm writeline)

5. Đóng file .txt bằng hàm closé

  • 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
Hì, thanks bác TueNV, em cũng chỉ cần thuật toán thôi mà

Mong mọi người giúp đỡ giải đáp thắc mắc còn lại của mình với

Bạn dùng lisp nào up lên đây thì mới xem được chứ.

1. Ý tác giả là tính diện tích chứ không phải tạo boundary nên khi tính diện tích xong thì đã xoá boundary đi rồi.

2. pick chọn nhấm đường bao thì pick chọn lại thôi.

Nói chung là phải xem code thì trả lới mới sát được ý của 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

CODE của nó đây bác ah :

(defun c:dd ( / tmp dtuong ds tam dsach)

(setq tong 0.00)

(while (setq a (getpoint "\nKich mot diem trong khu vuc: "))

(command "boundary" a "")

(command "area" "o" (entlast) )

(setq temp (getvar "area"))

(setq tong (+ tong temp))

)

(setq dtuong (car (entsel))

ds (entget dtuong))

(setq tong (rtos (/ tong ) 2 2))

(princ (strcat "\nDien tich la: " tong " m2"))

(foreach tam ds

(if (/= (car tam) 1)

(setq dsach (append dsach (list tam)))

 

(setq dsach (append dsach (list (cons 1 tong))))

)

)

(entmake dsach)

(entdel dtuong)

(princ)

);defun

;--------------------------------------------------------

Nói chung là ok, chỉ thi thoảng mới gặp phải kiểu 1 ; pick mà ko xuất hiện đường bao do lệnh Boudary tạo ra, nên có khi pick đi pick lại 1 vùng(nếu ko nhầm đã lỗi thì cái phần diện tích ấy cũng ko đúng)

Trường hợp thứ 2 là kiểu 1 vùng giao giữa các đường, chắc chắn là vùng kín, nhưng pick xong thì đường bao tạo ra lại bao ra cả các phần bên ngoài

_________________

PS : Có sử dụng được hàm foreach để duyệt danh sách ename do hàm ssget thu được ko 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
_________________

PS : Có sử dụng được hàm foreach để duyệt danh sách ename do hàm ssget thu được ko nhỉ ?

Hề hề hề,

Câu trả lời là không Bạn à. Hàm ssget trả về một bộ chọn gồm các ename của các đối tượng chọn chứ không phải là một list các ename. Do vậy hàm foreach không có tác dụng với bộ chọn này. Nếu có tình dùng bạn sẽ có câu trả lời là bad argument.

Nếu bạn muốn sử dụng hàm foreach thì bạn có thể tạo một danh sách các ename này nhờ hàm: (acet-ss-to-list (ssget)) bạn ạ. Hoặc bạn có thể tự tạo một list mới nhờ một vòng lặp while chẳng hạn.....

Chúc bạn vui và thành công.

  • 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
He, tiện thể hỏi mọi người luôn về vấn đề này nữa :

Mình dùng một lisp tính diện tích có bản chất nằm ở lệnh Boudary, nhưng có hai lỗi gặp phải :

1- Khi pick 1 điểm trong vùng thì không thấy xuất hiện đường bao và diện tích đo được ko chính xác

2- Pick chọn nhầm đường bao mong muốn

Các cao thủ giải thích nguyên nhân hộ mình với. Thanks

Vấn đề lối của bạn là do không tạo được boundary do đường bao vẽ bằng spline... mà nó tạo thành region. Mình sửa lisp cho bạn không bị lỗi trường hợp đó rồi. Code đây. Mình có sửa thêm tí chút mong tác giả bỏ qua cho.

(defun c:dd ( / tmp dtuong ds tam dsach) 
(setq tong 0.00)
(while (setq a (getpoint "\nKich mot diem trong khu vuc: "))
(command "boundary" a ""
 (if (/= (getvar "cmdactive") 0)
  (command "y")
  )
   )
 (setq el1 (entlast))
 (if (/= (cdr (assoc 0 (entget el1))) "REGION")
(command "region" el1 "")
   )
 (setq ob1 (vlax-ename->vla-object (setq el2 (entlast))))
(setq temp (vla-get-area ob1))
 (setq dchen (vlax-safearray->list (vlax-variant-value (vla-get-Centroid ob1))))
 (command "text" "j" "mc" dchen "" "" (strcat (rtos (/ temp 1000000.000) 2 3) " m2") "")
(setq tong (+ tong temp))
 (entdel el2)
)
(setq p  (getpoint "\nDiem chen ket qua"))
(setq tong (rtos (/ tong 1000000.000) 2 3))
(command "text" "j" "mc" p "" "" (strcat tong " m2") "")
(princ)
)

  • 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
Nói chung là ok, chỉ thi thoảng mới gặp phải kiểu 1 ; pick mà ko xuất hiện đường bao do lệnh Boudary tạo ra, nên có khi pick đi pick lại 1 vùng(nếu ko nhầm đã lỗi thì cái phần diện tích ấy cũng ko đúng)

Trường hợp thứ 2 là kiểu 1 vùng giao giữa các đường, chắc chắn là vùng kín, nhưng pick xong thì đường bao tạo ra lại bao ra cả các phần bên ngoài

Cái này là một lỗi cực kỳ khó hiểu của lệnh Boudary. Mình gặp trường hợp này khá nhiều rồi. nhất là khi bo diện tích trắc ngang của nova. Không đơn giản là do miền kín đc tạo bởi Spline như phamngoctu nói ở trên đâu. Các đối tượng được tạo ra trên trắc ngang nova hoàn toàn là 2D polyline và line nhưng vẫn cứ bị lỗi này như thường (thỉnh thoảng mới dính thôi nhé :D )

Gặp trường hợp này thì chỉ có cách là dùng lệnh fatten cho các đối tượng bao miền kín đó rồi bo lại là đc. Trong 1 vài trường hợp mình tắt 1 vài layer không liên quan cũng thấy có hiệu quả. Cực kỳ khó hiểu :iluvyousmiley:

  • 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

Thấy vấn đề của mình được mọi người quan tâm, vui quá đi mất

@phamthanhbinh: Hehe, em thích duyệt các phần tử bằng foreach hơn, thế là lại biết thêm lệnh acet-ss-to-list ^^, em đã có file acet-util nhưng mà thấy ko đầy đủ các lệnh, bác có chỉ cho em có thể tham khảo cú pháp các hàm acet ở đâu được với, search trên mạng được 1 file excel khoảng vài trăm lệnh acet- nhưng mà ko biết cú pháp nên chưa mò mẫm dùng thử được bác ah

@phamngoctukst: Ý của bác Thaistreetz hoàn toàn đúng với những gì em đang thắc mắc đấy

@Thaistreetz : Hì, em cũng dùng cái này để tính diện tích trên mấy cái trắc ngang, thỉnh thoảng gặp thấy lỗi này hơi khó chịu, chưa nhìn thấy cái lệnh fatten của bác bao h cả, để em check lại phát. Thanks cả 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

Hì, hỏi mọi người nhiều quá, bắt đầu thấy ngại ngại rồi, nhưng mà dốt thì vẫn cứ phải hỏi thui, các bác ngó xem cái lisp của e sai ở đâu với :

(Defun c:VG()

(Vl-load-com)

(Setq Pl (Car(Entsel"\n Chon Pline :"))

Point (Getpoint"\n Chon diem :")

Pl (vlax-ename->vla-object Pl)

Param (Vlax-curve-getparamatpoint Pl Point)

Diem1 (Vlax-curve-getpointatparam Pl (Fix Param))

Diem2 (Vlax-curve-getpointatparam Pl (1+(Fix Param)))

Ang (+ 90(Cvunit(Angle Diem1 Diem2) "RADIANS" "DEGREES"))

Ang2 (- 180 Ang))

(Command "LINE" point(Polar Point Ang 100) "")

(Command "LINE" Point(Polar Point Ang2 50) "")

(Princ))

;------------------------------------------------------------

Nội dụng của nó là vẽ vuông góc với pline về 2 phía, 1 phía 100, 1 phía 50, cái 100 đúng còn cái 50 thì lệch, ko vuông góc với pline , chả hiểu tại sao các bác ah (check qua vài trường hợp về cái Ang2 rùi vẫn sai :iluvyousmiley:(

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ì, hỏi mọi người nhiều quá, bắt đầu thấy ngại ngại rồi, nhưng mà dốt thì vẫn cứ phải hỏi thui, các bác ngó xem cái lisp của e sai ở đâu với :

(Defun c:VG()

(Vl-load-com)

(Setq Pl (Car(Entsel"\n Chon Pline :"))

Point (Getpoint"\n Chon diem :")

Pl (vlax-ename->vla-object Pl)

Param (Vlax-curve-getparamatpoint Pl Point)

Diem1 (Vlax-curve-getpointatparam Pl (Fix Param))

Diem2 (Vlax-curve-getpointatparam Pl (1+(Fix Param)))

Ang (+ 90(Cvunit(Angle Diem1 Diem2) "RADIANS" "DEGREES"))

Ang2 (- 180 Ang))

(Command "LINE" point(Polar Point Ang 100) "")

(Command "LINE" Point(Polar Point Ang2 50) "")

(Princ))

;------------------------------------------------------------

Nội dụng của nó là vẽ vuông góc với pline về 2 phía, 1 phía 100, 1 phía 50, cái 100 đúng còn cái 50 thì lệch, ko vuông góc với pline , chả hiểu tại sao các bác ah (check qua vài trường hợp về cái Ang2 rùi vẫn sai :iluvyousmiley:(

Bạn sai 2 dòng này

(Command "LINE" point(Polar Point Ang 100) "")

(Command "LINE" Point(Polar Point Ang2 50) "")

hàm polar dùng góc radian không phải là degrees.

Bạn thử cái này xem

(Defun c:VG()
(Vl-load-com)
(Setq Pl (Car(Entsel"\n Chon Pline :"))
Point (Getpoint"\n Chon diem :")
Pl (acet-geom-vertex-list Pl)
Diem1 (car pl)
Diem2 (cadr pl)
Ang (+ (Angle Diem1 Diem2) (/ pi 2))
  )
(Command "LINE" point (Polar Point Ang 100) "")
(Command "LINE" Point (Polar Point (+ Ang pi) 50) "")
(Princ))

  • 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
hàm polar dùng góc radian không phải là degrees.

Tất cả các hàm lisp dùng góc đơn vị là radian, Còn các lệnh trong cad thì dùng đơn vị Degrees

  • 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
Tất cả các hàm lisp dùng góc đơn vị là radian, Còn các lệnh trong cad thì dùng đơn vị Degrees

Sao bạn "vơ đũa cả nắm" thế? Tội lắm :iluvyousmiley:

Hàm cvunit có sử dụng đơn vị Degrees cơ mà?

(CVUNIT 45 "DEGREES" "RADIAN")

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

@Tue_NV : Ui trời, chính xác là dùng Radian thật, em vừa chỉnh, chuẩn như ý luôn ^^

@ThaiStreetz : He, bác đá qua nói có 1 lời mà đụng đúng vấn đề em đang lơ mơ rồi đấy

;--------------------------------------------------------------------------------------------------

Lệnh INSERT có scale mà sao em check mã DXF của đối tượng Block insert chưa thấy 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ệnh INSERT có scale mà sao em check mã DXF của đối tượng Block insert chưa thấy nhỉ

DXF 41, 42, 43 tương ứng với Scale X, Y, Z

  • 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

Em muốn tạo file chứa Block E-CSB để thực hiện đoạn lisp này thì làm thế nào ah :

(Entmake (List(cons 0 "INSERT")(cons 2 "E-CSB")(cons 10 p51)))

;-------------------------------------------------------------------------

Với Trong bản vẽ có dimstyle với độ chính xác là 2 chữ số sau dấu phẩy (precision?) giờ em muốn chỉnh một số đối tượng lẻ về độ chính xác là 4 chữ số sau dấu phẩy, chỉnh sửa các thứ liên quan đến dimension là khá phức tạp phải ko ah?

;Edit: Đã tự trả lời được câu hỏi thứ nhất, tạo block nhét vào 1 file xong copy vào folder support của cad, đúng ko ah

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
Em muốn tạo file chứa Block E-CSB để thực hiện đoạn lisp này thì làm thế nào ah :

(Entmake (List(cons 0 "INSERT")(cons 2 "E-CSB")(cons 10 p51)))

;-------------------------------------------------------------------------

Với Trong bản vẽ có dimstyle với độ chính xác là 2 chữ số sau dấu phẩy (precision?) giờ em muốn chỉnh một số đối tượng lẻ về độ chính xác là 4 chữ số sau dấu phẩy, chỉnh sửa các thứ liên quan đến dimension là khá phức tạp phải ko ah?

Hề hề hề,

1/- Cái vụ này bạn dùng hàm entmake nghe chừng khó ổn vì block được tạo phải có các đồi tượng tạo nên nó, mà các đối tượng này lại không nằm trực tiếp trong mã dxf của block. Để đạt tới các đối tượng bên trong block phải sử dụng hàm entnext hay nentsel.....

Trên diễn đàn hình như cũng đã có lisp để tạo các block từ các đối tượng có trên bản vẽ, bạn chịu khó tìm kiếm để tham khảo nhé.

2/- Quả là chơi với thằng dimension hơi khó chịu. Nếu chỉ chỉnh sửa một vài thằng thì bạn có thể dùng modify text hoặc cũng có thể dùng lisp. Còn nếu chỉnh sửa hàng loạt thì nên chỉnh sửa dimstyle hay chỉnh biến hệ thống Dimdec.....

Hề hề hề,...

  • 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

Thanks bác phamthanhbinh đã quan tâm, cái của em chính là muốn chỉnh các đối tượng riêng lẻ đấy ah, cụ thể là thế này , Dimstyle với độ chính xác 2 chữ số sau dấu phẩycó sẵn trong bản vẽ rồi, trong lisp em tạo 1 đường đo kích thước mới và muốn nó có độ chính xác là 4 chữ số sau dấu phẩy mà ko làm ảnh hưởng đến các huynh đệ của nó trong cùng 1 Dymstyle đó cơ :iluvyousmiley:

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
Thanks bác phamthanhbinh đã quan tâm, cái của em chính là muốn chỉnh các đối tượng riêng lẻ đấy ah, cụ thể là thế này , Dimstyle với độ chính xác 2 chữ số sau dấu phẩycó sẵn trong bản vẽ rồi, trong lisp em tạo 1 đường đo kích thước mới và muốn nó có độ chính xác là 4 chữ số sau dấu phẩy mà ko làm ảnh hưởng đến các huynh đệ của nó trong cùng 1 Dymstyle đó cơ :iluvyousmiley:

Bạn đã sử dụng lệnh DOV (Dimoverride) chưa?

  • 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
Thanks bác phamthanhbinh đã quan tâm, cái của em chính là muốn chỉnh các đối tượng riêng lẻ đấy ah, cụ thể là thế này , Dimstyle với độ chính xác 2 chữ số sau dấu phẩycó sẵn trong bản vẽ rồi, trong lisp em tạo 1 đường đo kích thước mới và muốn nó có độ chính xác là 4 chữ số sau dấu phẩy mà ko làm ảnh hưởng đến các huynh đệ của nó trong cùng 1 Dymstyle đó cơ :iluvyousmiley:

Đừng nghĩ cao xa quá, rằng phải tìm hiểu DXF này nọ.... Hãy suy nghĩ như một CAD User bình thường, câu trả lời sẽ đơn giản đến bất ngờ:

(defun C:D4() (command "dimoverride" "dimdec" 4 "" (ssget) ""))

  • Vote tăng 3

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 các bác rất nhiều , thật xấu hổ là em chưa biết cái lệnh DIMOVERRIDE, chẹp, dốt nát

Em đã chỉnh theo đoạn code của bác ssg, kết quả là hoàn toàn đúng theo mong muố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

Các bác ơi giờ muốn đóng gói đống lisp với menu và DCL thành một file cài đặt (ko biết diễn đạt đúng ko?) thì làm thế nào được ah. Em thấy nhìn cho nó có vẻ Pro hơn thôi ah

ah, mà cái phần viết DCL của Visual lisp Editor của Cad nó ko tự căn chỉnh như khi viết Lisp phải ko ah?

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


×