Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

Viết Lisp theo yêu cầu

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

xaydung    12
Lệnh là L2C (line to cylinder)

(defun c:l2c ()
 (defun cyl (ent / tt)
   (setq
     tt (entget ent)
     p1 (trans (cdr (assoc 10 tt)) 0 1)
     p2 (trans (cdr (assoc 11 tt)) 0 1)
   )
   (command ".CYLINDER" p1 r "a" p2)
 )

 (setq	ss    (ssget '((0 . "LINE")))
r     (getdist "\nBan kinh Cylinder: ")
oldos (getvar "osmode")
 )
 (setvar "osmode" 0)
 (sudung cyl ss)
 (setvar "osmode" oldos)
 (princ)
)

(defun sudung (ham ss / sodt index entdt soapp)
 (setq	sodt  (cond
	(ss (sslength ss))
	(t 0)
      )
soapp 0
index 0
 )
 (repeat sodt
   (setq entdt	(ssname ss index)
  index	(1+ index)
   )
   (if	(ham entdt)
     (setq soapp (1+ soapp))
   )
 )
 soapp
)

Bị lỗi 1 chút anh à, anh xem lại giúp em:

Nếu em nhập số thì báo lỗi :

Ban kinh Cylinder: 5

; error: no function definition: SUDUNG

Nếu em nhập 2 điểm trên màn hình thì báo lỗi :

 

Select objects: 1 found

Select objects:

Ban kinh Cylinder: Specify second point: ; error: no function definition:

SUDUNG

Và khi appload lệnh thì chưa gõ l2c nó đã vào lệnh luôn rồi!! Mong bác giúp em

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
Nguyen Hoanh    4.524
Bị lỗi 1 chút anh à, anh xem lại giúp em:

Nếu em nhập số thì báo lỗi :

Ban kinh Cylinder: 5

; error: no function definition: SUDUNG

Nếu em nhập 2 điểm trên màn hình thì báo lỗi :

 

Select objects: 1 found

Select objects:

Ban kinh Cylinder: Specify second point: ; error: no function definition:

SUDUNG

Và khi appload lệnh thì chưa gõ l2c nó đã vào lệnh luôn rồi!! Mong bác giúp em

Đoạn lisp trên không có gì sai cả.

Lỗi trên do bạn copy thiếu dấu ngoặc, hãy copy lại.

Hãy làm thật thận trọng trong việc copy, nếu xảy ra lỗi hãy kiểm tra thật kỹ lưỡng.

Bởi vì lisp chạy được thì tôi mới post lê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
xaydung    12
Đoạn lisp trên không có gì sai cả.

Lỗi trên do bạn copy thiếu dấu ngoặc, hãy copy lại.

Hãy làm thật thận trọng trong việc copy, nếu xảy ra lỗi hãy kiểm tra thật kỹ lưỡng.

Bởi vì lisp chạy được thì tôi mới post lên.

À, được rồi. Rất cám ơn anh Hoành đã giúp, em đang cần 1 lisp nữa nội dung cũng gần tương tự với lisp trên

chỉ khác đối tượng chọn không phải là line nữa mà là 1 arc (hoặc nhiều arc)

Bình thường em phải vẽ 1 circle rồi extrude theo đường path là arc rất mất thời gian,

Mong bác giúp em cái này nữa nha, 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

Chào năm mới !

Chào Cadviet !

Chào các bác !

Em vừa mới gia nhập vào và có một vài vấn đề xin các bác giúp cho :

1-Muốn tạo lisp để gán biến hệ thống "BLOCKEDITLOCK" và biến "DBLCLKEDIT" vào bản vẽ và có thể chỉnh lại thông qua biến đó (luôn đi kèm theo bản vẽ đó dù ở mọi máy ), và không cho phép những đối tượng là block được kiết xuất ra khỏi bản vẽ đó bằng các lệnh như :Ctrl+C,Ctrl+X,Write block,...

2-Khi người khác sử dụng các phương thức ánh xạ bên ngoài vào như XREF thì được nhưng không cho "bind",edit nó.

Nói tóm lại là "nội bất xuất,ngoại có nhập"

Xin 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
Nguyen Hoanh    4.524
Chào năm mới !

Chào Cadviet !

Chào các bác !

Em vừa mới gia nhập vào và có một vài vấn đề xin các bác giúp cho :

1-Muốn tạo lisp để gán biến hệ thống "BLOCKEDITLOCK" và biến "DBLCLKEDIT" vào bản vẽ và có thể chỉnh lại thông qua biến đó (luôn đi kèm theo bản vẽ đó dù ở mọi máy ), và không cho phép những đối tượng là block được kiết xuất ra khỏi bản vẽ đó bằng các lệnh như :Ctrl+C,Ctrl+X,Write block,...

2-Khi người khác sử dụng các phương thức ánh xạ bên ngoài vào như XREF thì được nhưng không cho "bind",edit nó.

Nói tóm lại là "nội bất xuất,ngoại có nhập"

Xin càm ơn !

Lisp không làm được bạn ạ!

 

Nếu được thì đã có chương trình khóa bản vẽ theo dạng này!

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ào bác Nguyen Hoanh !

 

Cám ơn bác đã cho biết, vậy em phải dùng theo cách của bác "thoclep" trên diễn đàn thôi, chỉ còn cái XREF không được là khiến em thật khó xử thôi. Nhân tiện nhờ bác xem thử có chỉnh sửa gì được trong lisp ấy để có thể dùng Xref đươc không !

 

Xin cảm ơn bác rất nhiểu, bác thật là nhiệt tì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
anhducna    0

Tôi muốn nhờ mọi người viết lisp này với

công việc của nó là đổi vị trí 2 đối tượng cho nhau, đối tượng ở đây có thể là text, hoặc hình 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
Nguyen Hoanh    4.524
Tôi muốn nhờ mọi người viết lisp này với

công việc của nó là đổi vị trí 2 đối tượng cho nhau, đối tượng ở đây có thể là text, hoặc hình vẽ.

 

Text thì dễ hiểu rồi.

 

Bạn muốn đổi chỗ hình vuông cho hình tròn như thế nà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
pooh_21    0

Khi vẽ đường dốc, mình toàn mất công lấy chiều cao chia cho chiều dài để biết được nó là nghiêng bao nhiêu %. Mình muốn xin một lisp thực hiện việc đó.

- Khi chạy lisp -----> chọn đối tượng (đường line, hoặc pline) ----->hiện ra một text có ghi độ nghiên theo phần trăm của đối tượng đó.

Cảm ơn các bạ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
anhducna    0
Text thì dễ hiểu rồi.

 

Bạn muốn đổi chỗ hình vuông cho hình tròn như thế nào?

à, với các hình đơn giản mình có thể dùng trọng tâm của nó để thay đổi vị trí. còn với các hình phức tạp có thể thay đổi bằng cách pick điểm trên màn hình.

hoặc nếu phức tạp chỉ thay đổi text cũng đượ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
Nguyen Hoanh    4.524
à, với các hình đơn giản mình có thể dùng trọng tâm của nó để thay đổi vị trí. còn với các hình phức tạp có thể thay đổi bằng cách pick điểm trên màn hình.

hoặc nếu phức tạp chỉ thay đổi text cũng được!

Vấn đề phức tạp.

Nếu chỉ là text thì lệnh CT dưới đây sẽ đáp ứng điều bạn cần:

(defun c:ct( / e1 e2 a1 a2)
 (setq e1 (car (entsel "\nDoi tuong 1: ")))
 (redraw e1 3)
 (setq  e2 (car (entsel "\nDoi tuong 2: ")))
 (redraw e1 4)
 (setq
   a1 (assoc 10 (entget e1))
   a2 (assoc 10 (entget e2))
 )
 (entmod (subst a2 a1 (entget e1)))
 (entmod (subst a1 a2 (entget e2)))  
)

  • 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
Nguyen Hoanh    4.524
Khi vẽ đường dốc, mình toàn mất công lấy chiều cao chia cho chiều dài để biết được nó là nghiêng bao nhiêu %. Mình muốn xin một lisp thực hiện việc đó.

- Khi chạy lisp -----> chọn đối tượng (đường line, hoặc pline) ----->hiện ra một text có ghi độ nghiên theo phần trăm của đối tượng đó.

Cảm ơn các bạn nhiều.

Pline thì hơi phức tạp.

 

Nếu là line thì lệnh XD (xác định dốc) dưới đây sẽ giúp bạn:

 

(defun c:xd ()
 (setq	sel (entsel "\nPick vao line can xac dinh doc: ")
tt  (entget (car sel))
 )
 (if (= "LINE" (cdr (assoc 0 tt)))
   (progn
     (setq
p  (cadr sel)
p1 (cdr (assoc 10 tt))
p2 (cdr (assoc 11 tt))
dx (- (car p1) (car p2))
dy (- (cadr p1) (cadr p2))
i  (strcat (rtos (* (abs (/ dy dx)) 100.0) 2 2) "%")
     )
     (wtxt i p)
   )
   (alert "Ban phai pick vao line!")
 )
)

(defun wtxt (txt p / sty d h)
 (setq
   sty	(getvar "textstyle")
   d	(tblsearch "style" sty)
   h	(cdr (assoc 40 d))
 )
 (entmake (list (cons 0 "TEXT")
	 (cons 7 sty)
	 (cons 1 txt)
	 (cons 10 p)
	 (if (> h 0)
	   (cons 40 h)
	   (assoc 40 d)
	 )
	 (assoc 41 d)
   )
 )
)

  • 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
Ar_Chanwoo    38

Em muốn hỏi các bác đôi điều :

-Em muốn biết khi ta Load các lisp (load tạm thời 1 bản vẽ và load cho cả các bản vẽ sau ) và khi ta Add 1đường dẫn nào đó ( Trong Support File Search Path) thì các thông số đó sẽ nằm ở đâu? Có thể viết cho em 1 Lisp mà khi ta gõ 1 lệnh nào đó của Lisp thì nó sẽ tạo cho ta các đường dẫn mà ta muốn trong Support File Search Path và load cho ta 1 số File nào đó.Như thế sẽ không phải cứ command : Op->File->Support File Search Path-> Add -> Browse.....

-Em có nhiều File nằm trong 1 Folder.Có thể viết 1 Lisp mà ta có thể Load hết tất cả các File trong Folder đó không(không phải Lisp liệt kê tất cả các File Lisp có trong Folder đó rồi Load đâu)

Cám ơn các 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
ssg    1.088
Em muốn hỏi các bác đôi điều :

-Em muốn biết khi ta Load các lisp (load tạm thời 1 bản vẽ và load cho cả các bản vẽ sau ) và khi ta Add 1đường dẫn nào đó ( Trong Support File Search Path) thì các thông số đó sẽ nằm ở đâu? Có thể viết cho em 1 Lisp mà khi ta gõ 1 lệnh nào đó của Lisp thì nó sẽ tạo cho ta các đường dẫn mà ta muốn trong Support File Search Path và load cho ta 1 số File nào đó.Như thế sẽ không phải cứ command : Op->File->Support File Search Path-> Add -> Browse.....

-Em có nhiều File nằm trong 1 Folder.Có thể viết 1 Lisp mà ta có thể Load hết tất cả các File trong Folder đó không(không phải Lisp liệt kê tất cả các File Lisp có trong Folder đó rồi Load đâu)

Cám ơn các bác!

1) Khi appload bình thường, Acad không lưu thông số nào. Toàn bộ nội dung load nằm trong memory, sẽ không còn vết tích gì khi mở bản vẽ mới, thoát Acad hoặc tắt máy.

 

