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

[Yêu cầu] Offset, chuyện cũ với yêu cầu mới

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

Mình nhờ các pro viết một Lisp rút gọn lệnh Fillet như sau:

Bình thường khi muốn fillet với bán kinh r=100 (lệnh fillet trc đó R#100) thì mình sẽ phải làm tuần tữ là:

F :enter

R :enter

100 :enter

....

Giờ mình muốn khi cần fillet với một bán kính R=100 thì chỉ cần gõ: R100 thì CAD sẽ hiểu là Lệnh Fillet với tham số b.kính R=100 (bỏ qua 3 bước ở trên).

Thanks tất cả mọi người! Phần này coi như đã xong

 

Bổ sung:

Mình nhờ các pro viết bổ sung thêm tính năng Lisp chamfer nhập biến trực tiếp của bro Ketxu mình , giúp Chamfer giữa đường thẳng và đường cong và giữa 2 đường cong theo kiểu như mình Chamfer giữa 2 đường thẳng với nhau. Yêu cầu như sau:

 * Sau khi nhập lệnh (ví dụ D5) thì chọn đối tượng. Có 2 trường hợp xảy ra:

1/ Nếu 2 đối tượng là đường thẳng thìm thực hiện lệnh Chamfer bình thường với biến D=5 (cái này lisp của bro Ketxu đã có ).

2/ Nếu 2 đối tượng được chọn có 1 hoặc cả 2 là đường cong thì sẽ thực hiện từng bớc như sau:

   + Bước 1: Thực hiện lệnh Fillet 2 đối tượng được chọn với bk R = D (ở đây R=D=5);[hoặc nhập R, rồi nhập bk, rồi fillet 2 đ.tượng được chọn với bk R vừa nhập.

   + Bước 2: Xóa bỏ cung tròn vừa được tạo ra bằng lệnh Fillet ở bước 1.

   + Bước 3: Nối 2 điểm trên 2 đối tượng lại bằng 1 đường thẳng. Mọi người xem hình minh họa sẽ rõ hơn.3

   + Bước 4: Chọn đối tượng tiếp theo hoặc Enter kết thúc lệnh. Xong

guicadviet_zps63056014.jpg

 

 

 Hết.

Thanks all!

 

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 nhờ các pro viết một Lisp rút gọn lệnh Fillet như sau:

Bình thường khi muốn fillet với bán kinh r=100 (lệnh fillet trc đó R#100) thì mình sẽ phải làm tuần tữ là:

F :enter

R :enter

100 :enter

....

Giờ mình muốn khi cần fillet với một bán kính R=100 thì chỉ cần gõ: R100 thì CAD sẽ hiểu là Lệnh Fillet với tham số b.kính R=100 (bỏ qua 3 bước ở trên).

Thanks tất cả mọi người!

 

Hề hề hề,

Khó hè???? Làm răng để nhét được cái tham số bán kính vô tên lệnh bây chừ??? Có nhẽ phải dùng hàm con chă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

Tôi đã viết lisp này, bài #20, link dưới đây. Bạn sang đó down nhé!

http://www.cadviet.com/forum/topic/68479-xin-hoi-ve-lenh-fillet/?pid=224052&do=findComment&comment=224052

Thanks bro. Nhưng cái này chưa đúng ý mình muốn.

Mình muốn rút gọn lệnh Fillet (bỏ qua bước nhập lệnh và tham số b.kính)

Ví dụ: Cần fillet với tham số b.kinh R=10 thì chỉ cần nhập lệnh: R10 là có thể fillet với b.kinh R=10

hay nhập R15 là có thể fillet với b.kính R=15.

Còn khi cần fillet với b.kính của lần fillet trước thì nhập: F như bình 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

Lâu rồi k viết, code tí cho đỡ quên ^^

 

;Fillet voi ban kinh bat ky, nhap lenh theo cau truc Rbankinh (R10, R100, R50, R1.5 ...)
;Ketxu 20/3/13
(vl-load-com)
(if (null fillet_reactor)(setq fillet_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . fillet_df)))))
(defun	fillet_df (a b / cmd r)	
	(cond
		((and (wcmatch (setq cmd (strcase (nth 0 b))) "R*")(setq r (distof (substr cmd 2))))
			(setvar 'FILLETRAD r)
			(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "fillet m ")			
		)
	)
	(princ)
)

  • Vote tăng 11

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 rồi k viết, code tí cho đỡ quên ^^

 

;Fillet voi ban kinh bat ky, nhap lenh theo cau truc Rbankinh (R10, R100, R50, R1.5 ...)
;Ketxu 20/3/13
(vl-load-com)
(if (null fillet_reactor)(setq fillet_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . fillet_df)))))
(defun	fillet_df (a b / cmd r)	
	(cond
		((and (wcmatch (setq cmd (strcase (nth 0 b))) "R*")(setq r (distof (substr cmd 2))))
			(setvar 'FILLETRAD r)
			(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "fillet m ")			
		)
	)
	(princ)
)

Đây mới đúng là cái mình cần.

Thanks bro ketxu rất là nhiều. :D

Có cái này giúp mình vẽ nhanh hơn rất nhiều.

Nếu ko phiền bro làm luôn cái Lisp kiểu như thế này nhưng cho lệnh CHAMFER nhe!

Chỉ cần nhập: D10 hay D15 ... là có thể chặt chém tới bến Ninh Kiều luôn hihihihii

Thanks bro ketxu một lần nữa nhe!!!! :D :D :D

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

Gì chớ "ăn cắp" thì mần được:


(vl-load-com)

(if (null chamfer_reactor)(setq chamfer_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . chamfer_df)))))

