Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết Lisp theo yêu cầu

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

Bạn đã thử như thế này chưa:

- Dùng lệnh options, rồi add đường dẫn thư mục chứa các file chi tiết vào trong Support file search path (chỉ cần làm 1 lần duy nhất).

- Mỗi khi dùng lệnh insert, nhập tên block = tên file (không cần có đuôi dwg, vd tên file là chitiet1.dwg thì bạn chỉ cần nhập chitiet1 tại lệnh insert).

Ý của mình là các bản vẽ chi tiết đó đã được chèn vào bản vẽ chính với tên block trùng với tên file chi tiết. Để mở file chi tiết chỉ cần chọn block đó thì bản vẽ chi tiết đó sẽ được Acad mở ra. Còn tạo đường dẫn để chèn cho các lần sau mà không phải chọn file thì mình đã thực hiện được (Chiêu này rất cảm ơn 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
Ý của mình là các bản vẽ chi tiết đó đã được chèn vào bản vẽ chính với tên block trùng với tên file chi tiết. Để mở file chi tiết chỉ cần chọn block đó thì bản vẽ chi tiết đó sẽ được Acad mở ra. Còn tạo đường dẫn để chèn cho các lần sau mà không phải chọn file thì mình đã thực hiện được (Chiêu này rất cảm ơn bạn đã hướng dẫn).

Bạn dùng thử lisp này, lệnh OB, select vào block là nó open file tương ứng.

Yếu cầu: bản vẽ chính và các bản vẽ chi tiết phải nằm chung thư mụckhông cần thiết lập Support File Search Path (SFSP).

Theo mình, không nên lạm dụng SFSP vì nếu số lượng project tăng lên theo thời gian (nếu bạn thiết kế thường xuyên chừng vài năm thì số lượng project tăng lên đáng kể) thì cái list SFSP cứ nối dài mãi à? Nhiều quá có vẻ không ổn chút nào. Ví dụ: 2 project khác nhau nhưng có 2 file trùng tên. Nếu không chỉ định chính xác path có khả năng sẽ gây ra nhầm lẫn.

 

(defun C:OB( / d bln fn dir ffn)
(setq
d (entget (car (entsel "\nSelect block:")))
bln (cdr (assoc 2 d))
fn (findfile (getvar "dwgname"))
dir (vl-filename-directory fn)
ffn (strcat dir "\\" bln ".dwg")
)
(if (findfile ffn) (command "start" ffn) (alert "File not found!"))
)

 

Vấn đề còn tồn tại:

Nếu file bản vẽ chi tiết đã open rồi nhưng user không nhớ và dùng tiếp OB, chương trình không có phản ứng gì cả, có thể làm cho user bối rối. Lẽ ra, chương trình phải có 1 trong 2 cách hành xử:

- Ra thông báo, kiểu như "File này đã được mở"

- Không cần thông báo, chuyển focus sang file bản vẽ đã chỉ định

Bạn nào có thể bổ sung giúp chỗ này? Cụ thể, làm thế nào để lấy được list các bản vẽ đang được open (bấm vào Menu - Window -> có 1 list các file *.dwg ở dưới cùng ấy). Lấy được list này sẽ xử được tồn tại trê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
lệnh SR và SL dưới đây sẽ SELECT đối tượng theo RADIUS và SELECT đối tượng theo LENGTH.

 

(defun c:sr ()
 (setq	bk (getdist "\nVao ban kinh: ")
ss (ssget "X"
	  '((-4 . "<or") (0 . "CIRCLE") (0 . "ARC") (-4 . "or>"))
   )
kq (ssadd)
 )
 (while (setq ent (ssname ss 0))
   (if	(equal bk
       (vla-get-Radius (vlax-ename->vla-object ent))
       0.0001
)
     (setq kq (ssadd ent kq))
   )
   (setq ss (ssdel ent ss))
 )
 (sssetfirst kq kq)
 (princ)
)


(defun c:sl ()
 (setq	bk (getdist "\nVao khoang cach: ")
ss (ssget "X"
	  '((0 . "*LINE"))
   )
kq (ssadd)
 )
 (while (setq ent (ssname ss 0))
   (if	(equal bk
       (vla-get-length (vlax-ename->vla-object ent))
       0.0001
)
     (setq kq (ssadd ent kq))
   )
   (setq ss (ssdel ent ss))
 )
 (sssetfirst kq kq)
 (princ)
)

(vl-load-com)

 

Bác Hoành ơi em vẫn bị lỗi khi dùng lệnh SL để lựa chọn theo length mặc dù em đã chuyển sang dùng cad2007

 

Command: sl

Vao khoang cach: 100
error: ActiveX Server returned the error: unknown name: Length

Bác xem giúp em một chút được 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
Bạn có thể post yêu cầu về autolisp ở topic này.

Cần Lisp Coppy nội dung Text theo nội dung Text khác, mà vẫn giữ nguyên text style

Chào các bác:

em đang cần 1 lisp, mong các bác giúp đỡ. Cảm ơn rất nhiều!

Yêu cầu:

- Em có các dòng text: A, B, C, D, ... (nội dung là chữ, số hoặc có cả chữ số,...)

- Nhiều trường hợp em cần các text B C D cũng có nội dung như của text A. Em cần 1 lisp có thể thực hiện nhanh thao tác này (như kích chuột vào A rồi kích vào B,C,D là được). 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
Cần Lisp Coppy nội dung Text theo nội dung Text khác, mà vẫn giữ nguyên text style

Chào các bác:

em đang cần 1 lisp, mong các bác giúp đỡ. Cảm ơn rất nhiều!

Yêu cầu:

- Em có các dòng text: A, B, C, D, ... (nội dung là chữ, số hoặc có cả chữ số,...)

- Nhiều trường hợp em cần các text B C D cũng có nội dung như của text A. Em cần 1 lisp có thể thực hiện nhanh thao tác này (như kích chuột vào A rồi kích vào B,C,D là được). Thanks!

 

Bạn xem trang 1 của topic này có rồi đó bạ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
Bạn dùng thử lisp này, lệnh OB, select vào block là nó open file tương ứng.

Yếu cầu: bản vẽ chính và các bản vẽ chi tiết phải nằm chung thư mụckhông cần thiết lập Support File Search Path (SFSP).

Theo mình, không nên lạm dụng SFSP vì nếu số lượng project tăng lên theo thời gian (nếu bạn thiết kế thường xuyên chừng vài năm thì số lượng project tăng lên đáng kể) thì cái list SFSP cứ nối dài mãi à? Nhiều quá có vẻ không ổn chút nào. Ví dụ: 2 project khác nhau nhưng có 2 file trùng tên. Nếu không chỉ định chính xác path có khả năng sẽ gây ra nhầm lẫn.

 

(defun C:OB( / d bln fn dir ffn)
(setq
d (entget (car (entsel "\nSelect block:")))
bln (cdr (assoc 2 d))
fn (findfile (getvar "dwgname"))
dir (vl-filename-directory fn)
ffn (strcat dir "\\" bln ".dwg")
)
(if (findfile ffn) (command "start" ffn) (alert "File not found!"))
)

 

Vấn đề còn tồn tại:

Nếu file bản vẽ chi tiết đã open rồi nhưng user không nhớ và dùng tiếp OB, chương trình không có phản ứng gì cả, có thể làm cho user bối rối. Lẽ ra, chương trình phải có 1 trong 2 cách hành xử:

- Ra thông báo, kiểu như "File này đã được mở"

- Không cần thông báo, chuyển focus sang file bản vẽ đã chỉ định

Bạn nào có thể bổ sung giúp chỗ này? Cụ thể, làm thế nào để lấy được list các bản vẽ đang được open (bấm vào Menu - Window -> có 1 list các file *.dwg ở dưới cùng ấy). Lấy được list này sẽ xử được tồn tại trên.

[/code]

Mình đã thử chạy code trên của bạn nhưng câu lệnh (setq fn (findfile (getvar "dwgname"))) lại hiện đường dẫn của bản vẽ chính nên luôn hiện thông báo (alert "File not found!"). Mình xin thông tin lại nội dung như sau :

- Ví dụ trong bản vẽ khai triển mình chèn block có tên "moinoibich" trong khi đó trong thư viện mình cũng đã có file chi tiết "moinoibich.dwg".

- Để mở file chi tiết "moinoibich.dwg" thì mình chỉ cần click chọn block có tên "moinoibich" thì bản vẽ "moinoibich.dwg" sẽ được mở ra.

Cho mình hỏi tí nhé : Hình như lệnh "start" không mở được bản vẽ mà tên bản vẽ có ký tự là khoảng trắng thì phải. Ví dụ như "moi noi bich.dwg".

Mình đã thử lại như sau thì thấy mở được :

(defun C:OB( / d bln fn dir ffn)

(setq

d (entget (car (entsel "\nSelect block:")))

bln (cdr (assoc 2 d))

fn (strcat bln ".dwg")

)

(command "start" fn)

)

Mình rất cảm ơn 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

Nhờ các bác viết hộ em một lisp ghi kích thước hàng loạt, tức là chọn hàng loạt đoạn thẳng và ghi kích thước của các đường thẳng đó. Em đang cần gấp mong các cao thủ giúp em 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

Em muốn nhờ các bác viết dùm 1 đoạn code thực hiện công việc sau:

 

1, Trên bản vẽ có 1 tập hợp các đoạn thẳng có giao cắt với nhau

2, Sử dụng lệnh chọn tất cả các đoạn thẳng đó, kết quả sẽ break các đoạn thẳng tại giao điểm của chúng.

 

Hiện giờ em đang làm bằng lệnh break với tham số F để chọn first point rồi sau đó chọn second point trùng với điểm đầu đã chọn. Nhưng thực hiện việc này với 1 mạng lưới khoảng 1000 phần tử giao nhau chằng chịt thì mất mấy ngày và nhàm chán. Em mong được các bác giúp đỡ.

 

Em 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
Mình đã thử chạy code trên của bạn nhưng câu lệnh (setq fn (findfile (getvar "dwgname"))) lại hiện đường dẫn của bản vẽ chính nên luôn hiện thông báo (alert "File not found!"). Mình xin thông tin lại nội dung như sau :

- Ví dụ trong bản vẽ khai triển mình chèn block có tên "moinoibich" trong khi đó trong thư viện mình cũng đã có file chi tiết "moinoibich.dwg".

- Để mở file chi tiết "moinoibich.dwg" thì mình chỉ cần click chọn block có tên "moinoibich" thì bản vẽ "moinoibich.dwg" sẽ được mở ra.

Cho mình hỏi tí nhé : Hình như lệnh "start" không mở được bản vẽ mà tên bản vẽ có ký tự là khoảng trắng thì phải. Ví dụ như "moi noi bich.dwg".

Mình đã thử lại như sau thì thấy mở được :

(defun C:OB( / d bln fn dir ffn)

(setq

d (entget (car (entsel "\nSelect block:")))

bln (cdr (assoc 2 d))

fn (strcat bln ".dwg")

)

(command "start" fn)

)

Mình rất cảm ơn bạn đã giúp đỡ.

1) Bạn sửa như vậy, bắt buộc phải thiết lập Support File Search Path (SFSP). Nếu không sẽ không chạy được. Đây không phải là giải pháp hay như mình đã phân tích ở bài trên.

 