2) Acad chỉ ghi nhận và lưu thông số khi dùng Startup Suite. Cái này mình chưa tìm, còn Support File Search Path thì ở đây:

(getenv "ACAD") ;;;Chú ý là chữ ACAD phải viết HOA

 

3) Function bổ sung Support File Search Path:

(defun addspath(s);;;Add support file search path. S: string, specify path
(setenv "ACAD" (strcat (getenv "ACAD") ";" s))
)

Use example: (addspath "D:\\MyLisp")

 

4) Acad không chấp nhận kiểu "hàng loạt" (load "\\...\\*.lsp"), bạn phải làm như cái bạn đã đề cập trong dấu ngoặc đơn trên. Bản thân mình cũng làm như vậy và cho thằng acad.lsp autoload luô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
vndesperados    253
-Em có nhiều File nằm trong 1 Folder.Có thể viết 1 Lisp mà ta có thể Load hết tất cả các File trong Folder đó không(không phải Lisp liệt kê tất cả các File Lisp có trong Folder đó rồi Load đâu)

Cám ơn các bác!

 

Đây là một câu hỏi cực kỳ ngớ ngẩn. Bất kỳ khi nào bạn làm một action nào trên một folder thì trước tiên HĐH cũng có thao tác list các file trong folder đó. Vậy nên nếu như có một actio nào dạng như là action ..\\*.LSP thì nó sẽ list file vào memory rồi một thực hiện action trên từng file

  • 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
