Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#681 duongepu

duongepu

    biết zoom

  • Members
  • Pip
  • 10 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 January 2010 - 03:30 PM

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!
  • 0

#682 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 01 January 2010 - 04:17 PM

@ 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!
  • 0

#683 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 01 January 2010 - 09:54 PM

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.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#684 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 January 2010 - 06:22 AM

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 (< sp ep)
(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 (< i n)
(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 < " (angtos *ang*) " > : ")))
(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 ạ.
:(

Bài viết đã được chỉnh sửa nội dung bởi Tue_NV: 02 January 2010 - 01:30 PM
Đã sửa lại lỗi theo bài viết số 713 của PhiPhi

  • 3

#685 duongepu

duongepu

    biết zoom

  • Members
  • Pip
  • 10 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 02 January 2010 - 08:59 AM

:( 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!
  • 0

#686 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 02 January 2010 - 10:41 AM

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
  • 0

#687 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 January 2010 - 01:37 PM

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

Đã 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)
  • 1

#688 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 January 2010 - 03:08 PM

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 (< sp ep)
(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 (< i n)
(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 < " (angtos *ang*) " > : ")))
(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ề......
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#689 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 January 2010 - 03:42 PM

: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ề...
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#690 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 02 January 2010 - 07:45 PM

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.
  • 0

#691 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 03 January 2010 - 07:13 AM

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 (< sp ep)
(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 (< i n)
(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 < " (angtos *ang*) " > : ")))
(if (not ang) (setq ang *ang*) (setq *ang* ang))
)
)
ang
)

  • 2

#692 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 04 January 2010 - 09:21 AM

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.
  • 0

#693 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 04 January 2010 - 09:48 AM

Đơ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.
  • 0

#694 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 04 January 2010 - 11:01 AM

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:
  • 1

#695 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 04 January 2010 - 03:49 PM

......
Ý 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 (< sp ep)
(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 (< i n)
(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 < " (angtos *ang*) " > : ")))
(if (not ang) (setq ang *ang*) (setq *ang* ang))
)
)
ang
)

  • 1

#696 zizpo_hetxang

zizpo_hetxang

    biết vẽ arc

  • Members
  • PipPip
  • 45 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 04 January 2010 - 04:19 PM

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
  • 0

#697 hdt4151

hdt4151

    biết vẽ pline

  • Members
  • PipPip
  • 69 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 05 January 2010 - 09:54 AM

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.
  • 0

#698 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 05 January 2010 - 11:00 AM

...
- 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)
)

  • 1

#699 xuanvi80

xuanvi80

    biết pan

  • Members
  • Pip
  • 6 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 05 January 2010 - 04:07 PM

Có bác nào viết dùm mình cái lisp dùng để vẽ thang cáp điện cho nhanh không?
Mô tả thang cáp điện như trong bản vẽ đính kèm

http://www.cadviet.c...le_trunking.dwg

Cám ơn nhiều.
  • 0

#700 duongepu

duongepu

    biết zoom

  • Members
  • Pip
  • 10 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 January 2010 - 12:22 AM

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
  • 0