Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
ttmt_jses

Xin mọi người giúp đỡ Lisp Center mark.

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

Xin chào các anh chị và các bạn, mình là thành viên mới, rất mong được sự giúp đỡ của tất cả mọi người.

Minh rất thích tìm hiểu về Lisp và có thắc mắc này mong các anh chị và các bạn giúp mình:

-Khi vẽ đường tròn chúng ta thường phải vẽ tâm, nếu dùng Center Mark thì phải scale lên tùy theo kích thước của đường tròn nên rất bất tiện, mọi người ai có lisp nào vẽ được Center Mark theo bất kỳ tỉ lệ nào cũng được mà không cần scale lên vẫn tương ứng với đường tròn đó thì xin giúp mình với.Cảm ơn nhiều.

-Mình đang làm công việc thiết kế các loại bàn ghế, trong đó dùng rất nhiều các loại khớp nối có thứ tự từ HJ1 - > HJ10, và nhiều phụ kiện khác .Mỗi lần vẽ xong mình phải dùng lệnh bcount để đếm từng loại nhưng phải nhấn F2 mới thấy được hết số lượng mấy thứ đó trên Autocad Text Window nên rất mất thời gian,.Xin viết giùm mình lisp theo ý sau: chọn tất cả các đối tượng cần tính toán, sau đó lisp tự thống kê số lượng của từng loại và in ra file text xuất kiện ngay trên màn hình giống như Autocad Text Window.Nếu cần thêm thông tin gì để viết được Lisp này xin mọi người cứ yêu cầu.Xin cảm ơn mọi người.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Xin chào các anh chị và các bạn, mình là thành viên mới, rất mong được sự giúp đỡ của tất cả mọi người.

Minh rất thích tìm hiểu về Lisp và có thắc mắc này mong các anh chị và các bạn giúp mình:

-Khi vẽ đường tròn chúng ta thường phải vẽ tâm, nếu dùng Center Mark thì phải scale lên tùy theo kích thước của đường tròn nên rất bất tiện, mọi người ai có lisp nào vẽ được Center Mark theo bất kỳ tỉ lệ nào cũng được mà không cần scale lên vẫn tương ứng với đường tròn đó thì xin giúp mình với.Cảm ơn nhiều.

 

Chưa hiểu ý bạn. Thường thì để vẽ Center Mark ta dùng lệnh dimcenter và sau đó chọn cung hoặc đường tròn để vẽ

 

Command: dimcenter

Select arc or circle:

 

Bạn có thể nói rõ hơn ý của bạn được không?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
...nếu dùng Center Mark thì phải scale lên tùy theo kích thước của đường tròn nên rất bất tiện...

Bạn vào đây chọn kiểu Center Mark, không cần phải scale:

 

cenmark.jpg

  • 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

mọi người không hiểu ý mình rồi.Mình có hình ảnh cụ thể đây:

http://www.cadviet.com/upfiles/untitled_49.bmp

Ở đây hình A là điều mình mong muốn, nghĩa là với bất cứ đường tròn nào dù lớn hay nhỏ thì đường tâm luôn lớn hơn đường tròn.

Còn hình B , nếu bản vẽ có n đường tròn khác nhau thì minh không thể chỉnh Center mark trong dimesion style n lần được, hoặc nếu dùng lệnh dimcenter thì quá mất thời gian.

Nói đến đây chắc mọi người hiểu rồi chứ.Xin mọi người giúp mình.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
mọi người không hiểu ý mình rồi.Mình có hình ảnh cụ thể đây:

http://www.cadviet.com/upfiles/untitled_49.bmp

Ở đây hình A là điều mình mong muốn, nghĩa là với bất cứ đường tròn nào dù lớn hay nhỏ thì đường tâm luôn lớn hơn đường tròn.

Còn hình B , nếu bản vẽ có n đường tròn khác nhau thì minh không thể chỉnh Center mark trong dimesion style n lần được, hoặc nếu dùng lệnh dimcenter thì quá mất thời gian.