duy782006    1.374
Em muốn hỏi các bác đôi điều :

-Em muốn biết khi ta Load các lisp (load tạm thời 1 bản vẽ và load cho cả các bản vẽ sau ) và khi ta Add 1đường dẫn nào đó ( Trong Support File Search Path) thì các thông số đó sẽ nằm ở đâu? Có thể viết cho em 1 Lisp mà khi ta gõ 1 lệnh nào đó của Lisp thì nó sẽ tạo cho ta các đường dẫn mà ta muốn trong Support File Search Path và load cho ta 1 số File nào đó.Như thế sẽ không phải cứ command : Op->File->Support File Search Path-> Add -> Browse.....

-Em có nhiều File nằm trong 1 Folder.Có thể viết 1 Lisp mà ta có thể Load hết tất cả các File trong Folder đó không(không phải Lisp liệt kê tất cả các File Lisp có trong Folder đó rồi Load đâu)

Cám ơn các bác!

Cái này có thể giải quyết yêu cầu 1 của bạn. Lưu ý phần màu xanh bạn sử lại theo cái của bạn.

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

 

(Defun C:run ( )

(setq OD (GETENV "ACAD"))

(setq NEW (strcat OD ";E:\\tienich\\dcl;E:\\tienich\\dwg;E:\\tienich\\hdt;E:\\tienich\\tvnd;E:\\tienich\\tvct"))

(setenv "ACAD" NEW)

 

(load"e:/tienich/lenh/thuvienndung")

(load"e:/tienich/lenh/thuvienchitiet")

(load"e:/tienich/lenh/tienichchonht")

(load"e:/tienich/lenh/thongke")

(load"e:/tienich/lenh/tienichdimht")

(load"e:/tienich/lenh/tienichblockht")

 

 

(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
Ar_Chanwoo    38

Cám ơn các Pac.Lisp của mấy bác hướng dẫn đã chạy đc rồi.

Nhân tiên em muốn nhờ các bác viết hộ cho e lisp này :

E có 3 file : 1 file lệnh của cad là acad.pgp và 2 file hatch(acad.pat và acadiso.pat) nằm trong 1 thư mục có đường dẫn đã biết.Khi ta gõ lênh "Loadlenh" của lisp(mà các bác viết cho e)thì cad se hỏi ta 2 lựa chọn :

-Copy file acad.pgp vao thư mục cad để có thể sử dụng nhũng lệnh tắt mà mình đã sửa trong file đó cho những lần sau.

-Nếu chúng ta đã copy vào rồi và giờ chúng ta không muốn dùng nữa thì cad sẽ Remove về nguyên trạng thái ban đầu của file acad.pgp

Cũng tương tự như trên với 2file hatch hki ta gõ lệnh Loadhatch

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
Nguyen Hoanh    4.524
Ah wên!

Anh Hoanh còn nhớ cái lisp ẩn đối tượng theo màu không ?Giờ mình muốn hiện lại các đối tượng đó thì làm sao hả anh?

 

Tên lệnh vẫn như cũ, là VIS

  • 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
ssg    1.088
Cám ơn các Pac.Lisp của mấy bác hướng dẫn đã chạy đc rồi.

Nhân tiên em muốn nhờ các bác viết hộ cho e lisp này :

E có 3 file : 1 file lệnh của cad là acad.pgp và 2 file hatch(acad.pat và acadiso.pat) nằm trong 1 thư mục có đường dẫn đã biết.Khi ta gõ lênh "Loadlenh" của lisp(mà các bác viết cho e)thì cad se hỏi ta 2 lựa chọn :

-Copy file acad.pgp vao thư mục cad để có thể sử dụng nhũng lệnh tắt mà mình đã sửa trong file đó cho những lần sau.

-Nếu chúng ta đã copy vào rồi và giờ chúng ta không muốn dùng nữa thì cad sẽ Remove về nguyên trạng thái ban đầu của file acad.pgp

Cũng tương tự như trên với 2file hatch hki ta gõ lệnh Loadhatch

thanks!!!!!!!

1) Về logic thì thế này:

Thay file A bằng file B?

- Rename A thành A0

- Copy B -> A

 

Trả lại nguyên trạng?

- Delete A

- Rename A0 thành A

 

2) Bạn lật Developer Help - Autolisp Reference - V-functions ra xem. Các họ functions dạng vl-file-xxxx có đủ "đồ chơi" cho các mục đích tương tự như trên. Mỗi function đều có ví dụ mẫu, bạn đọc là hiểu ngay.

 

