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

cuongtk2

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

    419
  • Đã tham gia

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

  • Ngày trúng

    33

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


  1. C­­­hưa đọc hết đã thấy lỗi ở hàm while rồi.

    Cấu trúc của nó là

    (while (điều kiện cần để chạy vòng lặp, ở đây là nhập toạ độ điểm)

    (biểu thức)

    ); end while.

     

    Ở đoạn code của bạn mình thấy sau while là luuos, khi giá trị này nil thì vòng lặp mới kết thúc.

    Bạn nên để vòng lặp như sau:

    (while

    (setq p1 (getpoint .....))

    (progn

    (luuos)

    (.....)

    (.....)

    ); end progn

    )end while

    Như vậy khi nào không nhập điểm nữa thì vòng lặp sẽ kết thúc. Chúc may mắn


  2. đúng là thừa 1 dấu ngoặc thật.

    Nếu bạn sử dụng dốc lên thì chọn i>0, dốc xuống thì i<0.

    Nếu muốn xoá đường pline cũ đi thì bổ sung đoạn code (entdel ent) vào trước dấu ngoặc đơn sau cùng, vậy là đường 3DPline mới coi như là được update từ đưòng Pline cũ.

     

    Nếu vấn đề như bạn nói thì phải xử lý theo hướng khác.

    Phương án 1:

    - Select bằng cách Chọn 1 điểm trên Pline.

    - Lọc lấy toạ độ tất cả các đỉnh của con Pline cũ ( làm được).

    - Xoá con Pline cũ đi ( làm được)

    - Nếu điểm chọn gần đầu mút nào sẽ lấy mút đó làm điểm đầu tiên. ( làm được)

    - Gán cao độ Z cho điểm đầu tiên.( làm được)

    - Gán chênh cao - tức dộ dốc cho các điểm tiếp theo, tuỳ khoảng cách các đỉnh mà sẽ có chênh cao thich hợp.( làm được)

    - Vẽ đường 3DPolyline trên các toạ độ cũ với các cung đoạn thẳng ( làm được)

     

    Tuy nhiên nếu đường polyline của bạn có các cung tròn thì kết quả sẽ không đuợc như mong muốn vì lệnh 3dpoly chỉ cho phép vẽ đoạn thẳng, không cho phép vẽ cung tròn. Nếu tuyến kênh của bạn chỉ là một cung tròn thì kết quả càng tai hại. Vì vậy cần bổ sung thêm điểm trên cung tròn để giả lập cung tròn đó, vấn đề là cần bao nhiêu điểm cho 1 cung tròn thì vừa. Câu hỏi này mình không giải quyết được bởi cung lớn thì cần nhiều điểm, cung nhỏ cần ít điểm, mà cung như thế nào để gọi là lớn thì mình không nắm được. Nếu bạn chỉ cần gặp cung tròn là cứ lấy khoảng cách ví dụ 500 đơn vị cho 1 điểm thì khả thi hơn. Tuy nhiên làm được cũng phải có thời gian đầu tư.

     

    Nếu bạn đồng ý mình sẽ giúp bạn phương án 2:

    - Bạn đồ lại pline cũ bằng pline chỉ gồm các đoạn thẳng để có thể mô phỏng các cung tròn .

    - Bước tiếp theo sử dụng phương án 1 cho con pline mới tạo ra này.

    OK?

    • Vote tăng 1

  3. Đâ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

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


  5. 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ỉ?


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


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


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


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

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

×