Chuyển đến nội dung
Diễn đàn CADViet

cuongtk2

Thành viên
  • Số lượng nội dung

    441
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    39

Bài đăng được đăng bởi cuongtk2


  1. Đây là đoạn code viết cho bạn

     

    (defun c:2->3dpl ( / ent chieudai dist dodoc p1 p2 i elev dlist)
     (setq ent (car (entsel "\nChon pline:")))
     (setq ent (vlax-ename->vla-object ent))
     (setq chieudai (vlax-get-property ent 'Length))
     (setq dist (getdist "\nKhoang cach can chia<500>:"))
    (if (null dist)(setq dist 500))
     (setq dodoc (getreal "\nDo doc<0.001>:"))
    (if (null dodoc)(setq dodoc 0.001))
     (setq elev (getreal "\nCos day<200>:"))
    (if (null elev)(setq elev 200))
     (setq i 0)
     (setq dlist (list))
     (while (< (* i dist) chieudai)
     (progn
     (setq p1 (vlax-curve-getPointAtDist ent (* i dist)))
    (setq p1 (list (car p1) (cadr p1) (+ elev (* i dist dodoc))))
    (setq dlist (append dlist (list p1))
      ))
    (setq i (1+ i))
    )
      (setq p2 (vlax-curve-getEndPoint ent))
     (setq p2 (list (car p2) (cadr p2) (+ (caddr p1) (* dodoc (distance p1 p2)))))
     (setq dlist (append dlist (list p2)))
     (command "_3dpoly")
       (foreach n dlist (command n)) (command ""))
    
    )

     

    Trong khi dùng bạn nên tắt chế độ bắt điểm vì đoạn code trên mới chỉ viết thử xem có đúng ý của bạn không nên chưa tẩy rửa sạch sẽ.

    • Vote tăng 1

  2. thấy các bro thao luận sôi nổi quá, nhưng tôi thấy việc scale theo 2 phương khác nhau chi cần tạo block, sau đó insert và chọn tỷ lệ theo 2 phương khác nhau là ok. có thể nhập tỷ lệ theo dạng phân số a/b trong hộp thoại insert

     

    Dùng lisp để giảm thao tác khi dùng cad, được ví như "đuờng chim bay" là thời gian ngắn nhất để thực hiện 1 công việc.

    Còn phương án như bạn đề ra thì ai cũng biết, được ví như " đường chim đi xe đạp".

    Bạn không thấy là đoạn lisp trên có tác dụng tạo 1 block, chèn theo tỉ lệ x, y, z rồi explode , tiếp đó là purge cái block đó.

    Tuy nhiên còn 1 vài điểm thiếu sót là :

    - Chưa kiểm xem block này đã có sẵn trong bản vẽ hay chưa.

    - Purg rồi mà vẫn chèn được block đó vào bản vẽ (purge chưa hết), chắc phải repeat purge cho chắc ăn.


  3. Gửi bạn một block đơn giản do mình tạo ra. Nó đáp ứng được các yêu cẩu của bạn. Chỉ cần sáng tạo một chút thôi mà :rolleyes:

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

     

    Sáng tạo thật đấy, nhưng mình không muốn phá đường tròn thành PLINE để dùng wipeout bởi muốn mịn thì segment phải tăng lên làm nặng bản vẽ.

    Còn có cách nào khác không nhỉ?


  4. các bác cho em hỏi 1 vấn đề về block như sau

    em tạo ra 1 block có tên là " xe hoi "

    nếu như em mún đưa block này vào bản vẽ , em sẽ phải sử dụng lệnh insert

    các bác có cách nào để có thể pick block trực tiếp bằng 1 lệnh (VD: command : XH .... enter ) ko???

    Không khó khăn gì.

    -Trước hết phải lưu block xe hơi ra 1 bản vẽ , có thể dùng lệnh wblock.

    - Đoạn code này giúp bạn chèn block xe hơi vào bản vẽ:

    (defun c:xh ( / p1)

    (setq p1 (getpoint "\Diem chen:"))

    (command "insert" "c:\\thuvien\\car\\xehoi.dwg" p1 "" "" )

    )

     

    "c:\\thuvien\\car\\xehoi.dwg" là đường dẫn tới thư mục đặt bản vẽ xe hơi.


  5. Mọi người có thể giúp đỡ mình viết lisp sau được ko, mình cám ơn rất nhiều:

    - mình có 2 đường thẳng cắt nhau, mình dùng lệnh trim cắt phần dư của 1 đoạn thẳng rồi sau đó mình lại dùng lệnh line để vẽ lại đường thẳng đó rồi đổi thuộc tính của nó sang nét đứt. Vậy mình xin nhờ mọi người viết lisp để nó tự dùng lệnh cắt trim rồi đổi sang thuộc tính khác. Mình cám ơn mọi người rất nhiều

     

    Bạn dùng code này sẽ cho phép cắt 2 đường LINE

    (defun c:catdt ( / ent1 ent2 sp1 sp2 ep1 ep2 pickpoint int layer)
     (setq ent1 (car (entsel "\nChon duong chan:"))
    ent2 (entsel "\nChon diem cat:")
    sp1 (cdr (assoc 10 (entget ent1)))
    ep1 (cdr (assoc 11 (entget ent1)))
    sp2 (cdr (assoc 10 (entget (car ent2))))
    ep2 (cdr (assoc 11 (entget (car ent2))))
    pickpoint (cadr ent2)
    int (inters sp1 ep1 sp2 ep2)
    layer (cdr (assoc 8 (entget (car ent2))))
    )
     (entdel (car ent2))
     (if (<
    (distance sp2 int)
    (distance sp2 pickpoint))
       (vedt1)
       (vedt2)
       )
     )
    (defun vedt2 ()
     (entmake (list ( cons 0 "line") (cons 8 layer) (cons 10 sp2) (cons 11 int) (cons 6  "HIDDEN")))
     (entmake (list ( cons 0 "line") (cons 8 layer) (cons 10 int) (cons 11 ep2) ))
     )
    (defun vedt1 ()
     (entmake (list ( cons 0 "line") (cons 8 layer) (cons 10 ep2) (cons 11 int) (cons 6  "HIDDEN")))
     (entmake (list ( cons 0 "line") (cons 8 layer) (cons 10 int) (cons 11 sp2) ))
     )
    


  6. Bây giờ bạn muốn thế nào?

    Ngoài việc đổi X với Y, còn gì nữa không?

    Bạn hãy nêu luôn một thể.

     

    Tôi không ngại viết, nhưng rất ngại sửa.

    Biết mà, mấy cha địa chính này đảo điên trời đất, X dọc Y ngang bọn này nằm vẽ hay sao ấy anh ạ. Mở bản vẽ ra xem định lưu ý anh Hoành nhưng ko kịp.


  7. Bây giờ bạn muốn thế nào?

    Ngoài việc đổi X với Y, còn gì nữa không?

    Bạn hãy nêu luôn một thể.

     

    Tôi không ngại viết, nhưng rất ngại sửa.

    Biết mà, mấy cha địa chính này đảo điên trời đất, X dọc Y ngang. Mở bản vẽ ra xem định lưu ý anh Hoành nhưng ko kịp.

    • Vote tăng 1

  8. Cảm ơn ssq nhiều, mấy cái font đó là mã unicode của chữ Việt thôi ( xem bài hiện tiếng việt trên command cho cad2007)

    Mình viết cái lisp này để muốn tra thước Lỗ Ban khỏi cần ra web, trước đây có 1 con thước dùng đuôi VLX chỉ hiển thị tốt trên cad 2004, còn trên cad 2007 thì lỗi.

    Thực ra mình viết lisp cũng nhiều nhưng với DCL không có tài liệu nào viết cụ thể cách vào ra nên mới phải học hỏi thêm.

    Theo tài liệu hướng dẫn của Nguyễn Hữu Lộc thì muốn xử lý phép tính thì phải giấu hộp thoại. Bây giờ mới thấy là mình hiểu chưa đúng tài liệu (:mellow:)


  9. hihi vui thế nhỉ không ngờ diễn đàn của chúng ta lại đông anh em thế:tất cả mọi người đều giỏi cả em hâm mộ quá! các bác ơi bác nào có cái lisp vẽ mặt cắt đất không cho em với em đang làm xây dựng nhưng mỗi lần vẽ mặt cắt đất tự nhiên hoặ là đất đắp thì rât lâu và cảm thấy nhàm chán bác nào có thì cho em với nhé:em muốn tức là mìh chỉ cần chọn điểm đầu và điểm cuối sau đó enter là đã thể hiện đc mặt cắt đất trên đó:các bác cố giúp em với nhé em sẽ hậu tạ:

     

    Bác hoành của chúng ta hay thật ấy:em có cô em gái xinh lắm nếu bác chưa có vợ em sẽ giới thiệu nó cho bác nhé:hehheh

    Cứ chơi cho hết đời trai trẻ

    rồi âm thầm lặng lẽ đạp xích

     

    Theo mình nghĩ thì chỉ cần làm 1 dynamic block theo dạng array là được.

    http://www.cadviet.com/upfiles/dattn.dwg" target="_blank">http://www.cadviet.com/upfiles/dattn.dwg


  10. Chắc có llẽ là như vậy:

    tronng ACAD tạo 1 textstyle với font arial, Bạn dùng DTEXT đẻ viết 1 dòng text tiếng việt bất kỳ.

    Xong bạn select vào text vừa viết nhấn ctr+1 nhìn vào bảng hiện ra bạn sẽ thấy 1 số mã unicode (ở mục nội dung) Bạn hãy lấy mã đó để dùng trong lisp

    Nếu nó vẫn kg ra tiếng việt, bạn hãy thử thêm vào các mã unicode dấu "/" tại những vị trí có kí tự "/" (tức double nó lên) rồi thử lại. Chúc bạn thành công. (kg nhớ rõ là kí tự này "/" hay kí tự này "\", mình quên rồi).

     

    Theo mình nghĩ cách nhanh nhất là dùng lệnh DTEXT để đánh chữ lên màn hình. Sau đó viết lisp xuất nội dung là nó thành mã Unicode ngay vì lisp chỉ xuất file text dạng ASCII nên kí tự unicode sẽ xuất thành dạng /U+XXXX , bạn chỉ việc copy nó là xong.

    Đây là đoạn mã để xuất nội dung:

    (setq noidung (cdr (assoc 1 (entget (car (entsel "Chon text:"))))))

     

    Nếu bạn dán mã này vào dòng command của cad thi hiện ra tiếng việt, dán vào V lisp console thì ra mã unicode

×