2) Dùng "start" đúng là bị nhược điểm về dấu space trong filename như bạn nói

 

3) Bạn dùng thử lisp này. Mình đã thử, chạy đúng trong mọi trường hợp, không cần thiết lập SFSP. Nếu file bản vẽ đã open, nó sẽ open tiếp ở dạng ReadOnly.

 

;;;-------------------------------------------------
(defun open_dwg(fn)
(vl-cmdf "vbastmt" (strcat "acadapplication.documents.open \"" fn "\",FALSE"))
)
;;;-------------------------------------------------
(defun C:OB( / d bln fn dir ffn)
(setq
   d (entget (car (entsel "\nSelect block:")))
   bln (cdr (assoc 2 d))
   fn (findfile (getvar "dwgname"))
   dir (vl-string-right-trim "\\" (vl-filename-directory fn))
   ffn (strcat dir "\\" bln ".dwg")
)
(if (findfile ffn) (open_dwg ffn) (alert "File not found!"))
)
;;;-------------------------------------------------

 

P/S: I'm sorry! Mình đọc kỹ lại bài của bạn và đã hiểu ý: bạn có 1 số chi tiết tiêu chuẩn chứa trong thư mục thư viện, được thiết lập SFSP và có thể dùng chung cho nhiều project. Đúng không?