(defun    chamfer_df (a b / cmd d)    
 (cond
  ((and (wcmatch (setq cmd (strcase (nth 0 B))) "D*")(setq d (distof (substr cmd 2))))
   (setvar 'CHAMFERA d) (setvar 'CHAMFERB d)
   (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "chamfer m ")))
 (princ))
Reator hay quá. Chắc phải tìm học thôi.
  • Vote tăng 8

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

 

Gì chớ "ăn cắp" thì mần được

Reator hay quá. Chắc phải tìm học thôi.

Bác cháu ta giống nhau, của chôm được là của quý, chôm xài lâu năm thì thành của ta, tội j ^^ 

 

 Đợt update này lại k xem được ai vote +/- nhỉ

  • Vote tăng 2

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

 

Gì chớ "ăn cắp" thì mần được:


(if (null chamfer_reactor)(setq chamfer_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . chamfer_df)))))

(defun    chamfer_df (a b / cmd d)    
 (cond
  ((and (wcmatch (setq cmd (strcase (nth 0 B))) "D*")(setq d (distof (substr cmd 2))))
   (setvar 'CHAMFERA d) (setvar 'CHAMFERB d)
   (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "chamfer m ")))
 (princ))
Reator hay quá. Chắc phải tìm học thôi.

Ủa sao mình chamfer ko đc ta?

Nhập D10

Cad báo lỗi:

; error: no function definition: CHAMFER_DF

Unknown command "D10".  Press F1 for help.

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 thêm dòng (vl-load-com) vào đầu lisp như tôi đã edit ở trên nhé. Tôi chép thiếu dòng này.

Tôi test mọi thứ đều ổn.

Khi bạn load nó có báo gì 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 thêm dòng (vl-load-com) vào đầu lisp như tôi đã edit ở trên nhé. Tôi chép thiếu dòng này.

Tôi test mọi thứ đều ổn.

Khi bạn load nó có báo gì không?

Đúng rồi. Lúc bro vừa post là mình down về liền.

Giờ thì ngon rồi.

Thanks bro Doan Van Ha nhiều nhe!!! :D :D :D

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

Sau khi em xoá chữ span nó lại báo như này

 

PPLOAD lisp chamfer.lsp successfully loaded.
lisp chamfer.lsp successfully loaded.
Command:
Command:
Command:
Command: c3 Unknown command "C3".  Press F1 for help.

:wacko:  :wacko:

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

 

Gì chớ "ăn cắp" thì mần được:

Reator hay quá. Chắc phải tìm học thôi.

 

Hề hề hề,

Bác DoanVanHa và ketxu cho hỏi thăm đường một chút.