3) Một ví dụ cụ thể: giả sử bạn có file cấu hình theo ý thích lưu ở D:\acad.pgp

Lệnh MCP thiết lập cấu hình theo ý thích, RCP trả lại nguyên trạng. Bạn đọc comments ở các dòng code sẽ hiểu rõ. Chương trình được lập ở dạng đơn giản nhất để bạn dễ đọc. Ngoài ra, bạn tự đặt thêm các điều kiện để hoàn thiện tiếp chương trình. Ví dụ: nếu không tìm thấy file thì xử lý thế nào?

;;;---------------------------------------------
(defun C:MCP( / fn1 fd1 fb1 fe1 fn0 fn2) ;;;Make Configuration Parameters
(setq
   fn1 (findfile "acad.pgp") ;;;Full file name of acad.pgp
   fd1 (vl-filename-directory fn1) ;;;Directory
   fb1 (vl-filename-base fn1) ;;;Filename base
   fe1 (vl-filename-extension fn1) ;;;Extension
   fn0 (strcat fd1 "\\" fb1 "_bak" fe1) ;;;Backup file
   fn2 "D:\\acad.pgp" ;;;Myfile
)
(vl-file-rename fn1 fn0) ;;;Rename acad.pgp to acad_bak.pgp
(vl-file-copy fn2 fn1) ;;;Copy Myfile to acad.pgp
(alert "Finish!")
)
;;;---------------------------------------------
(defun C:RCP( / fn1 fn0) ;;;Reset Configuration Parameters
(setq
   fn1 (findfile "acad.pgp")
   fn0 (findfile "acad_bak.pgp")
)
(vl-file-delete fn1) ;;;Delete current acad.pgp
(vl-file-rename fn0 fn1) ;;;Reset acad.pgp from backup file
(alert "Finish!")
)
;;;---------------------------------------------

  • 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

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

 