Nếu như vậy, bạn dùng lisp này. Filename có thể chứa space vô tư!

 

;;;-------------------------------------------------
(defun open_dwg(fn)
(vl-cmdf "vbastmt" (strcat "acadapplication.documents.open \"" fn "\",FALSE"))
)
;;;-------------------------------------------------
(defun C:OB2( / d bln fn)
(setq
d (entget (car (entsel "\nSelect block:")))
bln (cdr (assoc 2 d))
fn (findfile (strcat bln ".dwg"))
)
(open_dwg fn)
)
;;;-------------------------------------------------

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 nhờ các bác viết dùm 1 đoạn code thực hiện công việc sau:

 

1, Trên bản vẽ có 1 tập hợp các đoạn thẳng có giao cắt với nhau

2, Sử dụng lệnh chọn tất cả các đoạn thẳng đó, kết quả sẽ break các đoạn thẳng tại giao điểm của chúng.

 

Hiện giờ em đang làm bằng lệnh break với tham số F để chọn first point rồi sau đó chọn second point trùng với điểm đầu đã chọn. Nhưng thực hiện việc này với 1 mạng lưới khoảng 1000 phần tử giao nhau chằng chịt thì mất mấy ngày và nhàm chán. Em mong được các bác giúp đỡ.

 

Em xin cảm ơn.

 

 