1/- Tại sao phải có cái biến toàn cục a trong định nghĩa (defun    chamfer_df (a b / cmd d) . 

2/- Nếu dùng như bác DoanVanHa thì cái thằng chamfer này nó chém đều hai cạnh của góc cần chamfer. Vậy nếu ta thêm biến vào để có thể thích chém kiểu chi cũng được có nên không???

3/- Cái tham số m trong lệnh chamfer và fillet này (  "chamfer m ") có thực sự cần phải có hay không???

Cũng muốn chôm cái ni lắm nhưng mà chửa hiểu rõ nên hổng dám, chôm về nhỡ nó  nổ một phát thì tẩu hỏa nhập ma mất.

Hề hề hề,...

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ề hề,

Bác DoanVanHa và ketxu cho hỏi thăm đường một chút.

1/- Tại sao phải có cái biến toàn cục a trong định nghĩa (defun    chamfer_df (a b / cmd d) . 

2/- Nếu dùng như bác DoanVanHa thì cái thằng chamfer này nó chém đều hai cạnh của góc cần chamfer. Vậy nếu ta thêm biến vào để có thể thích chém kiểu chi cũng được có nên không???

3/- Cái tham số m trong lệnh chamfer và fillet này (  "chamfer m ") có thực sự cần phải có hay không???

Cũng muốn chôm cái ni lắm nhưng mà chửa hiểu rõ nên hổng dám, chôm về nhỡ nó  nổ một phát thì tẩu hỏa nhập ma mất.

Hề hề hề,...

Trước hết, tôi chôm code của Ket để sửa lại, nên nếu những trả lời dưới đây là sai thì Ket hoàn toàn chịu trách nhiệm trước pháp luật:

1). Chamfer và Fillet theo y/c của 2 chủ nhân thì đã biết D hoặc R rồi nên nó cần đúng 2 đối số là 2 đối tượng (ent1 và ent2) muốn Chamfer/Fillet, tương tự (command "Chamfer" ent1 ent2).

2). Chủ nhân yêu cầu 1 D thì tôi mần 1 D chung. Nếu cần D1 và D2 thì sửa code lại thôi, nhưng nhập dài hơn, VD là D50D100, chứ không phải là D50.

3). M là Multiple. Nếu bỏ M đi thì Chamfer/Fillet chỉ được 1 lần rồi dừng lại. Ở đây có EM nên nó muốn mần thêm vài cú nữa.

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

Trước hết, tôi chôm code của Ket để sửa lại, nên nếu những trả lời dưới đây là sai thì Ket hoàn toàn chịu trách nhiệm trước pháp luật:

1). Chamfer và Fillet theo y/c của 2 chủ nhân thì đã biết D hoặc R rồi nên nó cần đúng 2 đối số là 2 đối tượng (ent1 và ent2) muốn Chamfer/Fillet, tương tự (command "Chamfer" ent1 ent2).

2). Chủ nhân yêu cầu 1 D thì tôi mần 1 D chung. Nếu cần D1 và D2 thì sửa code lại thôi, nhưng nhập dài hơn, VD là D50D100, chứ không phải là D50.

3). M là Multiple. Nếu bỏ M đi thì Chamfer/Fillet chỉ được 1 lần rồi dừng lại. Ở đây có EM nên nó muốn mần thêm vài cú nữa.

Hề hề hề,

Ới bác DoanVanHa ơi. Hình như không phải rứa????

1/- Biến a là gì thì mình chưa biết, nhưng biến b chính là cái lệnh gõ vào dòng command. Bởi thế mới có (wcmatch (setq cmd (strcase (nth 0 b))) "R*")

2/- Tham số m trong lệnh fillet và chamfer không phải là multi mà muốn multi phải dùng tham số U chớ ạ. (Select first object or [Polyline/Radius/Trim/mUltiple]:)

3/- Nếu sửa vậy thì cần cả việc tách chuỗi nữa ạ.

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). Nhầm. Tiếp tục suy luận ẩu: Chắc a là Multilpe, bởi nếu bỏ a thì Multiple không hiệu lực. Chờ Ket xác minh.

2). Cad2007 nó thế này, đâu có U?

 

FILLET
Current settings: Mode = TRIM, Radius = 10.00
Select first object or [undo/Polyline/Radius/Trim/Multiple]:
 
Command: chamfer
(TRIM mode) Current chamfer Dist1 = 10.00, Dist2 = 10.00
Select first line or [undo/Polyline/Distance/Angle/Trim/mEthod/Multiple]:
3). OK
  • 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). Nhầm. Tiếp tục suy luận ẩu: Chắc a là Multilpe, bởi nếu bỏ a thì Multiple không hiệu lực. Chờ Ket xác minh.

2). Cad2007 nó thế này, đâu có U?

 

FILLET
Current settings: Mode = TRIM, Radius = 10.00
Select first object or [undo/Polyline/Radius/Trim/Multiple]:
 

Command: chamfer
(TRIM mode) Current chamfer Dist1 = 10.00, Dist2 = 10.00
Select first line or [undo/Polyline/Distance/Angle/Trim/mEthod/Multiple]:
3). OK

 

1.) a chính là VLR-Command-Reactor. Nôm na theo Tue_NV hiểu đó là hàm gọi reactor,

gọi là calling-reactor

