Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
18 replies to this topic

#1 ttmt_jses

ttmt_jses

    biết vẽ circle

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

Đã gửi 03 December 2008 - 03:35 PM

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

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 03 December 2008 - 04:04 PM

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

#3 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 December 2008 - 05:00 PM

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

Hình đã gửi
  • 1

#4 ttmt_jses

ttmt_jses

    biết vẽ circle

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

Đã gửi 03 December 2008 - 05:40 PM

mọi người không hiểu ý mình rồi.Mình có hình ảnh cụ thể đây:
http://www.cadviet.c...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.
  • 0

#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 03 December 2008 - 10:20 PM

mọi người không hiểu ý mình rồi.Mình có hình ảnh cụ thể đây:
http://www.cadviet.c...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.
  • 0

#6 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 December 2008 - 08:47 AM

Mình có hình ảnh cụ thể đây:
http://www.cadviet.c...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)
)


  • 0

#7 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 December 2008 - 10:43 AM

mọi người không hiểu ý mình rồi.Mình có hình ảnh cụ thể đây:
http://www.cadviet.c...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)
  • 0

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 04 December 2008 - 11:37 AM

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

#9 ttmt_jses

ttmt_jses

    biết vẽ circle

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

Đã gửi 04 December 2008 - 01:01 PM

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.c...Drawing1_19.dwg
  • 0

#10 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 December 2008 - 01:42 PM

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

#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 04 December 2008 - 01:59 PM

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

http://www.cadviet.c...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.c.../centermark.rar
  • 0

#12 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 December 2008 - 02:29 PM

@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...
  • 1

#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 04 December 2008 - 04:12 PM

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

#14 ttmt_jses

ttmt_jses

    biết vẽ circle

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

Đã gửi 04 December 2008 - 05:21 PM

Cảm ơn bác ssg nhiều lắm, lisp của bác thật đúng ý minh.
  • 0

#15 langtumaulanh

langtumaulanh

    biết vẽ ellipse

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

Đã gửi 17 July 2015 - 03:37 PM

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


  • -2

#16 anti lazy

anti lazy

    biết lệnh erase

  • Members
  • PipPipPip
  • 107 Bài viết
Điểm đánh giá: 27 (tàm tạm)

Đã gửi 17 July 2015 - 03:52 PM

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


  • 1

#17 langtumaulanh

langtumaulanh

    biết vẽ ellipse

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

Đã gửi 17 July 2015 - 04:00 PM

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 à!


  • 0

#18 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 17 July 2015 - 04:04 PM

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.


  • 1

#19 langtumaulanh

langtumaulanh

    biết vẽ ellipse

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

Đã gửi 17 July 2015 - 04:08 PM

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!


  • 0