- Mình không biết làm lisp bạn yêu cầu, chỉ biết 1 dòng lệnh này giúp bạn break nhanh hơn (một chút so với thao tác bình thường bạn làm)

 

Bạn copy đoạn này vào bất cứ lisp nào bạn đang dùng, khi chạy lisp bạn dùng lênh " bb " ---> chọn đường cần break ----> chọn điểm cần break -----> xong :bigsmile: không phải loàng ngoằng như bình thường bạn hay làm .

 

(defun c:bb () (command "BREAK" pause "_f" pause"@"))

 

 

Nhờ các bác viết hộ em một lisp ghi kích thước hàng loạt, tức là chọn hàng loạt đoạn thẳng và ghi kích thước của các đường thẳng đó. Em đang cần gấp mong các cao thủ giúp em với.

 

 

@hoangtrongbang lênh qdim có sẵn trong cad làm được điều bạn yêu cầ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
Em muốn nhờ các bác viết dùm 1 đoạn code thực hiện công việc sau:

 

1, Trên bản vẽ có 1 tập hợp các đoạn thẳng có giao cắt với nhau

2, Sử dụng lệnh chọn tất cả các đoạn thẳng đó, kết quả sẽ break các đoạn thẳng tại giao điểm của chúng.

 

Hiện giờ em đang làm bằng lệnh break với tham số F để chọn first point rồi sau đó chọn second point trùng với điểm đầu đã chọn. Nhưng thực hiện việc này với 1 mạng lưới khoảng 1000 phần tử giao nhau chằng chịt thì mất mấy ngày và nhàm chán. Em mong được các bác giúp đỡ.

 

Em xin cảm ơn.

Bạn dùng lisp này, lệnh BRK:

 