"m" chính là Multiple. 

 

Cùng 1 lệnh Fillet -> Tại sao gõ F  lại được dòng (1) ; gõ Fillet lại ra dòng (2)???

Thử CAD2007 thì thấy thế, CAD2012 thì gõ F hay Fillet đều được dòng (2). Lạ quá.....

 

Command: f nil
Select first object or [uNdo/Polyline/Radius/Trim/mUltiple]: (1)
 
 
Command: fillet
Current settings: Mode = TRIM, Radius = 1000.00
Select first object or [undo/Polyline/Radius/Trim/Multiple]: (2)
 
=> Lisp nhận lệnh đầy đủ -> Phải là "m" chứ không phải "u" trong code
  • 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

@ Phamthanhbinh: chamfer_df là hàm callback của reactor. Cấu trúc của nó quy định hơi khác hàm defun bình thường. Tất cả các hàm callback đều phải có 1 đối số bắt buộc đặt ở vị trí đầu tiên (vị trí a như hàm trên của ketxu). Nó chính là Cái reactor liên kết với hàm callback đó. sau đó là các đối số phụ tùy thuộc vào loại reactor.

Thông thường thì chúng ta không dùng đến nó, tuy nhiên khi thực hiện các lisp lớn có sử dụng nhiều reactor thì nó rất quan trọng để lập trình viên quản lý và điều khiển các reactor đã sử dụng, tránh việc cùng 1 lúc có thể có vài reactor được gọi bởi 1 sự kiện nhưng hoạt động theo hướng phủ định nhau.

  • 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). Cad2007 của tôi thì F hay Fillet cũng đều ra Multiple cả. Lạ quá!

2). Chưa hiểu cách giải thích của Tue_NV + ThuyLinh ở chỗ này: tại sao bỏ a đi thì vẫn dùng được, mà chỉ bị mất Multiple 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

 

1.) a chính là VLR-Command-Reactor. Nôm na theo Tue_NV hiểu đó là hàm gọi reactor,

gọi là calling-reactor

"m" chính là Multiple. 

 

Cùng 1 lệnh Fillet -> Tại sao gõ F  lại được dòng (1) ; gõ Fillet lại ra dòng (2)???

Thử CAD2007 thì thấy thế, CAD2012 thì gõ F hay Fillet đều được dòng (2). Lạ quá.....

 

Command: f nil
Select first object or [uNdo/Polyline/Radius/Trim/mUltiple]: (1)
 
 
Command: fillet
Current settings: Mode = TRIM, Radius = 1000.00
Select first object or [undo/Polyline/Radius/Trim/Multiple]: (2)
 
=> Lisp nhận lệnh đầy đủ -> Phải là "m" chứ không phải "u" trong code

Hề hề hề,

1/- Khi dùng code có tham số m. cad2004 của mình cho kết quả như sau:

 

Command: r5
Unknown command "R5".  Press F1 for help.
 
Command: fillet
Current settings: Mode = TRIM, Radius = 5.0000
Select first object or [Polyline/Radius/Trim/mUltiple]: m
 
 
*Invalid selection*
Expects a point or Window/Last/Crossing/BOX/Fence/WPolygon/CPolygon/CLass
 
Select first object or [Polyline/Radius/Trim/mUltiple]:
Select second object:
 
Và cũng chỉ fillet được 1 lần chứ không multi.
2/- Khi bỏ tham số m này thì kết quả là:
Command: r5
Unknown command "R5".  Press F1 for help.
 
Command: fillet
Current settings: Mode = TRIM, Radius = 5.0000
Select first object or [Polyline/Radius/Trim/mUltiple]:
Select second object:
Chỉ fillet 1 lần.
3/- Khi thay bằng tham số u thì kết quả là cho phép fillet nhiều lần như sau:
Command: r5
Unknown command "R5".  Press F1 for help.
 
Command: fillet
Current settings: Mode = TRIM, Radius = 5.0000
Select first object or [Polyline/Radius/Trim/mUltiple]: u
Select first object or [Polyline/Radius/Trim/mUltiple]:
Select second object:
Select first object or [Polyline/Radius/Trim/mUltiple]:
Select second object:
Select first object or [Polyline/Radius/Trim/mUltiple]:
Select second object:
Select first object or [Polyline/Radius/Trim/mUltiple]:
Select second object:
4/- Như vậy là có sự khác nhau giữa các đời CAD các bác ạ. Có nhẽ CAD2004 thì phải dùng tham số u chứ không dùng tham số m được.
Hề hề hề,....

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

×