Đế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

#661 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 31 December 2009 - 09:53 AM

Các cao thủ CadViet cho mình hỏi thế này: Mình có 1 đa giác kín, muốn chọn các đối tượng năm trong đa giác đó thì khi viết lisp sẽ dùng lựa chọn đối tượng theo cách "CP" hoặc "WP" với danh sách điểm là các đỉnh của đa giác đó. Tuy nhiên nếu đa giác đó là đa giác lồi thì không có vân đề gì, còn với đa giác lõm có hình phức tạp thì thường bị lỗi. Đấy là theo suy nghĩ của mình, bác nào có cách nào hay hoặc khắc phục nhược điểm trên của mình chỉ giúp với nhé. Xin cảm ơn.
  • 0

#662 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 31 December 2009 - 10:18 AM

...........
với đa giác lõm có hình phức tạp thì thường bị lỗi.
...............

phức tạp cỡ nào ?
Bạn có thể cho xem tí đuợc không ? :(
Upload file CAD .........
  • 1

#663 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 31 December 2009 - 10:57 AM

Các cao thủ CadViet cho mình hỏi thế này: Mình có 1 đa giác kín, muốn chọn các đối tượng năm trong đa giác đó thì khi viết lisp sẽ dùng lựa chọn đối tượng theo cách "CP" hoặc "WP" với danh sách điểm là các đỉnh của đa giác đó. Tuy nhiên nếu đa giác đó là đa giác lồi thì không có vân đề gì, còn với đa giác lõm có hình phức tạp thì thường bị lỗi. Đấy là theo suy nghĩ của mình, bác nào có cách nào hay hoặc khắc phục nhược điểm trên của mình chỉ giúp với nhé. Xin cảm ơn.

Theo mình nghĩ lỗi đó đơn thuần là do Cad. Do hình phức tạp mà bạn zoom nhỏ thì việc lựa chọn đối tượng sẽ bị sai số. Cách để giảm sai số là bạn phải chia miền thành nhiều miền nhỏ thôi. Cho quét qua từng miền, đến miền nào thì zoom extend miền đó
  • 1

#664 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 31 December 2009 - 01:42 PM

Gửi bạn Lisp quay tất cả đối tuợng trong đuờng tròn.
...

Khi PP chuyển các Text sang Attribute rồi làm thành Block để User dể dàng sử dụng thì Lisp của các Bác gia_bach, phamthanhbinh và Tue_NV không thể rotate các Block này được. Xin các bác giúp update Lisp trên để có thể rotate được cả các Block, đồng thời thêm khả năng chọn Line thay vì phải nhập góc muốn quay. Chắc Lisp này sẽ được nhiều Drafters sử dụng. Nếu được thì xin các Bác viết luôn Lisp dùng insert cái Block đó rồi chọn Line để rotate các đối tuợng trong đuờng tròn. Xin xem bản vẽ minh hoạ dưới đây. Thanks you
http://www.cadviet.c...otate_block.dwg

Hình đã gửiHình đã gửi
  • 0

#665 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 31 December 2009 - 03:32 PM

Khi PP chuyển các Text sang Attribute rồi làm thành Block để User dể dàng sử dụng thì Lisp của các Bác gia_bach, phamthanhbinh và Tue_NV không thể rotate các Block này được. Xin các bác giúp update Lisp trên để có thể rotate được cả các Block, đồng thời thêm khả năng chọn Line thay vì phải nhập góc muốn quay. Chắc Lisp này sẽ được nhiều Drafters sử dụng. Nếu được thì xin các Bác viết luôn Lisp dùng insert cái Block đó rồi chọn Line để rotate các đối tuợng trong đuờng tròn. Xin xem bản vẽ minh hoạ dưới đây. Thanks you
http://www.cadviet.c...otate_block.dwg

Hình đã gửiHình đã gửi

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 (< 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)
(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 (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 < " (angtos *ang*) " > : "))))
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 < " (angtos *ang*) " > : "))))
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)
)

  • 1

#666 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 31 December 2009 - 03:53 PM

.........
Xin các bác giúp update Lisp trên để có thể rotate được cả các Block, đồng thời thêm khả năng chọn Line thay vì phải nhập góc muốn quay.
.........................

Gửi bác Lisp quay Block thuộc tính tại điểm chèn.
góc có thể nhập trực tiếp hoặc Pick 2 điểm.
(defun c:rob(/ ang doc ov vl)               ;Rotate Block at Center
;; By : Gia Bach, Copyrightゥ December 2009 ;;
;; Contact : gia_bach @ www.CadViet.com ;;
(defun *error* (msg)
(if ov (mapcar 'setvar vl ov))
(if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
(princ (strcat "\n** Error: " msg " **")))
(princ))
(vl-load-com)
(setq doc (vla-get-activedocument(vlax-get-acad-object))
vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(33 0 0))
(or *ang* (setq *ang* (/ pi 4)))
(princ "\n Chon Block de quay :")
(while (ssget (list (cons 0 "INSERT")(cons 62 1)))
(setq ang (getangle (strcat "\nNhap goc muon quay <" (angtos *ang*) "> hay Pick diem : ")))
(if ang (setq *ang* ang))
(vlax-for e (vla-get-activeSelectionSet doc)
(vla-rotate e (vla-get-InsertionPoint e) *ang*))
(princ "\n Chon Block de quay :")
)
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)

  • 1

#667 Trần Diệu Nhân

Trần Diệu Nhân

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 31 December 2009 - 04:21 PM

Mình muốn có một lisp thực hiện 2 lệnh sau:
F (fillet) enter
R (rectangle) enter
0 enter
Mong được giúp đỡ! :(
  • 0

#668 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 31 December 2009 - 04:31 PM

Mình muốn có một lisp thực hiện 2 lệnh sau:
F (fillet) enter
R (rectangle) enter
0 enter
Mong được giúp đỡ! :(

Mại dzô : Link
  • 0

#669 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 31 December 2009 - 04:32 PM

Mình muốn có một lisp thực hiện 2 lệnh sau:
F (fillet) enter
R (rectangle) enter
0 enter
Mong được giúp đỡ! :(

Muốn giúp nhưng hông hiểu.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#670 Trần Diệu Nhân

Trần Diệu Nhân

    biết vẽ ellipse

  • Members
  • PipPip
  • 58 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 31 December 2009 - 05:41 PM

thay vì phải lặp lại lệnh fillet (F), nhập tiếp tham số ®, rồi nhập tiếp tham số (0) mất công. Em muốn có Lisp thực hiện công việc trên. Cảm ơn bác Duy nhiều :rolleyes:
@all: sorry ở trên em nói nhầm tham số R. hi hi :(
  • 0

#671 duongepu

duongepu

    biết zoom

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

Đã gửi 31 December 2009 - 06:13 PM

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

#672 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 31 December 2009 - 08:17 PM

thay vì phải lặp lại lệnh fillet (F), nhập tiếp tham số ®, rồi nhập tiếp tham số (0) mất công. Em muốn có Lisp thực hiện công việc trên. Cảm ơn bác Duy nhiều :rolleyes:
@all: sorry ở trên em nói nhầm tham số R. hi hi :(

Cái này bạn Nhập Bán kính bo có 1 lần rồi sử dụng cho các lần sau mà.
Nếu bạn thích thì đây :
(defun c:fr()
(setvar "FILLETRAD" 0)
(command "fillet" pause)
)

  • 1

#673 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 31 December 2009 - 08:34 PM

Gửi bác Lisp quay Block thuộc tính tại điểm chèn.
góc có thể nhập trực tiếp hoặc Pick 2 điểm.

(defun c:rob(/ ang doc ov vl)               ;Rotate Block at Center
;; By : Gia Bach, Copyrightゥ December 2009 ;;
;; Contact : gia_bach @ www.CadViet.com ;;
(defun *error* (msg)
(if ov (mapcar 'setvar vl ov))
(if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
(princ (strcat "\n** Error: " msg " **")))
(princ))
(vl-load-com)
(setq doc (vla-get-activedocument(vlax-get-acad-object))
vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(33 0 0))
(or *ang* (setq *ang* (/ pi 4)))
(princ "\n Chon Block de quay :")
(while (ssget (list (cons 0 "INSERT")(cons 62 1)))
(setq ang (getangle (strcat "\nNhap goc muon quay <" (angtos *ang*) "> hay Pick diem : ")))
(if ang (setq *ang* ang))
(vlax-for e (vla-get-activeSelectionSet doc)
(vla-rotate e (vla-get-InsertionPoint e) *ang*))
(princ "\n Chon Block de quay :")
)
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ)
)

Bác ráng làm cho Lisp pick luôn cả Line đê. Tkx
  • 0

#674 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 31 December 2009 - 10:54 PM

Từ một yêu cầu của e mà các bác phát triển ra nhìu ghê.. Thật là hay quá. Chúc anh em diễn đàn năm mới tốt lành nha!!!
  • 0

#675 nqt266

nqt266

    biết vẽ circle

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

Đã gửi 31 December 2009 - 11:02 PM

Xin hỏi mọi người: Với mỗi lệnh Autocad hay phần mềm trên nền Cad thì chắc đều có code lệnh đó dạng Visual Lisp, vậy code này mình có thể xem được ở đâu trong bộ cài Cad!!!
  • 0

#676 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 - 12:02 PM

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

#677 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 - 01:16 PM

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 (< 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)
(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 (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 < " (angtos *ang*) " > : "))))
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 < " (angtos *ang*) " > : "))))
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)))
)
)

  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#678 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 - 02:07 PM

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

#679 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

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

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 < " (angtos *ang*) " > : ")))) 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 < " (angtos *ang*) " > : ")))) 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 ạ
  • 2

#680 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 01 January 2010 - 03:19 PM

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