;;;-------------------------------------------------------------
(defun ss2ent (ss / i Le e)
(setq i 0 Le nil)
(repeat (sslength ss) 
   (setq
       e (ssname ss i)
       Le (append Le (list e))
       i (1+ i)
   )
)
Le
)
;;;-------------------------------------------------------------
(defun DXF (code e) (cdr (assoc code (entget e))) )
;;;-------------------------------------------------------------
(defun get_inters(e1 e2 / p11 p12 p21 p22)
(setq
   p11 (dxf 10 e1)  p12 (dxf 11 e1)
   p21 (dxf 10 e2) p22 (dxf 11 e2)
)
(inters p11 p12 p21 p22) 
)
;;;-------------------------------------------------------------
(defun C:BRK( / ss L Lp e1 e2 p e)
(setq
   ss (ssget '((0 . "LINE")))
   L (ss2ent ss)
   Lp nil
)
(foreach e1 L
   (foreach e2 L
       (setq p (get_inters e1 e2))
       (if (and p (not (member p Lp))) (setq Lp (append Lp (list p))))
   )
)
(foreach p Lp
   (setq
       ss (ssget "C" p p '((0 . "LINE")))
       L (ss2ent ss)
   )
   (foreach e L (command "break" e p p))
)
(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

@conghoa: Cảm ơn bác

 

@ssg: Rất cảm ơn bác. Chương trình của bác chạy rất tốt. Nó giúp bản thân em tiết kiệm cực kỳ nhiều thời gian.

 

Chúc các bác luôn mạnh khoẻ..

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) Bạn sửa như vậy, bắt buộc phải thiết lập Support File Search Path (SFSP). Nếu không sẽ không chạy được. Đây không phải là giải pháp hay như mình đã phân tích ở bài trên.

 

2) Dùng "start" đúng là bị nhược điểm về dấu space trong filename như bạn nói

 

3) Bạn dùng thử lisp này. Mình đã thử, chạy đúng trong mọi trường hợp, không cần thiết lập SFSP. Nếu file bản vẽ đã open, nó sẽ open tiếp ở dạng ReadOnly.

 

;;;-------------------------------------------------
(defun open_dwg(fn)
(vl-cmdf "vbastmt" (strcat "acadapplication.documents.open \"" fn "\",FALSE"))
)
;;;-------------------------------------------------
(defun C:OB( / d bln fn dir ffn)
(setq
   d (entget (car (entsel "\nSelect block:")))
   bln (cdr (assoc 2 d))
   fn (findfile (getvar "dwgname"))
   dir (vl-string-right-trim "\\" (vl-filename-directory fn))
   ffn (strcat dir "\\" bln ".dwg")
)
(if (findfile ffn) (open_dwg ffn) (alert "File not found!"))
)
;;;-------------------------------------------------

 

P/S: I'm sorry! Mình đọc kỹ lại bài của bạn và đã hiểu ý: bạn có 1 số chi tiết tiêu chuẩn chứa trong thư mục thư viện, được thiết lập SFSP và có thể dùng chung cho nhiều project. Đúng không?

Nếu như vậy, bạn dùng lisp này. Filename có thể chứa space vô tư!

 

;;;-------------------------------------------------
(defun open_dwg(fn)
(vl-cmdf "vbastmt" (strcat "acadapplication.documents.open \"" fn "\",FALSE"))
)
;;;-------------------------------------------------
(defun C:OB2( / d bln fn)
(setq
d (entget (car (entsel "\nSelect block:")))
bln (cdr (assoc 2 d))
fn (findfile (strcat bln ".dwg"))
)
(open_dwg fn)
)
;;;-------------------------------------------------

Mình đã thử đoạn code sau của bạn nhưng vẫn không mở được. Đúng là dùng code của mình sửa lại phải có SFSP và hàm "start" không tiện cho lắm. Cho mình hỏi bạn kết nối chuỗi "(strcat "acadapplication.documents.open \"" fn "\",FALSE"))" là tạo đường dẫn à? Đúng là mình có một số thư viện chuẩn để làm các project nhưng đôi khi cần phải mở chúng ra để sửa chữa đôi chút hoặc xem lại nó nên rất cần cách mở này. Cảm ơn 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 đã thử đoạn code sau của bạn nhưng vẫn không mở được. Đúng là dùng code của mình sửa lại phải có SFSP và hàm "start" không tiện cho lắm. Cho mình hỏi bạn kết nối chuỗi "(strcat "acadapplication.documents.open \"" fn "\",FALSE"))" là tạo đường dẫn à? Đúng là mình có một số thư viện chuẩn để làm các project nhưng đôi khi cần phải mở chúng ra để sửa chữa đôi chút hoặc xem lại nó nên rất cần cách mở này. Cảm ơn bạn đã giúp đỡ.

