Đến nội dung


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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)


  • Please log in to reply
2851 replies to this topic

#401 Minh_Ha

Minh_Ha

    biết zoom

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

Đã gửi 15 August 2009 - 05:04 PM

-Mình có block khung như trong file. Mình muốn lấy điểm 1 và điểm 2 như trong hình theo từng block.
- http://www.cadviet.com/upfiles/2/1.dwg
  • 0

#402 tomboy

tomboy

    biết vẽ polygon

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

Đã gửi 17 August 2009 - 08:13 AM

-Mình có block khung như trong file. Mình muốn lấy điểm 1 và điểm 2 như trong hình theo từng block.
- http://www.cadviet.com/upfiles/2/1.dwg

bạn ơi,máy của mình xài cad 2004 nên không mở đc bản vẽ đó, bạn có thể lưu bản vẽ sang cad 2004 rồi post lên đc không. Thanhks
  • 0

#403 Minh_Ha

Minh_Ha

    biết zoom

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

Đã gửi 17 August 2009 - 08:57 AM

- Rồi đó bạn mình hạ xuống cad2000.
- http://www.cadviet.c...files/2/1_1.dwg
  • 0

#404 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 17 August 2009 - 02:05 PM

-Mình có block khung như trong file. Mình muốn lấy điểm 1 và điểm 2 như trong hình theo từng block.
- http://www.cadviet.com/upfiles/2/1.dwg

Bạn tham khảo Lisp sau :
(defun C:test(/ ent pt1 pt1X pt1Y pt2X pt2Y)
(setq ent (car (entsel "\nChon Block:")))
(if (and (= (cdr (assoc 0 (entget ent))) "INSERT")
(= (cdr (assoc 2 (entget ent))) "A1図枠"));block name
(progn
(setq ent (entget ent)
pt1 (cdr (assoc 10 ent))
pt1X (car pt1)
pt1Y (cadr pt1)
pt2X (+(*(cdr (assoc 41 ent))841) pt1X);ch/rong: 841
pt2Y (+(*(cdr (assoc 42 ent))594) pt1Y);ch/cao : 594
)
(princ (strcat "\n Diem1 X = " (rtos pt1X) "; Y = " (rtos pt1Y)))
(princ (strcat "\n Diem2 X = " (rtos pt2X) "; Y = " (rtos pt2Y)))
;(list (list pt1X pt1Y) (list pt2X pt2Y))
)
)
(princ)
)

  • 0

#405 Minh_Ha

Minh_Ha

    biết zoom

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

Đã gửi 17 August 2009 - 08:32 PM

-Trước tiên mình cám ơn bạn gia_bach đã giúp mình, và mình đã dùng đọan code đó để vẽ đường chéo. Bây giờ mình muốn chọn n Block chứ không phải 1 Block như hiện tại và đây là đọan code, bạn chỉ dùm nha.
(defun C:test(/ ent pt1 pt1X pt1Y pt2X pt2Y)
(setq ent (car (entsel "\nChon Block:")))
(if (and (= (cdr (assoc 0 (entget ent))) "INSERT")
(= (cdr (assoc 2 (entget ent))) "1"));block name
(progn
(setq ent (entget ent)
pt1 (cdr (assoc 10 ent))
pt1X (car pt1)
pt1Y (cadr pt1)
pt2X (+(*(cdr (assoc 41 ent))841) pt1X);ch/rong: 841
pt2Y (+(*(cdr (assoc 42 ent))594) pt1Y);ch/cao : 594
)
;(princ (strcat "\n Diem1 X = " (rtos pt1X) "; Y = " (rtos pt1Y)))
;(princ (strcat "\n Diem2 X = " (rtos pt2X) "; Y = " (rtos pt2Y)))
(list (list pt1X pt1Y) (list pt2X pt2Y))
)
)
(setq D1 (list pt1X pt1Y))
(setq D2 (list pt2X pt2Y))
(command "line" D1 D2 "")
(princ)
)
  • 0

#406 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 17 August 2009 - 09:09 PM

-Trước tiên mình cám ơn bạn gia_bach đã giúp mình, và mình đã dùng đọan code đó để vẽ đường chéo. Bây giờ mình muốn chọn n Block chứ không phải 1 Block như hiện tại và đây là đọan code, bạn chỉ dùm nha.

Tue_NV thấy cái này không cần đến Lisp -> Chỉ cần 1 lệnh Refedit là ta có thể kẻ được đuờng chéo cho n block đấy bạn Minh Ha à
  • 0

#407 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 18 August 2009 - 02:25 AM

(if n_chia_het_cho_2 thenDoThis elseDoThis)

