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 [phần 2]

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

phamthanhbinh    3.123
Chào bác PhamthanhBinh

Thay vì nhớ trật tự góc quay khi nhập, mình nên cho hiện sáng đối tượng lên và quay đối tượng ngay tại thời điểm mà ta nhập góc vào. Chỉ cần 1 vòng While là đủ và biến lstg của bác trong code có lẽ rằng không cần thiết.

Như vậy thì bác khỏi phải nhớ cái trật tự khi lựa chọn các vòng tròn và trật tự góc quay khi nhập rồi.

 

Tue_NV xin phép bổ sung vào code Lisp việc lưu giá trị góc nhập vào cho lần sử dụng sau luôn ( ngay trong vòng lặp While), hiện sáng đối tượng, dây tóc chuột tại tâm đường tròn và quay đối tượng ngay thời điểm mà User nhập góc. Và không quay những đường tròn mà trong nó hoặc giao với nó không có đối tượng nào cả

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while ((setq pt (vlax-curve-getPointAtParam obj sp)
ptlst (cons pt ptlst)
sp (+ inc sp)) )
(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:mulro (/ sscir i n ent cen lstp ss ang vl ov)
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(setq sscir (ssget (list (cons 0 "CIRCLE")))
n (sslength sscir)
i 0
)
(or *ang* (setq *ang* (* (/ pi 4))))
(while ((setq ent (ssname sscir i)
cen (cdr (assoc 10 (entget ent)))
lstp (traceCircle (vlax-ename->vla-object ent))
)
(if (and (setq ss (ssget "cp" lstp)) (> (sslength ss) 1))

(command "rotate" ss "" cen 
 (/ (* 180 (setq ang (getangle cen (strcat "\nNhap goc muon quay  :  "))))
  pi)
)
)
(setq i (1+ i))
(if ang (setq *ang* ang))
)
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)

@Anh giaBach : Anh cho Tue_NV hỏi chút : ý nghĩa của hàm vl-cmdf tương tự như hàm command. Em nghĩ rằng hàm vl-cmdf có ưu điểm hơn hàm command. Không biết em suy nghĩ như vậy có đúng không? Hình như các hàm Vl, Vla có tốc độ xử lý nhanh hơn các hàm trong Lisp thì phải. Không biết Tue_NV có suy nghĩ như thế đúng không?

Anh gia_bach cùng mọi người giải thích dùm Tue_NV chổ này tí nhé.

Cảm ơn anh rất nhiều

Chào bác Tue_NV,

Đúng là làm như bác sẽ không cần cái biến lstg, tuy nhiên cái vụ highlight đối tượng mình chưa thạo bác ạ. Xem cái lisp của bác mình chưa hiểu tác dụng của cái hàm (or *ang* (setq *ang* (* (/ pi 4))))

Cái biến *ang* này có tác dụng gì, phải chăng hai cái dấu * trước và sau ang chỉ để phân biết với biến ang hay còn có tác dụng gì khác.

Cái hàm (* (/ pi 4)) để làm chi vậy, Sao không thể dùng (/ pi 4) thôi cho đơn giản???

Việc sử dụng hàm (command "rotate" ss "" cen (/ (* 180 (setq ang (getangle cen (strcat "\nNhap goc muon quay : ")))) pi) của bác tuy có phức tạp hơn cách nhập góc trực tiếp theo độ của mình nhưng bù lại nó lại có khả năng cho người sử dụng nhập góc bằng cách pick điểm. Đây là một điều rất hay mà mình xin phép mót của bác.

Cái vụ highlight đối tượng khi quay của bác phải chăng đó là do cái hàm (getangle cen (strcat.......)) này mà ra???

Rất mong bác chỉ bảo thêm.

Chúc bác khỏe và vui.

  • 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    3.123
Chào Phiphi.

Lisp của anh gia_bach, anh PhamThanhBinh và của Tue_NV viết theo yêu cầu của bạn nqt266 và chỉ có thể Rotate các đối tượng nằm trong CIRCLE, chứ chưa làm với đối tượng Block có vòng tròn.

 

Nếu bạn muốn sử dụng thêm Block thì sử dụng Lisp này của Tue_NV mới viết thêm. Mình chưa đáp ứng được yêu cầu của bạn là chọn Line thay vì phải nhập góc muốn quay vì dạo này Tue_NV cũng khá bận vì công việc. KHi nào rãnh thì Tue_NV mới viết thêm cho PP được. Thông cảm nhé

Bất kể điểm chèn Block nằm ở đâu thì Lisp chỉ quay tại tâm đường tròn đó mà thôi.

Lisp chấp nhận cả CIRCLE và Block

Bạn sử dụng Lisp này thử và cho ý kiến nhé:

 

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while ((setq pt (vlax-curve-getPointAtParam obj sp)
ptlst (cons pt ptlst)
sp (+ inc sp)) )
(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:mulro (/ sscir i n ent cen lstp ss ang vl ov)
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(setq sscir (ssget (list (cons 0 "CIRCLE,INSERT")))
n (sslength sscir)
i 0
)
(or *ang* (setq *ang* (* (/ pi 4))))
(while ((setq ent (ssname sscir i)
cen (cdr (assoc 10 (entget ent)))
)
;Xu ly Circle
(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
 (progn	
  (setq lstp (traceCircle (vlax-ename->vla-object ent))  )

    (if (and (setq ss (ssget "cp" lstp)) (> (sslength ss) 1))
(command "rotate" ss "" cen 
		(/ (* 180 (setq ang (getangle cen (strcat "\nNhap goc muon quay  :  "))))
  			pi)

)
     )
 );progn
);if
;Xu ly Block
(if (= (cdr (assoc 0 (entget ent))) "INSERT")
 (progn	
  (setq ob (vlax-ename->vla-object ent)  )
(foreach x (vlax-invoke ob 'explode)
   (if (= (vlax-get x 'ObjectName) "AcDbCircle")
     (progn
	(setq cen (vlax-safearray->list (variant-value (vla-get-Center x))))
	(command "rotate" ent "" cen 
		      (/ (* 180 (setq ang (getangle cen (strcat "\nNhap goc muon quay  :  "))))
  			pi)

        )
	(vla-erase x)
     )  (vla-erase x)
          );if
);foreach	

 );progn
);if

(setq i (1+ i))
(if ang (setq *ang* ang))
)
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)

Chào bác Tue_NV,

Bác thử sử dụng hàm sau để cho người sử dụng nhập góc bằng cả hai cách nhập số và nhập line xem nhé:

(defun ng (g / a ln lst)
(setq a (getreal "\n Nhap goc theo do: "))
(if (= a nil)
(progn
(setq ln (entsel "\n Chon line ")
     lst (entget (car ln))
     g (angle (cdr (assoc 10 lst)) (cdr (assoc 11 lst)))
)
)
(setq g (* pi (/ a 180)))
)
)

  • 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    3.123
Chào diễn đàn.Chào pác phamthanhbinh. Vâng em quên mất khi đưa bản vẽ lên mà không nói cụ thể.

Xin mọi người cho em xin slip thực hiện như trong hình vẽ.em cảm ơn..

Dao Xoc Rang

Hề hề hề,

Chào bạn duongepu,

Cái yêu cầu của bạn tuy là không quá khó khăn nhưng mất kha khá thời gian để viết . Do vậy mình muốn bạn cho biết rõ vì sao bạn cần cái lisp này. Thực tế thời gian dành để viết cho xong cái lisp này có khi bạn đã dùng để vẽ xong vài ba chục cái tương tự bạn ạ.

Vì thế nếu không phải là bạn cần sử dụng nó thường xuyên mà chỉ là để giúp bạn khỏi mất công ngồi vẽ một chút thì chả nên viết lisp làm gì. Bởi vì các kiến thức thu được trong cái lisp này chả có gì đáng kể, chỉ là việc xác định các điểm trên biên dạng và vẽ lại mà thôi, không khác gì một quá trình xây dựng lại bản vẽ trên Cad cả. Nó chả gây hứng thú cho người viết lisp bạn ạ.

Mặt khác nếu bạn dùng lisp chỉ để lười đi quá trình suy nghĩ và tìm cách dựng hình thì thật là không nên bởi vì nó sẽ làm bạn ngày càng mất đi khả năng làm việc của mình. Đồng thời nó cũng làm bạn phát sinh ra tư tưởng thiếu trách nhiệm với công việc của mình.

Người viết lisp không phải là bạn nên dù muốn dù không sản phẩm của họ rất có thể chứa những điều không phù hợp với yêu cầu của chính bạn. Nếu bạn chỉ trông chờ vào người khác làm hộ như vậy, bạn sẽ không thể hiểu rõ công việc của mình và giả sử như có sai sót gì đó thì bạn cũng sẽ bó tay không thể khắc phục được bạn ạ.

 

Do vậy, nếu thực tế công việc của bạn cần phải lặp đi lặp lại cái việc vẽ dao xọc này thì hãy dùng đến lisp và như vậy thì bạn cũng nên tìm hiểu thêm về lisp để có thể tự mình viết được những lisp có yêu cầu đơn giản như lisp này. Nếu bạn có khó khăn gì trong quá trình học lisp cũng như thực hành viết lisp, bạn cứ post lên mọi người sẽ giúp đỡ.

Khi đó bạn sẽ chủ động được công việc của bạn bạn ạ.

 

Riêng với mình, thời gian cuối năm này khá bận rộn nên không thể tập trung để viết ngay cho bạn được mà cần phải một thời gian nữa. Mong bạn thông cảm.

Chúc bạn vui.

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    3.841
Chào bác Tue_NV,

Đúng là làm như bác sẽ không cần cái biến lstg, tuy nhiên cái vụ highlight đối tượng mình chưa thạo bác ạ. Xem cái lisp của bác mình chưa hiểu tác dụng của cái hàm (or *ang* (setq *ang* (* (/ pi 4))))

Cái biến *ang* này có tác dụng gì, phải chăng hai cái dấu * trước và sau ang chỉ để phân biết với biến ang hay còn có tác dụng gì khác.

Cái hàm (* (/ pi 4)) để làm chi vậy, Sao không thể dùng (/ pi 4) thôi cho đơn giản???

Việc sử dụng hàm (command "rotate" ss "" cen (/ (* 180 (setq ang (getangle cen (strcat "\nNhap goc muon quay : ")))) pi) của bác tuy có phức tạp hơn cách nhập góc trực tiếp theo độ của mình nhưng bù lại nó lại có khả năng cho người sử dụng nhập góc bằng cách pick điểm. Đây là một điều rất hay mà mình xin phép mót của bác.

Cái vụ highlight đối tượng khi quay của bác phải chăng đó là do cái hàm (getangle cen (strcat.......)) này mà ra???

Rất mong bác chỉ bảo thêm.

Chúc bác khỏe và vui.

Chào bác PhamThanhBinh

1. Cấu trúc Hàm này (or *ang* (setq *ang* (* (/ pi 4)))) là Tue_NV học của anh gia_bach.

biến *ang* nó cũng giống như biến thông thường khác thôi.

2. (* (/ pi 4)) -> Dấu * trong hàm này có hoặc không có cũng được -> chẳng sao cả -> Trị số của nó trả về pi/4

 

3. Việc sử dụng hàm (command "rotate" ss "" cen (/ (* 180 (setq ang (getangle cen (strcat "\nNhap goc muon quay : ")))) pi) của bác tuy có phức tạp hơn cách nhập góc trực tiếp theo độ của mình nhưng bù lại nó lại có khả năng cho người sử dụng nhập góc bằng cách pick điểm.

Reply : Cách của Tue_NV vừa nhập được cả góc trực tiếp theo độ vừa nhập nhập góc bằng cách pick điểm. Bác đã test lại thử chưa?

 

4. Cái vụ highlight đối tượng khi quay của bác phải chăng đó là do cái hàm (getangle cen (strcat.......)) này mà ra???

Reply : Bác nói đúng

Nếu như bác viết như thế này : (command "rotate" ss "" cen ang)

Dưới tác dụng của hàm command -> lệnh rotate được thực hiện -> đối tượng trong tập ss được chọn và hiện sáng, đối tượng này được quay tại tâm cen với góc quay là ang -> kết thúc hàm command. User sẽ không thấy đối tượng hiện sáng nữa vì đã kết thúc hàm command rồi.

 

Nếu bác viết như Tue_NV trong code trên thì Dưới tác dụng của hàm command -> lệnh rotate được thực hiện -> đối tượng trong tập ss được chọn và hiện sáng -> tâm cen được xác định, hàm getangle buộc dừng lại và chọn góc. Ngay tại thời điểm này đối tượng chọn ss được hiện sáng và user phải dừng lại nhập góc do tác động của hàm getangle và user nhập góc xong mới kết thúc hàm command. Và User sẽ thấy đối tượng hiện sáng vì nó đang ở trạng thái......dừng lại

 

Chào bác Tue_NV,

Bác thử sử dụng hàm sau để cho người sử dụng nhập góc bằng cả hai cách nhập số và nhập line xem nhé:

(defun ng (g / a ln lst)
(setq a (getreal "\n Nhap goc theo do: "))
(if (= a nil)
(progn
(setq ln (entsel "\n Chon line ")
     lst (entget (car ln))
     g (angle (cdr (assoc 10 lst)) (cdr (assoc 11 lst)))
)
)
(setq g (* pi (/ a 180)))
)
)

Có những trường hợp như vậy và cũng có những trường hợp không là như vậy bác ạ

  • 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
gia_bach    1.442
........

Xem cái lisp của bác mình chưa hiểu tác dụng của cái hàm (or *ang* (setq *ang* (* (/ pi 4))))

Cái biến *ang* này có tác dụng gì, phải chăng hai cái dấu * trước và sau ang chỉ để phân biết với biến ang hay còn có tác dụng gì khác.

...............

Hai cái dấu * trước và sau ang chỉ để phân biệt đó là biến toàn cục (global).

Các biến khác (không có dấu *) là biến địa phương, nên giải phóng sau khi kết thúc lệnh (đặt vào trong dấu ngoặc sau tên lệnh)

(defun c: ten_lenh(/ tên_các_biến_địa_phương)

Tác dụng của biến toàn cục chắc bác rõ rồi : vẫn tồn tại sau khi kết thúc lệnh

 

(or *ang* (setq *ang* (/ pi 4)))

tương đương với

(if (not *ang*) (setq *ang* (/ pi 4)))

Hai dòng trên đều kiểm tra xem có biến *ang* chưa, nếu chưa có gán giá trị (/ pi 4) cho nó.

Nhưng về cú pháp dòng phía trên ngắn hơn dòng phía dưới 1 phép toán not : *ang*(not *ang*)

 

Bác thử sử dụng hàm sau để cho người sử dụng ... nhập line xem nhé:

.............

(angle (cdr (assoc 10 lst)) (cdr (assoc 11 lst)))

...............

@ phamthanhbinh : Hàm của bác trả về góc của 2 điểm, tuy nhiên đường thẳng AB (từ A đến B ) và đường thẳng BA (từ B đến A) có chiều ngược nhau nên góc chênh nhau 180 độ.

Do đó đôi khi kết quả trả về không như mong đợi (xác suất là 50-50).

 

Bác ráng làm cho Lisp pick luôn cả Line đê. Tkx
@ Phiphi- : có lẽ bác muốn tiết kiệm thời gian (bớt đi 1 lần pick điểm), nhưng như phân tích ở trên, với xác suất là 50-50 thì thục sự cũng không bớt được thời gian.
  • 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
duongepu    0

Vâng chào bác phamthanhbinh.Em đang phải làm đồ án môn học thui về AuoLISP.Đó là mô phỏng và lập trình AutoLISP về con dao xọc răng mà em đã post ở bài trên.Mà hiện giờ em chưa hiểu về rõ AutoLISP lắm nên không bjết bắt đầu từ đâu.Em cũng đã học qua về lập trình C rùi,em thấy nó cũng giống AutoLISP nhưng những câu lẹnh hơi khó hiểu.nhìn nó rối thế nào ý.

Nên em mong diễn đàn giúp.Với lại cho em hỏi: Từ một bản vẽ của CAD có suất ra được chương trình của LISP không ạ.Vì từ LISP có thể vẽ được CAD.Nên em mong bác and điễn đàn giải thích giúp em với.

Em 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
Phiphi-    175
@ phamthanhbinh : Hàm của bác trả về góc của 2 điểm, tuy nhiên đường thẳng AB (từ A đến B ) và đường thẳng BA (từ B đến A) có chiều ngược nhau nên góc chênh nhau 180 độ.

Do đó đôi khi kết quả trả về không như mong đợi (xác suất là 50-50).

 

@ Phiphi- : có lẽ bác muốn tiết kiệm thời gian (bớt đi 1 lần pick điểm), nhưng như phân tích ở trên, với xác suất là 50-50 thì thục sự cũng không bớt được thời gian.

Vậy thì Bác viết thêm đoạn code để các Text luôn là readable thì vấn đề pick Line/Pline vẩn được mà.

PP thấy pick Line thì tiện lợi hơn. Cheers!

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    3.123
Vâng chào bác phamthanhbinh.Em đang phải làm đồ án môn học thui về AuoLISP.Đó là mô phỏng và lập trình AutoLISP về con dao xọc răng mà em đã post ở bài trên.Mà hiện giờ em chưa hiểu về rõ AutoLISP lắm nên không bjết bắt đầu từ đâu.Em cũng đã học qua về lập trình C rùi,em thấy nó cũng giống AutoLISP nhưng những câu lẹnh hơi khó hiểu.nhìn nó rối thế nào ý.

Nên em mong diễn đàn giúp.Với lại cho em hỏi: Từ một bản vẽ của CAD có suất ra được chương trình của LISP không ạ.Vì từ LISP có thể vẽ được CAD.Nên em mong bác and điễn đàn giải thích giúp em với.

Em cảm ơn!

Chào bạn duongepu,

Vậy là mình hiểu rồi. Bạn muốn học lập trình bằng lisp. Rất tốt là bạn cũng đã biết lập trình bằng ngôn ngữ C. Về cơ bản nguyên tắc của việc lập trình bằng bất cứ ngôn ngữ nào thì cũng giống nhau cả thôi, có khác chăng là về cách thể hiện của từng ngôn ngữ mà thôi. Nó cũng như bạn học ngoại ngữ vậy, bạn phải biết cách thể hiện suy nghĩ của mình để người khác có thể hiểu được thì ở đây là bạn phải biết cách thể hiện suy nghĩ của mình cho cái máy tính nó hiểu và nó thực hiện theo đúng ý bạn.

Với bất kỳ một chương trình nào bạn cũng cần phải biết được Input của nó là gì và output của nó là gì. Quá trình bạn muốn xử lý các input để cho ra được out put chính là cái việc lập trình đó.

Với bài toán của bạn input chính là các kích thước của con dao, còn output là cái hình bạn muốn vẽ. Do vậy quá trình xử lý của bạn khá đơn giản, có thể hình dung thành các bước như như sau:

1/- chọn điểm gốc

2/- tính toán xác định tọa độ tương đối của các điểm cần thiết trên biên dạng dao

3/- sử dụng các lệnh của cad để xác định các điểm này trên bản vẽ.

4/- sử dụng các lệnh của cad để nối các điểm này thành hình như bạn muốn.

5/- sử dụng các lệnh của cad để tạo các kích thước, hatch mặt cắt, các ghi chú, vv....

Trong quá trình trên có thể xen lẫn giữa việc xác định điểm và việc vẽ để hình thành từng phần riêng của bản vẽ bạn ạ.

 

Để chọn điểm gốc bạn có thể sử dụng hàm (setq p0 (getpoint "\n Chon diem tuy y"))

Để xác định các điểm có tọa độ tương đối với điểm p0 là x1, y1 bạn có thể sử dụng hàm (setq p1 (list (+ (car p0) x1) (+ (cadr p0) y1)))

Để xác định diểm có tọa độ tương đối độc cực với điểm p0 là pi/4 , d bạn có thể dùng hàm (setq p1 (polar p0 (/ pi 4) d))

Để sử dụng các lệnh trong cad bạn có thể dùng hàm (command "tênlệnh" "t1" "t2" ....) với t1, t2 .... là các tham số của lệnh này.

Ví dụ để vẽ một line từ điểm p1 tới p2 bạn dùng (command "line" p1 p2 "")

để vẽ một vòng tròn tâm là p1, bán kính d bạn dùng (command "circle" p1 d).....

 

Để hiểu và ứng dụng tốt lisp bạn nên tìm hiểu và đọc thêm trong Help Developer của CAD, trong đó nêu khá rõ về cú pháp cũng như cách dùng các hàm của lisp bạn ạ.

Vài hướng dẫn đơn giản như vậy để bạn có thể bắt đầu, mong rằng bạn sẽ mạnh dạn làm thử để thấy rõ hơn và yêu lisp hơn.

Nếu bạn gặp khó khăn hãy post lên mọi người sẽ hướng dẫn bạn hoàn thành được cái lisp này, đừng ngại bạn nhé.

Chúc bạn vui.

 

@ Bác Tue_NV: Hình như bác có hiểu nhầm ý mình thì phải, (Reply : Cách của Tue_NV vừa nhập được cả góc trực tiếp theo độ vừa nhập nhập góc bằng cách pick điểm. Bác đã test lại thử chưa?)

Ý của mình nói rằng lisp của bác có ưu điểm hơn lisp của mình chính là cái chỗ này mà, mặc dầu nó có hơi dài hơn một tẹo.

@ Bác Tue_NV và bác Giabach: Để giải quyết cái góc của line này cần phải biết được ý của người dùng khi định dùng line thay cho việc nhập góc. Có thể kết hợp thêm một hàm điều kiện nữa để xác định góc này mà, phải không ạ. Cái hàm này sẽ căn cứ vào ý của bác Phi phi ta sẽ giải quyết được phải không các bác.

  • 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
Tue_NV    3.841

Chào PhiPhi . Bạn thử Code này xem nhé :

1. Lisp này quay các đối tượng nằm trong đường tròn và giao với đường tròn 1 góc ang tại tâm đường tròn Cỉcle, chấp nhận đối tượng là Block có 1 vòng tròn ở ngoài như bản vẽ mà Phiphi đã upload

2. Việc nhập góc theo 1 trong 2 dạng:

a. Chọn Line -> Lúc này Lisp sẽ hiện sáng vòng tròn và yêu cầu bạn chọn Line để quay đối tượng theo phương và hướng của Line và góc của Line hợp với trục OX bao giờ cũng nhỏ hơn 180 độ. Nếu bạn không muốn nhập góc dạng a thì nhấn Enter để nhập góc dạng b

b. Nhập góc theo cách nhập từ bàn phím hoặc pick điểm. Lúc này Lisp sẽ tự động chọn tâm đường tròn, dây tóc chuột tại tâm đường tròn, hiện sáng vòng tròn và bạn nhập góc từ bàn phím hoặc pick điểm

 

Lisp ưu tiên nhập góc theo dạng a theo ý của PhiPhi và Tue_NV cũng thấy nó hiệu quả. Phi phi sử dụng thử nhé :

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while (	(setq pt (vlax-curve-getPointAtParam obj sp)
	ptlst (cons pt ptlst)
	sp (+ inc sp)) )
	(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:mulro (/ sscir i n ent cen lstp ss ang vl ov angg)
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(setq sscir (ssget (list (cons 0 "CIRCLE,INSERT")))
n (sslength sscir)
i 0
)
(or *ang* (setq *ang* (* (/ pi 4))))
(while (	(setq ent (ssname sscir i)
	cen (cdr (assoc 10 (entget ent)))
)
;Xu ly Circle
(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
(progn 
(setq lstp (traceCircle (setq ob (vlax-ename->vla-object ent))) )

 (if (and (setq ss (ssget "cp" lstp)) (> (sslength ss) 1))
(progn  (setq angg (/ (* 180 (ng)) pi) )
	;(vla-highlight ob :vlax-true)
	(command "rotate" ss "" cen angg )
)
 )
);progn
);if
;Xu ly Block
(if (= (cdr (assoc 0 (entget ent))) "INSERT")
(progn 
(setq ob (vlax-ename->vla-object ent) )
(foreach x (vlax-invoke ob 'explode)
  (if (= (vlax-get x 'ObjectName) "AcDbCircle")
    (progn
	(setq cen (vlax-safearray->list (variant-value (vla-get-Center x)))
      angg (/ (* 180 (ng)) pi) )
(command "rotate" ent "" cen angg )
(vla-erase x)
     ) (vla-erase x)
   );if
);foreach 

);progn
);if

(setq i (1+ i))
;(if ang (setq *ang* ang))
);while
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)
;
(defun ng (/ lst)
(or *ang* (setq *ang* (* (/ pi 4))))
(vla-highlight ob :vlax-true)

(if (setq ln (entsel "\n Chon line hoac enter de nhap goc "))
(progn
(vla-highlight ob :vlax-true)

(setq lst (entget (car ln))
	ang (angle (cdr (assoc 10 lst)) (cdr (assoc 11 lst))))
(if (> ang pi)
     (progn 
	(setq ang (- ang pi))
	  (if (> ang (/ pi 2)) (setq ang (- ang pi)))
	(setq *ang* ang)
     )
	(setq *ang* ang)
)

)
   (progn
(setq ang (getangle cen (strcat "\nNhap goc muon quay  : ")))
(if (not ang) (setq ang *ang*) (setq *ang* ang))
   )
)
ang
)

@Bác PhamThanhBinh : Khi viết Lisp, em chỉ quan tâm đến hiệu quả của việc sử dụng Lisp -> làm sao để sử dụng cho nó có hiệu quả nhất, việc nhập số liệu sao cho trực quan nhất, chứ không quan tâm đến độ dài, ngắn, đơn giản hay phức tạp của code. Em chắc rằng bác cũng đồng ý với ý kiến của em vì từ trước đến giờ bác viết khá nhiều code mà không quan tâm đến hiệu quả code là điều vô lý, còn việc bác có quan tâm đến độ dài, ngắn, đơn giản hay phức tạp của code thì em không biết ạ.

:(

Chỉnh sửa theo Tue_NV
Đã sửa lại lỗi theo bài viết số 713 của PhiPhi
  • 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
duongepu    0

:( Vâng em cảm ơn pác.Em cũng đã hiểu chút it rùi.Cho em hỏi là mình muốn lập trình AutoLISP theo 3D của cái hình con dao đó thì có khác gì so với lập trình theo kiểu 2D không và có những lệnh gì khác nhau ạ?

Còn từ CAD có thể suất ra chương trình của LISP không ạ?

Mong bác và diễn đàn giúp em.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
Phiphi-    175
Lisp ưu tiên nhập góc theo dạng a theo ý của PhiPhi và Tue_NV cũng thấy nó hiệu quả. Phi phi sử dụng thử nhé :

Cám ơn Tue_NV đã viết Lisp trên. Nhân có bạn ngt266 yêu cầu Lisp quay đối tượng nên PP muốn đề nghị các Bác phát triển thêm vài function nhằm giúp Drafters có thể áp dụng tiện ích của Lisp trên cho công việc hàng ngày. Việc dùng các Tag này khá phổ biến.

Có 1 lỗi nhỏ khi dùng:

Command: mulro

Select objects: Specify opposite corner: 8 found

Select objects:

Chon line hoac enter de nhap goc

Nhap goc muon quay < 180 > : 45

Chon line hoac enter de nhap goc

Nhap goc muon quay < 45 > : (enter)

; error: bad argument type: numberp: nil

Khi góc quay giống nhau thì nên enter thay vì phải nhập lại góc. Nhờ Tue_VN sửa lổi này. Tkx

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    3.841
Cám ơn Tue_NV đã viết Lisp trên. Nhân có bạn ngt266 yêu cầu Lisp quay đối tượng nên PP muốn đề nghị các Bác phát triển thêm vài function nhằm giúp Drafters có thể áp dụng tiện ích của Lisp trên cho công việc hàng ngày. Việc dùng các Tag này khá phổ biến.

Có 1 lỗi nhỏ khi dùng:

Command: mulro

Select objects: Specify opposite corner: 8 found

Select objects:

Chon line hoac enter de nhap goc

Nhap goc muon quay : 45

Chon line hoac enter de nhap goc

Nhap goc muon quay : (enter)

; error: bad argument type: numberp: nil

Khi góc quay giống nhau thì nên enter thay vì phải nhập lại góc. Nhờ Tue_VN sửa lổi này. Tkx

Đã sửa lại lỗi theo ý của PhiPhi. Phiphi check lại nhé. (Bài viết số 711)

Phiphi cứ nêu yêu cầu phát triển function. Nếu trong khả năng của Tue_NV sẽ làm hết mình. Còn nếu nằm ngoài khả năng của mình thì có các bác trên diễn đàn hỗ trợ rồi mà. Tue_NV nói đúng không Phiphi?

 

@duongepu : Bạn có thể gõ lệnh Vlide -> Ấn Ctrol+N (New) để viết chương trình Lisp và lưu nó dưới dạng đuôi .lsp

(Hoặc vào Tool -> AutoLisp -> Visual Lisp Editor)

  • 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    3.123
Chào PhiPhi . Bạn thử Code này xem nhé :

1. Lisp này quay các đối tượng nằm trong đường tròn và giao với đường tròn 1 góc ang tại tâm đường tròn Cỉcle, chấp nhận đối tượng là Block có 1 vòng tròn ở ngoài như bản vẽ mà Phiphi đã upload

2. Việc nhập góc theo 1 trong 2 dạng:

a. Chọn Line -> Lúc này Lisp sẽ hiện sáng vòng tròn và yêu cầu bạn chọn Line để quay đối tượng theo phương và hướng của Line và góc của Line hợp với trục OX bao giờ cũng nhỏ hơn 180 độ. Nếu bạn không muốn nhập góc dạng a thì nhấn Enter để nhập góc dạng b

b. Nhập góc theo cách nhập từ bàn phím hoặc pick điểm. Lúc này Lisp sẽ tự động chọn tâm đường tròn, dây tóc chuột tại tâm đường tròn, hiện sáng vòng tròn và bạn nhập góc từ bàn phím hoặc pick điểm

 

Lisp ưu tiên nhập góc theo dạng a theo ý của PhiPhi và Tue_NV cũng thấy nó hiệu quả. Phi phi sử dụng thử nhé :

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while (	(setq pt (vlax-curve-getPointAtParam obj sp)
	ptlst (cons pt ptlst)
	sp (+ inc sp)) )
	(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:mulro (/ sscir i n ent cen lstp ss ang vl ov angg)
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(setq sscir (ssget (list (cons 0 "CIRCLE,INSERT")))
n (sslength sscir)
i 0
)
(or *ang* (setq *ang* (* (/ pi 4))))
(while (	(setq ent (ssname sscir i)
	cen (cdr (assoc 10 (entget ent)))
)
;Xu ly Circle
(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
(progn 
(setq lstp (traceCircle (setq ob (vlax-ename->vla-object ent))) )

 (if (and (setq ss (ssget "cp" lstp)) (> (sslength ss) 1))
(progn  (setq angg (/ (* 180 (ng)) pi) )
	;(vla-highlight ob :vlax-true)
	(command "rotate" ss "" cen angg )
)
 )
);progn
);if
;Xu ly Block
(if (= (cdr (assoc 0 (entget ent))) "INSERT")
(progn 
(setq ob (vlax-ename->vla-object ent) )
(foreach x (vlax-invoke ob 'explode)
  (if (= (vlax-get x 'ObjectName) "AcDbCircle")
    (progn
	(setq cen (vlax-safearray->list (variant-value (vla-get-Center x)))
      angg (/ (* 180 (ng)) pi) )
(command "rotate" ent "" cen angg )
(vla-erase x)
     ) (vla-erase x)
   );if
);foreach 

);progn
);if

(setq i (1+ i))
;(if ang (setq *ang* ang))
);while
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)
;
(defun ng (/ lst)
(or *ang* (setq *ang* (* (/ pi 4))))
(vla-highlight ob :vlax-true)

(if (setq ln (entsel "\n Chon line hoac enter de nhap goc "))
(progn
(vla-highlight ob :vlax-true)

(setq lst (entget (car ln))
	ang (angle (cdr (assoc 10 lst)) (cdr (assoc 11 lst))))
(if (> ang pi)
     (progn 
	(setq ang (- ang pi))
	  (if (> ang (/ pi 2)) (setq ang (- ang pi)))
	(setq *ang* ang)
     )
	(setq *ang* ang)
)

)
   (progn
(setq ang (getangle cen (strcat "\nNhap goc muon quay  : ")))
(if (not ang) (setq ang *ang*) (setq *ang* ang))
   )
)
ang
)

@Bác PhamThanhBinh : Khi viết Lisp, em chỉ quan tâm đến hiệu quả của việc sử dụng Lisp -> làm sao để sử dụng cho nó có hiệu quả nhất, việc nhập số liệu sao cho trực quan nhất, chứ không quan tâm đến độ dài, ngắn, đơn giản hay phức tạp của code. Em chắc rằng bác cũng đồng ý với ý kiến của em vì từ trước đến giờ bác viết khá nhiều code mà không quan tâm đến hiệu quả code là điều vô lý, còn việc bác có quan tâm đến độ dài, ngắn, đơn giản hay phức tạp của code thì em không biết ạ.

:cheers:

Hề hề hề,

Cái nhà bác Tue_NV này chỉ được cái nói...... đúng. Thực tình mình cũng rất muốn vậy song do trình độ có hạn, kiến thức còn ngắn, nên lực bất tòng tâm. Đành là cứ cố theo cái mình có rồi post lên để mọi người chỉ bảo thêm. Ấy là cái cách mót của mình, chả thèm dấu cái dốt làm chi. Cùng lắm các bác có mắng mấy câu thì mình cũng hề hề hề thôi mà. Chả đi đâu mà thiệt. Mong các bác cứ mạnh tay mà phang, tiếng vậy chớ mình còn gân chán, còn chịu được nhiều nhiều cú phang nữa mà các bác ạ. Chớ có nể nang chi mà làm hỏng mất cái tinh thần học hỏi chung của diễn đàn. 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
phamthanhbinh    3.123
:cheers: Vâng em cảm ơn pác.Em cũng đã hiểu chút it rùi.Cho em hỏi là mình muốn lập trình AutoLISP theo 3D của cái hình con dao đó thì có khác gì so với lập trình theo kiểu 2D không và có những lệnh gì khác nhau ạ?

Còn từ CAD có thể suất ra chương trình của LISP không ạ?

Mong bác và diễn đàn giúp em.Thanks!

Hề hề,

Chào bạn duongepu,

Khác thì đương nhiên là có khác vì ngay trong cad vẽ 3D và 2D đã có các lệnh khác nhau rồi mà. Tỷ như vẽ 2D thì đâu có dùng tới lệnh extrude .....

Tuy nhiên bất cứ cái gì bạn dùng CAD vẽ được thì đều có thể dùng lisp để tạo ra nó bằng cách sử dụng các lệnh của CAD trong hàm command của lisp như mình đã nói ở bài trước bạn ạ.

Ví như để vẽ một solid trụ bạn dùng lệnh extrude thì trong lisp bạn sẽ viết câu lệnh như sau :

(command "extrude" (entsel "\n chọn vòng tròn đáy") "" h 0) trong đó h là chiều cao trụ, 0 là góc nghiêng đường sinh trụ .

Bạn cứ vậy mà thử với các lệnh 3D khác của cad sẽ hiểu rõ hơn cần làm gì khi dùng lisp để vẽ mô hình 3D.

Có điều cần nói lại với bạn là nếu việc dựng hình này chỉ làm một lần thì bạn chớ có dại mà dùng lisp vì thời gian bạn viết xong lisp có thể dựng đượng vài chục cái như vậy rồi bạn ạ.

Hề hề hề

Từ Cad bạn có thể xuất ra chương trình lisp bằng cách viết lại các lệnh bạn đã dùng trong cad theo ngôn ngử lisp. Nhớ là ngôn ngữ lisp chớ không phải slip đâu nha. Cái ngôn ngữ slip này chắc bạn phải tìm hiểu thêm trong các quán KARAOKE mới giỏi được. Hề hề hề.

Thực ra mình có nghe nói đến việc tạo Macro trong CAD nhưng chưa rành nó bạn ạ. Bạn thử tìm hiểu nó xem, may ra có thể giúp bạn xuất ra chương trình lisp nhanh hơn chăng. 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
Phiphi-    175

Lisp Tue_VN sửa lại lần này đã không những loại trừ lỗi nhỏ trên mà còn giải quyết được vấn đề mà Bác gia_bach đã nêu:

 

@ phamthanhbinh : Hàm của bác trả về góc của 2 điểm, tuy nhiên đường thẳng AB (từ A đến B ) và đường thẳng BA (từ B đến A) có chiều ngược nhau nên góc chênh nhau 180 độ.

Do đó đôi khi kết quả trả về không như mong đợi (xác suất là 50-50).

 

@ Phiphi- : có lẽ bác muốn tiết kiệm thời gian (bớt đi 1 lần pick điểm), nhưng như phân tích ở trên, với xác suất là 50-50 thì thục sự cũng không bớt được thời gian.

Vậy thì Bác viết thêm đoạn code để các Text luôn là readable thì vấn đề pick Line/Pline vẩn được mà.

PP thấy pick Line thì tiện lợi hơn. Cheers!

Bây giờ Lisp đã cho phép User dựa vào việc nhập góc, pick Point hoặc chọn Line để rotate các đối tượng trong circle kể cả dạng Block như bản vẽ PP upload.

Có lẽ cũng sẽ có User đề cập đến việc pick cả dạng Polyline, lúc đó bác Tue_NV sẽ phải ra tay lần nữa. Thanks Tue_VN.

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    3.841
Lisp Tue_VN sửa lại lần này đã không những loại trừ lỗi nhỏ trên mà còn giải quyết được vấn đề mà Bác gia_bach đã nêu:

Bây giờ Lisp đã cho phép User dựa vào việc nhập góc, pick Point hoặc chọn Line để rotate các đối tượng trong circle kể cả dạng Block như bản vẽ PP upload.

Có lẽ cũng sẽ có User đề cập đến việc pick cả dạng Polyline, lúc đó bác Tue_NV sẽ phải ra tay lần nữa. Thanks Tue_VN.

Có gì thì Phiphi cứ nêu yêu cầu 1 lượt rồi hoàn thành luôn, chớ lắc nhắc mệt lắm đó

Code này chấp nhận nhập góc khi pick vào LINE và cả PLINE nữa. Thử nhé.

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while (	(setq pt (vlax-curve-getPointAtParam obj sp)
	ptlst (cons pt ptlst)
	sp (+ inc sp)) )
	(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:mulro (/ sscir i n ent cen lstp ss ang vl ov angg)
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(if (setq sscir (ssget (list (cons 0 "CIRCLE,INSERT"))))
(progn 
(setq n (sslength sscir) i 0)
(or *ang* (setq *ang* (* (/ pi 4))))
(while (	(setq ent (ssname sscir i)
	cen (cdr (assoc 10 (entget ent)))
)
;Xu ly Circle
(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
(progn 
(setq lstp (traceCircle (setq ob (vlax-ename->vla-object ent))) )

 (if (and (setq ss (ssget "cp" lstp)) (> (sslength ss) 1))
(progn  (setq angg (/ (* 180 (ng)) pi) )
	;(vla-highlight ob :vlax-true)
	(command "rotate" ss "" cen angg )
)
 )
);progn
);if
;Xu ly Block
(if (= (cdr (assoc 0 (entget ent))) "INSERT")
(progn 
(setq ob (vlax-ename->vla-object ent) )
(foreach x (vlax-invoke ob 'explode)
  (if (= (vlax-get x 'ObjectName) "AcDbCircle")
    (progn
	(setq cen (vlax-safearray->list (variant-value (vla-get-Center x)))
      angg (/ (* 180 (ng)) pi) )
(command "rotate" ent "" cen angg )
(vla-erase x)
     ) (vla-erase x)
   );if
);foreach 

);progn
);if

(setq i (1+ i))
;(if ang (setq *ang* ang))
);while
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
);progn
(alert "\n Ban chua chon doi tuong nao ca")
);if
(princ)
)
;
(defun ng (/ lst dpick dpicktt pr ln)
(or *ang* (setq *ang* (* (/ pi 4))))
(vla-highlight ob :vlax-true)
(setvar "osmode" 512)


(if (setq p (getpoint "\n Chon 1 diem tren line hay Pline de quay hoac enter de nhap goc "))
(progn
(vla-highlight ob :vlax-true)
(setq ln (car (nentselp p)))
(setq lst (entget ln))
   (if (or (= (cdr(assoc 0 lst)) "LWPOLYLINE")
    (= (cdr(assoc 0 lst)) "POLYLINE")
       )
   (progn (setq  pr (vlax-curve-getParamAtPoint ln p)
	  dpick (vlax-curve-getPointAtParam ln pr)
	  dpicktt (vlax-curve-getPointAtParam ln (1+ (fix pr)) )
   )
   );progn
   );if

   (if (= (cdr(assoc 0 lst)) "LINE")
   (progn (setq  dpick (vlax-curve-getStartPoint ln)
	  dpicktt (vlax-curve-getEndPoint ln)
   )
   );progn
   );if
	 (setq  ang (angle dpick dpicktt))

(if (> ang pi)
     (progn 
	(setq ang (- ang pi))
	  (if (> ang (/ pi 2)) (setq ang (- ang pi)))
	(setq *ang* ang)
     )
	(setq *ang* ang)
)

)
   (progn
(setq ang (getangle cen (strcat "\nNhap goc muon quay  : ")))
(if (not ang) (setq ang *ang*) (setq *ang* ang))
   )
)
ang
)

  • 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
gia_bach    1.442
Có gì thì Phiphi cứ nêu yêu cầu 1 lượt rồi hoàn thành luôn, chớ lắc nhắc mệt lắm đó

Code này chấp nhận nhập góc khi pick vào LINE và cả PLINE nữa. Thử nhé.

.......................

Đơn đặt hàng mới đê :

Có lẽ cũng sẽ có User đề cập đến việc pick cả Cung tròn (Arc), Cung ELLIPSE và góc của 1 Cung tròn trong PLine (Arc segments), ..........

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
Tue_NV    3.841
Đơn đặt hàng mới đê :

Có lẽ cũng sẽ có User đề cập đến việc pick cả Cung tròn (Arc), Cung ELLIPSE và góc của 1 Cung tròn trong PLine (Arc segments), ..........

Thanks all.

Thôi chết :cheers: , đang lúc dầu sôi lửa bỏng :cheers: (công việc đang dí ) mà anh gia_bách lại thảo ra cái đơn đặt hàng này :cheers: :cheers: . Cái này Tue_NV có thể làm được nhưng chưa có thời gian, đành hẹn anh gia_bach cùng các bạn ở 1 thời gian mà Tue_NV rỗi rãi công việc vậy. :cheers:

 

@Anh gia bach : Theo em hiểu là ý anh muốn quay các đối tượng trong và giao với Circle 1 góc bằng góc hợp bởi tiếp tuyến của Arc, Cung ELLIPSE và Arc segments của Pline so với trục OX phải không anh? Cảm ơn Anh.

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
gia_bach    1.442
Thôi chết :cheers: , đang lúc dầu sôi lửa bỏng :cheers: (công việc đang dí ) mà anh gia_bách lại thảo ra cái đơn đặt hàng này :cheers: :cheers: . Cái này Tue_NV có thể làm được nhưng chưa có thời gian, đành hẹn anh gia_bach cùng các bạn ở 1 thời gian mà Tue_NV rỗi rãi công việc vậy. :cheers:

 

@Anh gia bach : Theo em hiểu là ý anh muốn quay các đối tượng trong và giao với Circle 1 góc bằng góc hợp bởi tiếp tuyến của Arc, Cung ELLIPSE và Arc segments của Pline so với trục OX phải không anh? Cảm ơn Anh.

Ấy chết, Bác lại bổ sung thêm 1 Option nữa : góc hợp bởi tiếp tuyến của Arc, Cung ELLIPSE và Arc segment của Pline so với trục OX.

 

Ý tui là : tuơng tự việc pick LINE để lấy góc của 2 điểm đầu mút của Line đó, Lisp cho phép User pick cả Cung tròn (Arc), Cung ELLIPSE và Cung tròn trong PLine (Arc segment) để lấy góc của 2 điểm đầu mút của các đối tuợng đó.

Lisp của bác mới lấy đuợc góc của Line và Line-segments, với Arc-segment kết quả chưa chính xác.

 

Bác cứ thư thả (lúc này ai cũng bận cả), tập trung cho công việc kẻo "Xôi hỏng bỏng không" thì nguy to. :cheers:

  • 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
Tue_NV    3.841
......

Ý tui là : tuơng tự việc pick LINE để lấy góc của 2 điểm đầu mút của Line đó, Lisp cho phép User pick cả Cung tròn (Arc), Cung ELLIPSE và Cung tròn trong PLine (Arc segment) để lấy góc của 2 điểm đầu mút của các đối tuợng đó.

Lisp của bác mới lấy đuợc góc của Line và Line-segments, với Arc-segment kết quả chưa chính xác.

.....

Chào anh giabach

Lisp này Tue_NV viết theo ý của anh :

Lisp quay các đối tượng nằm trong đường tròn hoặc giao với đường tròn

 

Việc lấy góc theo như ý của anh gia_bach ở trên. User có thể enter để thực hiện việc nhập góc từ bàn phím hoặc pick điểm

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while ((setq pt (vlax-curve-getPointAtParam obj sp)
ptlst (cons pt ptlst)
sp (+ inc sp)) )
(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:mulro (/ sscir i n ent cen lstp ss ang vl ov angg)
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(if (setq sscir (ssget (list (cons 0 "CIRCLE,INSERT"))))
(progn 
(setq n (sslength sscir) i 0)
(or *ang* (setq *ang* (* (/ pi 4))))
(while ((setq ent (ssname sscir i)
cen (cdr (assoc 10 (entget ent)))
)
;Xu ly Circle
(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
(progn 
(setq lstp (traceCircle (setq ob (vlax-ename->vla-object ent))) )

(if (and (setq ss (ssget "cp" lstp)) (> (sslength ss) 1))
(progn (setq angg (/ (* 180 (ng)) pi) )
;(vla-highlight ob :vlax-true)
(command "rotate" ss "" cen angg )
)
)
);progn
);if
;Xu ly Block
(if (= (cdr (assoc 0 (entget ent))) "INSERT")
(progn 
(setq ob (vlax-ename->vla-object ent) )
(foreach x (vlax-invoke ob 'explode)
(if (= (vlax-get x 'ObjectName) "AcDbCircle")
(progn
(setq cen (vlax-safearray->list (variant-value (vla-get-Center x)))
angg (/ (* 180 (ng)) pi) )
(command "rotate" ent "" cen angg )
(vla-erase x)
) (vla-erase x)
);if
);foreach 

);progn
);if

(setq i (1+ i))
;(if ang (setq *ang* ang))
);while
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
);progn
(alert "\n Ban chua chon doi tuong nao ca")
);if
(princ)
)
;
(defun ng (/ lst dpick dpicktt pr ln)
(or *ang* (setq *ang* (* (/ pi 4))))
(vla-highlight ob :vlax-true)
(setvar "osmode" 512)


(if (setq p (getpoint "\n Chon 1 diem tren line hay Pline de quay hoac enter de nhap goc ")) 
(progn
(vla-highlight ob :vlax-true)
(setq ln (car (nentselp p)))
(setq lst (entget ln))
(if (wcmatch (cdr(assoc 0 lst)) "*POLYLINE")
(progn (setq pr (vlax-curve-getParamAtPoint ln p)
dpick (vlax-curve-getPointAtParam ln (fix pr))
dpicktt (vlax-curve-getPointAtParam ln (1+ (fix pr)) )
)
);progn
);if

(if (wcmatch (cdr(assoc 0 lst)) "LINE,ELLIPSE,ARC")
(progn (setq dpick (vlax-curve-getStartPoint ln)
dpicktt (vlax-curve-getEndPoint ln)
)
);progn
);if
(setq ang (angle dpick dpicktt))

(if (> ang (/ pi 2))
(progn 
(setq ang (- ang pi))
(if (> ang (/ pi 2)) (setq ang (- ang pi)))
(setq *ang* ang)
)
(setq *ang* ang)
)

)
(progn
(setq ang (getangle cen (strcat "\nNhap goc muon quay  : ")))
(if (not ang) (setq ang *ang*) (setq *ang* ang))
)
)
ang
)

  • 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

Xin các anh giúp đỡ cho em 1 lip để có thể xác định được tỷ lệ hiện hành. Em thường phải dùng rất là nhiều cái bản vẽ gom lại nên rất là nhiều tỷ lệ. ghi la 1/50 nhưng em dùng tỷ lệ 1/50 thi không đúng. rất mong các anh chỉ cách hoặt cho em xin 1 lip nhu vậy. Xin chân thành 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
hdt4151    1

Xin các bạn giúp mình 2 lisp sau:

 

1. Trong bản vẽ có nhiều text (DText) ghi các cao độ. Mình muốn mỗi cao độ đó cộng thêm 2 (hay 1 số khác, yêu cầu nhập vào trước).

 

2. Mình có 100 text có sẵn (vd như thế, có thể là 1 số bất kì), và cũng có 100 text khác, mình cần lisp đổi tên của 100 text ban đầu thành tên của 100 text kia theo thứ tự đã chọn. Lí do là 100 text ban đầu đã được sắp xếp ở các vị trí cố định, 100 text kia nằm rời rạc, nếu phải di chuyển sắp xếp sẽ rất mất thời gian.

 

- Có thể làm 1 lisp khác đơn giản hơn, click vào 1 text A, click tiếp vào text B, text A sẽ được đổi tên thành text B.

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
Phiphi-    175
...

- Có thể làm 1 lisp khác đơn giản hơn, click vào 1 text A, click tiếp vào text B, text A sẽ được đổi tên thành text B.

Dùng lệnh SWAP để đổi text lẫn nhau

;==========================================================
;Written by Len Nemirovsky                      March 2000
;Better Than Nothing Autolisp [url="http://www.wport.com/~nemi"]http://www.wport.com/~nemi[/url] 
;==========================================================
(defun c:swap (/ l1 lll1 ll1 lin1 line1 l2 lll2 ll2 line2 
                med1 med2)
  (setq l1 (nentsel "\nSelect First Line of text: "))
  (if (= l1 nil)(exit))
  (setq lll1 (car l1))
  (redraw lll1 3)
  (setq ll1 (entget (car l1)))
  (setq lin1 (cdr (assoc 0 ll1))) 
  (setq line1 (cdr (assoc 1 ll1)))
  (if (= line1 nil)(exit))
    (setq l2 (nentsel "\nSelect Second Line of text: "))
    (setq lll2 (car l2))
    (redraw lll2 3)
    (setq ll2 (entget (car l2)))
    (setq lin2 (cdr (assoc 0 ll2)))
    (setq line2 (cdr (assoc 1 ll2)))
    (if (= line2 nil)(exit))

     (setq med1 ll1)
     (setq med1 
               (subst (cons 1 line2)
                      (assoc 1 med1)
                      med1
               )
     )
     (entmod med1)

     (setq med2 ll2)
     (setq med2 
               (subst (cons 1 line1)
                      (assoc 1 med2)
                      med2
               )
     )
     (entmod med2)
(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
duongepu    0

Chào các bác.từ khi tham gia diễn đàn em cũng học hỏi các anh trong diễn đàn được chút ít.

em mới viết được 1 chương trình lisp xem các pác xem giúp em.

Còn phần đồ án của em .Vì đây là lần đầu làm nên em chưa có nhiều hiểu biết về cách trình bày của 1 đồ án môn học về lập trình như thế này .Em mới trình bày được một ít mong các anh hãy góp cho em xem em phải trình bày như thế nào em cảm ơn.

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

×