Không mở được? Ssg đã test rất kỹ trên máy mình! Bạn thử dùng lại lisp sau:

 

;;;-------------------------------------------------
(defun open_dwg(fn / obj)
(vl-load-com)
(setq obj (vlax-get-acad-object))
(vla-put-activedocument obj (vla-open (vla-get-documents obj) fn))
)
;;;-------------------------------------------------
(defun C:OB( / d bln fn)
(setq
d (entget (car (entsel "\nSelect block:")))
bln (cdr (assoc 2 d))
fn (findfile (strcat bln ".dwg"))
)
(open_dwg fn)
)
;;;-------------------------------------------------

 

Yêu cầu:

1) AutoCAD đời 2002 trở đi (mình đã test trên 2002 và 2007)

2) Phải thiết lập SFSP cho thư viện các bản vẽ chi tiết

3) Bỏ tất cả các chương trình chạy thử mấy hôm nay đi

4) Thử vô hiệu hoá toàn bộ các lisp khác có thể đang thiết lập chế độ autoLoad trên máy bạn (loại trừ khả năng có function nào đó trùng tên)

 

Bạn đáp ứng 4 yêu cầu trên, chắc chắn phải chạy được. Nếu vẫn không chạy được thì ssg... cũng bó tay!

 

P/S:

Chuỗi S = "(strcat "acadapplication.documents.open \"" fn "\",FALSE"))" không phải tạo đường dẫn.

Khi thư viện đã khai báo SFSP thì kết quả (setq fn (findfile (strcat bln ".dwg"))) đã là Full Filename của bản vẽ block rồi.

Cú pháp (vl-cmdf "vbastmt" S) là gọi một thủ tục VBA bằng lisp, với S là cú pháp của VBA. Bạn không chạy được cũng có thể là do sự khác biệt về version của Cad dẫn đến khác biệt version của VBA.

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ông mở được? Ssg đã test rất kỹ trên máy mình! Bạn thử dùng lại lisp sau:

 

;;;-------------------------------------------------
(defun open_dwg(fn / obj)
(vl-load-com)
(setq obj (vlax-get-acad-object))
(vla-put-activedocument obj (vla-open (vla-get-documents obj) fn))
)
;;;-------------------------------------------------
(defun C:OB( / d bln fn)
(setq
d (entget (car (entsel "\nSelect block:")))
bln (cdr (assoc 2 d))
fn (findfile (strcat bln ".dwg"))
)
(open_dwg fn)
)
;;;-------------------------------------------------

 

Yêu cầu:

1) AutoCAD đời 2002 trở đi (mình đã test trên 2002 và 2007)

2) Phải thiết lập SFSP cho thư viện các bản vẽ chi tiết

3) Bỏ tất cả các chương trình chạy thử mấy hôm nay đi

4) Thử vô hiệu hoá toàn bộ các lisp khác có thể đang thiết lập chế độ autoLoad trên máy bạn (loại trừ khả năng có function nào đó trùng tên)

 

Bạn đáp ứng 4 yêu cầu trên, chắc chắn phải chạy được. Nếu vẫn không chạy được thì ssg... cũng bó tay!

 

P/S:

Chuỗi S = "(strcat "acadapplication.documents.open \"" fn "\",FALSE"))" không phải tạo đường dẫn.

Khi thư viện đã khai báo SFSP thì kết quả (setq fn (findfile (strcat bln ".dwg"))) đã là Full Filename của bản vẽ block rồi.

Cú pháp (vl-cmdf "vbastmt" S) là gọi một thủ tục VBA bằng lisp, với S là cú pháp của VBA. Bạn không chạy được cũng có thể là do sự khác biệt về version của Cad dẫn đến khác biệt version của VBA.