Nói đến đây chắc mọi người hiểu rồi chứ.Xin mọi người giúp mình.

Hình vẽ bạn nên lưu dưới đuôi .jpg và khi upload lên diễn đàn bạn nên kiểm tra xem hình vẽ của bạn đã được upload chưa?

Hình vẽ của bạn bấm vào không thấy gì cả. Chỉ thấy dòng chữ này : Concurrent download limit exceeded.

bạn kiểm tra lại hình vẽ minh hoạ của bạn lại nhé.

 

Mình mới viết được đoạn Code này, hy vọng nó chạy theo đúng ý bạn.

Bạn có thể thay đổi phần dư ra khỏi đường tròn bằng cách khai lại biến KC

Tên lệnh là : Dcen

(defun c:Dcen ()
(setq c1 (getpoint "Pick vao duong tron:")) (terpri)
(command "lengthen" c1 "")
(setq L1 (getvar "perimeter"))
(setq KC 200)					; chieu dai phan du
(setq D (+ (/ L1 pi 2) KC))
(command "dimcen" D)
(command "dimcenter" c1 )
)

 

Chúc thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình có hình ảnh cụ thể đây:

http://www.cadviet.com/upfiles/untitled_49.bmp

Không thể down hình vẽ của bạn.

Ở đây hình A là điều mình mong muốn, nghĩa là với bất cứ đường tròn nào dù lớn hay nhỏ thì đường tâm luôn lớn hơn đường tròn.

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

Hy vọng đoạn LISP này đúng ý bạn : vẽ 2 đường line vuông góc giao nhau tại tâm đường tròn và có phần dư = 200, Layer trùng với layer của đường tròn.

bạn có thể thay đổi chiều dài phần dư này (thay đổi biến KC).

(defun C:Dcen(/ ent rr oo lay kc)
 (while 
   (not
     (and
(setq ent (car (entsel "\nChon duong tron:")))
(if ent (= (cdr (assoc 0 (entget ent))) "CIRCLE") )
)
     )
   (princ "\nSelect Again: ")
   )

 (if ent
   (progn
     (setq ent (entget ent)
    rr (cdr (assoc 40 ent))
    oo (cdr (assoc 10 ent))
    lay(cdr (assoc 8 ent))
    kc 200 ; chieu dai phan du
    )
     (entmake (list (cons 0 "LINE") (cons 10 (polar oo 0 (+ rr kc))) (cons 11 (polar oo pi (+ rr kc))) (cons 8 lay)))
     (entmake (list (cons 0 "LINE") (cons 10 (polar oo (/ pi 2) (+ rr kc))) (cons 11 (polar oo (* 3(/ pi 2)) (+ rr kc))) (cons 8 lay)))
     )
   )
 (princ)
 )

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
mọi người không hiểu ý mình rồi.Mình có hình ảnh cụ thể đây:

http://www.cadviet.com/upfiles/untitled_49.bmp

Ở đây hình A là điều mình mong muốn, nghĩa là với bất cứ đường tròn nào dù lớn hay nhỏ thì đường tâm luôn lớn hơn đường tròn.

Còn hình B , nếu bản vẽ có n đường tròn khác nhau thì minh không thể chỉnh Center mark trong dimesion style n lần được, hoặc nếu dùng lệnh dimcenter thì quá mất thời gian.

Nói đến đây chắc mọi người hiểu rồi chứ.Xin mọi người giúp mình.

1. Hình của bạn không down được. Hãy theo ý kiến của bạn Tue_NV để post hình lại. Nhưng theo ssg, tốt hơn hết là bạn post file *.dwg hơn là file ảnh.

2. Bạn chưa hiểu thì đúng hơn! Nếu bạn chọn trong dimstyle như cái hình mà ssg đã post (chọn "Line"), và chỉ 1 lần duy nhất, khi dùng center mark, nó luôn luôn tạo đường tâm lớn hơn đường tròn (vượt khỏi đường tròn bằng giá trị trong ô "Size" mà bạn đã chọn), bất kể đường tròn của bạn có kích thước như thế nào.