Phép toán nào giúp lọc được các giá trị của n là số chẵn được nhỉ? em đã thử search help bằng từ khóa div 2 nhưng không có
  • 0

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


#408 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 18 August 2009 - 06:21 AM

(if n_chia_het_cho_2 thenDoThis elseDoThis)

Phép toán nào giúp lọc được các giá trị của n là số chẵn được nhỉ? em đã thử search help bằng từ khóa div 2 nhưng không có

Đây : (setq n 12)
(= (rem n 2) 0) -> T
(/= (rem n 2) 0) -> nil
  • 1

#409 Minh_Ha

Minh_Ha

    biết zoom

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

Đã gửi 18 August 2009 - 07:30 AM

Tue_NV thấy cái này không cần đến Lisp -> Chỉ cần 1 lệnh Refedit là ta có thể kẻ được đuờng chéo cho n block đấy bạn Minh Ha à

Tue_NV hiểu sai ý mình rồi. Mình xin lỗi vì không nói rõ mục đích. Vẽ đường line đó chỉ là ví dụ. Mình dùng đọan code trên để in hàng lọat trong cad vì công ty mình dùng cadLT nên không dùng đươc Mplot.vlx của bạn Nguyen Hoanh. Mong bạn gíup dùm.
  • 0

#410 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 18 August 2009 - 08:36 AM

-Trước tiên mình cám ơn bạn gia_bach đã giúp mình, và mình đã dùng đọan code đó để vẽ đường chéo. Bây giờ mình muốn chọn n Block chứ không phải 1 Block như hiện tại và đây là đọan code, bạn chỉ dùm nha.
..................