Ok, cảm ơn bạn rất nhiều. Mình thấy bạn rất giỏi về visualisp, bạn có tài liệu gì về hướng dẫn lập trình VL ko, nếu có cho mình tham khảo được 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
Ok, cảm ơn bạn rất nhiều. Mình thấy bạn rất giỏi về visualisp, bạn có tài liệu gì về hướng dẫn lập trình VL ko, nếu có cho mình tham khảo được không?

Ssg không dám nhận, chỉ mò mẫm tự học, tự làm và tự chiêm nghiệm kết quả khi chạy chương trình.

Mình không có bất cứ một cuốn sách hay tài liệu gì về Cad và Lisp ngoài cái Help có sẵn của AutoCAD!

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

@hoangtrongbang lênh qdim có sẵn trong cad làm được điều bạn yêu cầu.

 

Mình cảm ơn bạn tuy nhiên,lệnh QDim nó chưa thực hiện hết được theo ý của mình, Ý của mình là muốn nó ghi kích thước của một loạt đường thẳng và DIM nằm luôn tại vị trí của đường thẳng đó cơ. Lệnh QDim thì nó lại kéo tất cả các đường DIM về cùng một vị trí nên rất khó theo dõi. Mình mong các bạn hãy cố giúp mình 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

các bác ơi, cứu e với, lâu nay e không có thời gian vào diễn đàn vì đang phải làm 1 con quy hoạch chi tiết tỉ lệ 1/500 khoảng 2.000 ha. Bọn e hì hục vẽ xong đến lúc đi in thì mới toát mồ hôi các bác ạ : 1 bản vẽ của bọn e in tỉ lệ 1/500 trên layout gồm 198 tờ A0 ghép lại (hu hu...). e vừa đi in thử 1 bản vẽ mất 01 ngày trời... :bigsmile: . Vì thế e lên đây cầu cứu các bác cao thủ trên diễn đàn giúp e có được cái lisp nào tự động in tất cả các khung in trên layout mà không cần ngồi pick in từng bản (in xong đống hồ sơ của e chắc tay e cơ bắp nổi cuồn cuộn mất)....mong các bác tận tình giúp đỡ, gửi tất cả các bác lời chào thân ái và quyết thắ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
các bác ơi, cứu e với, lâu nay e không có thời gian vào diễn đàn vì đang phải làm 1 con quy hoạch chi tiết tỉ lệ 1/500 khoảng 2.000 ha. Bọn e hì hục vẽ xong đến lúc đi in thì mới toát mồ hôi các bác ạ : 1 bản vẽ của bọn e in tỉ lệ 1/500 trên layout gồm 198 tờ A0 ghép lại (hu hu...). e vừa đi in thử 1 bản vẽ mất 01 ngày trời... :bigsmile: . Vì thế e lên đây cầu cứu các bác cao thủ trên diễn đàn giúp e có được cái lisp nào tự động in tất cả các khung in trên layout mà không cần ngồi pick in từng bản (in xong đống hồ sơ của e chắc tay e cơ bắp nổi cuồn cuộn mất)....mong các bác tận tình giúp đỡ, gửi tất cả các bác lời chào thân ái và quyết thắng !

Trên diễn đàn có cách tách bản vẽ, mỗi bản vẽ lại là 1 khung, sau đó dùng chức năng của MPlot (tg: NGUYEN HOANH) 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
các bác ơi, cứu e với, lâu nay e không có thời gian vào diễn đàn vì đang phải làm 1 con quy hoạch chi tiết tỉ lệ 1/500 khoảng 2.000 ha. Bọn e hì hục vẽ xong đến lúc đi in thì mới toát mồ hôi các bác ạ : 1 bản vẽ của bọn e in tỉ lệ 1/500 trên layout gồm 198 tờ A0 ghép lại (hu hu...). e vừa đi in thử 1 bản vẽ mất 01 ngày trời... :bigsmile: . Vì thế e lên đây cầu cứu các bác cao thủ trên diễn đàn giúp e có được cái lisp nào tự động in tất cả các khung in trên layout mà không cần ngồi pick in từng bản (in xong đống hồ sơ của e chắc tay e cơ bắp nổi cuồn cuộn mất)....mong các bác tận tình giúp đỡ, gửi tất cả các bác lời chào thân ái và quyết thắng !

