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

#301 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 30 October 2009 - 09:31 PM

Bạn thử cái này xem thế nào? Có gì chưa được thì Tue_NV sẽ chỉnh lại :

(defun c:tdb(/ ent cao tam ang)
(setq ent (car(entsel"\n Pick chon Block :")))
(setq cao (getdist "\n Nhap chieu cao Text :"))
(setq tam (cdr(assoc 10 (entget ent))))
(setq ang (cdr(assoc 50 (entget ent))))
(wtxt (strcat "(" (rtos (car tam) 2 0) "," (rtos (cadr tam) 2 0) ")")
(getpoint "\n Diem dat Text :") ang cao)

)
;
(defun wtxt (txt p ang h / sty)
(setq sty (getvar "textstyle"))
(entmake (list (cons 0 "TEXT") (cons 7 sty) (cons 1 txt) (cons 10 p) (cons 11 p)
(cons 72 0) (cons 73 1) (cons 50 ang) (cons 40 h) (cons 41 1))
)
)

Chào bác Tue_NV,
Cái dòng code (setq tam (cdr(assoc 10 (entget ent)))) dùng để xác định điểm chèn (base point) của block phải không ạ?? Yêu cầu của bạn t031285 là tọa độ tâm của block nên có thể cái base point này không trùng với tâm của block phải không bác.??? Bác xem lại giùm chỗ này với.
Ở hàm (entmake (list (cons 0 "TEXT") (cons 7 sty) (cons 1 txt) (cons 10 p) (cons 11 p) (cons 72 0) (cons 73 1) (cons 50 ang) (cons 40 h) (cons 41 1))
cái đoạn code (cons 11 p) có tác dụng thế nào bác nhỉ??? Có nhất thiết phải có nó không và vì sao bác lại chọn nó trùng với điểm chèn text (cons 10 p) ???
Rất mong bác giải thích giùm ạ.
Chúc bác khỏe và luôn vui tươi.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#302 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 30 October 2009 - 09:41 PM

Bạn nói đúng,có rất nhiều đối tượng trên hình vẽ,vậy mình chỉ cần các đối tượng là hình tròn,hình vuông,hình chữ nhật,và các point.Nếu có thể là block của các hình này nếu bác và bác tue có thể giúp được.Cái quan trọng là làm sao khi chọn tất cả các đối tượng trên thì nó sẽ xuất toạ độ của các điểm đã chọn.Thanks.

Chào bạn hugo007,
Vậy là yêu cầu của bạn khác với bạn t031285 rồi , đúng không bạn???
Bạn t031285 yêu cầu xuất ra tọa độ tâm của đối tượng, còn bạn lại yêu cầu xuất tọa độ điểm chọn của đối tượng. Có phải vậy không bạn???
Các hình vuông, hình chữ nhật của bạn được tạo bởi các đoạn thẳng line riêng biệt hay được tạo bởi một polyline duy nhất (ví dụ như tạo bởi lệnh vẽ rectangle ??? Để nghị bạn cho biết rõ hơn nhé.
Chúc bạn luôn vui vẻ và thành đạt.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#303 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 30 October 2009 - 10:12 PM

Chào bác Tue_NV,
Cái dòng code (setq tam (cdr(assoc 10 (entget ent)))) dùng để xác định điểm chèn (base point) của block phải không ạ?? Yêu cầu của bạn t031285 là tọa độ tâm của block nên có thể cái base point này không trùng với tâm của block phải không bác.??? Bác xem lại giùm chỗ này với.
Ở hàm (entmake (list (cons 0 "TEXT") (cons 7 sty) (cons 1 txt) (cons 10 p) (cons 11 p) (cons 72 0) (cons 73 1) (cons 50 ang) (cons 40 h) (cons 41 1))
cái đoạn code (cons 11 p) có tác dụng thế nào bác nhỉ??? Có nhất thiết phải có nó không và vì sao bác lại chọn nó trùng với điểm chèn text (cons 10 p) ???
Rất mong bác giải thích giùm ạ.
Chúc bác khỏe và luôn vui tươi.

Chào bạn phamthanhBinh
1. Tue_NV đã xác định Base point. Có lẽ là chưa đúng với ý của bạn t031285 là tọa độ tâm của block. Mình đã nhầm cái này. bạn t031285 có thể nói rõ cái tâm này định nghĩa như thế nào không?

2. Bạn PhamthanhBinh đọc cái này :

Bạn thêm (cons 11 p) nữa. Vì chỉ có align Left là dùng dxf code 10 thôi (code 11 khi đó là '(0 0 0))
còn các align khác thì code 11 là chính còn 10 là phụ.
Bạn cứ cho cả 2 code 10 và 11 bằng p hết đi, cad sẽ tự động tính lại code 10.

Bạn chạy thử code của Tue_NV -> bỏ (cons 11 p) đi sẽ thấy kết quả mà
  • 2

#304 t031285

t031285

    biết vẽ rectang

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

Đã gửi 30 October 2009 - 10:35 PM

Chào bạn phamthanhBinh
1. Tue_NV đã xác định Base point. Có lẽ là chưa đúng với ý của bạn t031285 là tọa độ tâm của block. Mình đã nhầm cái này. bạn t031285 có thể nói rõ cái tâm này định nghĩa như thế nào không?

2. Bạn PhamthanhBinh đọc cái này :

Bạn chạy thử code của Tue_NV -> bỏ (cons 11 p) đi sẽ thấy kết quả mà

Cảm ơn hai bác,cho phép e gọi bằng bác vì theo e biết bác TUE_VN lớn tuổi hơn e còn bác Thanh bình thì e không biết tuổi.Ý của e là toạ độ của tâm đó.ví dụ như hình chữ nhật,hình vuông,hình tròn,block đều là toạ độ của tâm hết.2 bác cố gắng giúp e và làm sao xuất được toạ độ tâm của các hình đã chọn này.2 bác có thể cho e biết 2 bác ở đâu không để có gì e mời 2 bác 1 bữa gọi là cảm ơn và học hỏi.Thanks
  • 0

#305 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 October 2009 - 05:38 AM

Cảm ơn hai bác,cho phép e gọi bằng bác vì theo e biết bác TUE_VN lớn tuổi hơn e còn bác Thanh bình thì e không biết tuổi.Ý của e là toạ độ của tâm đó.ví dụ như hình chữ nhật,hình vuông,hình tròn,block đều là toạ độ của tâm hết.2 bác cố gắng giúp e và làm sao xuất được toạ độ tâm của các hình đã chọn này.2 bác có thể cho e biết 2 bác ở đâu không để có gì e mời 2 bác 1 bữa gọi là cảm ơn và học hỏi.Thanks

Phải chăng bạn nói đến tâm là nói đến trọng tâm của đối tượng. Theo Tue_NV được biết trọng tâm này được định nghĩa cho 2 loại đối tượng : REGIONSOLID
  • 0

#306 t031285

t031285

    biết vẽ rectang

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

Đã gửi 31 October 2009 - 07:39 AM

Phải chăng bạn nói đến tâm là nói đến trọng tâm của đối tượng. Theo Tue_NV được biết trọng tâm này được định nghĩa cho 2 loại đối tượng : REGIONSOLID

Đơn giản nếu là hình vuông,hình chữ nhật thì là điểm giao của 2 đường chéo thôi.còn hình tròn thì tâm của đường tròn.Cảm ơn bác rất nhiều.
  • 0

#307 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 October 2009 - 08:38 AM

Đơn giản nếu là hình vuông,hình chữ nhật thì là điểm giao của 2 đường chéo thôi.còn hình tròn thì tâm của đường tròn.Cảm ơn bác rất nhiều.

Bạn thử cái này xem :
Tue_NV ghi toạ độ trọng tâm tại trọng tâm luôn

(defun c:tdt (/ tam oldos ss cao i)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget))
(setq cao (getdist "\n Nhap chieu cao Text :") i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq tam (cen ent))
(wtxt (strcat "(" (rtos (car tam) 2 0) "," (rtos (cadr tam) 2 0) ")") tam cao)
(setq i (1+ i))
)
(setvar "osmode" oldos)
(princ)
)
;
(defun wtxt (txt p h / sty)
(setq sty (getvar "textstyle"))
(entmake (list (cons 0 "TEXT") (cons 7 sty) (cons 1 txt) (cons 10 p) (cons 11 p)
(cons 72 1) (cons 73 2) (cons 40 h) (cons 41 1))
)
)
;
(defun cen (ent / p1 p2)
(vla-getboundingbox (vlax-ename->vla-object ent) 'p1 'p2)
(setq p1 (vlax-safearray->list p1)
p2 (vlax-safearray->list p2)
pt (mapcar '+ p1 p2)
pt (mapcar '* pt '(0.5 0.5 0.5))
)
pt
)

  • 3

#308 cungkeng

cungkeng

    biết zoom

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

Đã gửi 01 November 2009 - 10:28 PM

Có thể cho mình xin lisp tính trung bình công các số được không.Mình tim kiếm trên diễn đàn có 1 lisp về tính trung bình cộng http://www.cadviet.c...showtopic=11703 nhưng có lỗi không dùng được.Mình rất cần.Thanks mọi người
  • 0

#309 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 November 2009 - 08:43 AM

Nhờ các Bác viết giúp LISP để ghi góc của PHÚT và GIÂY nhỏ 10 phải ghi cả số 0 phía trước như là 18o01'04"
Hiện tại thì AutoCAD chỉ ghi ra là 18o1'4" . Xin xem bv dưới. Cám ơn nhiều.

http://www.cadviet.c...ra_2_chu_so.dwg
  • 0

#310 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 November 2009 - 08:56 AM

Nhờ các Bác viết giúp LISP để ghi góc của PHÚT và GIÂY nhỏ 10 phải ghi cả số 0 phía trước như là 18o01'04"
Hiện tại thì AutoCAD chỉ ghi ra là 18o1'4" . Xin xem bv dưới. Cám ơn nhiều.

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

'Phiphi hãy tham khảo thêm bài viết này :
Bai viet so 2191
Nếu PP muốn viết theo ý của PP hì hãy nói rõ dữ liệu đầu vào : -> Bạn muốn chọn DIM hay chọn 2 đường thẳng tạo nên góc -> và xuất kết quả như thế nào ? PP nói rõ nhé
  • 1

#311 tnmtpc

tnmtpc

    biết dimcontinue

  • Members
  • PipPipPipPipPip
  • 370 Bài viết
Điểm đánh giá: 206 (khá)

Đã gửi 02 November 2009 - 09:28 AM

trước đây Bác Hòanh có viết một lisp " di chuyển dấu chấm thập phân text đến trùng với point tương ứng". Nay nhờ các bạn viết lisp di chuyển các text sao cho điểm chèn text trùng các point tương ứng. Cụ thể như sau: bản vẽ có nhiều text, mỗi text có một point tương ứng nằm gần text, vị trí text so với point hơi tự do một chút, nghĩa là vị trí text so với point không phải lúc nào cũng bằng nhau. Yêu cầu chương trình: sau khi gõ lệnh, chọn tất cả text và point một lúc, enter, lệnh thực hiện.
Cám ơn trước .

không Bác nào giúp mình cái này à??
  • 0

#312 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 November 2009 - 10:13 AM

'Phiphi hãy tham khảo thêm bài viết này :
Bai viet so 2191
Nếu PP muốn viết theo ý của PP hì hãy nói rõ dữ liệu đầu vào : -> Bạn muốn chọn DIM hay chọn 2 đường thẳng tạo nên góc -> và xuất kết quả như thế nào ? PP nói rõ nhé

Thanks Tue_NV, cách nào cũng OK, miễn cho ra kết quả đọc được như là 18o01'04"
  • 0

#313 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 02 November 2009 - 11:45 AM

trước đây Bác Hòanh có viết một lisp " di chuyển dấu chấm thập phân text đến trùng với point tương ứng". Nay nhờ các bạn viết lisp di chuyển các text sao cho điểm chèn text trùng các point tương ứng. Cụ thể như sau: bản vẽ có nhiều text, mỗi text có một point tương ứng nằm gần text, vị trí text so với point hơi tự do một chút, nghĩa là vị trí text so với point không phải lúc nào cũng bằng nhau. Yêu cầu chương trình: sau khi gõ lệnh, chọn tất cả text và point một lúc, enter, lệnh thực hiện.
Cám ơn trước .

(defun c:pt()
(setq i 0 txt_pnt (ssget '((0 . "TEXT,point"))))
(command "undo" "begin")
(setq oldos (getvar "osmode"))
(command "osmode" 0)
(repeat (sslength txt_pnt)
(setq txt_pnt_ent (entget (ssname txt_pnt i)))
(if (assoc 1 txt_pnt_ent)
(progn
(setq txt_pt (cdr (assoc 10 txt_pnt_ent)) ii 0 kcmin 999999999999999999)
(while (< ii (sslength txt_pnt))
(setq txt_pnt_ent1 (entget (ssname txt_pnt ii)))
(if (assoc 1 txt_pnt_ent1) ()
(progn (setq pnt_pt (cdr(assoc 10 txt_pnt_ent1)) kci (distance txt_pt pnt_pt))
(if (< kci kcmin) (setq kcmin kci pnt_goc pnt_pt))
);progn
);if
(setq ii (+ ii 1))
);while
(command "move" (ssname txt_pnt i) "" txt_pt pnt_goc)
);progn
);if
(setq i (+ i 1))
);repeat
(setvar "osmode" oldos)
(command "undo" "end")
);defun

Chú ý:
- Khi chạy lisp này, với mỗi text lisp sẽ quyét tất cả các point để tìm point gần nhất và di chuyển text đến point đó. Chính vì thế có thể xảy ra trường hợp (rất ít xảy ra) 2 text có chung một point gần nhất, khi đó lisp sẽ di chuyển chúng trùng với nhau dẫn đến có thể một số point bị lạc mất text cao độ. bạn sử dụng chú ý một chút là OK.
- Tên lệnh bạn có thể tự đổi cho phù hợp với nhu cầu.
- Vì viết nhanh nên mình chỉ quan tâm đến hiệu quả, không quan tâm đến chất lượng nên lisp này nói chung là không hay lắm dưới con mắt người lập trình, vài chỗ cách làm hơi củ chuối nhưng với người sử dụng thì OK không vấn đề gì. hi vọng đúng ý bạn. :tongue2:
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#314 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 November 2009 - 05:59 PM

Nhờ các Bác viết giúp LISP để ghi góc của PHÚT và GIÂY nhỏ 10 phải ghi cả số 0 phía trước như là 18o01'04"
Hiện tại thì AutoCAD chỉ ghi ra là 18o1'4" . Xin xem bv dưới. Cám ơn nhiều.

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

Chào 'Phiphi-
Bạn sử dụng code này thử nhé :


(defun c:dpg(/ ss i ent goc do phut giay dotinh ph gi dpg)
(if (setq ss (ssget '((0 . "DIMENSION"))))
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (entget (ssname ss i)))
(setq ent (entmod (subst (cons 1 "<>") (assoc 1 ent) ent)))

(setq goc (/ (* (cdr(assoc 42 ent)) 180) pi))
(setq do (fix goc))

(setq dotinh (* (- goc do) 3600))
(setq phut (fix (/ dotinh 60) ))
(setq giay (rem dotinh 60) )

(if (or (< phut 10) (< giay 10))
(progn
(if (< phut 10) (setq ph (strcat "0" (itoa phut) )) (setq ph (itoa phut)))
(if (< giay 10) (setq gi (strcat "0" (rtos giay 2 0) )) (setq gi (rtos giay 2 0)))
(setq dpg (strcat (itoa do) "%%d" ph "'" gi "''"))
(setq ent (entmod (subst (cons 1 dpg) (assoc 1 ent) ent)))
))
(setq i (1+ i))
)
)
(Princ "khong co doi tuong nao duoc chon")
)
(princ)
)

@Phi phi : Tue_NV đã fix lỗi. Phiphi kiểm tra lại giùm. Thanks

Bài viết đã được chỉnh sửa nội dung bởi Tue_NV: 03 November 2009 - 08:23 AM

  • 1

#315 cungkeng

cungkeng

    biết zoom

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

Đã gửi 02 November 2009 - 10:20 PM

Có thể cho mình xin lisp tính trung bình công các số được không.Mình tim kiếm trên diễn đàn có 1 lisp về tính trung bình cộng http://www.cadviet.c...showtopic=11703 nhưng có lỗi không dùng được.Mình rất cần.Thanks mọi người

hix,không ai giúp mình à???
  • 0

#316 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 November 2009 - 04:23 AM

@cungkeng : Bạn lấy đường link trên ở đâu thì hãy post bài của bạn về đúng vị trí ấy. Để các bạn khác tiện việc theo dõi, tìm kiếm. Bạn nói Lisp trong đường Link của bạn thì Lisp nào bị lỗi?
Bạn hãy post bài viết của bạn vào ngay trong topic theo đường Link mà bạn đã đưa nhé. Thanks
  • 0

#317 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 03 November 2009 - 06:21 AM

Chào 'Phiphi-
Bạn sử dụng code này thử nhé :
...

LISP đã thay đổi đúng theo format xx'xx" nhưng sao kết quả chính xác thì luôn luôn thiếu (gần) 1 giây.
Nhờ Tue_NV round lại các số (như CAD đã làm khi mình chọn các Precision) nhé.
Cám ơn Tue_NV rất nhiều.
http://www.cadviet.c...hieu_1_giay.dwg
  • 0

#318 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 November 2009 - 08:25 AM

LISP đã thay đổi đúng theo format xx'xx" nhưng sao kết quả chính xác thì luôn luôn thiếu (gần) 1 giây.
Nhờ Tue_NV round lại các số (như CAD đã làm khi mình chọn các Precision) nhé.
Cám ơn Tue_NV rất nhiều.
http://www.cadviet.c...hieu_1_giay.dwg

Sorry Phi phi. Tue_NV sơ ý quá. Gửi lại Phi phi code đã test lỗi ở bài viết 341. Phi phi kiểm tra lại nhé
  • 1

#319 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 03 November 2009 - 09:00 AM

Sorry Phi phi. Tue_NV sơ ý quá. Gửi lại Phi phi code đã test lỗi ở bài viết 341. Phi phi kiểm tra lại nhé

Nhờ Tue_NV chỉnh thêm chút xíu nữa nhé, trong file CAD trên có đo góc 69o 5' 59.7" LISP đã sửa lại thành 69o 05' 60" (vẩn OK)
Nhưng đúng hơn thì nên sửa lại là 69o 06' 00". Tks.
  • 0

#320 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 November 2009 - 09:46 AM

Nhờ Tue_NV chỉnh thêm chút xíu nữa nhé, trong file CAD trên có đo góc 69o 5' 59.7" LISP đã sửa lại thành 69o 05' 60" (vẩn OK)
Nhưng đúng hơn thì nên sửa lại là 69o 06' 00". Tks.

Hy vọng đúng ý của Phi phi

(defun c:dpg(/ ss i ent goc do phut giay dotinh ph gi dpg)
(if (setq ss (ssget '((0 . "DIMENSION"))))
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (entget (ssname ss i)))
(setq ent (entmod (subst (cons 1 "<>") (assoc 1 ent) ent)))

(setq goc (/ (* (cdr(assoc 42 ent)) 180) pi))
(setq do (fix goc))

(setq dotinh (* (- goc do) 3600))
(setq phut (fix (/ dotinh 60) ))
(setq giay (rem dotinh 60) )

(if (or (< phut 10) (< giay 10))
(progn
(if (< phut 10) (setq ph (strcat "0" (itoa phut) )) (setq ph (itoa phut)))
(if (< giay 10) (setq gi (strcat "0" (rtos giay 2 0) )) (setq gi (rtos giay 2 0)))
(if (= (atof gi) 60)
(progn
(setq ph (strcat "0" (itoa (1+ phut)))) (setq gi "00")
)
)
(setq dpg (strcat (itoa do) "%%d" ph "'" gi "''"))
(setq ent (entmod (subst (cons 1 dpg) (assoc 1 ent) ent)))
))
(setq i (1+ i))
)
)
(Princ "khong co doi tuong nao duoc chon")
)
(princ)
)

  • 1