3. Các lisp của các bạn ở trên cũng không có gì hơn tính năng có sẵn của AutoCAD! Dùng lisp chỉ hiệu quả khi user chọn hàng loạt, chơi 1 phát là có hàng trăm đường tâm đúng như ý muốn. Cái này thì rất nhiều người viết được, nhưng trước hết bạn phải nêu rõ hơn yêu cầu. Ví dụ: khoảng vượt ra ngoài đường tròn bằng bao nhiêu (tính bằng đơn vị bản vẽ hoặc % so với bán kính)

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
2. Bạn chưa hiểu thì đúng hơn! Nếu bạn chọn trong dimstyle như cái hình mà ssg đã post (chọn "Line"), và chỉ 1 lần duy nhất, khi dùng center mark, nó luôn luôn tạo đường tâm lớn hơn đường tròn (vượt khỏi đường tròn bằng giá trị trong ô "Size" mà bạn đã chọn), bất kể đường tròn của bạn có kích thước như thế nào.

Bác SSG xem lại một chút nhé : Nếu chọn như bác SSG và khai báo trong ô Size một giá trị nào đó. Ví dụ : 1000

thì độ dài của đường thẳng được vẽ bởi lệnh dimcenter sẽ được tính từ tâm ra mỗi bên 500 chứ không phải là giá trị mà vượt khỏi đường tròn (phần nhô ra).

Và giá trị khai báo này sẽ gán mặc định cho biến dimcen

Và như vậy thì đường tròn to cũng như đường tròn nhỏ đều bị gán với giá tri biến dimcen. Điều đó có nghĩa là bài toán chưa được giải quyết.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn bạn rất nhiều về cái lisp ban gởi, bạn hiểu gần đúng ý mình rồi, mình có upload lại hình vẽ để rõ ràng hơn.

Mình nói lại để bạn dễ hiểu hơn: trong 3 hình A,B,C, cái mình muốn là hình A , dù đường tròn lớn hay nhỏ , vẽ ở tỉ lệ bất kỳ, đường tâm

luôn luôn như vậy.Hình C là của bạn gởi, như vây thì đường tâm lớn quá.Hình A là mặc định của cad, có thể chỉnh được nhưng rất mất thời gian.

Xin mọi người giúp mình.

http://www.cadviet.com/upfiles/Drawing1_19.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bác SSG xem lại một chút nhé : Nếu chọn như bác SSG và khai báo trong ô Size một giá trị nào đó. Ví dụ : 1000

thì độ dài của đường thẳng được vẽ bởi lệnh dimcenter sẽ được tính từ tâm ra mỗi bên 500 chứ không phải là giá trị mà vượt khỏi đường tròn (phần nhô ra).

Và giá trị khai báo này sẽ gán mặc định cho biến dimcen

Và như vậy thì đường tròn to cũng như đường tròn nhỏ đều bị gán với giá tri biến dimcen. Điều đó có nghĩa là bài toán chưa được giải quyết.

Mời bạn xem bản vẽ này:

 

http://www.cadviet.com/upfiles/center_mark.zip

 

Hình A, B, C là của bạn ttmt_jses gởi

Hình D là ssg đánh center mark ví dụ

Hình E là chừa lại để bạn thử đánh center mark, sau đó tự rút ra kết luận...

 

Thật ra thì có một số trường hợp nó không đúng như vậy, thật đáng tiếc! Cách giải quyết triệt để là dùng lisp. Và như ssg đã nói ở bài trên, đã dùng lisp thì thực hiện luôn cho hàng loạt đường tròn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mời bạn xem bản vẽ này:

 

http://www.cadviet.com/upfiles/center_mark.zip

 

Hình A, B, C là của bạn ttmt_jses gởi