Bạn hãy đặt mỗi một khung tên trên 1 layout.

 

Sau đó, chọn tất cả các layout (bằng cách click rồi giữ shift) sau đó phải chuột chọn Publish selected layouts.

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 nhưng bản vẽ của e bắt buộc phải để 1 layout, còn 199 cái khung để in A0 kia phải xếp cạnh nhau (tiếp giáp biên để khi in ra có thể ghép trùng khớp với nhau được - bản vẽ của e nó ghép mảnh bản đồ như cái google map ý, bao gồm nhiều hình vuông dữ liệu ghép lại và phải trùng khớp với nhau). Nếu tách mỗi bản vẽ 1 layout thì e không thể ghép với nhau được sau khi in ra, mong các bác chỉ bảo e cách nào giải quyết khác với. Mong tin các bác sớ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

Cho mình xin một lisp chuyển đổi block.

 

- Mình có 2 block (A, B ) ở hai vị trí khác nhau, bây giờ mình muốn chuyển đổi vị trí của block A và block B cho nhau.

 

Ví dụ:

chạy lisp ----> chọn block A, B -----> lisp sẽ tự động chuyển đổi vị trí 2 điểm chèn của block A và block B cho nhau!

 

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
Cho mình xin một lisp chuyển đổi block.

 

- Mình có 2 block (A, B ) ở hai vị trí khác nhau, bây giờ mình muốn chuyển đổi vị trí của block A và block B cho nhau.

 

Ví dụ:

chạy lisp ----> chọn block A, B -----> lisp sẽ tự động chuyển đổi vị trí 2 điểm chèn của block A và block B cho nhau!

 

Thanks!

 

lệnh SWB (SWap block) sẽ làm điều bạn muốn:

(defun c:swb( / ent1 ent2 tt1 tt2 o1 o2)
 (setq ent1 (car (entsel "\nHay pick vao block A: ")))
 (redraw ent1 3)
 (setq ent2 (car (entsel "\nHay pick vao block B: "))
  tt1 (entget ent1)
tt2 (entget ent2)
o1  (assoc 10 tt1)
o2  (assoc 10 tt2)
tt1 (subst o2 o1 tt1)
tt2 (subst o1 o2 tt2)
 )
 (entmod tt1)
 (entmod tt2)
 (redraw ent2 4)
 (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

Em muốn Trim nhiều đối tượng mà dùng một dao cắt- Giống như là khi có một loạt đường thẳng-nó hơi dài nên em phải vẽ một đường thẳng để Trim nó ấy- em phải lựa chọn từng cái một.

Có ai có thể giúp em chút- có thể dùng lệnh hoặc lisp

Em xin cảm ơn nhiều!

(Em ko thấy chỗ up ảnh nên ko up được- Các bác thông cảm chút nghe!)

@Em có tham khảo một số bài viết trên 4room rồi but mà ko rõ lắm- với lại cũng là phải chọn từng điểm căt một- Các bác chỉ cụ thể cho em cái nha!

Chúc mọi người tuần mới vui 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
Em muốn Trim nhiều đối tượng mà dùng một dao cắt- Giống như là khi có một loạt đường thẳng-nó hơi dài nên em phải vẽ một đường thẳng để Trim nó ấy- em phải lựa chọn từng cái một.

Có ai có thể giúp em chút- có thể dùng lệnh hoặc lisp

Em xin cảm ơn nhiều!

(Em ko thấy chỗ up ảnh nên ko up được- Các bác thông cảm chút nghe!)

@Em có tham khảo một số bài viết trên 4room rồi but mà ko rõ lắm- với lại cũng là phải chọn từng điểm căt một- Các bác chỉ cụ thể cho em cái nha!

Chúc mọi người tuần mới vui vẻ!

Gõ "trim" enter

select đối tượng để chọn dao cắt xong

gõ "f", rồi pick 2 điểm để cắt hàng loạt

Xong.

  • 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×