(Defun C:run ( )

(setq OD (GETENV "ACAD"))

(setq NEW (strcat OD ";E:\\tienich\\dcl;E:\\tienich\\dwg;E:\\tienich\\hdt;E:\\tienich\\tvnd;E:\\tienich\\tvct"))

(setenv "ACAD" NEW)

 

(load"e:/tienich/lenh/thuvienndung")

(load"e:/tienich/lenh/thuvienchitiet")

(load"e:/tienich/lenh/tienichchonht")

(load"e:/tienich/lenh/thongke")

(load"e:/tienich/lenh/tienichdimht")

(load"e:/tienich/lenh/tienichblockht")

 

 

(Princ)

)

 

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

 

 

Em không hiểu tại sao khi e dùng lisp này để load các lisp ma e có thì chỉ load đc trong bản vẽ đang dùng, khi mở 1 file mới thì không đc,

Thanks bác SSG đã hướng dẫn e,đoạn lisp đó rất dễ đọ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
ssg    1.088
... Em không hiểu tại sao khi e dùng lisp này để load các lisp ma e có thì chỉ load đc trong bản vẽ đang dùng, khi mở 1 file mới thì không đc ...

Bạn xem ở đây:

http://www.cadviet.com/forum/index.php?sho...;st=0#entry6295

 

Ngoài ra, bạn có thể dùng tính năng autoload của file acad.lsp để làm việc này. Acad.lsp là file đặc biệt, Acad sẽ autoload toàn bộ nội dung của nó mỗi khi Start, Open hoặc New.

Ví dụ, bạn có file D:\MyFile.lsp. Bạn tạo file acad.lsp trong thư mục gốc của Acad, thư mục ...\Support, hoặc bất cứ thư mục nào đã được thiết lập "Support File Search Path" với nội dung sau: (load "D:\\MyFile.lsp")

Nếu acad.lsp đã có thì bổ sung thêm nội dung trên 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×