Bạn chạy thử lisp này.
(defun C:test(/ vl ov ss e)
(defun draw_line(ent / pt1 pt1X pt1Y pt2X pt2Y)
(setq pt1 (cdr (assoc 10 ent))
pt1X (car pt1)
pt1Y (cadr pt1)
pt2X (+(*(cdr (assoc 41 ent))841) pt1X);ch/rong: 841
pt2Y (+(*(cdr (assoc 42 ent))594) pt1Y);ch/cao : 594
)
(entmake (list '(0 . "LINE")(cons 10 (list pt1X pt1Y))(cons 11 (list pt2X pt2Y))(cons 62 6)) )
(entmake (list '(0 . "LINE")(cons 10 (list pt1X pt2Y))(cons 11 (list pt2X pt1Y))(cons 62 6)) );bonus
)
(command "undo" "be")
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(setvar "osmode" 0) (setvar "orthomode" 0) (setvar "cmdecho" 0)
(princ "\nChon Block khung ten :")
(if(setq ss (ssget (list (cons 0 "INSERT")(cons 2 "A1図枠"))))
(foreach e (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(draw_line e)
)
)
(mapcar 'setvar vl ov) ; reset Sys Vars
(command "undo" "e")(princ)
)

  • 1

#411 Minh_Ha

Minh_Ha

    biết zoom

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

Đã gửi 18 August 2009 - 09:45 AM

-Mình thật sự cám ơn bạn gia_bach đọan code của bạn giúp cho mình rất nhiều. Bây giờ mình chỉ việc chọn tất cả các block trong bản vẽ là in tòan bộ bản vẽ đó ra máy in. Một lần nữa cám ơn bạn. Sẽ nhờ bạn giúp đỡ lần sau nữa nha.
  • 0

#412 Minh_Ha

Minh_Ha

    biết zoom

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

Đã gửi 21 August 2009 - 07:40 AM

-Trong lisp lam sao lưu được giá trị nhập vào cho những lần sau thực hiện lệnh.VD: mình có đọan code sau:
(defun c:aa1()
(setq LA (getvar "Clayer"))
(initget 1 "P DT")
(setq BT (getkword "\n Tinh dien tich Pick hoac chon doi tuong?

:"))
(if (= BT "P")
- khi đánh lệnh aa1 và nhập giá trị P thì lần sau thực hiện lệnh không cần nhập lại. Mong được sự giúp đỡ.

  • 0

#413 thiep

thiep

    biết dimbaseline

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

Đã gửi 21 August 2009 - 10:17 AM

-Trong lisp lam sao lưu được giá trị nhập vào cho những lần sau thực hiện lệnh.VD: mình có đọan code sau:
(defun c:aa1()
(setq LA (getvar "Clayer"))
(initget 1 "P DT")
(setq BT (getkword "\n Tinh dien tich Pick hoac chon doi tuong?

:"))
(if (= BT "P")
- khi đánh lệnh aa1 và nhập giá trị P thì lần sau thực hiện lệnh không cần nhập lại. Mong được sự giúp đỡ.

Bạn xem đoạn mã ví dụ sau đây:
(defun c:Pick-Select ()
(setq bit (cond (bit)
("Pick")
)
)
(initget "Pick Select")
(setq Tmp (strcat "\nAnother Quension? [Pick/Select] <" bit ">: ")
bit (cond ((getkword Tmp))
(bit)
)
)
(if (eq bit "Pick")
(Print "Toi chon picK")
(Print "Toi chon select")
)
(princ)
)

Bạn chỉ cần đánh P hay S, lần sau chỉ cần enter
  • 1

#414 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 24 August 2009 - 11:39 AM

Tại sao có những lisp em viết chạy bình thường, nhưng mỗi lần gõ lệnh xong thì cad lại báoUnknown command "tenlenh". Press F1 for help.
mặc dù báo như thế nhưng lisp vẫn chạy ra được kết quả. cái dòng Unknown command "tenlenh". Press F1 for help thực sự khiến em thấy khó chịu lắm
  • 0

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


#415 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 24 August 2009 - 11:50 AM

Tại sao có những lisp em viết chạy bình thường, nhưng mỗi lần gõ lệnh xong thì cad lại báoUnknown command "tenlenh". Press F1 for help.
mặc dù báo như thế nhưng lisp vẫn chạy ra được kết quả. cái dòng Unknown command "tenlenh". Press F1 for help thực sự khiến em thấy khó chịu lắm

Ví dụ 1 cái đi bạn
  • 0

#416 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 24 August 2009 - 12:55 PM

Một ví dụ của em.
(defun C:stt()
(command "undo" "Begin" "")
(if (not i) (setq i 1))
(if (not a) (setq a 1))
(setq i1 (getreal (strcat"\nSTT bat dau < " (rtos i 2 0) " >: "))
a1 (getreal (strcat"\nSo gia < " (rtos a 2 0) " >: " )))
(if i1 (setq i i1))
(if a1 (setq a a1))
(while
(setq res (entsel (strcat "\nChon text de ghi STT thu " (rtos i 2 0) "")))
(setq res (entget (car res)))
(setq res (entmod (subst (cons 1 (rtos i 2 0)) (assoc 1 res) res)))
(setq i (+ i a))
);while
(command "undo" "end" "")
(princ)
)
Code này không khác mấy so với code của anh. nó vẫn chạy được nhưng luôn kèm theo dòng thông báo ấy, còn của anh thì chẳng sao cả. em chẳng hiểu vì sao nữa. :bigsmile:
  • 0

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


#417 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 24 August 2009 - 01:19 PM

(defun C:stt()
(command "undo" "Begin" "")
............
(command "undo" "end" "")
(princ)
)

Vấn đề của bạn ở dòng Lệnh UNDO
(command "undo" "Begin" "") -> (command "undo" "Begin")
(command "undo" "end" "") -> (command "undo" "end" )
xóa 2 dấu nháy phía cuối lệnh.
  • 1

#418 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 24 August 2009 - 02:01 PM

Vấn đề của bạn ở dòng Lệnh UNDO
(command "undo" "Begin" "") -> (command "undo" "Begin")
(command "undo" "end" "") -> (command "undo" "end" )
xóa 2 dấu nháy phía cuối lệnh.

cảm ơn anh Gia Bach nhé. đúng là có những lúc sai sót ở những chỗ không ngờ vì ta vẫn đinh ninh rằng nó đúng. :bigsmile:
  • 0

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


#419 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 07 September 2009 - 02:47 PM

Nhờ các anh, các chị giải đáp giùm em:
Tại sao trong bản vẽ này của em: http://www.cadviet.c...es/2/nhaso5.dwg, các dim đều không thể sử dụng lisp CUTDIM:
"Command: cd
Please select dimension object!
Select objects: 1 found

Select objects:
Point to trim or extend:
Error: bad DXF group: (13)"
Thậm chí cả lệnh Tr cũng không dùng được.
Cảm ơn các anh, các chị!
  • 0
http://khuyen.space

#420 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 07 September 2009 - 02:59 PM

Nhờ các anh, các chị giải đáp giùm em:
Tại sao trong bản vẽ này của em: http://www.cadviet.c...es/2/nhaso5.dwg, các dim đều không thể sử dụng lisp CUTDIM:
"Command: cd
Please select dimension object!
Select objects: 1 found

Select objects:
Point to trim or extend:
Error: bad DXF group: (13)"
Thậm chí cả lệnh Tr cũng không dùng được.
Cảm ơn các anh, các chị!

Em xem ở bài viết sau :
Bai viet so 10

Và Lisp này đã được Tue_NV cải tiến : Khi cắt dim để lại phần chân dim bằng nhau :
Bai viet so 8
  • 1