Hình D là ssg đánh center mark ví dụ

Hình E là chừa lại để bạn thử đánh center mark, sau đó tự rút ra kết luận...

 

Thật ra thì có một số trường hợp nó không đúng như vậy, thật đáng tiếc! Cách giải quyết triệt để là dùng lisp. Và như ssg đã nói ở bài trên, đã dùng lisp thì thực hiện luôn cho hàng loạt đường tròn.

Đúng là file đó khi bác SSg đánh Center Mark thì được đoạn nhô ra khỏi đường tròn một đoạn 30.

Nhưng tại sao trong file này khi đánh Center Mark thì được một đoạn thẳng luôn dài bằng giá trị size ghi trong hộp thoại Modify dimension style?

http://www.cadviet.com/upfiles/centermark.rar

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

@ttmt_jses:

Bạn dùng thử lisp đánh center mark cho hàng loạt đường tròn. Lệnh CTM:

;;;----------------------------------------------------
(defun ctm1(e / k d p0 r p1 p2 p3 p4)
(setq
   k 1.2
   d (entget e)
   p0 (cdr (assoc 10 d))
   r (cdr (assoc 40 d))
   p1 (polar p0 pi (* k r))
   p2 (polar p0 0 (* k r))
   p3 (polar p0 (* pi 0.5) (* k r))
   p4 (polar p0 (* pi 1.5) (* k r))
)
(command "line" p1 p2 "")
(command "line" p3 p4 "")
)
;;;----------------------------------------------------
(defun C:CTM( / ss oldos e)
(setq ss (ssget '((0 . "CIRCLE"))))
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(while (setq e (ssname ss 0))
   (ctm1 e)
   (ssdel e ss)
)
(setvar "osmode" oldos)
(princ)
)
;;;----------------------------------------------------

Đường center có chiều dài bằng 1.2 lần đường kính đường tròn. Muốn thay đổi thì sửa trị số 1.2 ở dòng thứ 3 trong code.

 

 

@Tue_NV: Cái "tại sao" bạn nêu mình biết rồi. Bạn làm thử nghiệm này:

1. Chọn Size của center mark (đặt là c), chọn Type "Line"

2. Vẽ các đường tròn có r trong khoảng 0 đến 2c, đánh center mark -> nhận xét

3. Thử nghiệm như trên với các đường tròn có r > 2c -> nhận xét và kết luận...

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
@ttmt_jses:

Bạn dùng thử lisp đánh center mark cho hàng loạt đường tròn. Lệnh CTM:

;;;----------------------------------------------------
(defun ctm1(e / k d p0 r p1 p2 p3 p4)
(setq
   k 1.2
   d (entget e)
   p0 (cdr (assoc 10 d))
   r (cdr (assoc 40 d))
   p1 (polar p0 pi (* k r))
   p2 (polar p0 0 (* k r))
   p3 (polar p0 (* pi 0.5) (* k r))
   p4 (polar p0 (* pi 1.5) (* k r))
)
(command "line" p1 p2 "")
(command "line" p3 p4 "")
)
;;;----------------------------------------------------
(defun C:CTM( / ss oldos e)
(setq ss (ssget '((0 . "CIRCLE"))))
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(while (setq e (ssname ss 0))
   (ctm1 e)
   (ssdel e ss)
)
(setvar "osmode" oldos)
(princ)
)
;;;----------------------------------------------------

Đường center có chiều dài bằng 1.2 lần đường kính đường tròn. Muốn thay đổi thì sửa trị số 1.2 ở dòng thứ 3 trong code.

@Tue_NV: Cái "tại sao" bạn nêu mình biết rồi. Bạn làm thử nghiệm này:

1. Chọn Size của center mark (đặt là c), chọn Type "Line"

2. Vẽ các đường tròn có r trong khoảng 0 đến 2c, đánh center mark -> nhận xét

3. Thử nghiệm như trên với các đường tròn có r > 2c -> nhận xét và kết luận...

Đúng thật, Khi vẽ các đường tròn có r trong khoảng 0 đến 2c thì khi đánh center Mark cho được độ dài đường thẳng bằng giá trị 2c.

Còn khi vẽ các đường tròn có r > 2c thì khi đánh center Mark cho được độ dài đường thẳng bằng giá trị đường kính cộng với 2c

Sử dụng lệnh dimcenter không thể giải quyết triệt để vấn đề của bài toán.

 

Lisp của bác SSG hay lắm : chọn hàng loạt đường tròn, sử dụng chỉ một lệnh đánh hàng loạt Center Mark.

Cảm ơn bác SSG nhiều lắm

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@ttmt_jses:

Bạn dùng thử lisp đánh center mark cho hàng loạt đường tròn. Lệnh CTM:

;;;----------------------------------------------------
(defun ctm1(e / k d p0 r p1 p2 p3 p4)
(setq
k 1.2
d (entget e)
p0 (cdr (assoc 10 d))
r (cdr (assoc 40 d))
p1 (polar p0 pi (* k r))
p2 (polar p0 0 (* k r))
p3 (polar p0 (* pi 0.5) (* k r))
p4 (polar p0 (* pi 1.5) (* k r))
)
(command "line" p1 p2 "")
(command "line" p3 p4 "")
)
;;;----------------------------------------------------
(defun C:CTM( / ss oldos e)
(setq ss (ssget '((0 . "CIRCLE"))))
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(while (setq e (ssname ss 0))
(ctm1 e)
(ssdel e ss)
)
(setvar "osmode" oldos)
(princ)
)
;;;----------------------------------------------------
Đường center có chiều dài bằng 1.2 lần đường kính đường tròn. Muốn thay đổi thì sửa trị số 1.2 ở dòng thứ 3 trong code.

 

 

@Tue_NV: Cái "tại sao" bạn nêu mình biết rồi. Bạn làm thử nghiệm này:

1. Chọn Size của center mark (đặt là c), chọn Type "Line"

2. Vẽ các đường tròn có r trong khoảng 0 đến 2c, đánh center mark -> nhận xét

3. Thử nghiệm như trên với các đường tròn có r > 2c -> nhận xét và kết luận...

Gửi bạn ssg và các bạn trong diễn đàn mình thấy lisp của bạn rất hay! vấn đề ở đây mình cần là 2 đường center mark xoay đi 45 đô ( dạng dấu X)các bạn giúp mình giải quyết vấn đề này với nhá! Cảm ơn các bạn rất nhiều!

  • Vote giảm 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

Là member đến 6 năm sao chẳng học được gì?

Sung đã rụng, chỉ cần lượm bỏ vào miệng bằng cách học hàm polar

Uhm! thật ra mình bỏ nghề 3 năm nay rùi bây giờ mới vọc lại bạ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

Bạn thay thế 4 dòng này:
p1 (polar p0 pi (* k r))

p2 (polar p0 0 (* k r))

p3 (polar p0 (* pi 0.5) (* k r))

p4 (polar p0 (* pi 1.5) (* k r))
Bằng 4 dòng này:
p1 (polar p0 (* pi 0.75) (* k r))
p2 (polar p0 (* pi 1.75) (* k r))
p3 (polar p0 (* pi 0.25) (* k r))
p4 (polar p0 (* pi 1.25) (* k r))

Là ok.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn thay thế 4 dòng này:

p1 (polar p0 pi (* k r))

p2 (polar p0 0 (* k r))

p3 (polar p0 (* pi 0.5) (* k r))

p4 (polar p0 (* pi 1.5) (* k r))

Bằng 4 dòng này:

p1 (polar p0 (* pi 0.75) (* k r))

p2 (polar p0 (* pi 1.75) (* k r))

p3 (polar p0 (* pi 0.25) (* k r))

p4 (polar p0 (* pi 1.25) (* k r))

Là ok.

Cảm ơn bạ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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×